Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of github.com:simgrid/simgrid
authorMartin Quinson <martin.quinson@loria.fr>
Sun, 21 May 2017 15:03:13 +0000 (17:03 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Sun, 21 May 2017 15:03:13 +0000 (17:03 +0200)
413 files changed:
.gitignore
.travis.yml
CMakeLists.txt
ChangeLog
circle.yml [new file with mode: 0644]
doc/doxygen/deployment.doc
doc/doxygen/howtos.doc
doc/doxygen/inside_tests.doc
doc/doxygen/module-xbt.doc
doc/doxygen/ns3.doc
doc/doxygen/outcomes_logs.doc
doc/doxygen/platform.doc
doc/msg-tuto-src/deployment0.xml
doc/msg-tuto-src/deployment1.xml
doc/msg-tuto-src/deployment2.xml
doc/msg-tuto-src/deployment3.xml
doc/msg-tuto-src/deployment_general.xml
examples/java/app/bittorrent/Peer.java
examples/java/app/bittorrent/bittorrent.xml
examples/java/app/centralizedmutex/Node.java
examples/java/app/centralizedmutex/centralizedmutex.xml
examples/java/app/masterworker/masterworker.xml
examples/java/app/pingpong/Receiver.java
examples/java/dht/chord/chord.xml
examples/java/dht/kademlia/Answer.java
examples/java/dht/kademlia/Common.java
examples/java/dht/kademlia/Node.java
examples/java/dht/kademlia/RoutingTable.java
examples/java/dht/kademlia/kademlia.xml
examples/java/energy/consumption/Main.java
examples/java/io/file/Node.java
examples/java/process/kill/Killer.java
examples/java/process/startkilltime/startkilltime.xml
examples/java/task/priority/priority.xml
examples/java/trace/pingpong/Sender.java
examples/msg/CMakeLists.txt
examples/msg/actions-comm/actions-comm_d.xml
examples/msg/actions-comm/actions-comm_split_d.xml
examples/msg/actions-storage/actions-storage_d.xml
examples/msg/app-bittorrent/app-bittorrent_d.xml
examples/msg/app-chainsend/app-chainsend_d.xml
examples/msg/app-chainsend/broadcaster.c
examples/msg/app-chainsend/iterator.c
examples/msg/app-masterworker/app-masterworker-multicore_d.xml
examples/msg/app-masterworker/app-masterworker-vivaldi_d.xml
examples/msg/app-masterworker/app-masterworker_d.xml
examples/msg/app-pingpong/app-pingpong_d.xml
examples/msg/async-wait/async-wait2_d.xml
examples/msg/async-wait/async-wait3_d.xml
examples/msg/async-wait/async-wait4_d.xml
examples/msg/async-wait/async-wait_d.xml
examples/msg/async-waitall/async-waitall_d.xml
examples/msg/async-waitany/async-waitany_d.xml
examples/msg/async-yield/async-yield_d.xml
examples/msg/dht-chord/dht-chord_d.xml
examples/msg/dht-kademlia/dht-kademlia_d.xml
examples/msg/energy-onoff/platform_onoff.xml
examples/msg/io-remote/io-remote_d.xml
examples/msg/mc/CMakeLists.txt
examples/msg/mc/deploy_bugged1.xml
examples/msg/mc/deploy_bugged1_liveness.xml
examples/msg/mc/deploy_bugged1_liveness_visited.xml
examples/msg/mc/deploy_bugged2.xml
examples/msg/mc/deploy_bugged2_liveness.xml
examples/msg/mc/deploy_bugged3.xml
examples/msg/mc/deploy_centralized_mutex.xml
examples/msg/mc/deploy_electric_fence.xml
examples/msg/mc/platform.xml
examples/msg/network-ns3/3hosts_2links_d.xml
examples/msg/network-ns3/3links-timer_d.xml
examples/msg/network-ns3/3links_d.xml
examples/msg/network-ns3/crosstraffic_d.xml
examples/msg/network-ns3/dogbone_d.xml
examples/msg/network-ns3/one_cluster_d.xml
examples/msg/network-ns3/onelink_d.xml
examples/msg/network-ns3/two_clusters_d.xml
examples/msg/platform-properties/platform-properties.c
examples/msg/platform-properties/platform-properties_d.xml
examples/msg/process-startkilltime/baseline_d.xml
examples/msg/process-startkilltime/kill_d.xml
examples/msg/process-startkilltime/start_d.xml
examples/msg/process-startkilltime/start_kill_d.xml
examples/msg/task-priority/task-priority_d.xml
examples/platforms/bypassASroute.xml
examples/platforms/bypassRoute.xml
examples/platforms/cloud.xml
examples/platforms/cluster.xml
examples/platforms/cluster_and_one_host.xml
examples/platforms/cluster_dragonfly.xml
examples/platforms/cluster_fat_tree.xml
examples/platforms/cluster_no_backbone.xml
examples/platforms/cluster_torus.xml
examples/platforms/config.xml
examples/platforms/config_tracing.xml
examples/platforms/crosstraffic.xml
examples/platforms/data_center.xml
examples/platforms/dogbone.xml
examples/platforms/energy_cluster.xml
examples/platforms/energy_platform.xml
examples/platforms/faulty_host.xml
examples/platforms/g5k.xml
examples/platforms/griffon.xml
examples/platforms/meta_cluster.xml
examples/platforms/multicore_machine.xml
examples/platforms/onelink.xml
examples/platforms/prop.xml
examples/platforms/routing_cluster.xml
examples/platforms/routing_none.xml
examples/platforms/simulacrum_7_hosts.xml
examples/platforms/small_platform.xml
examples/platforms/small_platform_fatpipe.xml
examples/platforms/small_platform_one_link_routes.xml
examples/platforms/small_platform_with_failures.xml
examples/platforms/small_platform_with_routers.xml
examples/platforms/storage/remote_io.xml
examples/platforms/storage/storage.xml
examples/platforms/three_multicore_hosts.xml
examples/platforms/trace/jupiter_speed.trace
examples/platforms/trace/jupiter_state.trace
examples/platforms/trace/link1_avail.trace
examples/platforms/trace/linkBandwidth7.bw
examples/platforms/trace/trace_A.txt
examples/platforms/trace/trace_A_failure.txt
examples/platforms/trace/trace_B.txt
examples/platforms/two_clusters.xml
examples/platforms/two_hosts.xml
examples/platforms/two_hosts_platform_shared.xml
examples/platforms/two_hosts_platform_with_availability.xml
examples/platforms/two_hosts_platform_with_availability_included.xml
examples/platforms/two_peers.xml
examples/platforms/vivaldi.xml
examples/s4u/actions-comm/s4u_actions-comm_d.xml
examples/s4u/actions-comm/s4u_actions-comm_split_d.xml
examples/s4u/actions-storage/s4u_actions-storage_d.xml
examples/s4u/actor-create/s4u_actor-create_d.xml
examples/s4u/app-masterworker/s4u_app-masterworker_d.xml
examples/s4u/dht-chord/s4u_dht-chord_d.xml
examples/simdag/availability/sd_availability.tesh
examples/simdag/scheduling/sd_scheduling.c
examples/smpi/CMakeLists.txt
examples/smpi/replay_multiple/generate_multiple_deployment.sh
examples/smpi/smpi_msg_masterslave/deployment_masterslave_mailbox_smpi.xml
include/simgrid/forward.h
include/simgrid/jedule/jedule.hpp
include/simgrid/jedule/jedule_events.hpp
include/simgrid/jedule/jedule_platform.hpp
include/simgrid/jedule/jedule_sd_binding.h
include/simgrid/modelchecker.h
include/simgrid/msg.h
include/simgrid/s4u.hpp
include/simgrid/s4u/Actor.hpp
include/simgrid/s4u/Comm.hpp
include/simgrid/s4u/NetZone.hpp
include/simgrid/simix.h
include/simgrid_config.h.in
include/smpi/mpi.h
include/smpi/smpi.h
include/surf/surf_routing.h
include/xbt.h
include/xbt/base.h
include/xbt/ex.hpp
include/xbt/functional.hpp
include/xbt/log.h
include/xbt/matrix.h
include/xbt/memory.hpp [deleted file]
include/xbt/str.h
include/xbt/strbuff.h [deleted file]
include/xbt/string.hpp
include/xbt/utility.hpp
sonar-project.properties
src/bindings/java/jmsg.cpp
src/bindings/java/jmsg.h
src/bindings/java/jmsg_as.cpp
src/bindings/java/jmsg_host.cpp
src/bindings/java/jmsg_storage.cpp
src/include/mc/mc.h
src/include/surf/surf.h
src/instr/instr_smpi.h
src/instr/jedule/jedule.cpp
src/instr/jedule/jedule_events.cpp
src/instr/jedule/jedule_platform.cpp
src/instr/jedule/jedule_sd_binding.cpp
src/kernel/activity/SynchroComm.hpp
src/kernel/context/Context.cpp
src/kernel/context/ContextBoost.cpp
src/kernel/context/ContextRaw.cpp
src/kernel/context/ContextUnix.cpp
src/kernel/routing/DijkstraZone.cpp
src/kernel/routing/DijkstraZone.hpp
src/kernel/routing/NetZoneImpl.cpp
src/mc/checker/CommunicationDeterminismChecker.cpp
src/mc/checker/LivenessChecker.hpp
src/mc/mc_base.cpp
src/mc/mc_checkpoint.cpp
src/mc/mc_config.cpp
src/mc/mc_global.cpp
src/mc/mc_ignore.h
src/mc/mc_record.cpp
src/mc/remote/Client.cpp
src/mc/remote/Client.hpp
src/msg/instr_msg_task.cpp
src/msg/msg_environment.cpp
src/msg/msg_global.cpp
src/msg/msg_io.cpp
src/plugins/vm/VmHostExt.cpp
src/plugins/vm/VmHostExt.hpp
src/s4u/s4u_actor.cpp
src/s4u/s4u_comm.cpp
src/s4u/s4u_netzone.cpp
src/simdag/sd_daxloader.cpp
src/simdag/sd_global.cpp
src/simdag/sd_task.cpp
src/simdag/simdag_private.hpp
src/simgrid/host.cpp
src/simgrid/sg_config.cpp
src/simix/ActorImpl.hpp
src/simix/popping.cpp
src/simix/popping_generated.cpp
src/simix/simcalls.py
src/simix/smx_context.cpp
src/simix/smx_deployment.cpp
src/simix/smx_global.cpp
src/simix/smx_io.cpp
src/simix/smx_io_private.h
src/simix/smx_network.cpp
src/simix/smx_private.h
src/smpi/colls/allgather/allgather-rdb.cpp
src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp
src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp
src/smpi/colls/alltoall/alltoall-pair.cpp
src/smpi/colls/alltoall/alltoall-rdb.cpp
src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp
src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp
src/smpi/colls/colls_private.h
src/smpi/colls/smpi_automatic_selector.cpp
src/smpi/colls/smpi_default_selector.cpp
src/smpi/instr_smpi.cpp
src/smpi/private.h
src/smpi/private.hpp
src/smpi/smpi_bench.cpp
src/smpi/smpi_coll.cpp
src/smpi/smpi_coll.hpp
src/smpi/smpi_comm.cpp
src/smpi/smpi_comm.hpp
src/smpi/smpi_datatype.cpp
src/smpi/smpi_datatype.hpp
src/smpi/smpi_datatype_derived.cpp
src/smpi/smpi_datatype_derived.hpp
src/smpi/smpi_deployment.cpp
src/smpi/smpi_f2c.cpp
src/smpi/smpi_f2c.hpp
src/smpi/smpi_f77.cpp
src/smpi/smpi_global.cpp
src/smpi/smpi_group.cpp
src/smpi/smpi_group.hpp
src/smpi/smpi_info.cpp
src/smpi/smpi_info.hpp
src/smpi/smpi_keyvals.cpp
src/smpi/smpi_keyvals.hpp
src/smpi/smpi_memory.cpp
src/smpi/smpi_op.cpp
src/smpi/smpi_op.hpp
src/smpi/smpi_pmpi.cpp
src/smpi/smpi_process.cpp
src/smpi/smpi_process.hpp
src/smpi/smpi_replay.cpp
src/smpi/smpi_request.cpp
src/smpi/smpi_request.hpp
src/smpi/smpi_shared.cpp
src/smpi/smpi_static_variables.cpp
src/smpi/smpi_status.cpp
src/smpi/smpi_status.hpp
src/smpi/smpi_topo.cpp
src/smpi/smpi_topo.hpp
src/smpi/smpi_utils.cpp
src/smpi/smpi_win.cpp
src/smpi/smpi_win.hpp
src/smpi/smpicc.in
src/smpi/smpirun.in
src/surf/cpu_cas01.cpp
src/surf/cpu_cas01.hpp
src/surf/cpu_interface.cpp
src/surf/cpu_interface.hpp
src/surf/cpu_ti.cpp
src/surf/cpu_ti.hpp
src/surf/fair_bottleneck.cpp
src/surf/maxmin.cpp
src/surf/network_cm02.cpp
src/surf/network_cm02.hpp
src/surf/network_ib.hpp
src/surf/network_interface.cpp
src/surf/network_interface.hpp
src/surf/network_ns3.cpp
src/surf/network_ns3.hpp
src/surf/ptask_L07.cpp
src/surf/ptask_L07.hpp
src/surf/sg_platf.cpp
src/surf/storage_interface.cpp
src/surf/storage_interface.hpp
src/surf/surf_c_bindings.cpp
src/surf/surf_interface.cpp
src/surf/surf_interface.hpp
src/surf/trace_mgr.cpp
src/surf/trace_mgr.hpp
src/surf/trace_mgr_test.cpp [new file with mode: 0644]
src/surf/xml/platf_private.hpp
src/surf/xml/simgrid.dtd
src/surf/xml/simgrid_dtd.c
src/surf/xml/simgrid_dtd.h
src/surf/xml/surfxml_parseplatf.cpp
src/surf/xml/surfxml_sax_cb.cpp
src/xbt/backtrace_linux.cpp
src/xbt/cunit.cpp
src/xbt/dict.cpp
src/xbt/dict_cursor.c
src/xbt/ex.cpp
src/xbt/log.c
src/xbt/mallocator.c
src/xbt/memory_map.hpp
src/xbt/mmalloc/mfree.c
src/xbt/mmalloc/mm_legacy.c
src/xbt/parmap.cpp
src/xbt/string.cpp
src/xbt/xbt_log_layout_format.c
src/xbt/xbt_log_layout_simple.c
src/xbt/xbt_main.cpp
src/xbt/xbt_os_file.c
src/xbt/xbt_str.cpp
src/xbt/xbt_strbuff.c [deleted file]
src/xbt_modinter.h
teshsuite/mc/CMakeLists.txt
teshsuite/mc/mutex-handling/mutex-handling_d.xml
teshsuite/msg/trace_integration/test-hbp1-c0s0-c0s1.xml
teshsuite/msg/trace_integration/test-hbp1-c0s0-c1s0.xml
teshsuite/msg/trace_integration/test-hbp1-c0s1-c0s2.xml
teshsuite/msg/trace_integration/test-hbp1-c0s1-c2s2.xml
teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s0.xml
teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s1.xml
teshsuite/msg/trace_integration/test-hbp1-c1s1-c1s2.xml
teshsuite/msg/trace_integration/test-hbp1-c1s1-c3s2.xml
teshsuite/msg/trace_integration/test-hbp1.0-hbp1.0-hbp1.0.xml
teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml
teshsuite/msg/trace_integration/test-hbp1.5-hbp1.5.xml
teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml
teshsuite/simdag/availability/availability.tesh
teshsuite/simdag/flatifier/bogus_missing_gateway.tesh
teshsuite/simdag/flatifier/flatifier.cpp
teshsuite/simdag/is-router/is-router.tesh
teshsuite/simdag/platforms/Dijkstra.xml
teshsuite/simdag/platforms/bob.trace
teshsuite/simdag/platforms/bogus_disk_attachment.xml
teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml
teshsuite/simdag/platforms/bogus_missing_src_gateway.xml
teshsuite/simdag/platforms/bogus_two_hosts_asymetric.xml
teshsuite/simdag/platforms/carol.fail
teshsuite/simdag/platforms/erin.avail
teshsuite/simdag/platforms/four_hosts_floyd.xml
teshsuite/simdag/platforms/host_attributes.xml
teshsuite/simdag/platforms/link.bw
teshsuite/simdag/platforms/link.fail
teshsuite/simdag/platforms/link.lat
teshsuite/simdag/platforms/link_attributes.xml
teshsuite/simdag/platforms/one_cluster.xml
teshsuite/simdag/platforms/one_cluster_fullduplex.xml
teshsuite/simdag/platforms/one_cluster_multicore.xml
teshsuite/simdag/platforms/one_cluster_router_id.xml
teshsuite/simdag/platforms/platform_2p_1bb.xml
teshsuite/simdag/platforms/platform_2p_1fl.xml
teshsuite/simdag/platforms/platform_2p_1sl.xml
teshsuite/simdag/platforms/platform_2p_1sl_hetero.xml
teshsuite/simdag/platforms/platform_2p_1switch.xml
teshsuite/simdag/platforms/platform_4p_1switch.xml
teshsuite/simdag/platforms/platform_include.xml
teshsuite/simdag/platforms/properties.xml
teshsuite/simdag/platforms/test_of_is_router.xml
teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml
teshsuite/simdag/platforms/two_clusters.xml
teshsuite/simdag/platforms/two_clusters_one_name.xml
teshsuite/simdag/platforms/two_clusters_router_id.xml
teshsuite/simdag/platforms/two_hosts_multi_hop.xml
teshsuite/simdag/platforms/two_hosts_one_link.xml
teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml
teshsuite/simix/stack_overflow/stack_overflow.c
teshsuite/smpi/CMakeLists.txt
teshsuite/smpi/bug-17132/bug-17132.tesh
teshsuite/smpi/coll-alltoallv/coll-alltoallv.c
teshsuite/smpi/macro-sample/macro-sample.c
teshsuite/smpi/privatization/privatization.c [new file with mode: 0644]
teshsuite/smpi/privatization/privatization.tesh [new file with mode: 0644]
teshsuite/smpi/privatization/privatization_dlopen.tesh [new file with mode: 0644]
teshsuite/surf/CMakeLists.txt
teshsuite/surf/maxmin_bench/maxmin_bench.cpp
teshsuite/surf/surf_usage/surf_usage.tesh
teshsuite/surf/surf_usage2/surf_usage2.tesh
teshsuite/surf/trace_usage/trace_usage.cpp [deleted file]
teshsuite/surf/trace_usage/trace_usage.tesh [deleted file]
teshsuite/xbt/parmap_bench/parmap_bench.c
tools/cmake/CTestConfig.cmake
tools/cmake/DefinePackages.cmake
tools/cmake/Distrib.cmake
tools/cmake/GCCFlags.cmake
tools/cmake/MakeLib.cmake
tools/cmake/Modules/FindLuaSimgrid.cmake
tools/cmake/Modules/FindNS3.cmake
tools/cmake/Tests.cmake
tools/cmake/UnitTesting.cmake
tools/cmake/src/internal_config.h.in
tools/internal/check_dist_archive.exclude
tools/internal/spell_dict.txt
tools/internal/travis-sonarqube.sh
tools/simgrid.supp
tools/simgrid_update_xml.pl
tools/tesh/tesh.py

index 1eaa7ce..725236b 100644 (file)
@@ -200,6 +200,7 @@ examples/s4u/actor-suspend/s4u_actor-suspend
 examples/s4u/basic/s4u_basic
 examples/s4u/basic/s4u_basic_deployment
 examples/s4u/basic/s4u_basic_function
+examples/s4u/dht-chord/s4u_dht-chord
 examples/s4u/io/s4u_io
 examples/s4u/mutex/s4u_mutex
 examples/simdag/daxload/sd_daxload
@@ -1037,6 +1038,7 @@ teshsuite/smpi/mpich-test/pt2pt/waitall3
 teshsuite/smpi/mpich-test/pt2pt/waitall4
 teshsuite/smpi/mpich-test/pt2pt/waitany
 teshsuite/smpi/mpich-test/*/*.stdo
+teshsuite/smpi/privatization/privatization
 teshsuite/smpi/pt2pt-dsend/pt2pt-dsend
 teshsuite/smpi/pt2pt-pingpong/pt2pt-pingpong
 teshsuite/smpi/coll-reduce/coll-reduce
@@ -1057,7 +1059,6 @@ teshsuite/surf/lmm_usage/lmm_usage
 teshsuite/surf/maxmin_bench/maxmin_bench
 teshsuite/surf/surf_usage/surf_usage
 teshsuite/surf/surf_usage2/surf_usage2
-teshsuite/surf/trace_usage/trace_usage
 teshsuite/xbt/heap_bench/heap_bench
 teshsuite/xbt/log_large/log_large
 teshsuite/xbt/log_usage/log_usage
@@ -1072,6 +1073,7 @@ testgraph.xml
 test_rl
 test_sg
 tools/tesh/tesh
+unit_tmgr
 #########################################
 ## touched files to track the dependencies of java examples
 examples/java/app/bittorrent/java_app_bittorrent_compiled
index 99f0f5e..5f89b91 100644 (file)
@@ -25,6 +25,9 @@ addons:
     - gfortran
     - libboost-dev
     - libboost-all-dev
+    - libdw-dev
+    - libevent-dev
+    - libunwind8-dev
   coverity_scan:
     project:
       name: "simgrid/simgrid"
@@ -44,9 +47,10 @@ addons:
 #   - ls -lR $TRAVIS_BUILD_DIR/LuaInstall
 
 script:
-   - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update         ; fi
-   - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install python3; fi
-   - cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON . 
+   - test "$TRAVIS_OS_NAME" == "osx"   && brew update
+   - test "$TRAVIS_OS_NAME" == "osx"   && brew install python3
+   - test "$TRAVIS_OS_NAME" == "osx"   && cmake -Denable_model-checking=OFF -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON .
+   - test "$TRAVIS_OS_NAME" == "linux" && cmake -Denable_model-checking=ON  -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON .
    # run make in the sonar wrapper && run the tests before sonar to get coverage info
    - ./tools/internal/travis-sonarqube.sh make VERBOSE=1
    # if sonar was not run (and if the build succeeded), run the tests manually
index 703224d..d99da0d 100644 (file)
@@ -206,15 +206,17 @@ include(CheckSymbolExists)
 set(HAVE_GRAPHVIZ 0)
 include(FindGraphviz)
 
-set(HAVE_LUA 0)
+set(SIMGRID_HAVE_LUA 0)
 if(enable_lua)
   include(FindLuaSimgrid)
 endif()
 
-set(HAVE_NS3 0)
+set(SIMGRID_HAVE_NS3 0)
 if(enable_ns3)
   include(FindNS3)
-  if (NOT HAVE_NS3)
+  if (SIMGRID_HAVE_NS3)
+    set(SIMGRID_HAVE_NS3 1)
+  else()
     message(FATAL_ERROR "Cannot find NS3. Please install it (apt-get install ns3 libns3-dev) or disable that cmake option")
   endif()
 endif()
@@ -244,40 +246,29 @@ if(Boost_FOUND)
   include_directories(${Boost_INCLUDE_DIRS})
 else()
   if(APPLE)
-    message(FATAL_ERROR "Boost libraries not found. Try to install them with 'sudo fink install boost1.53.nopython'")
+    message(FATAL_ERROR "Boost libraries not found. Try to install them with 'sudo fink install boost1.53.nopython' (check the exact name with 'fink list boost') or 'sudo brew install boost'")
   else()
     message(FATAL_ERROR "Boost libraries not found. Install libboost-dev (>= 1.48.0).")
   endif()
 endif()
 
-#Boost context 1.61 will break compatibility with our implementation.
-#Warn users about that
-find_package(Boost 1.61 COMPONENTS context)
-
-if(Boost_FOUND AND Boost_CONTEXT_FOUND)
-  message("   WARNING : our implementation of Boost context factory is not compatible with Boost >=1.61 yet.")
-
-  set(Boost_FOUND 1)
-  set(HAVE_BOOST_CONTEXTS 0)
-else()
-# Try again to see if we have libboost-context
-  find_package(Boost 1.42 COMPONENTS context)
-  set(Boost_FOUND 1) # We don't care of whether this component is missing
-
-  if(Boost_FOUND AND Boost_CONTEXT_FOUND)
-    # We should use feature detection for this instead:
-    if (Boost_VERSION LESS 105600)
-      message("Found Boost.Context API v1")
-      set(HAVE_BOOST_CONTEXTS 1)
-    else()
-      message("Found Boost.Context API v2")
-      set(HAVE_BOOST_CONTEXTS 2)
-    endif()
+find_package(Boost COMPONENTS context)
+set(Boost_FOUND 1) # This component is optional
+if(Boost_CONTEXT_FOUND)
+  if (Boost_VERSION LESS 105600)
+    message("Found Boost.Context API v1")
+    set(HAVE_BOOST_CONTEXTS 1)
+  elseif(Boost_VERSION LESS 106100)
+    message("Found Boost.Context API v2")
+    set(HAVE_BOOST_CONTEXTS 2)
   else()
-    message ("   boost        : found.")
-    message ("   boost-context: missing. Install libboost-context-dev for this optional feature.")
+    message("   WARNING : our implementation of Boost context factory is not compatible with Boost >=1.61 yet.")
     set(HAVE_BOOST_CONTEXTS 0)
   endif()
+else()
+  message ("   boost        : found.")
+  message ("   boost-context: missing. Install libboost-context-dev for this optional feature.")
+  set(HAVE_BOOST_CONTEXTS 0)
 endif()
 
 # Checks for header libraries functions.
@@ -365,15 +356,15 @@ else()
 endif()
 
 if(enable_jedule)
-  set(HAVE_JEDULE 1)
+  set(SIMGRID_HAVE_JEDULE 1)
 else()
-  set(HAVE_JEDULE 0)
+  set(SIMGRID_HAVE_JEDULE 0)
 endif()
 
 if(enable_mallocators)
-  SET(HAVE_MALLOCATOR 1)
+  SET(SIMGRID_HAVE_MALLOCATOR 1)
 else()
-  SET(HAVE_MALLOCATOR 0)
+  SET(SIMGRID_HAVE_MALLOCATOR 0)
 endif()
 
 include(FindLibunwind)
@@ -406,13 +397,13 @@ if(enable_model-checking)
   find_package(Libevent REQUIRED)
   include_directories(${LIBDW_INCLUDE_DIR} ${LIBEVENT_INCLUDE_DIR})
   set(SIMGRID_DEP "${SIMGRID_DEP} ${LIBEVENT_LIBRARIES} ${LIBDW_LIBRARIES}")
-  set(HAVE_MC 1)
+  set(SIMGRID_HAVE_MC 1)
   if("${CMAKE_SYSTEM}" MATCHES "FreeBSD" AND enable_java)
     message(WARNING "FreeBSD + Model-Checking + Java = too much for now. Disabling java")
     set(enable_java FALSE)
   endif()
 else()
-  SET(HAVE_MC 0)  
+  SET(SIMGRID_HAVE_MC 0)  
   set(HAVE_MMALLOC 0)
 endif()
 
@@ -963,7 +954,7 @@ message("        LDFlags .....................: ${CMAKE_C_LINK_FLAGS}")
 message("        with LTO ....................: ${enable_lto}")
 message("")
 
-if (HAVE_NS3)
+if (SIMGRID_HAVE_NS3)
   message("        Compile NS-3 ................: yes (path: ${NS3_PATH})")
 else()
   message("        Compile NS-3 ................: NO  (hint: ${NS3_HINT})")
@@ -975,7 +966,7 @@ if (${Java_FOUND})
 else()
   message("        Compile Java ................: NO")
 endif()
-message("        Compile Lua .................: ${HAVE_LUA}")
+message("        Compile Lua .................: ${SIMGRID_HAVE_LUA}")
 message("        Compile Smpi ................: ${HAVE_SMPI}")
 message("          Smpi fortran ..............: ${SMPI_FORTRAN}")
 message("          MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}")
@@ -985,8 +976,8 @@ message("        Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}")
 message("")
 message("        Maintainer mode .............: ${enable_maintainer_mode}")
 message("        Documentation................: ${enable_documentation}")
-message("        Model checking ..............: ${HAVE_MC}")
-message("        Jedule  mode ................: ${HAVE_JEDULE}")
+message("        Model checking ..............: ${SIMGRID_HAVE_MC}")
+message("        Jedule  mode ................: ${SIMGRID_HAVE_JEDULE}")
 message("        Graphviz mode ...............: ${HAVE_GRAPHVIZ}")
 message("        Mallocators .................: ${enable_mallocators}")
 message("")
index 0fc46d7..6ca3d3e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,19 +1,38 @@
 SimGrid (3.16) UNRELEASED
 
-SimDag
- - New and Backwards Compatibility break: 
-   SD_simulate_with_update (double how_long, xbt_dynar_t changed_tasks_dynar)
-   When one wants to get the list of tasks whose states have changed during a
-   simulation round, s/he has to allocate and free a dynar and use it as argument 
-   to this function. The former SD_simulate (double how_long) now returns void.
+ Portability status:
+  - FreeBSD: Disable SMPI mmap privatization, switch automatically to dlopen.
+  - Mac, BSD: dlopen+thread broken, switch automatically to raw contexts.
+
+ XML platforms: Switch to platform v4.1 format.
+ * This is a backward compatible change: v4 are valid v4.1 files
+   - <zone> can be used as a synonym for the now deprecated <as>
+   - <zoneZoute> an be used as a synonym for the now deprecated <asroute>
+   - <bypassZoneRoute> an be used as a synonym for the now deprecated <bypassAsRoute>
+   - <actor> can be used as a synonym for the now deprecated <process>
+   - state_file and avail_file periodicity is now easier to express
+     (check the documentation) the old behavior should still work.
+
+ SimDag
+  - New and Backwards Compatibility break: 
+    SD_simulate_with_update (double how_long, xbt_dynar_t changed_tasks_dynar)
+    When one wants to get the list of tasks whose states have changed during a
+    simulation round, s/he has to allocate and free a dynar and use it as argument 
+    to this function. The former SD_simulate (double how_long) now returns void.
+
+ MSG
+  - The netzone are now available from the MSG API. 
+    The old names still work, but are now deprecated.
 
  SMPI
   - New algorithm to privatize globals: dlopen, with dynamic loading tricks
   - New option: smpi/keep-temps to not cleanup temp files
 
- XBT/Replay:
-  - New function xbt_replay_action_get():
+ XBT
+  - Replay: New function xbt_replay_action_get():
     Retrieve the function previously associated to an event type.
+  - DROPPED FUNCTION: xbt_str_varsubst()
+  - DROPPED MODULE: strbuff. We don't need it anymore.
 
  -- Release target: June 21 2017   -- Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
 
diff --git a/circle.yml b/circle.yml
new file mode 100644 (file)
index 0000000..3faf143
--- /dev/null
@@ -0,0 +1,21 @@
+# This is the configuration file for the https://circleci.com/ continuous integration server
+#
+# Copyright (C) 2017. The SimGrid team. All rights reserved.
+# 
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+machine:
+  python:
+      version: 3.6.0
+
+dependencies:
+  pre:
+    - sudo apt-get update; sudo apt-get install cmake valgrind default-jdk gfortran libboost-dev libboost-all-dev
+
+test:
+  pre:
+    - mkdir _build
+    - pushd _build ; cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON ..
+  override:
+    - pushd _build ; make -j4 && ctest -j4 --output-on-failure
index cd1ef5d..b4d96ca 100644 (file)
@@ -34,13 +34,13 @@ in many of the provided example, just grep for them.
 
 @section deploy_xml Deployment with XML
 
-Deploying processes from XML is easy. This section presents a complete
+Deploying actors from XML is easy. This section presents a complete
 example and the reference guide of the involved tags.
 
 The deployment file looks just like a @ref platform "platform" file,
 with only 3 tags used:
 
-  - @c &lt;process&gt; starts a new actor on a given host;
+  - @c &lt;actor&gt; starts a new actor on a given host;
   - @c &lt;argument&gt; passes a given argument in the argv of an actor
     (the list of arguments is ordered);
   - @c &lt;prop&gt; adds a property to the actor.
@@ -55,26 +55,26 @@ are named @c ***_d_xml.
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
 <platform version="4">
   <!-- Alice, which runs on the machine named 'host1', does not take any parameter -->
-  <process host="host1" function="alice" />
+  <actor host="host1" function="alice" />
 
   <!-- Bob, which runs on 'host2', has 2 parameters "3" and "3000" in its argv -->
-  <process host="host2" function="bob" />
+  <actor host="host2" function="bob" />
      <argument value="3"/>
      <argument value="3000"/>
-  </process>
+  </actor>
 
   <!-- Carole runs on 'host3', has 1 parameter "42" in its argv and one property -->
   <!-- See MSG_process_get_property_value() to retrieve this property -->
-  <process host="host3" function="carole">
+  <actor host="host3" function="carole">
       <argument value="42"/>
       <prop id="SomeProp" value="SomeValue"/>
-  </process>
+  </actor>
 </platform>
 @endverbatim
 
-@subsection deploy_xml_process The process tag
+@subsection deploy_xml_actor The actor tag
 
-&lt;process&gt; starts a new actor on a given host. It specifies which
+&lt;actor&gt; starts a new actor on a given host. It specifies which
 function (from your application) gets executed on the host. Hence, the
 @c host and @c function attributes are mandatory, but this tag accepts
 some optional attributes too.
@@ -85,11 +85,11 @@ some optional attributes too.
 | function        | yes       | String       | Name of the function (from your own code) that will be executed.  See @ref deploy_xml_functions. |
 | start_time      | no        | int          | The simulated time when this actor will be started (Default: ASAP).             |
 | kill_time       | no        | int          | The simulated time when this actor will be forcefully stopped (Default: never). |
-| on_failure      | no        | DIE\|RESTART | What should be done when the process fails (Default: die).       |
+| on_failure      | no        | DIE\|RESTART | What should be done when the actor fails (Default: die).       |
 
 @subsection deploy_xml_argument The argument tag
 
-This tag (which must be enclosed in a @c &lt;process&gt; tag) adds a
+This tag (which must be enclosed in a @c &lt;actor&gt; tag) adds a
 new string to the parameter list received by your actor (either its @c
 argv array in MSG or its @c args vector in S4U).  Naturally, the
 semantic of these parameters completely depend on your program.
@@ -100,12 +100,11 @@ semantic of these parameters completely depend on your program.
 
 @subsection deploy_xml_prop The prop tag
 
-This tag (which must be enclosed in a @c &lt;process&gt; tag) adds a
-new property to your actor.
-
-(either its @c
-argv array in MSG or its @c args vector in S4U).  Naturally, the
-semantic of these parameters completely depend on your program.
+This tag (which must be enclosed in a @c &lt;actor&gt; tag) adds a new
+property to your actor. You can retrieve these properties with
+MSG_process_get_property_value() or simgrid::s4u::Actor::property().
+Naturally, the semantic of these parameters completely depend on your
+program.
 
 | Attribute name  | Mandatory | Values                 | Description                  |
 | --------------- | --------- | ---------------------- | -----------                  |
@@ -115,7 +114,7 @@ semantic of these parameters completely depend on your program.
 @subsection deploy_xml_functions Declaring startable functions
 
 You need to connect your code to the names that you use in the XML
-deployment file. Depends on the interface you use, this is done with
+deployment file. Depending on the interface you use, this is done with
 MSG_process_create() or simgrid::s4u::Engine::registerFunction().
 There is nothing to do in your **Java code** since SimGrid uses
 the Java introspection abilities to retrieve the classes from their
index 8da21aa..a764b7a 100644 (file)
@@ -18,6 +18,34 @@ Of course, you should also check the @ref examples page, that shows
 more detailed usage examples. As for the rest of the documentation
 (and of SimGrid, actually), any contribution is welcome.
 
+@section howto_churn How to model churn
+
+One of the biggest challenges in P2P settings is to cope with the
+churn, meaning that resources keep appearing and disappearing. In
+SimGrid, you can always change the state of each host manually, with
+eg simgrid::s4u::Host::on(). To reduce the burden when the churn is
+high, you can also attach a **state profile** to the host directly.
+
+This is not possible from S4U yet (TODO), and you should use the \c
+state_file attribute of @ref pf_tag_host or @ref pf_tag_cluster. 
+
+Every lines (but the last) of such files describe timed events with
+the form "date value". Example:
+
+~~~{.py}
+  1 0
+  2 1
+ LOOPAFTER 8
+~~~
+
+ - At time t=1, the host is turned off (value 0 means OFF)
+ - At time t=2, it is turned back on (other values means ON)
+ - At time t=10, the history is reset (because that's 8 seconds after
+   the last event). So the host will be turned off again at t=11.
+
+If your trace does not contain a LOOPAFTER line, then your profile is
+only executed once and not repetitively.
+
 @section howto_multicore How to model multicore machines
 
 Multicore machines are very complex, and there is many way to model
index d7a7328..c8195c2 100644 (file)
@@ -72,13 +72,12 @@ your changes should look like that:
 --- a/tools/cmake/UnitTesting.cmake
 +++ b/tools/cmake/UnitTesting.cmake
 @@ -11,6 +11,7 @@ set(FILES_CONTAINING_UNITTESTS
-   src/xbt/xbt_strbuff.c
    src/xbt/xbt_sha.c
    src/xbt/config.c
 +  src/xbt/plouf.c
    )
 
- if(HAVE_MC)
+ if(SIMGRID_HAVE_MC)
 \endverbatim
 
 Then, you want to actually add your tests in the source file. All the
index 3f53b36..395f744 100644 (file)
@@ -18,7 +18,6 @@
       - \ref XBT_dict
       - \ref XBT_swag
       - \ref XBT_heap
-      - @ref xbt_strbuff
     - \ref XBT_misc
       - \ref XBT_graph
 
index 8a9af01..5022462 100644 (file)
@@ -43,7 +43,7 @@ cmake . -Denable_ns3=ON -DNS3_HINT=/opt/ns3 # or change the path if needed
 
 By the end of the configuration, cmake reports whether ns-3 was found,
 and this information is also available in <tt>include/simgrid_config.h</tt>
-If your local copy defines the variable \c HAVE_NS3 to 1, then NS3
+If your local copy defines the variable \c SIMGRID_HAVE_NS3 to 1, then NS3
 was correctly detected. If it's defined to 0, then something went
 wrong. Explore <tt>CMakeFiles/CMakeOutput.log</tt> and
 <tt>CMakeFiles/CMakeError.log</tt> to diagnose the problem.
index d369083..131fe36 100644 (file)
@@ -306,12 +306,6 @@ Here are the existing format directives:
  - %%L: line number where the log event was raised (LOG4J compatible)
  - %%M: function name (LOG4J compatible -- called method name here of course).
 
- - %%b: full backtrace (Called %%throwable in LOG4J).
-   Defined only under windows or when using the GNU libc because backtrace() is not defined
-   elsewhere, and we only have a fallback for windows boxes, not mac ones for example.
- - %%B: short backtrace (only the first line of the %%b).
-   Called %%throwable{short} in LOG4J; defined where %%b is.
-
  - %%d: date (UNIX-like epoch)
  - %%r: application age (time elapsed since the beginning of the application)
 
index f9601f9..89ee5f6 100644 (file)
@@ -43,144 +43,100 @@ files.
 From time to time, this DTD evolves to introduce possibly
 backward-incompatible changes. That is why each platform desciption is
 enclosed within a @c platform tag, that have a @c version attribute. 
-The current version is <b>4</b>. The @c simgrid_update_xml program can
+The current version is <b>4.1</b>. The @c simgrid_update_xml program can
 upgrade most of the past platform files to the recent formalism.
 
-\section pf_netzones Defining a NetZone
+\section pf_first_example First Platform Example 
 
-In SimGrid, any resource must be located within a given **NetZone**.
-Each netzone is in charge of the routing between its resources. It
-means that when an host wants to communicate with another host of the
-same NetZone, it is the NetZone's duty to find the list of links that
-are involved in the communication. If the hosts are not in the same
-NetZone, @ref routing_basics "things are slightly more complex" to
-determine the links involved in a time- and space-efficient manner.
+Here is a very simple platform file, containing 3 resources (two hosts
+and one link), and explicitly giving the route between the hosts.
 
-But only one NetZone is really sufficient to begin with. The following
-chunk describes a simplistic NetZone using the Full routing (we will
-have to specify each and every routes manually). 
-
-\verbatim
-<AS id="netzone0" routing="Full">
-\endverbatim
-
-There is also the ``<route>`` tag; this tag takes two attributes,
-``src`` (source) and ``dst`` (destination). Both source and
-destination must be valid identifiers for routers (these will be
-introduced later). Contained by the ``<route>`` are network links;
-these links must be used in order to communicate from the source to
-the destination specified in the tag. Hence, a route merely describes
-how to reach a router from another router.
-
-\remark
-  More information and (code-)examples can be found in Section \ref pf_rm.
-
-A netzone can also contain itself one or more netzone; this allows you to model
-the hierarchy of your platform.
-
-### Within each AS, the following types of resources exist:
-
-%Resource        | Documented in Section | Description
---------------- | --------------------- | -----------
-AS              |                       | Every Autonomous System (AS) may contain one or more AS.
-host            | \ref pf_host          | This entity carries out the actual computation. For this reason, it contains processors (with potentially multiple cores).
-router          | \ref pf_router        | In SimGrid, routers are used to provide helpful information to routing algorithms.  Routers may also act as gateways, connecting several autonomous systems with each other.
-link            | \ref pf_link          | In SimGrid, (network)links define a connection between two or potentially even more resources. Every link has a bandwidth and a latency and may potentially experience congestion.
-cluster         | \ref pf_cluster       | In SimGrid, clusters were introduced to model large and homogenous environments. They are not really a resource by themselves - technically, they are only a shortcut, as they will internally set up all the hosts, network and routing for you, i.e., using this resource, one can easily setup thousands of hosts and links in a few lines of code. Each cluster is itself an AS.
-
-As it is desirable to interconnect these resources, a routing has to
-be defined. The AS is supposed to be Autonomous, hence this has to be
-done at the AS level. The AS handles two different types of entities
-(<b>host/router</b> and <b>AS</b>). However, the user is responsible
-to define routes between those resources, otherwise entities will be
-unconnected and therefore unreachable from other entities. Although
-several routing algorithms are built into SimGrid (see \ref pf_rm),
-you might encounter a case where you want to define routes manually
-(for instance, due to specific requirements of your platform).
-
-There are three tags to use:
-\li <b>ASroute</b>: to define routes between two  <b>AS</b>
-\li <b>route</b>: to define routes between two <b>host/router</b>
-\li <b>bypassRoute</b>: to define routes between two <b>AS</b> that
-    will bypass default routing (as specified by the ``routing`` attribute
-    supplied to ``<AS>``, see above).
+\code{.xml}
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
+<platform version="4.1">
+  <zone id="first zone" routing="Full">
+    <!-- the resources -->
+    <host id="host1" speed="1Mf"/>
+    <host id="host2" speed="2Mf"/>
+    <link id="link1" bandwidth="125MBps" latency="100us"/>
+    <!-- the routing: specify how the hosts are interconnected -->
+    <route src="host1" dst="host2">
+      <link_ctn id="link1"/>
+    </route>
+  </zone>
+</platform>
+\endcode
 
+As we said, the englobing @ref pf_overview "&lt;platform&gt;" tag is
+used to specify the dtd version used for this file.
+
+Then, every resource (specified with @ref pf_tag_host, @ref
+pf_tag_link or others) must be located within a given **networking
+zone**.  Each zone is in charge of the routing between its
+resources. It means that when an host wants to communicate with
+another host of the same zone, it is the zone's duty to find the list
+of links that are involved in the communication. Here, since the @ref
+pf_tag_zone tag has **Full** as a **routing attribute**, all routes
+must be explicitely given using the @ref pf_tag_route and @ref
+pf_tag_linkctn tags (this @ref pf_rm "routing model" is both simple
+and inefficient :) It is OK to not specify the route between two
+hosts, as long as the processes located on them never try to
+communicate together.
+
+A zone can contain several zones itself, leading to a hierarchical
+decomposition of the platform. This can be more efficient (as the
+inter-zone routing gets factorized with @ref pf_tag_zoneroute), and
+allows to have more than one routing model in your platform. For
+example, you could have a coordinate-based routing for the WAN parts
+of your platforms, a full routing within each datacenter, and a highly
+optimized routing within each cluster of the datacenter.  In this
+case, determining the route between two given hosts gets @ref
+routing_basics "somewhat more complex" but SimGrid still computes
+these routes for you in a time- and space-efficient manner.
 Here is an illustration of these concepts:
 
-![An illustration of an AS hierarchy. Here, AS1 contains 5 other ASes who in turn may contain other ASes as well.](AS_hierarchy.png)
- Circles represent processing units and squares represent network routers. Bold
-    lines represent communication links. AS2 models the core of a national
-    network interconnecting a small flat cluster (AS4) and a larger
-    hierarchical cluster (AS5), a subset of a LAN (AS6), and a set of peers
-    scattered around the world (AS7).
-
-\section pf_pftags Resource description
-
-\subsection  pf_As Platform: The &lt;AS&gt; tag
-
-For historical reasons, the XML files use the expression AS for
-NetZones. Netzones are very important because they group other resources (such
-as routers/hosts) together (in fact, any such resource must be
-contained in a NetZone).
-
-Available attributes :
-
-Attribute name  | Mandatory | Values | Description
---------------- | --------- | ------ | -----------
-id              | yes       | String | The identifier of an AS; facilitates referring to this AS. ID must be unique.
-routing         | yes       | Full\| Floyd\| Dijkstra\| DijkstraCache\| None\| Vivaldi\| Cluster | See Section \ref pf_rm for details.
-
-
-<b>Example:</b>
-\code
-<AS id="AS0" routing="Full">
-   <host id="host1" speed="1000000000"/>
-   <host id="host2" speed="1000000000"/>
-   <link id="link1" bandwidth="125000000" latency="0.000100"/>
-   <route src="host1" dst="host2"><link_ctn id="link1"/></route>
-</AS>
-\endcode
-
-In this example, AS0 contains two hosts (host1 and host2). The route
-between the hosts goes through link1.
+![A hierarchy of networking zones.](AS_hierarchy.png)
 
-\subsection pf_Cr Computing resources: hosts, clusters and peers.
+Circles represent processing units and squares represent network
+routers. Bold lines represent communication links. The zone "AS2"
+models the core of a national network interconnecting a small flat
+cluster (AS4) and a larger hierarchical cluster (AS5), a subset of a
+LAN (AS6), and a set of peers scattered around the world (AS7).
 
-\subsubsection pf_host &lt;host&gt;
+\section pf_res Resource description
 
-A <b>host</b> represents a computer/node card. Every host is able to execute
-code and it can send and receive data to/from other hosts. Most importantly,
-a host can contain more than 1 core.
+\subsection pf_res_computing Computing Resources
 
-### Attributes: ###
+\subsubsection pf_tag_host &lt;host&gt;
 
-Attribute name  | Mandatory | Values | Description
---------------- | --------- | ------ | -----------
-id              | yes       | String | The identifier of the host. facilitates referring to this AS.
-speed           | yes       | double (must be > 0.0) | Computational power of every core of this host in FLOPS. Must be larger than 0.0.
-core            | no        | int (Default: 1) | The number of cores of this host. If more than one core is specified, the "speed" parameter refers to every core, i.e., the total computational power is no_of_cores*speed.<br /> If 6 cores are specified, up to 6 tasks can be executed without sharing the computational power; if more than 6 tasks are executed, computational power will be shared among these tasks. <br /> <b>Warning:</b> Although functional, this model was never scientifically assessed.
-availability_file| no       | string | (Relative or absolute) filename to use as input; must contain availability traces for this host. The syntax of this file is defined below. <br /> <b>Note:</b> The filename must be specified with your system's format.
-state_file      | no        | string |  Same mechanism as availability_file.<br /> <b>Note:</b> The filename must be specified with your system's format.
-coordinates     | no        | string | Must be provided when choosing the Vivaldi, coordinate-based routing model for the AS the host belongs to. More details can be found in the Section \ref pf_P2P_tags.
-pstate     | no        | double (Default: 0.0) | FIXME: Not yet documented.
+An host is the computing resource on which an actor can execute.
 
-### Possible children: ###
+Attribute         | Values                                 | Description
+----------------- | -------------------------------------- | -----------
+id                | String (mandatory)                     | The identifier of the host. facilitates referring to this AS.
+speed             | double (mandatory)                     | Computational power of every core of this host in FLOPS (must be positive)
+core              | int (defaults to 1)                    | Number of cores (see @ref howto_multicore)
+state             | optionally "OFF"                       | If set to OFF, the host is initially turned off.
+availability_file | File name (optional) | (Relative or absolute) filename to use as input; must contain availability traces for this host. The syntax of this file is defined below.
+state_file        | File name (optional) |  File to use as a state profile (see @ref howto_churn)
+coordinates       | String (mandatory when using Vivaldi routing) | The coordinates of this host (see @ref pf_P2P_tags).
+pstate     | Double (Defaults to 0) | FIXME: Not yet documented.
 
-Tag name        | Description | Documentation
-------------    | ----------- | -------------
-\<mount/\>        | Defines mounting points between some storage resource and the host. | \ref pf_storage_entity_mount
-\<prop/\>         | The prop tag allows you to define additional information on this host following the attribute/value schema. You may want to use it to give information to the tool you use for rendering your simulation, for example. | N/A
+#### Included tags ####
 
-### Example ###
+ - @ref pf_tag_mount Specifies the storages mounted on that host
+ - @ref pf_tag_prop Specifies a user-defined property of that host, that you can retrieve with MSG_host_get_property_value() or simgrid::s4u::Host::property().
 
-\verbatim
-   <host id="host1" speed="1000000000"/>
-   <host id="host2" speed="1000000000">
-       <prop id="color" value="blue"/>
-       <prop id="rendershape" value="square"/>
-   </host>
-\endverbatim
+#### Examples ####
 
+\code{.xml}
+<host id="host1" speed="1000000000"/>
+<host id="host2" speed="1000000000">
+   <prop id="color" value="blue"/>
+   <prop id="rendershape" value="square"/>
+</host>
+\endcode
 
 \anchor pf_host_dynamism
 ### Expressing dynamism ###
@@ -219,53 +175,7 @@ will start delivering 80\% of its power. In this example, this amounts to 400 Mf
 Since the periodicity in line 1 was set to be 1.0, i.e., 1 timestep, this host will
 continue to provide 500 Mflop/s from time 21. From time 32 it will provide 250 MFlop/s and so on.
 
-### Changing initial state ###
-
-It is also possible to specify whether the host is up or down by setting the
-``state`` attribute to either <b>ON</b> (default value) or <b>OFF</b>.
-
-#### Example: Expliciting the default value "ON" ####
-
-\verbatim
-<platform version="4">
-   <host id="bob" speed="500Gf" state="ON" />
-</platform>
-\endverbatim
-
-If you want this host to be unavailable, simply substitute ON with OFF.
-
-\anchor pf_host_churn
-### Expressing churn ###
-
-To express the fact that a host can change state over time (as in P2P
-systems, for instance), it is possible to use a file describing the time
-at which the host is turned on or off. An example of the content
-of such a file is presented below.
-
-#### Adding a state file ####
-
-\verbatim
-<platform version="4">
-  <host id="bob" power="500Gf" state_file="bob.fail" />
-</platform>
-\endverbatim
-
-#### Example of "bob.fail" file ####
-
-~~~{.py}
-  PERIODICITY 10.0
-  1.0 0
-  2.0 1
-~~~
-
-A zero value means <b>down</b> (i.e., OFF) while a positive one means <b>up and
-  running</b> (i.e., ON). From time 0.0 to time 1.0, the host is on as usual. At time 1.0, it is
-turned off and at time 2.0, it is turned on again until time 12 (2 plus the
-periodicity 10). It will be turned off again at time 13.0 until time 23.0, and
-so on.
-
-
-\subsubsection pf_cluster &lt;cluster&gt;
+\subsubsection pf_tag_cluster &lt;cluster&gt;
 
 ``<cluster />`` represents a machine-cluster. It is most commonly used
 when one wants to define many hosts and a network quickly. Technically,
@@ -319,7 +229,7 @@ suffix          | yes       | string | Each node of the cluster will be suffixed
 radical         | yes       | string | Regexp used to generate cluster nodes name. Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. The produced number is concatenated between prefix and suffix to form machine names.
 speed           | yes       | int    | Same as the ``speed`` attribute of the ``\<host\>`` tag.
 core            | no        | int (default: 1) | Same as the ``core`` attribute of the ``\<host\>`` tag.
-bw              | yes       | int    | Bandwidth for the links between nodes and backbone (if any). See the \ref pf_link "link section" for syntax/details.
+bw              | yes       | int    | Bandwidth for the links between nodes and backbone (if any). See the \ref pf_tag_link "link section" for syntax/details.
 lat             | yes       | int    | Latency for the links between nodes and backbone (if any). See <b>link</b> section for syntax/details.
 sharing_policy  | no        | string | Sharing policy for the links between nodes and backbone (if any). See <b>link</b> section for syntax/details.
 bb_bw           | no        | int    | Bandwidth for backbone (if any). See <b>link</b> section for syntax/details. If bb_bw and bb_lat (see below) attributes are omitted, no backbone is created (alternative cluster architecture <b>described before</b>).
@@ -369,7 +279,7 @@ c-99.me
     This tag is only available when the routing mode of the AS
     is set to ``Cluster``.
 
-The ``&lt;cabinet /&gt;`` tag is, like the \ref pf_cluster "&lt;cluster&gt;" tag,
+The ``&lt;cabinet /&gt;`` tag is, like the \ref pf_tag_cluster "&lt;cluster&gt;" tag,
 a meta-tag. This means that it is simply a shortcut for creating a set of (homogenous) hosts and links quickly;
 unsurprisingly, this tag was introduced to setup cabinets in data centers quickly. Unlike
 &lt;cluster&gt;, however, the &lt;cabinet&gt; assumes that you create the backbone
@@ -383,9 +293,9 @@ id              | yes       | string | The identifier of the cabinet. Facilitate
 prefix          | yes       | string | Each node of the cabinet has to have a name. This name will be prefixed with this prefix.
 suffix          | yes       | string | Each node of the cabinet will be suffixed with this suffix
 radical         | yes       | string | Regexp used to generate cabinet nodes name. Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. The produced number is concatenated between prefix and suffix to form machine names.
-speed           | yes       | int    | Same as the ``speed`` attribute of the \ref pf_host "&lt;host&gt;" tag.
-bw              | yes       | int    | Bandwidth for the links between nodes and backbone (if any). See the \ref pf_link "link section" for syntax/details.
-lat             | yes       | int    | Latency for the links between nodes and backbone (if any). See the \ref pf_link "link section" for syntax/details.
+speed           | yes       | int    | Same as the ``speed`` attribute of the \ref pf_tag_host "&lt;host&gt;" tag.
+bw              | yes       | int    | Bandwidth for the links between nodes and backbone (if any). See the \ref pf_tag_link "link section" for syntax/details.
+lat             | yes       | int    | Latency for the links between nodes and backbone (if any). See the \ref pf_tag_link "link section" for syntax/details.
 
 \note
     Please note that as of now, it is impossible to change attributes such as,
@@ -453,7 +363,7 @@ See the documentation of simgrid::kernel::routing::VivaldiZone for
 details on how the latency is computed from the coordinate, and on the
 the up and down bandwidth are used.
 
-\subsection pf_ne Network equipments: links and routers
+\subsection pf_ne Network equipments
 
 There are two tags at all times available to represent network entities and
 several other tags that are available only in certain contexts.
@@ -497,7 +407,7 @@ coordinates     | no        | string | Must be provided when choosing the Vivald
  <router id="gw_dc1_horizdist"/>
 \endverbatim
 
-\subsubsection pf_link &lt;link/&gt;
+\subsubsection pf_tag_link &lt;link&gt;
 
 Network links can represent one-hop network connections. They are
 characterized by their id and their bandwidth; links can (but may not) be subject
@@ -646,7 +556,6 @@ be adjusted to 0.01 (or 10ms) and one second later it will be set again to 1ms.
 value will not change until second 5, when the periodicity defined in line 1
 kicks in. It then loops back, starting at 100µs (the initial value) for one second.
 
-
 #### The ``<prop/>`` tag ####
 
 Similar to the ``<host>`` tag, a link may also contain the ``<prop/>`` tag; see the host
@@ -697,7 +606,7 @@ Entity name     | Description
 --------------- | -----------
 \ref pf_storage_entity_storage_type "storage_type"    | Defines a template for a particular kind of storage (such as a hard-drive) and specifies important features of the storage, such as capacity, performance (read/write), contents, ... Different models of hard-drives use different storage_types (because the difference between an SSD and an HDD does matter), as they differ in some specifications (e.g., different sizes or read/write performance).
 \ref pf_storage_entity_storage "storage"        | Defines an actual instance of a storage type (disk, RAM, ...); uses a ``storage_type`` template (see line above) so that you don't need to re-specify the same details over and over again.
-\ref pf_storage_entity_mount "mount"          | Must be wrapped by a \ref pf_host tag; declares which storage(s) this host has mounted and where (i.e., the mountpoint).
+\ref pf_tag_mount "mount"          | Must be wrapped by a \ref pf_tag_host tag; declares which storage(s) this host has mounted and where (i.e., the mountpoint).
 
 
 \anchor pf_storage_content_file
@@ -803,12 +712,9 @@ Here is a complete example for the ``storage_type`` tag:
 </storage_type>
 \endverbatim
 
-\anchor pf_storage_entity_storage
-#### &lt;storage&gt; ####
-
-``storage`` attributes:
+@subsubsection pf_tag_storage &lt;storage&gt; 
 
-Attribute name | Mandatory | Values | Description
+Attributes     | Mandatory | Values | Description
 -------------- | --------- | ------ | -----------
 id             | yes       | string | Identifier of this ``storage``; used when referring to it
 typeId         | yes       | string | Here you need to refer to an already existing \ref pf_storage_entity_storage_type "\<storage_type\>"; the storage entity defined by this tag will then inherit the properties defined there.
@@ -835,16 +741,14 @@ now specifies a new content file (so the contents will be different from Disk1)
 and the filesystem uses the windows style; finally, it is attached to a second host,
 called alice (which is again not defined here).
 
-\anchor pf_storage_entity_mount
-#### &lt;mount&gt; ####
+\subsubsection pf_tag_mount &lt;mount&gt;
 
-Attributes:
-| Attribute name   | Mandatory   | Values   | Description                                                                                               |
-| ---------------- | ----------- | -------- | -------------                                                                                             |
-| id               | yes         | string   | Refers to a \ref pf_storage_entity_storage "&lt;storage&gt;" entity that will be mounted on that computer |
-| name             | yes         | string   | Path/location to/of the logical reference (mount point) of this disk
+| Attribute   | Mandatory   | Values   | Description                                                                                               |
+| ----------- | ----------- | -------- | -------------                                                                                             |
+| id          | yes         | string   | Refers to a \ref pf_storage_entity_storage "&lt;storage&gt;" entity that will be mounted on that computer |
+| name        | yes         | string   | Path/location to/of the logical reference (mount point) of this disk
 
-This tag must be enclosed by a \ref pf_host tag. It then specifies where the mountpoint of a given storage device (defined by the ``id`` attribute)
+This tag must be enclosed by a \ref pf_tag_host tag. It then specifies where the mountpoint of a given storage device (defined by the ``id`` attribute)
 is; this location is specified by the ``name`` attribute.
 
 Here is a simple example, taken from the file ``examples/platform/storage.xml``:
@@ -962,6 +866,31 @@ are all calculating shortest paths. They do require some time to converge, but
 eventually, when the routing tables have stabilized, your packets will follow
 the shortest paths.
 
+\subsection  pf_tag_zone &lt;zone&gt;
+
+Before SimGrid v3.16, networking zones used to be called Autonomous
+Systems, but this was misleading as zones may include other zones in a
+hierarchical manner. If you find any remaining reference to ASes,
+please report this as a bug.
+
+Attribute   | Value                                             | Description
+----------- | ------------------------------------------------- | ----------------------------------------------
+id          | String (mandatory)                                | The identifier of this zone (must be unique)
+routing     | One of the existing routing algorithm (mandatory) | See Section \ref pf_rm for details.
+
+<b>Example:</b>
+\code
+<AS id="AS0" routing="Full">
+   <host id="host1" speed="1000000000"/>
+   <host id="host2" speed="1000000000"/>
+   <link id="link1" bandwidth="125000000" latency="0.000100"/>
+   <route src="host1" dst="host2"><link_ctn id="link1"/></route>
+</AS>
+\endcode
+
+In this example, AS0 contains two hosts (host1 and host2). The route
+between the hosts goes through link1.
+
 \subsection pf_rm Routing models
 
 For each AS, you must define explicitly which routing model will
@@ -1138,7 +1067,7 @@ routing model (the path is given relative to SimGrid's source directory):
 
 | Name                                     | Description                                                                                                                         |
 | ---------------------------------------- | ------------------------------------------------------------------------------                                                      |
-| \ref pf_routing_model_cluster "Cluster"  | This is specific to the \ref pf_cluster "&lt;cluster/&gt;" tag and should not be used by the user, as several assumptions are made. |
+| \ref pf_routing_model_cluster "Cluster"  | This is specific to the \ref pf_tag_cluster "&lt;cluster/&gt;" tag and should not be used by the user, as several assumptions are made. |
 | \ref pf_routing_model_none    "None"     | No routing at all. Unless you know what you're doing, avoid using this mode in combination with a non-constant network model.       |
 | \ref pf_routing_model_vivaldi "Vivaldi"  | Perfect when you want to use coordinates. Also see the corresponding \ref pf_P2P_tags "P2P section" below.                          |
 
@@ -1163,7 +1092,7 @@ available within this model and if you try to communicate within the AS that
 uses this model, SimGrid will fail unless you have explicitly activated the
 \ref options_model_select_network_constant "Constant Network Model" (this model charges
 the same for every single communication). It should
-be noted, however, that you can still attach an \ref pf_routing_tag_asroute "ASroute",
+be noted, however, that you can still attach an \ref pf_tag_asroute "ASroute",
 as is demonstrated in the example below:
 
 \verbinclude platforms/cluster_and_one_host.xml
@@ -1201,10 +1130,10 @@ There are currently four different ways to define routes:
 
 | Name                                              | Description                                                                         |
 | ------------------------------------------------- | ----------------------------------------------------------------------------------- |
-| \ref pf_routing_tag_route "route"                 | Used to define route between host/router                                            |
-| \ref pf_routing_tag_asroute "ASroute"             | Used to define route between different AS                                           |
-| \ref pf_routing_tag_bypassroute "bypassRoute"     | Used to supersede normal routes as calculated by the network model between host/router; e.g., can be used to use a route that is not the shortest path for any of the shortest-path routing models. |
-| \ref pf_routing_tag_bypassasroute "bypassASroute"  | Used in the same way as bypassRoute, but for AS                                     |
+| \ref pf_tag_route "route"                 | Used to define route between host/router                                            |
+| \ref pf_tag_zoneroute "zoneRoute"             | Used to define route between different zones                                           |
+| \ref pf_tag_bypassroute "bypassRoute"     | Used to supersede normal routes as calculated by the network model between host/router; e.g., can be used to use a route that is not the shortest path for any of the shortest-path routing models. |
+| \ref pf_tag_bypassasroute "bypassZoneRoute"  | Used in the same way as bypassRoute, but for zones                                     |
 
 Basically all those tags will contain an (ordered) list of references
 to link that compose the route you want to define.
@@ -1220,14 +1149,14 @@ Consider the example below:
 \endverbatim
 
 The route here from host Alice to Bob will be first link1, then link2,
-and finally link3. What about the reverse route? \ref pf_routing_tag_route "Route" and
-\ref pf_routing_tag_asroute "ASroute" have an optional attribute \c symmetrical, that can
+and finally link3. What about the reverse route? \ref pf_tag_route "Route" and
+\ref pf_tag_zoneroute "ASroute" have an optional attribute \c symmetrical, that can
 be either \c YES or \c NO. \c YES means that the reverse route is the same
 route in the inverse order, and is set to \c YES by default. Note that
 this is not the case for bypass*Route, as it is more probable that you
 want to bypass only one default route.
 
-For an \ref pf_routing_tag_asroute "ASroute", things are just slightly more complicated, as you have
+For an \ref pf_tag_zoneroute "ASroute", things are just slightly more complicated, as you have
 to give the id of the gateway which is inside the AS you want to access ... 
 So it looks like this:
 
@@ -1243,11 +1172,11 @@ it means that it must pass through router1 to get out of the AS, then
 pass through link1, and get into AS2 by being received by router2.
 router1 must belong to AS1 and router2 must belong to AS2.
 
-\subsubsection pf_linkctn &lt;link_ctn/&gt;
+\subsubsection pf_tag_linkctn &lt;link_ctn&gt;
 
 This entity has only one purpose: Refer to an already existing
-\ref pf_link "&lt;link/&gt;" when defining a route, i.e., it
-can only occur as a child of \ref pf_routing_tag_route "&lt;route/&gt;"
+\ref pf_tag_link "&lt;link/&gt;" when defining a route, i.e., it
+can only occur as a child of \ref pf_tag_route "&lt;route/&gt;"
 
 | Attribute name  | Mandatory | Values | Description                                                   |
 | --------------- | --------- | ------ | -----------                                                   |
@@ -1261,7 +1190,7 @@ entity (the path is given relative to SimGrid's source directory):
 
 \verbinclude example_filelist_xmltag_linkctn
 
-\subsubsection pf_routing_tag_asroute ASroute
+\subsubsection pf_tag_zoneroute &lt;zoneRoute&gt;
 
 The purpose of this entity is to define a route between two ASes.
 This is mainly useful when you're in the \ref pf_routing_model_full "Full routing model".
@@ -1272,7 +1201,7 @@ This is mainly useful when you're in the \ref pf_routing_model_full "Full routin
 | --------------- | --------- | ------ | -----------                                                                                                                                |
 | src             | yes       | String | The identifier of the source AS                                                                                                            |
 | dst             | yes       | String | See the \c src attribute                                                                                                                   |
-| gw_src          | yes       | String | The gateway that will be used within the src AS; this can be any \ref pf_host "Host" or \ref pf_router "Router" defined within the src AS. |
+| gw_src          | yes       | String | The gateway that will be used within the src AS; this can be any \ref pf_tag_host "Host" or \ref pf_router "Router" defined within the src AS. |
 | gw_dst          | yes       | String | Same as \c gw_src, but with the dst AS instead.                                                                                            |
 | symmetrical     | no        | YES\|NO (Default: YES) | If this route is symmetric, the opposite route (from dst to src) will also be declared implicitly.               | 
 
@@ -1303,12 +1232,12 @@ This is mainly useful when you're in the \ref pf_routing_model_full "Full routin
 </AS>
 \endverbatim
 
-\subsubsection pf_routing_tag_route route 
+\subsubsection pf_tag_route &lt;route&gt; 
 
 The principle is the same as for 
-\ref pf_routing_tag_asroute "ASroute": The route contains a list of links that
+\ref pf_tag_zoneroute "ASroute": The route contains a list of links that
 provide a path from \c src to \c dst. Here, \c src and \c dst can both be either a 
-\ref pf_host "host" or \ref pf_router "router".  This is mostly useful for the 
+\ref pf_tag_host "host" or \ref pf_router "router".  This is mostly useful for the 
 \ref pf_routing_model_full "Full routing model" as well as for the 
 \ref pf_routing_model_shortest_path "shortest-paths" based models (as they require 
 topological information).
@@ -1342,7 +1271,7 @@ A route in the \ref pf_routing_model_shortest_path "Shortest-Path routing model"
     (network-)graph and the employed algorithms need to know which edge connects
     which pair of entities.
 
-\subsubsection pf_routing_tag_bypassasroute bypassASroute
+\subsubsection pf_tag_bypassasroute bypassASroute
 
 As said before, once you choose
 a model, it (most likely; the constant network model, for example, doesn't) calculates routes for you. But maybe you want to
@@ -1379,7 +1308,7 @@ connects the router \c my_cluster_1_router in the source cluster to the router
 \c my_cluster_2_router in the destination router. Additionally, as the \c symmetrical
 attribute was not given, this route is presumed to be symmetrical.
 
-\subsubsection pf_routing_tag_bypassroute bypassRoute
+\subsubsection pf_tag_bypassroute bypassRoute
 
 As said before, once you choose
 a model, it (most likely; the constant network model, for example, doesn't) calculates routes for you. But maybe you want to
@@ -1479,93 +1408,67 @@ information to SimGrid. Here is a file doing it all :
 </AS>
 \endverbatim
 
-\section pf_other_tags Tags not (directly) describing the platform
+\section pf_other Other tags
 
 The following tags can be used inside a \<platform\> tag even if they are not
 directly describing the platform:
-\li \ref pf_config "config": it allows you to pass some configuration stuff like, for
-    example, the network model and so on. It follows the
-\li \ref pf_include "include": allows you to include another file into the current one.
 
-\subsection pf_config config
+  - @ref pf_tag_config passes configuration options, e.g. to change the network model;
+  - @ref pf_tag_prop gives user-defined properties to various elements
 
-The only purpose of this tag is to contain the \c prop tags, as described below.
-These tags will then configure the options as described by Section \ref options.
-(See the example)
+\subsection pf_tag_config &lt;config&gt;
 
-#### Attributes ####
+Adding configuration flags into the platform file is particularly
+useful when the described platform is best used with specific
+flags. For example, you could finely tune SMPI in your platform file directly.
 
-| Attribute name  | Mandatory | Values                  | Description                                                                                                  |
-| --------------- | --------- | ----------------------  | -----------                                                                                                  |
-| id              | yes       | String                  | The identifier of the config tag when referring to id; this is basically useless, though.                    |
+| Attribute  | Values              | Description                                    |
+| ---------- | ------------------- | ---------------------------------------------- |
+| id         | String (optional)   | This optional identifier is ignored by SimGrid |
 
-#### Possible children ####
+* **Included tags:** @ref pf_tag_prop to specify a given configuration item (see @ref options).
 
-Tag name        | Description | Documentation
-------------    | ----------- | -------------
-\<prop/\>       | The prop tag allows you to define different configuration options following the attribute/value schema. See the \ref options page. | N/A
+Any such configuration must be given at the very top of the platform file.
 
-#### Example ####
+* **Example**
 
 \verbatim
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
 <platform version="4">
-<config id="General">
-       <prop id="maxmin/precision" value="0.000010"></prop>
-       <prop id="cpu/optim" value="TI"></prop>
-       <prop id="host/model" value="compound"></prop>
-       <prop id="network/model" value="SMPI"></prop>
-       <prop id="path" value="~/"></prop>
-       <prop id="smpi/bw-factor" value="65472:0.940694;15424:0.697866;9376:0.58729"></prop>
+<config>
+       <prop id="maxmin/precision" value="0.000010" />
+       <prop id="cpu/optim" value="TI" />
+       <prop id="network/model" value="SMPI" />
+       <prop id="smpi/bw-factor" value="65472:0.940694;15424:0.697866;9376:0.58729" />
 </config>
 
 <AS  id="AS0"  routing="Full">
 ...
 \endverbatim
 
-\subsection pf_include include
+\subsection pf_tag_prop &lt;prop&gt;
 
-Even if it can be used in other contexts, this tag was originally created
-to be used with \ref pf_trace. The idea was to have a file describing the
-platform, and another file attaching traces of a given period to the platform.
+Defines a user-defined property, identified with a name and having a
+value. You can specify such properties to most kind of resources:
+@ref pf_tag_zone, @ref pf_tag_host, @ref pf_tag_storage,
+@ref pf_tag_cluster and @ref pf_tag_link. These values can be retrieved
+at runtime with MSG_zone_property() or simgrid::s4u::NetZone::property(),
+or similar functions.
 
-The drawback is that the file chuncks that will be included do not
-constitute valid XML files. This may explain why this feature was never really
-used in practice (as far as we know). Other mechanisms, such as the ability to load
-several platform files one after the other, could be considered in the future.
-
-In the meanwhile, the \c include tag allows you to import other platforms into your
-local file. This is done with the intention to help people
-combine their different AS and provide new platforms. Those files
-should contain XML that consists of 
-\ref pf_include "include", \ref pf_cluster "cluster", \ref pf_peer "peer", \ref pf_As "AS", \ref pf_trace "trace", \ref pf_trace "tags".
-
-Do not forget to close the tag to make it work, or you will end up with an invalid XML file.
-
-#### Attributes ####
-
-| Attribute name  | Mandatory | Values                  | Description                                                                                                  |
-| --------------- | --------- | ----------------------  | -----------                                                                                                  |
-| file            | yes       | String                  | Filename of the path you want to include with either relative or absolute path. |
+| Attribute | Values                  | Description                                                                               |
+| --------- | ----------------------  | ----------------------------------------------------------------------------------------- |
+| id        | String (mandatory)      | Identifier of this property. Must be unique for a given property holder, eg host or link. |
+| value     | String (mandatory)      | Value of this property; The semantic is completely up to you.                             |
 
+* **Included tags:** none.
 
 #### Example ####
 
-The following example includes two files, clusterA.xml and clusterB.xml and
-combines them two one platform file; all hosts, routers etc. defined in 
-each of them will then be usable.
+\code{.xml}
+<prop id="Operating System" value="Linux" />
+\endcode
 
-\verbatim
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-       <AS id="main" routing="Full">
-               <include file="clusterA.xml"></include>
-               <include file="clusterB.xml"></include>
-       </AS>
-</platform>
-\endverbatim
 
 \subsection pf_trace trace and trace_connect
 
@@ -1602,7 +1505,7 @@ entity.
 | --------------- | --------- | ---------------------- | -----------                                                                                       |
 | id              | yes       | String                 | Identifier of this trace; this is the name you pass on to \c trace_connect.                       |
 | file            | no        | String                 | Filename of the file that contains the information - the path must follow the style of your OS. You can omit this, but then you must specifiy the values inside of &lt;trace&gt; and &lt;/trace&gt; - see the example below. |
-| trace_periodicity | yes | String | This is the same as for \ref pf_host "hosts" (see there for details) |
+| trace_periodicity | yes | String | This is the same as for \ref pf_tag_host "hosts" (see there for details) |
 
 Here is an example  of trace when no file name is provided:
 
@@ -1630,7 +1533,7 @@ are some best practices you should pay attention to in order to
 produce good platform and some choices you can make in order to have
 faster simulations. Here's some hints and tips, then.
 
-@subsection Finding the platform example that you need
+@subsection pf_hints_search Finding the platform example that you need
 
 Most platform files that we ship are in the @c examples/platforms
 folder. The good old @c grep tool can find the examples you need when
index 4746b97..a9fe036 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="master">
      <argument value="20"/>       <!-- Number of tasks -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="1000000"/>   <!-- Communication size of tasks -->
      <argument value="Ginette"/>  <!-- Third worker -->
      <argument value="Bourassa"/> <!-- Last worker -->
      <argument value="Tremblay"/> <!-- Me! I can work too! -->
-  </process>
-  <!-- The worker process (with no argument) -->
-  <process host="Tremblay" function="worker" on_failure="RESTART"/>
-  <process host="Jupiter" function="worker" on_failure="RESTART"/>
-  <process host="Fafard" function="worker" on_failure="RESTART"/>
-  <process host="Ginette" function="worker" on_failure="RESTART"/>
-  <process host="Bourassa" function="worker" on_failure="RESTART"/>
+  </actor>
+  <!-- The worker actor (with no argument) -->
+  <actor host="Tremblay" function="worker" on_failure="RESTART"/>
+  <actor host="Jupiter" function="worker" on_failure="RESTART"/>
+  <actor host="Fafard" function="worker" on_failure="RESTART"/>
+  <actor host="Ginette" function="worker" on_failure="RESTART"/>
+  <actor host="Bourassa" function="worker" on_failure="RESTART"/>
 </platform>
index 04dd2eb..2286d86 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="master">
      <argument value="20"/>       <!-- Number of tasks -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="1000000"/>   <!-- Communication size of tasks -->
-  </process>
+  </actor>
 </platform>
index de5170e..99a9fca 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <actor host="Tremblay" function="master">
      <argument value="3600"/>      <!-- Simulation timeout -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="1000000"/>   <!-- Communication size of tasks -->
-  </process>
+  </actor>
 </platform>
index 3c86f5b..c602a27 100644 (file)
@@ -1,19 +1,19 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <actor host="Tremblay" function="master">
      <argument value="3600"/>      <!-- Simulation timeout -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="10"/>   <!-- Communication size of tasks -->
-  </process>
-  <process host="Fafard" function="master">
+  </actor>
+  <actor host="Fafard" function="master">
      <argument value="3600"/>      <!-- Simulation timeout -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="10"/>   <!-- Communication size of tasks -->
-  </process>
-  <process host="Jupiter" function="master">
+  </actor>
+  <actor host="Jupiter" function="master">
      <argument value="3600"/>      <!-- Simulation timeout -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="10"/>   <!-- Communication size of tasks -->
-  </process>
+  </actor>
 </platform>
index 6afc3c8..adbb7cb 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="griffon-1.nancy.grid5000.fr" function="master"> <!-- griffon-1.nancy.grid5000.fr peer-0 cb1-1.dc1.acloud.com-->
+<platform version="4.1">
+  <actor host="griffon-1.nancy.grid5000.fr" function="master"> <!-- griffon-1.nancy.grid5000.fr peer-0 cb1-1.dc1.acloud.com-->
      <argument value="3600"/>      <!-- Simulation timeout -->
      <argument value="50000000"/>  <!-- Computation size of tasks -->
      <argument value="100000"/>   <!-- Communication size of tasks -->
-  </process>
+  </actor>
 </platform>
index 0bdc770..3a2e19e 100644 (file)
@@ -624,10 +624,9 @@ public class Peer extends Process {
   }
 
   private String getStatus() {
-    String s = "";
-    for (int i = 0; i < Common.FILE_PIECES; i++) {
-      s = s + bitfield[i];
-    }
-    return s;
+    StringBuilder s = new StringBuilder("");
+    for (int i = 0; i < Common.FILE_PIECES; i++)
+      s.append(bitfield[i]);
+    return s.toString();
   }
 }
index e65416f..df70dfb 100644 (file)
@@ -1,39 +1,39 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 
-  <process host="node-0.acme.org" function="app.bittorrent.Tracker">
+  <actor host="node-0.acme.org" function="app.bittorrent.Tracker">
     <argument value="3000" />
-  </process>
+  </actor>
 
-  <process host="node-1.acme.org" function="app.bittorrent.Peer">
+  <actor host="node-1.acme.org" function="app.bittorrent.Peer">
     <argument value="00000002"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
     <argument value="1" />       <!-- indicates if the app.bittorrent.Peer is a seed at the beginning of the simulation --> 
-  </process>
-  <process host="node-2.acme.org" function="app.bittorrent.Peer">
+  </actor>
+  <actor host="node-2.acme.org" function="app.bittorrent.Peer">
     <argument value="00000003"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
-  <process host="node-3.acme.org" function="app.bittorrent.Peer">
+  </actor>
+  <actor host="node-3.acme.org" function="app.bittorrent.Peer">
     <argument value="00000004"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
-  <process host="node-4.acme.org" function="app.bittorrent.Peer">
+  </actor>
+  <actor host="node-4.acme.org" function="app.bittorrent.Peer">
     <argument value="00000005"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
     <argument value="1" />       <!-- indicates if the app.bittorrent.Peer is a seed at the beginning of the simulation --> 
-  </process>
-  <process host="node-5.acme.org" function="app.bittorrent.Peer">
+  </actor>
+  <actor host="node-5.acme.org" function="app.bittorrent.Peer">
     <argument value="00000006"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
-  <process host="node-6.acme.org" function="app.bittorrent.Peer">
+  </actor>
+  <actor host="node-6.acme.org" function="app.bittorrent.Peer">
     <argument value="00000007"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
-  <process host="node-7.acme.org" function="app.bittorrent.Peer">
+  </actor>
+  <actor host="node-7.acme.org" function="app.bittorrent.Peer">
     <argument value="00000008"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
+  </actor>
 </platform>
index 78bfef9..43ed0cf 100644 (file)
@@ -16,13 +16,13 @@ public class Node extends Process {
   public Node(Host host, String name, String[]args) {
    super(host,name,args);
   }
-  public void request(double CStime) throws MsgException {
+  public void request(double csTime) throws MsgException {
     RequestTask req = new RequestTask(getName());
     Msg.info("Send a request to the coordinator");
     req.send("coordinator");
     Msg.info("Wait for a grant from the coordinator");
     GrantTask.receive(getName());
-    Task compute = new Task("CS", CStime, 0);
+    Task compute = new Task("CS", csTime, 0);
     compute.execute();
     ReleaseTask release = new ReleaseTask();
     release.send("coordinator");
index 4d4bcb8..da816b5 100644 (file)
@@ -1,15 +1,15 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="app.centralizedmutex.Coordinator">
+<platform version="4.1">
+  <actor host="Tremblay" function="app.centralizedmutex.Coordinator">
     <argument value="2"/> <!-- Amount of CS to serve -->
-  </process>
-  <process host="Jupiter" function="app.centralizedmutex.Node">
+  </actor>
+  <actor host="Jupiter" function="app.centralizedmutex.Node">
     <argument value="2"/> <!-- initial sleep time -->
     <argument value="5"/> <!-- CS time -->
-  </process>
-  <process host="Fafard" function="app.centralizedmutex.Node">
+  </actor>
+  <actor host="Fafard" function="app.centralizedmutex.Node">
     <argument value="2"/> <!-- initial sleep time -->
     <argument value="5"/> <!-- CS time -->
-  </process>
+  </actor>
 </platform>
index f632a5d..0a96f6c 100644 (file)
@@ -1,32 +1,32 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Jacquelin" function="app.masterworker.Master">
+<platform version="4.1">
+  <actor host="Jacquelin" function="app.masterworker.Master">
     <argument value="5"/>     <!-- Amount of tasks to dispatch -->
     <argument value="50000"/> <!-- Computation size of each task -->
     <argument value="10"/>    <!-- Communication size of each one -->
     <argument value="7"/>     <!-- Amount of workers waiting for orders -->
-  </process>
+  </actor>
 
-  <process host="Tremblay" function="app.masterworker.Worker">
+  <actor host="Tremblay" function="app.masterworker.Worker">
     <argument value="0"/>  <!-- Input mailbox -->
-  </process>
-  <process host="Fafard" function="app.masterworker.Worker">
+  </actor>
+  <actor host="Fafard" function="app.masterworker.Worker">
     <argument value="1"/>  <!-- Input mailbox -->
-  </process>
-  <process host="Bourassa" function="app.masterworker.Worker">
+  </actor>
+  <actor host="Bourassa" function="app.masterworker.Worker">
     <argument value="2"/>  <!-- Input mailbox -->
-  </process>
-  <process host="Boivin" function="app.masterworker.Worker">
+  </actor>
+  <actor host="Boivin" function="app.masterworker.Worker">
     <argument value="3"/>  <!-- Input mailbox -->
-  </process>
-  <process host="Ginette" function="app.masterworker.Worker">
+  </actor>
+  <actor host="Ginette" function="app.masterworker.Worker">
     <argument value="4"/>  <!-- Input mailbox -->
-  </process>
-  <process host="Jupiter" function="app.masterworker.Worker">
+  </actor>
+  <actor host="Jupiter" function="app.masterworker.Worker">
     <argument value="5"/>  <!-- Input mailbox -->
-  </process>
-  <process host="Jacquelin" function="app.masterworker.Worker">
+  </actor>
+  <actor host="Jacquelin" function="app.masterworker.Worker">
     <argument value="6"/>  <!-- Input mailbox -->
-  </process>
+  </actor>
 </platform>
index 089ec45..b9955d4 100644 (file)
@@ -17,7 +17,7 @@ public class Receiver extends Process {
        }
 
        public void main(String[] args) throws MsgException {
-               for (int i = 0 ; i<Main.TASK_COUNT; i++) {
+               for (int i = 0 ; i < Main.TASK_COUNT; i++) {
                        Msg.info("Wait for a task");
 
                        PingPongTask task = (PingPongTask)Task.receive(getHost().getName());
index 39875d4..2434d41 100644 (file)
@@ -1,62 +1,62 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-0.acme.org" function="dht.chord.Node">
+<platform version="4.1">
+  <actor host="node-0.acme.org" function="dht.chord.Node">
     <argument value="42"/>
     <argument value="6000000"/>
-  </process>
-  <process host="node-1.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-1.acme.org" function="dht.chord.Node">
     <argument value="366680" />
     <argument value="42" />
     <argument value="10" />
     <argument value="6000000" />
-  </process>
-  <process host="node-2.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-2.acme.org" function="dht.chord.Node">
     <argument value="533744" />
     <argument value="366680" />
     <argument value="20" />
     <argument value="6000000" />
-  </process>
-  <process host="node-3.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-3.acme.org" function="dht.chord.Node">
     <argument value="1319738" />
     <argument value="42" />
     <argument value="30" />
     <argument value="6000000" />
-  </process>
-  <process host="node-4.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-4.acme.org" function="dht.chord.Node">
     <argument value="16509405" />
     <argument value="366680" />
     <argument value="40" />
     <argument value="6000000" />
-  </process>
-  <process host="node-5.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-5.acme.org" function="dht.chord.Node">
     <argument value="10874876" />
     <argument value="533744" />
     <argument value="50" />
     <argument value="6000000" />
-  </process>
-  <process host="node-6.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-6.acme.org" function="dht.chord.Node">
     <argument value="16728096" />
     <argument value="1319738" />
     <argument value="60" />
     <argument value="6000000" />
-  </process>
-  <process host="node-7.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-7.acme.org" function="dht.chord.Node">
     <argument value="10004760" />
     <argument value="16509405" />
     <argument value="70" />
     <argument value="6000000" />
-  </process>
-  <process host="node-8.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-8.acme.org" function="dht.chord.Node">
     <argument value="6518808" />
     <argument value="42" />
     <argument value="80" />
     <argument value="6000000" />
-  </process>
-  <process host="node-9.acme.org" function="dht.chord.Node">
+  </actor>
+  <actor host="node-9.acme.org" function="dht.chord.Node">
     <argument value="2015253" />
     <argument value="1319738" />
     <argument value="90" />
     <argument value="6000000" />
-  </process>
+  </actor>
 </platform>
index 1421529..a18bc2a 100644 (file)
@@ -16,7 +16,7 @@ public class Answer {
 
   public Answer(int destinationId) {
     this.destinationId = destinationId;
-    nodes = new ArrayList<Contact>();
+    nodes = new ArrayList<>();
   }
 
   int getDestinationId() {
index 381cf38..8af5cc5 100644 (file)
@@ -13,7 +13,7 @@ public class Common {
 
   public static final int RANDOM_LOOKUP_INTERVAL = 100;
 
-  public static final int alpha = 3;
+  public static final int ALPHA = 3;
 
   public static final int IDENTIFIER_SIZE = 32;
   /* Maximum size of the buckets */
index 4e46ba0..841e9d1 100644 (file)
@@ -57,16 +57,16 @@ public class Node extends Process {
   }
 
   public void mainLoop() {
-    double next_lookup_time = Msg.getClock() + Common.RANDOM_LOOKUP_INTERVAL;
+    double nextLookupTime = Msg.getClock() + Common.RANDOM_LOOKUP_INTERVAL;
     while (Msg.getClock() < this.deadline) {
       try {
         if (comm == null) {
           comm = Task.irecv(Integer.toString(id));
         }
         if (!comm.test()) {
-          if (Msg.getClock() >= next_lookup_time) {
+          if (Msg.getClock() >= nextLookupTime) {
             randomLookup();
-            next_lookup_time += Common.RANDOM_LOOKUP_INTERVAL;
+            nextLookupTime += Common.RANDOM_LOOKUP_INTERVAL;
           } else {
             waitFor(1);
           }
@@ -275,7 +275,7 @@ public class Node extends Process {
   public int sendFindNodeToBest(Answer nodeList) {
     int destination = nodeList.getDestinationId();
     int i;
-    for (i = 0; i < Common.alpha && i < nodeList.size(); i++) {
+    for (i = 0; i < Common.ALPHA && i < nodeList.size(); i++) {
       Contact node = nodeList.getNodes().get(i);
       if (node.getId() != this.id) {
         this.sendFindNode(node.getId(),destination);
index 9dc08f8..c5f88b2 100644 (file)
@@ -18,7 +18,7 @@ public class RoutingTable {
 
   public RoutingTable(int id) {
     this.id = id;
-    buckets = new Vector<Bucket>();
+    buckets = new Vector<>();
     for (int i = 0; i < Common.IDENTIFIER_SIZE + 1; i++) {
       buckets.add(new Bucket(i));
     }
@@ -102,12 +102,12 @@ public class RoutingTable {
 
   @Override
   public String toString() {
-    String string = "RoutingTable [ id=" + id + " " ;
+    StringBuilder string = new StringBuilder("RoutingTable [ id=" + id + " ");
     for (int i = 0; i < buckets.size(); i++) {
       if (buckets.get(i).size() > 0) {
-        string += buckets.get(i) + " ";
+        string.append(buckets.get(i) + " ");
       }
     }
-    return string;
+    return string.toString();
   }
 }
index 2b113e8..748558f 100644 (file)
@@ -1,27 +1,27 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 
-  <process host="node-0.acme.org" function="dht.kademlia.Node">
+  <actor host="node-0.acme.org" function="dht.kademlia.Node">
     <argument value="0"/>        <!-- my id -->
     <argument value ="900"/>     <!-- deadline -->
-  </process>
+  </actor>
 
-  <process host="node-1.acme.org" function="dht.kademlia.Node">
+  <actor host="node-1.acme.org" function="dht.kademlia.Node">
     <argument value="1"/>        <!-- my id -->
     <argument value="0"/>        <!-- known id -->
     <argument value ="900"/>     <!-- deadline -->
-  </process>
+  </actor>
 
-  <process host="node-2.acme.org" function="dht.kademlia.Node">
+  <actor host="node-2.acme.org" function="dht.kademlia.Node">
     <argument value="2"/>        <!-- my id -->
     <argument value="0"/>        <!-- known id -->
     <argument value ="900"/>     <!-- deadline -->
-  </process>
+  </actor>
 
-  <process host="node-3.acme.org" function="dht.kademlia.Node">
+  <actor host="node-3.acme.org" function="dht.kademlia.Node">
     <argument value="4"/>        <!-- my id -->
     <argument value="0"/>        <!-- known id -->
     <argument value ="900"/>     <!-- deadline -->
-  </process>
+  </actor>
 </platform>
index 3ac36da..e318036 100644 (file)
@@ -10,9 +10,6 @@ import org.simgrid.msg.Msg;
 import org.simgrid.msg.MsgException;
 
 public class Main {
-  public static final double task_comp_size = 10;
-  public static final double task_comm_size = 10;
-  public static final int hostNB = 2 ; 
   private Main() {
     throw new IllegalAccessError("Utility class");
   }
index df9e214..82ce689 100644 (file)
@@ -26,10 +26,10 @@ import org.simgrid.msg.HostNotFoundException;
 import org.simgrid.msg.MsgException;
 
 public class Node extends Process {
-  private static String FILENAME1 = "/doc/simgrid/examples/platforms/g5k.xml";
-  private static String FILENAME2 = "\\Windows\\setupact.log";
-  private static String FILENAME3 = "/doc/simgrid/examples/platforms/g5k_cabinets.xml";
-  private static String FILENAME4 = "/doc/simgrid/examples/platforms/nancy.xml";
+  private static String file1 = "/doc/simgrid/examples/platforms/g5k.xml";
+  private static String file2 = "\\Windows\\setupact.log";
+  private static String file3 = "/doc/simgrid/examples/platforms/g5k_cabinets.xml";
+  private static String file4 = "/doc/simgrid/examples/platforms/nancy.xml";
 
   protected int rank;
 
@@ -40,42 +40,42 @@ public class Node extends Process {
 
   public void main(String[] args) throws MsgException {
     String mount;
-    String filename;
+    String fileName;
     switch (rank) {
       case 4:
         mount = "/home";
-        filename = mount + FILENAME1;
+        fileName = mount + file1;
       break;
       case 0:
         mount = "c:";
-        filename = mount + FILENAME2;
+        fileName = mount + file2;
       break;
       case 2:
         mount = "/home";
-        filename = mount + FILENAME3;
+        fileName = mount + file3;
       break;
       case 1:
         mount = "/home";
-        filename = mount + FILENAME4;
+        fileName = mount + file4;
       break;
       default:
         mount = "/home";
-        filename = mount + FILENAME1;
+        fileName = mount + file1;
     }
 
-    Msg.info("Open file " + filename);
-    File file = new File(filename);
+    Msg.info("Open file " + fileName);
+    File file = new File(fileName);
 
     long read = file.read(10000,1);
-    Msg.info("Having read " + read + " on " + filename);
+    Msg.info("Having read " + read + " on " + fileName);
 
     long write = file.write(100000,1);
-    Msg.info("Having write " + write + " on " + filename);
+    Msg.info("Having write " + write + " on " + fileName);
 
-    Msg.info("Seek back to the beginning of " + filename);
+    Msg.info("Seek back to the beginning of " + fileName);
     file.seek(0,File.SEEK_SET);
 
     read = file.read(150000,1);
-    Msg.info("Having read " + read + " on " + filename);  
+    Msg.info("Having read " + read + " on " + fileName);  
   }
 }
index 18b0645..c82af1d 100644 (file)
@@ -35,6 +35,8 @@ public class Killer extends Process {
     poorVictim.kill();
 
     Msg.info("Ok, goodbye now.");
-    exit(); // This would be more useful if not placed on the last line
+    // The actor can also commit a suicide with the following command
+    exit(); // This will forcefully stop the current actor
+    // Of course, it's not useful here at the end of the main function, but that's for the example (and to check that this still works in the automated tests)
   }
 }
index 6389686..dc3c969 100644 (file)
@@ -1,22 +1,22 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-0.acme.org" function="process.startkilltime.Sleeper" start_time="0" kill_time="5">
+<platform version="4.1">
+  <actor host="node-0.acme.org" function="process.startkilltime.Sleeper" start_time="0" kill_time="5">
     <argument value="10"/>
-  </process>
-  <process host="node-1.acme.org" function="process.startkilltime.Sleeper" start_time="1" kill_time="6">
+  </actor>
+  <actor host="node-1.acme.org" function="process.startkilltime.Sleeper" start_time="1" kill_time="6">
     <argument value="10"/>
-  </process>
-  <process host="node-2.acme.org" function="process.startkilltime.Sleeper" start_time="2" kill_time="7">
+  </actor>
+  <actor host="node-2.acme.org" function="process.startkilltime.Sleeper" start_time="2" kill_time="7">
     <argument value="4" />
-  </process>
-  <process host="node-3.acme.org" function="process.startkilltime.Sleeper" start_time="3" kill_time="8">
+  </actor>
+  <actor host="node-3.acme.org" function="process.startkilltime.Sleeper" start_time="3" kill_time="8">
     <argument value="4" />
-  </process>
-  <process host="node-4.acme.org" function="process.startkilltime.Sleeper" start_time="4" kill_time="9">
+  </actor>
+  <actor host="node-4.acme.org" function="process.startkilltime.Sleeper" start_time="4" kill_time="9">
     <argument value="5" />
-  </process>
-  <process host="node-5.acme.org" function="process.startkilltime.Sleeper" start_time="5" kill_time="10">
+  </actor>
+  <actor host="node-5.acme.org" function="process.startkilltime.Sleeper" start_time="5" kill_time="10">
     <argument value="5"/>
-  </process>
+  </actor>
 </platform>
index 92a83da..26b1641 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Fafard" function="task.priority.Test">
+<platform version="4.1">
+  <actor host="Fafard" function="task.priority.Test">
     <argument value="76296000"/>
     <argument value="1.0"/>
-  </process>
-  <process host="Fafard" function="task.priority.Test">
+  </actor>
+  <actor host="Fafard" function="task.priority.Test">
     <argument value="76296000"/>
     <argument value="2.0"/>
-  </process>
+  </actor>
 </platform>
index d3f107d..6af47fa 100644 (file)
@@ -14,8 +14,8 @@ import org.simgrid.msg.Task;
 import org.simgrid.trace.Trace;
 
 public class Sender extends Process {
-  private static final double commSizeLat = 1;
-  private static final double commSizeBw = 100000000;
+  private static final double COMM_SIZE_LAT = 1;
+  private static final double COMM_SIZE_BW = 100000000;
   private static final String PM_STATE = "PM_STATE";
 
   public Sender(String hostname, String name, String[] args) throws HostNotFoundException {
@@ -40,7 +40,7 @@ public class Sender extends Process {
     for (int pos = 0; pos < hostCount; pos++) { 
       time = Msg.getClock(); 
       Msg.info("sender time: " + time);
-      ping = new PingPongTask("no name",computeDuration,commSizeLat);
+      ping = new PingPongTask("no name",computeDuration,COMM_SIZE_LAT);
       ping.setTime(time);
       ping.send(mailboxes[pos]);
 
@@ -57,7 +57,7 @@ public class Sender extends Process {
       communicationTime=timeGot - time;
       Msg.info("Communication time : " + communicationTime);
 
-      Msg.info(" --- bw "+ commSizeBw/communicationTime + " ----");
+      Msg.info(" --- bw "+ COMM_SIZE_BW/communicationTime + " ----");
 
       /* Pop the last state (going back to sending ping) */  
       Trace.hostPopState (getHost().getName(), PM_STATE);
index 81da7fb..15c5b87 100644 (file)
@@ -23,7 +23,7 @@ foreach(x maestro-set)
   set(tesh_files   ${tesh_files}   ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
 endforeach()
 
-if(HAVE_NS3)
+if(SIMGRID_HAVE_NS3)
   add_executable       (network-ns3 network-ns3/network-ns3.c)
   target_link_libraries(network-ns3 simgrid)
   set_target_properties(network-ns3  PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/network-ns3)
@@ -128,6 +128,6 @@ ADD_TESH_FACTORIES(app-masterworker-vivaldi     "thread;ucontext;raw;boost" --se
 
 ADD_TESH(msg-app-pmm  --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/app-pmm/app-pmm.tesh)
 
-if(HAVE_NS3)
+if(SIMGRID_HAVE_NS3)
   ADD_TESH_FACTORIES(msg-network-ns3 "thread;ucontext;raw;boost" --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/network-ns3/network-ns3.tesh)
 endif()
index 8a5602e..dbecc0b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="p0"/>
-  <process host="Ruby" function="p1"/>
-  <process host="Perl" function="p2"/>
+<platform version="4.1">
+  <actor host="Tremblay" function="p0"/>
+  <actor host="Ruby" function="p1"/>
+  <actor host="Perl" function="p2"/>
 </platform>
index 846270d..831c9e0 100644 (file)
@@ -1,14 +1,14 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-<!-- Example file of how to use trace replay, with actions split in separate files, one per process.
+<platform version="4.1">
+<!-- Example file of how to use trace replay, with actions split in separate files, one per actor.
      Launch it like this:
          ./actions-comm ../../platforms/platform.xml actions-comm_split_d.xml  -->
 
-  <process host="Tremblay" function="p0">
+  <actor host="Tremblay" function="p0">
     <argument value="actions-comm_split_p0.txt"/>
-  </process>
-  <process host="Ruby"   function="p1">
+  </actor>
+  <actor host="Ruby"   function="p1">
     <argument value="actions-comm_split_p1.txt"/>
-  </process>
+  </actor>
 </platform>
index d2eb682..3f52ae6 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="denise" function="p0"/>
+<platform version="4.1">
+  <actor host="denise" function="p0"/>
 </platform>
index 3836bde..5460ab1 100644 (file)
@@ -1,39 +1,39 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 
-  <process host="node-0.acme.org" function="tracker">
+  <actor host="node-0.acme.org" function="tracker">
     <argument value="3000" />
-  </process>
+  </actor>
 
-  <process host="node-1.acme.org" function="peer">
+  <actor host="node-1.acme.org" function="peer">
     <argument value="00000002"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
     <argument value="1" />       <!-- indicates if the peer is a seed at the beginning of the simulation --> 
-  </process>
-  <process host="node-2.acme.org" function="peer">
+  </actor>
+  <actor host="node-2.acme.org" function="peer">
     <argument value="00000003"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
-  <process host="node-3.acme.org" function="peer">
+  </actor>
+  <actor host="node-3.acme.org" function="peer">
     <argument value="00000004"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
-  <process host="node-4.acme.org" function="peer">
+  </actor>
+  <actor host="node-4.acme.org" function="peer">
     <argument value="00000005"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
     <argument value="1" />       <!-- indicates if the peer is a seed at the beginning of the simulation --> 
-  </process>
-  <process host="node-5.acme.org" function="peer">
+  </actor>
+  <actor host="node-5.acme.org" function="peer">
     <argument value="00000006"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
-  <process host="node-6.acme.org" function="peer">
+  </actor>
+  <actor host="node-6.acme.org" function="peer">
     <argument value="00000007"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
-  <process host="node-7.acme.org" function="peer">
+  </actor>
+  <actor host="node-7.acme.org" function="peer">
     <argument value="00000008"/>    <!-- my id -->
     <argument value="5000" />    <!-- end time --> 
-  </process>
+  </actor>
 </platform>
index dd83afe..73ab26b 100644 (file)
@@ -1,36 +1,36 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!-- For using with chainsend -->
   <!-- Broadcaster -->
-  <process host="node-0.acme.org" function="broadcaster">
+  <actor host="node-0.acme.org" function="broadcaster">
     <argument value="8"/> <!-- number of peers -->
     <argument value="256"/> <!-- number of pieces -->
-  </process>
+  </actor>
 
   <!-- Peers -->
-  <process host="node-1.acme.org" function="peer">
+  <actor host="node-1.acme.org" function="peer">
     <argument value="1"/>
-  </process>
-  <process host="node-2.acme.org" function="peer">
+  </actor>
+  <actor host="node-2.acme.org" function="peer">
     <argument value="2"/>
-  </process>
-  <process host="node-3.acme.org" function="peer">
+  </actor>
+  <actor host="node-3.acme.org" function="peer">
     <argument value="3"/>
-  </process>
-  <process host="node-4.acme.org" function="peer">
+  </actor>
+  <actor host="node-4.acme.org" function="peer">
     <argument value="4"/>
-  </process>
-  <process host="node-5.acme.org" function="peer">
+  </actor>
+  <actor host="node-5.acme.org" function="peer">
     <argument value="5"/>
-  </process>
-  <process host="node-6.acme.org" function="peer">
+  </actor>
+  <actor host="node-6.acme.org" function="peer">
     <argument value="6"/>
-  </process>
-  <process host="node-7.acme.org" function="peer">
+  </actor>
+  <actor host="node-7.acme.org" function="peer">
     <argument value="7"/>
-  </process>
-  <process host="node-8.acme.org" function="peer">
+  </actor>
+  <actor host="node-8.acme.org" function="peer">
     <argument value="8"/>
-  </process>
+  </actor>
 </platform>
index f14a1be..f17ed64 100644 (file)
@@ -11,9 +11,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_broadcaster, "Messages specific for the broadca
 xbt_dynar_t build_hostlist_from_hostcount(int hostcount)
 {
   xbt_dynar_t host_list = xbt_dynar_new(sizeof(char*), xbt_free_ref);
-  int i;
-  
-  for (i = 1; i <= hostcount; i++) {
+  for (int i = 1; i <= hostcount; i++) {
     char *hostname = bprintf("host%d", i);
     XBT_DEBUG("%s", hostname);
     xbt_dynar_push(host_list, &hostname);
@@ -24,12 +22,12 @@ xbt_dynar_t build_hostlist_from_hostcount(int hostcount)
 int broadcaster_build_chain(broadcaster_t bc)
 {
   msg_task_t task = NULL;
-  char **cur = (char**)xbt_dynar_iterator_next(bc->it);
-  const char *me = "host0"; /* FIXME: hardcoded*/ /*MSG_host_get_name(MSG_host_self());*/
-  const char *current_host = NULL;
-  const char *prev = NULL;
-  const char *next = NULL;
-  const char *last = NULL;
+  char** cur               = (char**)xbt_dynar_iterator_next(bc->it);
+  const char* me           = MSG_host_get_name(MSG_host_self());
+  const charcurrent_host = NULL;
+  const char* prev         = NULL;
+  const char* next         = NULL;
+  const char* last         = NULL;
 
   /* Build the chain if there's at least one peer */
   if (cur != NULL) {
@@ -62,8 +60,7 @@ int broadcaster_build_chain(broadcaster_t bc)
 
 int broadcaster_send_file(broadcaster_t bc)
 {
-  const char *me = "host0"; /* FIXME: hardcoded*/ /*MSG_host_get_name(MSG_host_self());*/
-  //msg_comm_t comm = NULL;
+  const char* me  = MSG_host_get_name(MSG_host_self());
   msg_task_t task = NULL;
 
   bc->current_piece = 0;
@@ -101,7 +98,7 @@ static void broadcaster_destroy(broadcaster_t bc)
   /* Destroy iterator and hostlist */
   xbt_dynar_iterator_delete(bc->it);
   xbt_dynar_free(&bc->pending_sends);
-  xbt_dynar_free(&bc->host_list); /* FIXME: host names are not free'd */
+  xbt_dynar_free(&bc->host_list);
   xbt_free(bc);
 }
 
index 2d0eccc..e36ab5d 100644 (file)
@@ -17,7 +17,7 @@ xbt_dynar_iterator_t xbt_dynar_iterator_new(xbt_dynar_t list, xbt_dynar_t (*crit
   
   it->list = list;
   it->length = xbt_dynar_length(list);
-  it->indices_list = criteria_fn(it->length); //xbt_dynar_new(sizeof(int), NULL);
+  it->indices_list = criteria_fn(it->length); // Creates and fills a dynar of int
   it->criteria_fn = criteria_fn;
   it->current = 0;
 
@@ -46,8 +46,7 @@ void xbt_dynar_iterator_delete(xbt_dynar_iterator_t it)
 xbt_dynar_t forward_indices_list(int size)
 {
   xbt_dynar_t indices_list = xbt_dynar_new(sizeof(int), NULL);
-  int i;
-  for (i = 0; i < size; i++)
+  for (int i = 0; i < size; i++)
     xbt_dynar_push_as(indices_list, int, i);
   return indices_list;
 }
index e8ce4f9..cf8c0eb 100644 (file)
@@ -1,30 +1,30 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="master">
     <argument value="20"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="6"/>         <!-- Number of workers -->
-  </process>
+  </actor>
   <!-- The worker processes (with mailbox to listen on as argument) -->
-  <process host="Tremblay" function="worker">
+  <actor host="Tremblay" function="worker">
     <argument value="0"/> 
-  </process>
-  <process host="Tremblay" function="worker">
+  </actor>
+  <actor host="Tremblay" function="worker">
     <argument value="1"/> 
-  </process>
-  <process host="Tremblay" function="worker">
+  </actor>
+  <actor host="Tremblay" function="worker">
     <argument value="2"/> 
-  </process>
-  <process host="Tremblay" function="worker">
+  </actor>
+  <actor host="Tremblay" function="worker">
     <argument value="3"/> 
-  </process>
-  <process host="Tremblay" function="worker">
+  </actor>
+  <actor host="Tremblay" function="worker">
     <argument value="4"/> 
-  </process>
-  <process host="Tremblay" function="worker">
+  </actor>
+  <actor host="Tremblay" function="worker">
     <argument value="5"/> 
-  </process>
+  </actor>
 </platform>
index 11d28ff..cd7a4f4 100644 (file)
@@ -1,57 +1,57 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) --> 
-  <process host="100030591" function="master">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) --> 
+  <actor host="100030591" function="master">
     <argument value="10"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="15"/>         <!-- Number of workers -->
-  </process>
+  </actor>
   <!-- The worker processes (with mailbox to listen on as argument) -->
-  <process host="100036570" function="worker">
+  <actor host="100036570" function="worker">
     <argument value="0"/> 
-  </process>
-  <process host="100041334" function="worker">
+  </actor>
+  <actor host="100041334" function="worker">
     <argument value="1"/> 
-  </process>
-  <process host="100055671" function="worker">
+  </actor>
+  <actor host="100055671" function="worker">
     <argument value="2"/> 
-  </process>
-  <process host="100066658" function="worker">
+  </actor>
+  <actor host="100066658" function="worker">
     <argument value="3"/> 
-  </process>
-  <process host="100090691" function="worker">
+  </actor>
+  <actor host="100090691" function="worker">
     <argument value="4"/> 
-  </process>
-  <process host="100094952" function="worker">
+  </actor>
+  <actor host="100094952" function="worker">
     <argument value="5"/> 
-  </process>
-  <process host="100117943" function="worker">
+  </actor>
+  <actor host="100117943" function="worker">
     <argument value="6"/> 
-  </process>
-  <process host="100126290" function="worker">
+  </actor>
+  <actor host="100126290" function="worker">
     <argument value="7"/> 
-  </process>
-  <process host="100144483" function="worker">
+  </actor>
+  <actor host="100144483" function="worker">
     <argument value="8"/> 
-  </process>
-  <process host="100152889" function="worker">
+  </actor>
+  <actor host="100152889" function="worker">
     <argument value="9"/> 
-  </process>
-  <process host="100178474" function="worker">
+  </actor>
+  <actor host="100178474" function="worker">
     <argument value="10"/> 
-  </process>
-  <process host="100180261" function="worker">
+  </actor>
+  <actor host="100180261" function="worker">
     <argument value="11"/> 
-  </process>
-  <process host="100185883" function="worker">
+  </actor>
+  <actor host="100185883" function="worker">
     <argument value="12"/> 
-  </process>
-  <process host="100186365" function="worker">
+  </actor>
+  <actor host="100186365" function="worker">
     <argument value="13"/> 
-  </process>
-  <process host="100200866" function="worker">
+  </actor>
+  <actor host="100200866" function="worker">
     <argument value="14"/> 
-  </process>
+  </actor>
 </platform>
index 869db93..feadead 100644 (file)
@@ -1,27 +1,27 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="master">
     <argument value="20"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="5"/>         <!-- Number of workers -->
-  </process>
+  </actor>
   <!-- The worker processes (with mailbox to listen on as argument) -->
-  <process host="Tremblay" function="worker" on_failure="RESTART">
+  <actor host="Tremblay" function="worker" on_failure="RESTART">
     <argument value="0"/> 
-  </process>
-  <process host="Jupiter" function="worker" on_failure="RESTART">
+  </actor>
+  <actor host="Jupiter" function="worker" on_failure="RESTART">
     <argument value="1"/> 
-  </process>
-  <process host="Fafard" function="worker" on_failure="RESTART">
+  </actor>
+  <actor host="Fafard" function="worker" on_failure="RESTART">
     <argument value="2"/> 
-  </process>
-  <process host="Ginette" function="worker" on_failure="RESTART">
+  </actor>
+  <actor host="Ginette" function="worker" on_failure="RESTART">
     <argument value="3"/> 
-  </process>
-  <process host="Bourassa" function="worker" on_failure="RESTART">
+  </actor>
+  <actor host="Bourassa" function="worker" on_failure="RESTART">
     <argument value="4"/> 
-  </process>
+  </actor>
 </platform>
index af7b1e3..c0fdc23 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 <!-- For using with ping_pong, platform_sendrecv.xml -->
-  <process host="Tremblay" function="pinger">
+  <actor host="Tremblay" function="pinger">
     <argument value="Jupiter"/>
-  </process>
-  <process host="Jupiter"  function="ponger">
+  </actor>
+  <actor host="Jupiter"  function="ponger">
     <argument value="Tremblay"/>
-  </process>
+  </actor>
 </platform>
index 6e73106..1e49112 100644 (file)
@@ -1,19 +1,19 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="sender">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="sender">
     <argument value="3"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="1"/>         <!-- Number of receivers -->
     <argument value="1"/>         <!-- Sleep_start_time -->
     <argument value="0.1"/>      <!-- Time for test -->
-  </process>
+  </actor>
   <!-- The receiver processes -->
-  <process host="Ruby" function="receiver">
+  <actor host="Ruby" function="receiver">
     <argument value="0"/>
     <argument value="5"/>         <!-- Sleep_start_time -->
     <argument value="0.1"/>      <!-- Time for test -->
-  </process>
+  </actor>
 </platform>
index 27c1d20..f1ef12d 100644 (file)
@@ -1,19 +1,19 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="sender">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="sender">
     <argument value="3"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="1"/>         <!-- Number of receivers -->
     <argument value="5"/>         <!-- Sleep_start_time -->
     <argument value="0"/>      <!-- Time for test -->
-  </process>
+  </actor>
   <!-- The receiver processes -->
-  <process host="Ruby" function="receiver">
+  <actor host="Ruby" function="receiver">
     <argument value="0"/>
     <argument value="1"/>         <!-- Sleep_start_time -->
     <argument value="0"/>      <!-- Time for test -->
-  </process>
+  </actor>
 </platform>
index 939d62e..84ca7e6 100644 (file)
@@ -1,20 +1,20 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="sender">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="sender">
     <argument value="3"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="1"/>         <!-- Number of receivers -->
     <argument value="1"/>         <!-- Sleep_start_time -->
     <argument value="0"/>      <!-- Time for test -->
-  </process>
+  </actor>
   <!-- The receiver processes -->
-  <process host="Ruby" function="receiver">
+  <actor host="Ruby" function="receiver">
     <argument value="0"/>
     <argument value="5"/>         <!-- Sleep_start_time -->
     <argument value="0"/>      <!-- Time for test -->
-  </process>
+  </actor>
 </platform>
 
index f72618e..e385572 100644 (file)
@@ -1,19 +1,19 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="sender">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="sender">
     <argument value="3"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="1"/>         <!-- Number of receivers -->
     <argument value="5"/>         <!-- Sleep_start_time -->
     <argument value="0.1"/>      <!-- Time for test -->
-  </process>
+  </actor>
   <!-- The receiver processes -->
-  <process host="Ruby" function="receiver">
+  <actor host="Ruby" function="receiver">
     <argument value="0"/>
     <argument value="1"/>         <!-- Sleep_start_time -->
     <argument value="0.1"/>      <!-- Time for test -->
-  </process>
+  </actor>
 </platform>
index 51f03d1..6f122c2 100644 (file)
@@ -1,15 +1,15 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="sender">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="sender">
     <argument value="3"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="1"/>         <!-- Number of receivers -->
-  </process>
+  </actor>
   <!-- The receiver processes -->
-  <process host="Ruby" function="receiver">
+  <actor host="Ruby" function="receiver">
     <argument value="0"/>
-  </process>
+  </actor>
 </platform>
index 1972e41..2e680c4 100644 (file)
@@ -1,21 +1,21 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="sender">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="sender">
     <argument value="6"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>      <!-- Communication size of tasks -->
     <argument value="2"/>         <!-- Number of receivers -->
     <argument value="0"/>         <!-- Use diff comm size -->
-  </process>
+  </actor>
   <!-- The receiver processes -->
-  <process host="Fafard" function="receiver">
+  <actor host="Fafard" function="receiver">
     <argument value="0"/>
     <argument value="3"/>       <!-- Number of tasks -->
-  </process>
-  <process host="Jupiter" function="receiver">
+  </actor>
+  <actor host="Jupiter" function="receiver">
     <argument value="1"/>
     <argument value="3"/>       <!-- Number of tasks -->
-  </process>
+  </actor>
 </platform>
index 0b1b17a..b1ab776 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="yielder">
+<platform version="4.1">
+  <actor host="Tremblay" function="yielder">
     <argument value="10"/>       <!-- Number of yields to do  -->
-  </process>
-  <process host="Ruby" function="yielder">
+  </actor>
+  <actor host="Ruby" function="yielder">
     <argument value="15"/>       <!-- Number of yields to do  -->
-  </process>
+  </actor>
 </platform>
index f31fb7b..b698648 100644 (file)
@@ -1,62 +1,62 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-0.acme.org" function="node">
+<platform version="4.1">
+  <actor host="node-0.acme.org" function="node">
     <argument value="42"/>
     <argument value="6000000"/>
-  </process>
-  <process host="node-1.acme.org" function="node">
+  </actor>
+  <actor host="node-1.acme.org" function="node">
     <argument value="366680" />
     <argument value="42" />
     <argument value="10" />
     <argument value="6000000" />
-  </process>
-  <process host="node-2.acme.org" function="node">
+  </actor>
+  <actor host="node-2.acme.org" function="node">
     <argument value="533744" />
     <argument value="366680" />
     <argument value="20" />
     <argument value="6000000" />
-  </process>
-  <process host="node-3.acme.org" function="node">
+  </actor>
+  <actor host="node-3.acme.org" function="node">
     <argument value="1319738" />
     <argument value="42" />
     <argument value="30" />
     <argument value="6000000" />
-  </process>
-  <process host="node-4.acme.org" function="node">
+  </actor>
+  <actor host="node-4.acme.org" function="node">
     <argument value="16509405" />
     <argument value="366680" />
     <argument value="40" />
     <argument value="6000000" />
-  </process>
-  <process host="node-5.acme.org" function="node">
+  </actor>
+  <actor host="node-5.acme.org" function="node">
     <argument value="10874876" />
     <argument value="533744" />
     <argument value="50" />
     <argument value="6000000" />
-  </process>
-  <process host="node-6.acme.org" function="node">
+  </actor>
+  <actor host="node-6.acme.org" function="node">
     <argument value="16728096" />
     <argument value="1319738" />
     <argument value="60" />
     <argument value="6000000" />
-  </process>
-  <process host="node-7.acme.org" function="node">
+  </actor>
+  <actor host="node-7.acme.org" function="node">
     <argument value="10004760" />
     <argument value="16509405" />
     <argument value="70" />
     <argument value="6000000" />
-  </process>
-  <process host="node-8.acme.org" function="node">
+  </actor>
+  <actor host="node-8.acme.org" function="node">
     <argument value="6518808" />
     <argument value="42" />
     <argument value="80" />
     <argument value="6000000" />
-  </process>
-  <process host="node-9.acme.org" function="node">
+  </actor>
+  <actor host="node-9.acme.org" function="node">
     <argument value="2015253" />
     <argument value="1319738" />
     <argument value="90" />
     <argument value="6000000" />
-  </process>
+  </actor>
 </platform>
index a63e6c9..e199776 100644 (file)
@@ -1,72 +1,72 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 
-  <process host="node-0.acme.org" function="node">
+  <actor host="node-0.acme.org" function="node">
     <argument value="0x0000"/>          <!-- my id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
+  </actor>
 
-  <process host="node-1.acme.org" function="node">
+  <actor host="node-1.acme.org" function="node">
     <argument value="0x0001"/>          <!-- my id -->
     <argument value="0"/>               <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
+  </actor>
 
-  <process host="node-2.acme.org" function="node">
+  <actor host="node-2.acme.org" function="node">
     <argument value="0x0003"/>          <!-- my id -->
     <argument value="0x0001"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
+  </actor>
 
-  <process host="node-3.acme.org" function="node">
+  <actor host="node-3.acme.org" function="node">
     <argument value="0x0007"/>          <!-- my id -->
     <argument value="0x0003"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-4.acme.org" function="node">
+  </actor>
+  <actor host="node-4.acme.org" function="node">
     <argument value="0x000f"/>          <!-- my id -->
     <argument value="0x0007"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-5.acme.org" function="node">
+  </actor>
+  <actor host="node-5.acme.org" function="node">
     <argument value="0x001f"/>          <!-- my id -->
     <argument value="0x000f"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-6.acme.org" function="node">
+  </actor>
+  <actor host="node-6.acme.org" function="node">
     <argument value="0x003f"/>          <!-- my id -->
     <argument value="0x001f"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-7.acme.org" function="node">
+  </actor>
+  <actor host="node-7.acme.org" function="node">
     <argument value="0x007f"/>          <!-- my id -->
     <argument value="0x003f"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-8.acme.org" function="node">
+  </actor>
+  <actor host="node-8.acme.org" function="node">
     <argument value="0x00ff"/>          <!-- my id -->
     <argument value="0x007f"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-9.acme.org" function="node">
+  </actor>
+  <actor host="node-9.acme.org" function="node">
     <argument value="0x01ff"/>          <!-- my id -->
     <argument value="0x00ff"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-10.acme.org" function="node">
+  </actor>
+  <actor host="node-10.acme.org" function="node">
     <argument value="0x03ff"/>          <!-- my id -->
     <argument value="0x01ff"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-11.acme.org" function="node">
+  </actor>
+  <actor host="node-11.acme.org" function="node">
     <argument value="0x07ff"/>          <!-- my id -->
     <argument value="0x03ff"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
-  <process host="node-12.acme.org" function="node">
+  </actor>
+  <actor host="node-12.acme.org" function="node">
     <argument value="0x0fff"/>          <!-- my id -->
     <argument value="0x0000"/>          <!-- known id -->
     <argument value ="780"/>            <!-- deadline -->
-  </process>
+  </actor>
 </platform>
index 58be9ca..b0423a9 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
 
     <!-- Use the pstate mechanism to encode the boot/shutdown time and energy -->
 
@@ -40,5 +40,5 @@
     <route src="MyHost1" dst="MyHost2">
       <link_ctn id="link1"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 0bda8f8..838ab3d 100644 (file)
@@ -1,24 +1,24 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="alice" function="host">
+<platform version="4.1">
+  <actor host="alice" function="host">
     <argument value = "c:\Windows\setupact.log"/>
-  </process>
-  <process host="bob" function="host">
+  </actor>
+  <actor host="bob" function="host">
     <argument value = "/scratch/lib/libsimgrid.so.3.6.2"/>
     <argument value = "/scratch/doc/simgrid/examples/platforms/g5k.xml"/>
     <argument value = "alice"/>
     <argument value = "c:\Windows\Platforms\g5k.xml"/>
     <argument value = "0"/>
-  </process>
-  <process host="carl" function="host">
+  </actor>
+  <actor host="carl" function="host">
     <argument value = "/scratch/lib/libsimgrid.so.3.6.2"/>
-  </process>
-  <process host="dave" function="host">
+  </actor>
+  <actor host="dave" function="host">
     <argument value = "c:\Windows\bootstat.dat"/>
     <argument value = "c:\Windows\Professional.xml"/>
     <argument value = "carl"/>
     <argument value = "/scratch/mailbox/Professional.xml"/>
     <argument value = "1"/>
-  </process>
+  </actor>
 </platform>
index d6e288b..2c16afb 100644 (file)
@@ -1,5 +1,5 @@
 foreach (x bugged1 bugged2 bugged3 centralized_mutex electric_fence bugged1_liveness bugged2_liveness)
-  if(HAVE_MC)
+  if(SIMGRID_HAVE_MC)
     add_executable       (${x} ${x}.c)
     target_link_libraries(${x} simgrid)
   endif()
@@ -7,7 +7,7 @@ foreach (x bugged1 bugged2 bugged3 centralized_mutex electric_fence bugged1_live
   set(xml_files     ${xml_files}    ${CMAKE_CURRENT_SOURCE_DIR}/deploy_${x}.xml)
 endforeach()
 
-if(HAVE_MC)
+if(SIMGRID_HAVE_MC)
   if(HAVE_C_STACK_CLEANER)
     add_executable       (bugged1_liveness_cleaner_on  bugged1_liveness.c)
     target_link_libraries(bugged1_liveness_cleaner_on  simgrid)
index 4333fd7..1f4b2a7 100644 (file)
@@ -1,16 +1,16 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="HostA" function="server">
+<platform version="4.1">
+  <actor host="HostA" function="server">
     <argument value="0"/>
-  </process>
-  <process host="HostB" function="client">
+  </actor>
+  <actor host="HostB" function="client">
     <argument value="1"/>
-  </process>
-  <process host="HostC" function="client">
+  </actor>
+  <actor host="HostC" function="client">
     <argument value="2"/>
-  </process>
-  <process host="HostD" function="client">
+  </actor>
+  <actor host="HostD" function="client">
     <argument value="3"/>
-  </process>
+  </actor>
 </platform>
index 08b755e..3d6b31c 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="coordinator" />
-  <process host="Boivin" function="client" >
+<platform version="4.1">
+  <actor host="Tremblay" function="coordinator" />
+  <actor host="Boivin" function="client" >
     <argument value="1"/>
-  </process>
-  <process host="Fafard" function="client" >
+  </actor>
+  <actor host="Fafard" function="client" >
     <argument value="2"/>
-  </process>
+  </actor>
 </platform>
index 911865f..af31561 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="coordinator" />
-  <process host="Boivin" function="client" >
+<platform version="4.1">
+  <actor host="Tremblay" function="coordinator" />
+  <actor host="Boivin" function="client" >
     <argument value="2"/>
-  </process>
-  <process host="Fafard" function="client" >
+  </actor>
+  <actor host="Fafard" function="client" >
     <argument value="1"/>
-  </process>
+  </actor>
 </platform>
index c6dbe05..c95f94b 100644 (file)
@@ -1,13 +1,13 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="HostA" function="server">
+<platform version="4.1">
+  <actor host="HostA" function="server">
     <argument value="0"/>
-  </process>
-  <process host="HostB" function="client">
+  </actor>
+  <actor host="HostB" function="client">
     <argument value="1"/>
-  </process>
-  <process host="HostC" function="client">
+  </actor>
+  <actor host="HostC" function="client">
     <argument value="2"/>
-  </process>
+  </actor>
 </platform>
index 51ea5bf..e1b845c 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="coordinator" />
-  <process host="Fafard"   function="client" >
+<platform version="4.1">
+  <actor host="Tremblay" function="coordinator" />
+  <actor host="Fafard"   function="client" >
     <argument value="1"/>
-  </process>
-  <process host="Boivin" function="client" >
+  </actor>
+  <actor host="Boivin" function="client" >
     <argument value="2"/>
-  </process>
+  </actor>
 </platform>
index c6dbe05..c95f94b 100644 (file)
@@ -1,13 +1,13 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="HostA" function="server">
+<platform version="4.1">
+  <actor host="HostA" function="server">
     <argument value="0"/>
-  </process>
-  <process host="HostB" function="client">
+  </actor>
+  <actor host="HostB" function="client">
     <argument value="1"/>
-  </process>
-  <process host="HostC" function="client">
+  </actor>
+  <actor host="HostC" function="client">
     <argument value="2"/>
-  </process>
+  </actor>
 </platform>
index a22bda1..89ba1a2 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="coordinator" />
+<platform version="4.1">
+  <actor host="Tremblay" function="coordinator" />
 
-  <process host="Fafard" function="client" />
-  <process host="Boivin" function="client" />
-  <process host="Jacquelin" function="client" />
-  <process host="Ginette" function="client" />
+  <actor host="Fafard" function="client" />
+  <actor host="Boivin" function="client" />
+  <actor host="Jacquelin" function="client" />
+  <actor host="Ginette" function="client" />
 </platform>
index cf7d227..1926770 100644 (file)
@@ -1,13 +1,13 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="HostA" function="server">
+<platform version="4.1">
+  <actor host="HostA" function="server">
     <argument value="0"/>
-  </process>
-  <process host="HostB" function="client">
+  </actor>
+  <actor host="HostB" function="client">
     <argument value="1"/>
-    </process>
-  <process host="HostC" function="client">
+    </actor>
+  <actor host="HostC" function="client">
     <argument value="2"/>
-  </process>
+  </actor>
 </platform>
index 3149f5c..29d062c 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="HostA" speed="137.333Mf"/>
     <host id="HostB" speed="98.095Mf"/>
     <host id="HostC" speed="98.095Mf"/>
@@ -18,5 +18,5 @@
     <route src="HostA" dst="HostD">
       <link_ctn id="3"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index a360912..1d7171d 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <actor host="Tremblay" function="master">
     <argument value="100"/>
     <argument value="Jupiter"/>
     <argument value="1"/>
-  </process>
-  <process host="Jupiter" function="worker">
+  </actor>
+  <actor host="Jupiter" function="worker">
     <argument value="1"/>
-  </process>
+  </actor>
 </platform>
index c9727c3..cc0e18a 100644 (file)
@@ -1,44 +1,44 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <actor host="Tremblay" function="master">
     <argument value="10000"/>
     <argument value="Jupiter"/>
     <argument value="1"/>
-  </process>
-  <process host="Jupiter" function="worker">
+  </actor>
+  <actor host="Jupiter" function="worker">
     <argument value="1"/>
-  </process>
-  <process host="Fafard" function="master">
+  </actor>
+  <actor host="Fafard" function="master">
     <argument value="10000"/>
     <argument value="Ginette"/>
     <argument value="2"/>
-  </process>
-  <process host="Ginette" function="worker">
+  </actor>
+  <actor host="Ginette" function="worker">
     <argument value="2"/>
-  </process>
-  <process host="Bourassa" function="master">
+  </actor>
+  <actor host="Bourassa" function="master">
     <argument value="10000"/>
     <argument value="Lovelace"/>
     <argument value="3"/>
-  </process>
-  <process host="Lovelace" function="worker">
+  </actor>
+  <actor host="Lovelace" function="worker">
     <argument value="3"/>
-  </process>
-  <process host="Bourassa" function="master" start_time="2.0">
+  </actor>
+  <actor host="Bourassa" function="master" start_time="2.0">
     <argument value="10000"/>
     <argument value="Lovelace"/>
     <argument value="4"/>
-  </process>
-  <process host="Lovelace" function="worker">
+  </actor>
+  <actor host="Lovelace" function="worker">
     <argument value="4"/>
-  </process>
-  <process host="Lovelace" function="timer">
+  </actor>
+  <actor host="Lovelace" function="timer">
     <argument value="0"/>
     <argument value=".1"/>
-  </process>
-  <process host="Lovelace" function="timer" start_time="2.0">
+  </actor>
+  <actor host="Lovelace" function="timer" start_time="2.0">
     <argument value="0"/>
     <argument value=".1"/>
-  </process>
+  </actor>
 </platform>
index 9ae01af..2bb2b03 100644 (file)
@@ -1,28 +1,28 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <actor host="Tremblay" function="master">
     <argument value="10000"/>
     <argument value="Jupiter"/>
     <argument value="1"/>
-  </process>
-  <process host="Jupiter" function="worker">
+  </actor>
+  <actor host="Jupiter" function="worker">
     <argument value="1"/>
-  </process>
-  <process host="Fafard" function="master">
+  </actor>
+  <actor host="Fafard" function="master">
     <argument value="10000"/>
     <argument value="Ginette"/>
     <argument value="2"/>
-  </process>
-  <process host="Ginette" function="worker">
+  </actor>
+  <actor host="Ginette" function="worker">
     <argument value="2"/>
-  </process>
-  <process host="Bourassa" function="master">
+  </actor>
+  <actor host="Bourassa" function="master">
     <argument value="10000"/>
     <argument value="Lovelace"/>
     <argument value="3"/>
-  </process>
-  <process host="Lovelace" function="worker">
+  </actor>
+  <actor host="Lovelace" function="worker">
     <argument value="3"/>
-  </process>
+  </actor>
 </platform>
index 91ce479..cc69bd7 100644 (file)
@@ -1,36 +1,36 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="S1" function="master">
+<platform version="4.1">
+  <actor host="S1" function="master">
     <argument value="10000"/>
     <argument value="C1"/>
     <argument value="1"/>
-  </process>
-  <process host="C1" function="worker">
+  </actor>
+  <actor host="C1" function="worker">
     <argument value="1"/>
-  </process>
-  <process host="S1" function="master">
+  </actor>
+  <actor host="S1" function="master">
     <argument value="10000"/>
     <argument value="C1"/>
     <argument value="2"/>
-  </process>
-  <process host="C1" function="worker">
+  </actor>
+  <actor host="C1" function="worker">
     <argument value="2"/>
-  </process>
-  <process host="S1" function="master">
+  </actor>
+  <actor host="S1" function="master">
     <argument value="10000"/>
     <argument value="C1"/>
     <argument value="3"/>
-  </process>
-  <process host="C1" function="worker">
+  </actor>
+  <actor host="C1" function="worker">
     <argument value="3"/>
-  </process>
-  <process host="C1" function="master">
+  </actor>
+  <actor host="C1" function="master">
     <argument value="10000"/>
     <argument value="S1"/>
     <argument value="4"/>
-  </process>
-  <process host="S1" function="worker">
+  </actor>
+  <actor host="S1" function="worker">
     <argument value="4"/>
-  </process>
+  </actor>
 </platform>
index cf3068b..150a99a 100644 (file)
@@ -1,20 +1,20 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="S1" function="master">
+<platform version="4.1">
+  <actor host="S1" function="master">
     <argument value="10000"/>
     <argument value="C1"/>
     <argument value="0"/>
-  </process>
-  <process host="S2" function="master">
+  </actor>
+  <actor host="S2" function="master">
     <argument value="10000"/>
     <argument value="C2"/>
     <argument value="1"/>
-  </process>
-  <process host="C1" function="worker">
+  </actor>
+  <actor host="C1" function="worker">
     <argument value="0"/>
-  </process>
-  <process host="C2" function="worker">
+  </actor>
+  <actor host="C2" function="worker">
     <argument value="1"/>
-  </process>
+  </actor>
 </platform>
index 9eab752..4c0f7bc 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-2.acme.org" function="master">
+<platform version="4.1">
+  <actor host="node-2.acme.org" function="master">
     <argument value="100"/>
     <argument value="node-6.acme.org"/>
     <argument value="1"/>
-  </process>
-  <process host="node-6.acme.org" function="worker">
+  </actor>
+  <actor host="node-6.acme.org" function="worker">
     <argument value="1"/>
-  </process>
+  </actor>
 </platform>
index 4bc5107..2a2d4b2 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="S1" function="master">
+<platform version="4.1">
+  <actor host="S1" function="master">
     <argument value="10000"/>
     <argument value="C1"/>
     <argument value="1"/>
-  </process>
-  <process host="C1" function="worker">
+  </actor>
+  <actor host="C1" function="worker">
     <argument value="1"/>
-  </process>
+  </actor>
 </platform>
index db540cb..c104b21 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-3.acme.org" function="master">
+<platform version="4.1">
+  <actor host="node-3.acme.org" function="master">
     <argument value="100"/>
     <argument value="node-16.acme.org"/>
     <argument value="1"/>
-  </process>
-  <process host="node-16.acme.org" function="worker">
+  </actor>
+  <actor host="node-16.acme.org" function="worker">
     <argument value="1"/>
-  </process>
+  </actor>
 </platform>
index 83acf80..9e1de6d 100644 (file)
@@ -65,11 +65,11 @@ static int david(int argc, char *argv[]) {/* Dump what we have on a remote host
 static int bob(int argc, char *argv[])
 {
   /* this host also tests the properties of the AS*/
-  msg_as_t root = MSG_environment_get_routing_root();
+  msg_as_t root = MSG_zone_get_root();
   XBT_INFO("== Print the properties of the AS");
-  XBT_INFO("   Process property: filename -> %s", MSG_environment_as_get_property_value(root, "filename"));
-  XBT_INFO("   Process property: date -> %s", MSG_environment_as_get_property_value(root, "date"));
-  XBT_INFO("   Process property: author -> %s", MSG_environment_as_get_property_value(root, "author"));
+  XBT_INFO("   Process property: filename -> %s", MSG_zone_get_property_value(root, "filename"));
+  XBT_INFO("   Process property: date -> %s", MSG_zone_get_property_value(root, "date"));
+  XBT_INFO("   Process property: author -> %s", MSG_zone_get_property_value(root, "author"));
 
   /* Get the property list of current bob process */
   xbt_dict_t props = MSG_process_get_properties(MSG_process_self());
index 98d3590..f4c76b9 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="host1" function="alice" />
-  <process host="host1" function="bob">
+<platform version="4.1">
+  <actor host="host1" function="alice" />
+  <actor host="host1" function="bob">
     <prop id="SomeProp" value="SomeValue"/>
-  </process>
-  <process host="host2" function="carole" />
-  <process host="host2" function="david" />
+  </actor>
+  <actor host="host2" function="carole" />
+  <actor host="host2" function="david" />
 </platform>
index bc19db1..e24cced 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!-- Just sleeps for 10 seconds and quits -->
-  <process host="node-0.acme.org" function="sleeper">  
+  <actor host="node-0.acme.org" function="sleeper">  
     <argument value="10"/>
-  </process>
+  </actor>
 </platform>
index a85e3f6..6d7d312 100644 (file)
@@ -1,13 +1,13 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-1.acme.org" function="sleeper" kill_time="6">
+<platform version="4.1">
+  <actor host="node-1.acme.org" function="sleeper" kill_time="6">
     <argument value="10"/>
-  </process>
-  <process host="node-2.acme.org" function="sleeper" kill_time="6">
+  </actor>
+  <actor host="node-2.acme.org" function="sleeper" kill_time="6">
     <argument value="6"/>
-  </process>
-  <process host="node-3.acme.org" function="sleeper" kill_time="10"> 
+  </actor>
+  <actor host="node-3.acme.org" function="sleeper" kill_time="10"> 
     <argument value="6"/>
-  </process>
+  </actor>
 </platform>
index 6819164..3d6934b 100644 (file)
@@ -1,22 +1,22 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-0.acme.org" function="sleeper" start_time="0">
+<platform version="4.1">
+  <actor host="node-0.acme.org" function="sleeper" start_time="0">
     <argument value="10"/>
-  </process>
-  <process host="node-1.acme.org" function="sleeper" start_time="1">
+  </actor>
+  <actor host="node-1.acme.org" function="sleeper" start_time="1">
     <argument value="10"/>
-  </process>
-  <process host="node-2.acme.org" function="sleeper" start_time="2">
+  </actor>
+  <actor host="node-2.acme.org" function="sleeper" start_time="2">
     <argument value="10"/>
-  </process>
-  <process host="node-3.acme.org" function="sleeper" start_time="3">
+  </actor>
+  <actor host="node-3.acme.org" function="sleeper" start_time="3">
     <argument value="10"/>
-  </process>
-  <process host="node-4.acme.org" function="sleeper" start_time="4">
+  </actor>
+  <actor host="node-4.acme.org" function="sleeper" start_time="4">
     <argument value="10"/>
-  </process>
-  <process host="node-5.acme.org" function="sleeper" start_time="5">
+  </actor>
+  <actor host="node-5.acme.org" function="sleeper" start_time="5">
     <argument value="10"/>
-  </process>
+  </actor>
 </platform>
index 318c5fe..7292ca2 100644 (file)
@@ -1,22 +1,22 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-0.acme.org" function="sleeper" start_time="0" kill_time="5">
+<platform version="4.1">
+  <actor host="node-0.acme.org" function="sleeper" start_time="0" kill_time="5">
     <argument value="10"/>
-  </process>
-  <process host="node-1.acme.org" function="sleeper" start_time="1" kill_time="6">
+  </actor>
+  <actor host="node-1.acme.org" function="sleeper" start_time="1" kill_time="6">
     <argument value="10"/>
-  </process>
-  <process host="node-2.acme.org" function="sleeper" start_time="2" kill_time="7">
+  </actor>
+  <actor host="node-2.acme.org" function="sleeper" start_time="2" kill_time="7">
     <argument value="4" />
-  </process>
-  <process host="node-3.acme.org" function="sleeper" start_time="3" kill_time="8">
+  </actor>
+  <actor host="node-3.acme.org" function="sleeper" start_time="3" kill_time="8">
     <argument value="4" />
-  </process>
-  <process host="node-4.acme.org" function="sleeper" start_time="4" kill_time="9">
+  </actor>
+  <actor host="node-4.acme.org" function="sleeper" start_time="4" kill_time="9">
     <argument value="5" />
-  </process>
-  <process host="node-5.acme.org" function="sleeper" start_time="5" kill_time="10">
+  </actor>
+  <actor host="node-5.acme.org" function="sleeper" start_time="5" kill_time="10">
     <argument value="5"/>
-  </process>
+  </actor>
 </platform>
index 3d8f513..5d15f2b 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Fafard" function="test">
+<platform version="4.1">
+  <actor host="Fafard" function="test">
     <argument value="76296000"/>
     <argument value="1.0"/>
-  </process>
-  <process host="Fafard" function="test">
+  </actor>
+  <actor host="Fafard" function="test">
     <argument value="76296000"/>
     <argument value="2.0"/>
-  </process>
+  </actor>
 </platform>
index 37b973a..ea93cd3 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <cluster id="my_cluster_1" prefix="" suffix="" radical="1" speed="1Gf" bw="125MBps" lat="50us"/>
     <cluster id="my_cluster_2" prefix="" suffix="" radical="2" speed="1Gf" bw="125MBps" lat="50us"/>
     <cluster id="my_cluster_3" prefix="" suffix="" radical="3" speed="1Gf" bw="125MBps" lat="50us"/>
 
     <link id="link_tmp"  bandwidth="1.25GBps" latency="500us"/>
 
-    <ASroute src="my_cluster_1" dst="my_cluster_2" gw_src="my_cluster_1_router" gw_dst="my_cluster_2_router">
+    <zoneRoute src="my_cluster_1" dst="my_cluster_2" gw_src="my_cluster_1_router" gw_dst="my_cluster_2_router">
       <link_ctn id="link1"/>
       <link_ctn id="link2"/>
-    </ASroute>
-    <ASroute src="my_cluster_1" dst="my_cluster_3" gw_src="my_cluster_1_router" gw_dst="my_cluster_3_router">
+    </zoneRoute>
+    <zoneRoute src="my_cluster_1" dst="my_cluster_3" gw_src="my_cluster_1_router" gw_dst="my_cluster_3_router">
       <link_ctn id="link1"/>
       <link_ctn id="link3"/>
-    </ASroute>
-    <ASroute src="my_cluster_2" dst="my_cluster_3" gw_src="my_cluster_2_router" gw_dst="my_cluster_3_router">
+    </zoneRoute>
+    <zoneRoute src="my_cluster_2" dst="my_cluster_3" gw_src="my_cluster_2_router" gw_dst="my_cluster_3_router">
       <link_ctn id="link2"/>
       <link_ctn id="link3"/>
-    </ASroute>
+    </zoneRoute>
 
     <bypassASroute src="my_cluster_1" dst="my_cluster_2" gw_src="my_cluster_1_router" gw_dst="my_cluster_2_router">
       <link_ctn id="link_tmp"/>
     </bypassASroute>
-  </AS>
+  </zone>
 </platform>
index 4b99bcc..072fe3a 100644 (file)
@@ -1,17 +1,17 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS_Big" routing="Dijkstra">
-    <AS id="AS_1" routing="Full">
+<platform version="4.1">
+  <zone  id="AS_Big" routing="Dijkstra">
+    <zone id="AS_1" routing="Full">
       <host id="AS_1_host1" speed="1Gf"/>
       <link id="AS_1_link" bandwidth="1.25GBps" latency="500us"/>
       <router id="AS_1_gateway"/>
       <route src="AS_1_host1" dst="AS_1_gateway">
         <link_ctn id="AS_1_link"/>
       </route>
-    </AS>
+    </zone>
 
-    <AS id="AS_2" routing="Floyd">
+    <zone id="AS_2" routing="Floyd">
       <host id="AS_2_host1" speed="1Gf"/>
       <host id="AS_2_host2" speed="1Gf"/>
       <host id="AS_2_host3" speed="1Gf"/>
         <link_ctn id="AS_2_link6"/>
         <link_ctn id="AS_2_link5"/>
       </bypassRoute>
-    </AS>
+    </zone>
 
     <link id="backbone" bandwidth="1.25GBps" latency="500us"/>
 
-    <ASroute src="AS_1" dst="AS_2" gw_src="AS_1_gateway" gw_dst="AS_2_gateway">
+    <zoneRoute src="AS_1" dst="AS_2" gw_src="AS_1_gateway" gw_dst="AS_2_gateway">
       <link_ctn id="backbone"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index fe0774b..82672ea 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Vivaldi">
-    <AS id="AS1_dc1" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Vivaldi">
+    <zone id="AS1_dc1" routing="Full">
       <!--small tier-1 datacenter, according to TIA-942 annex G tiers notation -->
       <!-- 3 clusters, no zone dist area, 1 horiz dist area, no multi-homing, telecom and operation rooms omitted -->
       <!-- clusters -->
@@ -18,7 +18,7 @@
       <link id="link_dc1_cb3" bandwidth="1.25GBps" latency="100us"/>
 
       <!-- horiz dist area switch, main dist area switch, entrance room switch, end point for ISP  -->
-      <AS id="gw_AS1_dc1" routing="Floyd">
+      <zone id="gw_AS1_dc1" routing="Floyd">
         <!-- equipments-->
         <router id="gw_dc1_horizdist"/>
         <router id="gw_dc1_maindist"/>
         <route src="gw_dc1_entranceroom" dst="router_AS1_dc1">
           <link_ctn id="dc1_entranceroom_ISP"/>
         </route>
-      </AS>
+      </zone>
 
       <!-- internal routes between clusters -->
-      <ASroute src="AS1_cb3" dst="AS1_cb1" gw_src="cb3-AS1_cb3_router.dc1.acloud.com"
+      <zoneRoute src="AS1_cb3" dst="AS1_cb1" gw_src="cb3-AS1_cb3_router.dc1.acloud.com"
                gw_dst="cb1-AS1_cb1_router.dc1.acloud.com">
         <link_ctn id="link_dc1_cb3"/>
         <link_ctn id="link_dc1_cb1"/>
-      </ASroute>
-      <ASroute src="AS1_cb2" dst="AS1_cb1" gw_src="cb2-AS1_cb2_router.dc1.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS1_cb2" dst="AS1_cb1" gw_src="cb2-AS1_cb2_router.dc1.acloud.com"
                gw_dst="cb1-AS1_cb1_router.dc1.acloud.com">
         <link_ctn id="link_dc1_cb2"/>
         <link_ctn id="link_dc1_cb1"/>
-      </ASroute>
-      <ASroute src="AS1_cb2" dst="AS1_cb3" gw_src="cb2-AS1_cb2_router.dc1.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS1_cb2" dst="AS1_cb3" gw_src="cb2-AS1_cb2_router.dc1.acloud.com"
                gw_dst="cb3-AS1_cb3_router.dc1.acloud.com">
         <link_ctn id="link_dc1_cb2"/>
         <link_ctn id="link_dc1_cb3"/>
-      </ASroute>
-      <!-- routes to exit AS -->
-      <ASroute src="AS1_cb1" dst="gw_AS1_dc1" gw_src="cb1-AS1_cb1_router.dc1.acloud.com" gw_dst="gw_dc1_horizdist">
+      </zoneRoute>
+      <!-- routes to exit zone -->
+      <zoneRoute src="AS1_cb1" dst="gw_AS1_dc1" gw_src="cb1-AS1_cb1_router.dc1.acloud.com" gw_dst="gw_dc1_horizdist">
         <link_ctn id="link_dc1_cb1"/>
-      </ASroute>
-      <ASroute src="AS1_cb3" dst="gw_AS1_dc1" gw_src="cb3-AS1_cb3_router.dc1.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS1_cb3" dst="gw_AS1_dc1" gw_src="cb3-AS1_cb3_router.dc1.acloud.com"
                gw_dst="gw_dc1_horizdist">
         <link_ctn id="link_dc1_cb3"/>
-      </ASroute>
-      <ASroute src="AS1_cb2" dst="gw_AS1_dc1" gw_src="cb2-AS1_cb2_router.dc1.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS1_cb2" dst="gw_AS1_dc1" gw_src="cb2-AS1_cb2_router.dc1.acloud.com"
                gw_dst="gw_dc1_horizdist">
         <link_ctn id="link_dc1_cb2"/>
-      </ASroute> 
-      <ASroute dst="AS1_cb1" src="gw_AS1_dc1" gw_dst="cb1-AS1_cb1_router.dc1.acloud.com"
+      </zoneRoute> 
+      <zoneRoute dst="AS1_cb1" src="gw_AS1_dc1" gw_dst="cb1-AS1_cb1_router.dc1.acloud.com"
                gw_src="gw_dc1_horizdist">
         <link_ctn id="link_dc1_cb1"/>
-      </ASroute>
-      <ASroute dst="AS1_cb3" src="gw_AS1_dc1" gw_dst="cb3-AS1_cb3_router.dc1.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS1_cb3" src="gw_AS1_dc1" gw_dst="cb3-AS1_cb3_router.dc1.acloud.com"
                gw_src="gw_dc1_horizdist">
         <link_ctn id="link_dc1_cb3"/>
-      </ASroute>
-      <ASroute dst="AS1_cb2" src="gw_AS1_dc1" gw_dst="cb2-AS1_cb2_router.dc1.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS1_cb2" src="gw_AS1_dc1" gw_dst="cb2-AS1_cb2_router.dc1.acloud.com"
                gw_src="gw_dc1_horizdist">
         <link_ctn id="link_dc1_cb2"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <AS id="AS2_dc2" routing="Full">
+    <zone id="AS2_dc2" routing="Full">
       <!--bigger tier-1 datacenter, according to TIA-942 annex G tiers notation, routing : Full -->
       <!-- 6 clusters, no zone dist area, 1 horiz dist area, no multi-homing, telecom and operation rooms omitted -->
       <!-- clusters -->
       <link id="link_dc2_cb6" bandwidth="1.25GBps" latency="100us"/>
 
       <!-- horiz dist area switch, main dist area switch, entrance room switch, end point for ISP  -->
-      <AS id="gw_AS2_dc2" routing="Floyd">
+      <zone id="gw_AS2_dc2" routing="Floyd">
         <!-- equipments-->
         <router id="gw_dc2_horizdist"/>
         <router id="gw_dc2_maindist"/>
         <route src="gw_dc2_entranceroom" dst="router_AS2_dc2">
           <link_ctn id="dc2_entranceroom_ISP"/>
         </route>
-      </AS>
+      </zone>
 
       <!-- internal routes between clusters -->
-      <ASroute src="AS2_cb4" dst="AS2_cb6" gw_src="cb4-AS2_cb4_router.dc2.acloud.com"
+      <zoneRoute src="AS2_cb4" dst="AS2_cb6" gw_src="cb4-AS2_cb4_router.dc2.acloud.com"
                gw_dst="cb6-AS2_cb6_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb4"/>
         <link_ctn id="link_dc2_cb6"/>
-      </ASroute>
-      <ASroute src="AS2_cb5" dst="AS2_cb6" gw_src="cb5-AS2_cb5_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb5" dst="AS2_cb6" gw_src="cb5-AS2_cb5_router.dc2.acloud.com"
                gw_dst="cb6-AS2_cb6_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb5"/>
         <link_ctn id="link_dc2_cb6"/>
-      </ASroute>
-      <ASroute src="AS2_cb5" dst="AS2_cb4" gw_src="cb5-AS2_cb5_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb5" dst="AS2_cb4" gw_src="cb5-AS2_cb5_router.dc2.acloud.com"
                gw_dst="cb4-AS2_cb4_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb5"/>
         <link_ctn id="link_dc2_cb4"/>
-      </ASroute>
-      <ASroute src="AS2_cb2" dst="AS2_cb6" gw_src="cb2-AS2_cb2_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb2" dst="AS2_cb6" gw_src="cb2-AS2_cb2_router.dc2.acloud.com"
                gw_dst="cb6-AS2_cb6_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb2"/> 
         <link_ctn id="link_dc2_cb6"/>
-      </ASroute>
-      <ASroute src="AS2_cb2" dst="AS2_cb4" gw_src="cb2-AS2_cb2_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb2" dst="AS2_cb4" gw_src="cb2-AS2_cb2_router.dc2.acloud.com"
                gw_dst="cb4-AS2_cb4_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb2"/>
         <link_ctn id="link_dc2_cb4"/>
-      </ASroute>
-      <ASroute src="AS2_cb2" dst="AS2_cb5" gw_src="cb2-AS2_cb2_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb2" dst="AS2_cb5" gw_src="cb2-AS2_cb2_router.dc2.acloud.com"
                gw_dst="cb5-AS2_cb5_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb2"/>
         <link_ctn id="link_dc2_cb5"/>
-      </ASroute>
-      <ASroute src="AS2_cb3" dst="AS2_cb6" gw_src="cb3-AS2_cb3_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb3" dst="AS2_cb6" gw_src="cb3-AS2_cb3_router.dc2.acloud.com"
                gw_dst="cb6-AS2_cb6_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb3"/>
         <link_ctn id="link_dc2_cb6"/>
-      </ASroute>
-      <ASroute src="AS2_cb3" dst="AS2_cb4" gw_src="cb3-AS2_cb3_router.dc2.acloud.com" 
+      </zoneRoute>
+      <zoneRoute src="AS2_cb3" dst="AS2_cb4" gw_src="cb3-AS2_cb3_router.dc2.acloud.com" 
                gw_dst="cb4-AS2_cb4_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb3"/>
         <link_ctn id="link_dc2_cb4"/>
-      </ASroute>
-      <ASroute src="AS2_cb3" dst="AS2_cb5" gw_src="cb3-AS2_cb3_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb3" dst="AS2_cb5" gw_src="cb3-AS2_cb3_router.dc2.acloud.com"
                gw_dst="cb5-AS2_cb5_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb3"/>
         <link_ctn id="link_dc2_cb5"/>
-      </ASroute>
-      <ASroute src="AS2_cb3" dst="AS2_cb2" gw_src="cb3-AS2_cb3_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb3" dst="AS2_cb2" gw_src="cb3-AS2_cb3_router.dc2.acloud.com"
                gw_dst="cb2-AS2_cb2_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb3"/>
         <link_ctn id="link_dc2_cb2"/>
-      </ASroute>
-      <ASroute src="AS2_cb1" dst="AS2_cb6" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb1" dst="AS2_cb6" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
                gw_dst="cb6-AS2_cb6_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb1"/>
         <link_ctn id="link_dc2_cb6"/>
-      </ASroute>
-      <ASroute src="AS2_cb1" dst="AS2_cb4" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb1" dst="AS2_cb4" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
                gw_dst="cb4-AS2_cb4_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb1"/>
         <link_ctn id="link_dc2_cb4"/>
-      </ASroute>
-      <ASroute src="AS2_cb1" dst="AS2_cb5" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb1" dst="AS2_cb5" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
                gw_dst="cb5-AS2_cb5_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb1"/>
         <link_ctn id="link_dc2_cb5"/>
-      </ASroute>
-      <ASroute src="AS2_cb1" dst="AS2_cb2" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb1" dst="AS2_cb2" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
                gw_dst="cb2-AS2_cb2_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb1"/>
         <link_ctn id="link_dc2_cb2"/>
-      </ASroute>
-      <ASroute src="AS2_cb1" dst="AS2_cb3" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb1" dst="AS2_cb3" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
                gw_dst="cb3-AS2_cb3_router.dc2.acloud.com">
         <link_ctn id="link_dc2_cb1"/>
         <link_ctn id="link_dc2_cb3"/>
-      </ASroute>
+      </zoneRoute>
 
-      <!-- routess to exit AS -->
-      <ASroute src="AS2_cb6" dst="gw_AS2_dc2" gw_src="cb6-AS2_cb6_router.dc2.acloud.com"
+      <!-- routess to exit zone -->
+      <zoneRoute src="AS2_cb6" dst="gw_AS2_dc2" gw_src="cb6-AS2_cb6_router.dc2.acloud.com"
                gw_dst="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb6"/>
-      </ASroute>
-      <ASroute src="AS2_cb4" dst="gw_AS2_dc2" gw_src="cb4-AS2_cb4_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb4" dst="gw_AS2_dc2" gw_src="cb4-AS2_cb4_router.dc2.acloud.com"
                gw_dst="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb4"/>
-      </ASroute>
-      <ASroute src="AS2_cb5" dst="gw_AS2_dc2" gw_src="cb5-AS2_cb5_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb5" dst="gw_AS2_dc2" gw_src="cb5-AS2_cb5_router.dc2.acloud.com"
                gw_dst="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb5"/>
-      </ASroute>
-      <ASroute src="AS2_cb2" dst="gw_AS2_dc2" gw_src="cb2-AS2_cb2_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb2" dst="gw_AS2_dc2" gw_src="cb2-AS2_cb2_router.dc2.acloud.com"
                gw_dst="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb2"/>
-      </ASroute>
-      <ASroute src="AS2_cb3" dst="gw_AS2_dc2" gw_src="cb3-AS2_cb3_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb3" dst="gw_AS2_dc2" gw_src="cb3-AS2_cb3_router.dc2.acloud.com"
                gw_dst="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb3"/>
-      </ASroute>
-      <ASroute src="AS2_cb1" dst="gw_AS2_dc2" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS2_cb1" dst="gw_AS2_dc2" gw_src="cb1-AS2_cb1_router.dc2.acloud.com"
                gw_dst="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb1"/>
-      </ASroute> 
-      <ASroute dst="AS2_cb6" src="gw_AS2_dc2" gw_dst="cb6-AS2_cb6_router.dc2.acloud.com"
+      </zoneRoute> 
+      <zoneRoute dst="AS2_cb6" src="gw_AS2_dc2" gw_dst="cb6-AS2_cb6_router.dc2.acloud.com"
                gw_src="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb6"/>
-      </ASroute>
-      <ASroute dst="AS2_cb4" src="gw_AS2_dc2" gw_dst="cb4-AS2_cb4_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS2_cb4" src="gw_AS2_dc2" gw_dst="cb4-AS2_cb4_router.dc2.acloud.com"
                gw_src="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb4"/>
-      </ASroute>
-      <ASroute dst="AS2_cb5" src="gw_AS2_dc2" gw_dst="cb5-AS2_cb5_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS2_cb5" src="gw_AS2_dc2" gw_dst="cb5-AS2_cb5_router.dc2.acloud.com"
                gw_src="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb5"/>
-      </ASroute>
-      <ASroute dst="AS2_cb2" src="gw_AS2_dc2" gw_dst="cb2-AS2_cb2_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS2_cb2" src="gw_AS2_dc2" gw_dst="cb2-AS2_cb2_router.dc2.acloud.com"
                gw_src="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb2"/>
-      </ASroute>
-      <ASroute dst="AS2_cb3" src="gw_AS2_dc2" gw_dst="cb3-AS2_cb3_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS2_cb3" src="gw_AS2_dc2" gw_dst="cb3-AS2_cb3_router.dc2.acloud.com"
                gw_src="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb3"/>
-      </ASroute>
-      <ASroute dst="AS2_cb1" src="gw_AS2_dc2" gw_dst="cb1-AS2_cb1_router.dc2.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS2_cb1" src="gw_AS2_dc2" gw_dst="cb1-AS2_cb1_router.dc2.acloud.com"
                gw_src="gw_dc2_horizdist">
         <link_ctn id="link_dc2_cb1"/>
-      </ASroute> 
-    </AS>
+      </zoneRoute> 
+    </zone>
 
-    <AS id="AS3_dc3" routing="Full">  
+    <zone id="AS3_dc3" routing="Full">  
       <!--small tier-1 datacenter, according to TIA-942 annex G tiers notation, routing : FULL -->    
       <!-- 4 clusters, no zone dist area, 1 horiz dist area, no multi-homing, telecom and operation rooms omitted -->
       <!-- clusters -->
       <link id="link_dc3_cb4" bandwidth="1.25GBps" latency="100us"/>
 
       <!-- horiz dist area switch, main dist area switch, entrance room switch, end point for ISP  -->
-      <AS id="gw_AS3_dc3" routing="Floyd">
+      <zone id="gw_AS3_dc3" routing="Floyd">
         <!-- equipments-->
         <router id="gw_dc3_horizdist"/>
         <router id="gw_dc3_maindist"/>
         <route src="gw_dc3_entranceroom" dst="router_AS3_dc3">
           <link_ctn id="dc3_entranceroom_ISP"/>
         </route>
-      </AS>
+      </zone>
 
       <!-- internal routes between clusters -->
-      <ASroute src="AS3_cb2" dst="AS3_cb3" gw_src="cb2-AS3_cb2_router.dc3.acloud.com"
+      <zoneRoute src="AS3_cb2" dst="AS3_cb3" gw_src="cb2-AS3_cb2_router.dc3.acloud.com"
                gw_dst="cb3-AS3_cb3_router.dc3.acloud.com">
         <link_ctn id="link_dc3_cb2"/>
         <link_ctn id="link_dc3_cb3"/>
-      </ASroute>
-      <ASroute src="AS3_cb1" dst="AS3_cb3" gw_src="cb1-AS3_cb1_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS3_cb1" dst="AS3_cb3" gw_src="cb1-AS3_cb1_router.dc3.acloud.com"
                gw_dst="cb3-AS3_cb3_router.dc3.acloud.com">
         <link_ctn id="link_dc3_cb1"/>
         <link_ctn id="link_dc3_cb3"/>
-      </ASroute>
-      <ASroute src="AS3_cb1" dst="AS3_cb2" gw_src="cb1-AS3_cb1_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS3_cb1" dst="AS3_cb2" gw_src="cb1-AS3_cb1_router.dc3.acloud.com"
                gw_dst="cb2-AS3_cb2_router.dc3.acloud.com">
         <link_ctn id="link_dc3_cb1"/>
         <link_ctn id="link_dc3_cb2"/>
-      </ASroute>
-      <ASroute src="AS3_cb4" dst="AS3_cb3" gw_src="cb4-AS3_cb4_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS3_cb4" dst="AS3_cb3" gw_src="cb4-AS3_cb4_router.dc3.acloud.com"
                gw_dst="cb3-AS3_cb3_router.dc3.acloud.com">
         <link_ctn id="link_dc3_cb4"/>
         <link_ctn id="link_dc3_cb3"/>
-      </ASroute>
-      <ASroute src="AS3_cb4" dst="AS3_cb2" gw_src="cb4-AS3_cb4_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS3_cb4" dst="AS3_cb2" gw_src="cb4-AS3_cb4_router.dc3.acloud.com"
                gw_dst="cb2-AS3_cb2_router.dc3.acloud.com">
         <link_ctn id="link_dc3_cb4"/>
         <link_ctn id="link_dc3_cb2"/>
-      </ASroute>
-      <ASroute src="AS3_cb4" dst="AS3_cb1" gw_src="cb4-AS3_cb4_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS3_cb4" dst="AS3_cb1" gw_src="cb4-AS3_cb4_router.dc3.acloud.com"
                gw_dst="cb1-AS3_cb1_router.dc3.acloud.com">
         <link_ctn id="link_dc3_cb4"/>
         <link_ctn id="link_dc3_cb1"/>
-      </ASroute>
+      </zoneRoute>
 
-      <!-- routes to exit AS -->
-      <ASroute src="AS3_cb3" dst="gw_AS3_dc3" gw_src="cb3-AS3_cb3_router.dc3.acloud.com"
+      <!-- routes to exit zone -->
+      <zoneRoute src="AS3_cb3" dst="gw_AS3_dc3" gw_src="cb3-AS3_cb3_router.dc3.acloud.com"
                gw_dst="gw_dc3_horizdist">
         <link_ctn id="link_dc3_cb3"/>
-      </ASroute>
-      <ASroute src="AS3_cb2" dst="gw_AS3_dc3" gw_src="cb2-AS3_cb2_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS3_cb2" dst="gw_AS3_dc3" gw_src="cb2-AS3_cb2_router.dc3.acloud.com"
                gw_dst="gw_dc3_horizdist">
         <link_ctn id="link_dc3_cb2"/>
-      </ASroute>
-      <ASroute src="AS3_cb1" dst="gw_AS3_dc3" gw_src="cb1-AS3_cb1_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS3_cb1" dst="gw_AS3_dc3" gw_src="cb1-AS3_cb1_router.dc3.acloud.com"
                gw_dst="gw_dc3_horizdist">
         <link_ctn id="link_dc3_cb1"/>
-      </ASroute>
-      <ASroute src="AS3_cb4" dst="gw_AS3_dc3" gw_src="cb4-AS3_cb4_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="AS3_cb4" dst="gw_AS3_dc3" gw_src="cb4-AS3_cb4_router.dc3.acloud.com"
                gw_dst="gw_dc3_horizdist">
         <link_ctn id="link_dc3_cb4"/>
-      </ASroute>
-      <ASroute dst="AS3_cb3" src="gw_AS3_dc3" gw_dst="cb3-AS3_cb3_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS3_cb3" src="gw_AS3_dc3" gw_dst="cb3-AS3_cb3_router.dc3.acloud.com"
                gw_src="gw_dc3_horizdist">
         <link_ctn id="link_dc3_cb3"/>
-      </ASroute>
-      <ASroute dst="AS3_cb2" src="gw_AS3_dc3" gw_dst="cb2-AS3_cb2_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS3_cb2" src="gw_AS3_dc3" gw_dst="cb2-AS3_cb2_router.dc3.acloud.com"
                gw_src="gw_dc3_horizdist">
         <link_ctn id="link_dc3_cb2"/>
-      </ASroute>
-      <ASroute dst="AS3_cb1" src="gw_AS3_dc3" gw_dst="cb1-AS3_cb1_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS3_cb1" src="gw_AS3_dc3" gw_dst="cb1-AS3_cb1_router.dc3.acloud.com"
                gw_src="gw_dc3_horizdist">
         <link_ctn id="link_dc3_cb1"/>
-      </ASroute>
-      <ASroute dst="AS3_cb4" src="gw_AS3_dc3" gw_dst="cb4-AS3_cb4_router.dc3.acloud.com"
+      </zoneRoute>
+      <zoneRoute dst="AS3_cb4" src="gw_AS3_dc3" gw_dst="cb4-AS3_cb4_router.dc3.acloud.com"
                gw_src="gw_dc3_horizdist">
         <link_ctn id="link_dc3_cb4"/>
-      </ASroute>
-    </AS>
-  </AS>
+      </zoneRoute>
+    </zone>
+  </zone>
 </platform>
index db66bf0..628427b 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!--             _________
                   |          |
                   |  router  |
index fbdad7e..165f6d4 100644 (file)
@@ -1,18 +1,18 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <cluster id="my_cluster_1" prefix="c-" suffix=".me" radical="0-1" speed="1Gf" bw="125MBps" lat="50us"
              router_id="router1"/>
 
-    <AS id="AS1" routing="None">
+    <zone id="AS1" routing="None">
       <host id="host1" speed="1Gf"/>
-    </AS>
+    </zone>
 
     <link id="link1" bandwidth="100kBps" latency="10ms"/>
 
-    <ASroute src="my_cluster_1" dst="AS1" gw_src="router1" gw_dst="host1">
+    <zoneRoute src="my_cluster_1" dst="AS1" gw_src="router1" gw_dst="host1">
       <link_ctn id="link1"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index a8d66d0..c54d4d6 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <cluster id="bob_cluster" prefix="node-" suffix=".acme.org" radical="0-119" speed="1Gf" 
              bw="125MBps" lat="50us" topology="DRAGONFLY" topo_parameters="3,4;4,3;5,1;2" 
              loopback_bw="100MBps" loopback_lat="0" limiter_link="150MBps"/>
-  </AS>
+  </zone>
 </platform>
index 83ff7d9..77a7237 100644 (file)
@@ -1,14 +1,14 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!-- This is an example for a fat tree cluster. 
   This is taken from figure 1/ b/ of the paper "D-Mod-K Routing Providing on-Blocking Traffic for Shift Permutations on 
   Real Life Fat Trees" available at webee.technion.ac.il/publication-link/index/id/574
   This defines a two levels fat-tree, with 4 leaf switches connected to 4 nodes each and 2 core switches connected to 
   each leaf switch by two cables -->
 
-  <AS id="AS0" routing="Full">
+  <zone id="AS0" routing="Full">
     <cluster id="bob_cluster" prefix="node-" suffix=".acme.org" radical="0-15" speed="1Gf" bw="125MBps" lat="50us" 
              topology="FAT_TREE" topo_parameters="2;4,4;1,2;1,2" loopback_bw="100MBps" loopback_lat="0"/>
-  </AS>
+  </zone>
 </platform>
index 249f7cc..c3acb30 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!--           _________
                 |          |
                 |  router  |
@@ -12,7 +12,7 @@
                 /     |     \
             host0   host1   host2
   -->
-  <AS id="AS0" routing="Full">
+  <zone id="AS0" routing="Full">
     <cluster id="my_cluster_1" prefix="" suffix="" radical="0-262144" speed="1Gf" bw="125MBps" lat="50us"/>
-  </AS>
+  </zone>
 </platform>
index 8fb7a06..1f9c8c0 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <cluster id="bob_cluster" prefix="node-" radical="0-11" suffix=".acme.org" speed="1Gf" 
              bw="125MBps" lat="50us" topology="TORUS" topo_parameters="3,2,2" loopback_bw="100MBps" loopback_lat="0"/>
-  </AS>
+  </zone>
 </platform>
index fe25716..3bd41a5 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <config id="General">
     <prop id="maxmin/precision" value="0.000010"></prop>
     <prop id="cpu/optim" value="TI"></prop>
@@ -10,7 +10,7 @@
     <prop id="smpi/bw-factor" value="65472:0.940694;15424:0.697866;9376:0.58729"></prop>
   </config>
 
-  <AS  id="AS0"  routing="Full">
+  <zone  id="AS0"  routing="Full">
     <host id="bob" speed="1Gf"/>
     <host id="alice" speed="500Mf"/>
 
@@ -23,5 +23,5 @@
       <link_ctn id="link2"/>
       <link_ctn id="link3"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 84fa6bc..38b306b 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <config id="example config">
     <prop id="tracing/uncategorized" value="yes"/>
     <prop id="tracing/buffer" value="yes"/>
@@ -11,7 +11,7 @@
     <prop id="tracing/categorized" value="yes"/>
   </config>
 
-  <AS id="AS0" routing="Full">
+  <zone id="AS0" routing="Full">
     <host id="Tremblay" speed="98.095Mf"/>
     <host id="Jupiter" speed="76.296Mf"/>
     <host id="Fafard" speed="76.296Mf"/>
       <link_ctn id="6"/>
       <link_ctn id="7"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 50c09d2..dedcff8 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!-- S1 _________ C1
            link 1
          10kB, 10ms    -->
        
-  <AS id="1" routing="Full">
+  <zone id="1" routing="Full">
     <host id="S1" speed="1Gf"/>
     <host id="C1" speed="1Gf"/>
 
@@ -17,5 +17,5 @@
     <route src="C1" dst="S1" symmetrical="NO">
       <link_ctn id="1" direction="UP"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 807b0a0..95e8167 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Vivaldi">
-    <AS id="dataCenter1" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Vivaldi">
+    <zone id="dataCenter1" routing="Full">
       <!-- 3 cabinets, no zone dist area, 1 horiz dist area, no multi-homing, telecom and operation rooms omitted -->
       <!-- cabinets -->
       <cluster id="cabinet1" prefix="cb1-" suffix=".dc1.acloud.com" radical="1-40" speed="5.2297Gf"
@@ -17,7 +17,7 @@
       <link id="link_dc1_cb3" bandwidth="1.25GBps" latency="100us"/>
 
       <!-- horiz dist area switch, main dist area switch, entrance room switch, end point for ISP  -->
-      <AS id="gw_dataCenter1" routing="Floyd">
+      <zone id="gw_dataCenter1" routing="Floyd">
         <!-- equipments-->
         <router id="gw_dc1_horizdist"/>
         <router id="gw_dc1_maindist"/>
         <route src="gw_dc1_entranceroom" dst="router_dataCenter1">
           <link_ctn id="dc1_entranceroom_ISP"/>
         </route>
-      </AS>
+      </zone>
 
       <!-- internal routes between cabinets -->
-      <ASroute src="cabinet2" dst="cabinet3" gw_src="cb2-cabinet2_router.dc1.acloud.com"
+      <zoneRoute src="cabinet2" dst="cabinet3" gw_src="cb2-cabinet2_router.dc1.acloud.com"
                gw_dst="cb3-cabinet3_router.dc1.acloud.com">
         <link_ctn id="link_dc1_cb2"/>
         <link_ctn id="link_dc1_cb3"/>
-      </ASroute>
-      <ASroute src="cabinet1" dst="cabinet3" gw_src="cb1-cabinet1_router.dc1.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="cabinet1" dst="cabinet3" gw_src="cb1-cabinet1_router.dc1.acloud.com"
                gw_dst="cb3-cabinet3_router.dc1.acloud.com">
         <link_ctn id="link_dc1_cb1"/>
         <link_ctn id="link_dc1_cb3"/>
-      </ASroute>
-      <ASroute src="cabinet1" dst="cabinet2" gw_src="cb1-cabinet1_router.dc1.acloud.com"
+      </zoneRoute>
+      <zoneRoute src="cabinet1" dst="cabinet2" gw_src="cb1-cabinet1_router.dc1.acloud.com"
                gw_dst="cb2-cabinet2_router.dc1.acloud.com">
         <link_ctn id="link_dc1_cb1"/>
         <link_ctn id="link_dc1_cb2"/>
-      </ASroute>
-    </AS>
-  </AS>
+      </zoneRoute>
+    </zone>
+  </zone>
 </platform>
index 26a1a99..6587933 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="S1" speed="1Gf"/>
     <host id="C1" speed="1Gf"/>
     <host id="S2" speed="1Gf"/>
@@ -50,5 +50,5 @@
     <route src="R2" dst="C2">
       <link_ctn id="5"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 0d15f71..680a30e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <cluster id="cluster" prefix="MyHost" radical="1-2" suffix="" speed="100.0Mf,50.0Mf,20.0Mf"
            bw="125MBps" lat="50us" bb_bw="2.25GBps"  bb_lat="500us">
     <!--  List of idle_power:min_power:max_power pairs (in Watts) -->
index d1ca0ff..0af3e71 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <!-- Multiple pstate processor capacities can be defined as a list of powers specified for a given host -->
     <!-- Attribute 'pstate' specifies the initialy selected pstate (here, the lowest pstate corresponds to the highest
          processor speed) -->
@@ -31,5 +31,5 @@
     <route src="MyHost2" dst="MyHost3">
       <link_ctn id="bus"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index bcb382c..60dc58a 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="Faulty Host" speed="1Gf" state_file="trace/faulty_host.trace"/>
     <host id="Safe Host" speed="500Mf"/>
-  </AS>
+  </zone>
 </platform>
 
index 9a8ae89..234b305 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
+<platform version="4.1">
 
 <!--
   This file is a manual and imperfect description of the Grid'5000 platform.
@@ -12,9 +13,8 @@
 
 -->
 
-<platform version="4">
-  <AS id="AS_grid5000" routing="Floyd">
-    <AS id="AS_interne" routing="Floyd">
+  <zone id="AS_grid5000" routing="Floyd">
+    <zone id="AS_interne" routing="Floyd">
       <router id="lille"/>
       <router id="paris"/>
       <router id="nancy"/>
@@ -63,8 +63,8 @@
       <route src="marseille" dst="toulouse">
         <link_ctn id="Marseille_Toulouse"/>
       </route>
-    </AS>
-    <AS id="AS_bordeaux" routing="Full">
+    </zone>
+    <zone id="AS_bordeaux" routing="Full">
       <cluster id="AS_bordeplage" prefix="bordeplage-" suffix=".bordeaux.grid5000.fr" radical="1-51" speed="5.2297E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_bordeplage" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
       <cluster id="AS_borderline" prefix="borderline-" suffix=".bordeaux.grid5000.fr" radical="1-10" speed="13.357E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_borderline" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_bordeaux" routing="Full">
+      <zone id="gw_AS_bordeaux" routing="Full">
         <router id="gw_bordeaux"/>
-      </AS>
+      </zone>
       <link id="link_gw_bordeaux" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_bordeplage" dst="AS_bordereau" gw_src="bordeplage-AS_bordeplage_router.bordeaux.grid5000.fr" gw_dst="bordereau-AS_bordereau_router.bordeaux.grid5000.fr">
+      <zoneRoute src="AS_bordeplage" dst="AS_bordereau" gw_src="bordeplage-AS_bordeplage_router.bordeaux.grid5000.fr" gw_dst="bordereau-AS_bordereau_router.bordeaux.grid5000.fr">
         <link_ctn id="link_bordeplage"/>
         <link_ctn id="link_bordereau"/>
-      </ASroute>
-      <ASroute src="AS_borderline" dst="AS_bordereau" gw_src="borderline-AS_borderline_router.bordeaux.grid5000.fr" gw_dst="bordereau-AS_bordereau_router.bordeaux.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_borderline" dst="AS_bordereau" gw_src="borderline-AS_borderline_router.bordeaux.grid5000.fr" gw_dst="bordereau-AS_bordereau_router.bordeaux.grid5000.fr">
         <link_ctn id="link_borderline"/>
         <link_ctn id="link_bordereau"/>
-      </ASroute>
-      <ASroute src="AS_borderline" dst="AS_bordeplage" gw_src="borderline-AS_borderline_router.bordeaux.grid5000.fr" gw_dst="bordeplage-AS_bordeplage_router.bordeaux.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_borderline" dst="AS_bordeplage" gw_src="borderline-AS_borderline_router.bordeaux.grid5000.fr" gw_dst="bordeplage-AS_bordeplage_router.bordeaux.grid5000.fr">
         <link_ctn id="link_borderline"/>
         <link_ctn id="link_bordeplage"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_bordereau" dst="gw_AS_bordeaux" gw_src="bordereau-AS_bordereau_router.bordeaux.grid5000.fr" gw_dst="gw_bordeaux">
+      <zoneRoute src="AS_bordereau" dst="gw_AS_bordeaux" gw_src="bordereau-AS_bordereau_router.bordeaux.grid5000.fr" gw_dst="gw_bordeaux">
         <link_ctn id="link_bordereau"/>
-      </ASroute>
-      <ASroute src="AS_bordeplage" dst="gw_AS_bordeaux" gw_src="bordeplage-AS_bordeplage_router.bordeaux.grid5000.fr" gw_dst="gw_bordeaux">
+      </zoneRoute>
+      <zoneRoute src="AS_bordeplage" dst="gw_AS_bordeaux" gw_src="bordeplage-AS_bordeplage_router.bordeaux.grid5000.fr" gw_dst="gw_bordeaux">
         <link_ctn id="link_bordeplage"/>
-      </ASroute>
-      <ASroute src="AS_borderline" dst="gw_AS_bordeaux" gw_src="borderline-AS_borderline_router.bordeaux.grid5000.fr" gw_dst="gw_bordeaux">
+      </zoneRoute>
+      <zoneRoute src="AS_borderline" dst="gw_AS_bordeaux" gw_src="borderline-AS_borderline_router.bordeaux.grid5000.fr" gw_dst="gw_bordeaux">
         <link_ctn id="link_borderline"/>
-      </ASroute>
-   </AS>
+      </zoneRoute>
+   </zone>
 
-    <AS id="AS_grenoble" routing="Full">
+    <zone id="AS_grenoble" routing="Full">
       <cluster id="AS_adonis" prefix="adonis-" suffix=".grenoble.grid5000.fr" radical="1-12" speed="23.681E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_adonis" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
       <cluster id="AS_genepi" prefix="genepi-" suffix=".grenoble.grid5000.fr" radical="1-34" speed="21.175E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_genepi" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_grenoble" routing="Full">
+      <zone id="gw_AS_grenoble" routing="Full">
         <router id="gw_grenoble"/>
-      </AS>
+      </zone>
       <link id="link_gw_grenoble" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_genepi" dst="AS_adonis" gw_src="genepi-AS_genepi_router.grenoble.grid5000.fr" gw_dst="adonis-AS_adonis_router.grenoble.grid5000.fr">
+      <zoneRoute src="AS_genepi" dst="AS_adonis" gw_src="genepi-AS_genepi_router.grenoble.grid5000.fr" gw_dst="adonis-AS_adonis_router.grenoble.grid5000.fr">
         <link_ctn id="link_genepi"/>
         <link_ctn id="link_adonis"/>
-      </ASroute>
-      <ASroute src="AS_edel" dst="AS_adonis" gw_src="edel-AS_edel_router.grenoble.grid5000.fr" gw_dst="adonis-AS_adonis_router.grenoble.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_edel" dst="AS_adonis" gw_src="edel-AS_edel_router.grenoble.grid5000.fr" gw_dst="adonis-AS_adonis_router.grenoble.grid5000.fr">
         <link_ctn id="link_edel"/>
         <link_ctn id="link_adonis"/>
-      </ASroute>
-      <ASroute src="AS_edel" dst="AS_genepi" gw_src="edel-AS_edel_router.grenoble.grid5000.fr" gw_dst="genepi-AS_genepi_router.grenoble.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_edel" dst="AS_genepi" gw_src="edel-AS_edel_router.grenoble.grid5000.fr" gw_dst="genepi-AS_genepi_router.grenoble.grid5000.fr">
         <link_ctn id="link_edel"/>
         <link_ctn id="link_genepi"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_adonis" dst="gw_AS_grenoble" gw_src="adonis-AS_adonis_router.grenoble.grid5000.fr" gw_dst="gw_grenoble">
+      <zoneRoute src="AS_adonis" dst="gw_AS_grenoble" gw_src="adonis-AS_adonis_router.grenoble.grid5000.fr" gw_dst="gw_grenoble">
         <link_ctn id="link_adonis"/>
-      </ASroute>
-      <ASroute src="AS_genepi" dst="gw_AS_grenoble" gw_src="genepi-AS_genepi_router.grenoble.grid5000.fr" gw_dst="gw_grenoble">
+      </zoneRoute>
+      <zoneRoute src="AS_genepi" dst="gw_AS_grenoble" gw_src="genepi-AS_genepi_router.grenoble.grid5000.fr" gw_dst="gw_grenoble">
         <link_ctn id="link_genepi"/>
-      </ASroute>
-      <ASroute src="AS_edel" dst="gw_AS_grenoble" gw_src="edel-AS_edel_router.grenoble.grid5000.fr" gw_dst="gw_grenoble">
+      </zoneRoute>
+      <zoneRoute src="AS_edel" dst="gw_AS_grenoble" gw_src="edel-AS_edel_router.grenoble.grid5000.fr" gw_dst="gw_grenoble">
         <link_ctn id="link_edel"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <AS id="AS_lille" routing="Full">
+    <zone id="AS_lille" routing="Full">
       <cluster id="AS_chicon" prefix="chicon-" suffix=".lille.grid5000.fr" radical="1-26" speed="8.9618E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_chicon" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
       <cluster id="AS_chirloute" prefix="chirloute-" suffix=".lille.grid5000.fr" radical="1-8" speed="24.473E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_chirloute" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_lille" routing="Full">
+      <zone id="gw_AS_lille" routing="Full">
         <router id="gw_lille"/>
-      </AS>
+      </zone>
       <link id="link_gw_lille" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_chirloute" dst="AS_chinqchint" gw_src="chirloute-AS_chirloute_router.lille.grid5000.fr" gw_dst="chinqchint-AS_chinqchint_router.lille.grid5000.fr">
+      <zoneRoute src="AS_chirloute" dst="AS_chinqchint" gw_src="chirloute-AS_chirloute_router.lille.grid5000.fr" gw_dst="chinqchint-AS_chinqchint_router.lille.grid5000.fr">
         <link_ctn id="link_chirloute"/>
         <link_ctn id="link_chinqchint"/>
-      </ASroute>
-      <ASroute src="AS_chimint" dst="AS_chinqchint" gw_src="chimint-AS_chimint_router.lille.grid5000.fr" gw_dst="chinqchint-AS_chinqchint_router.lille.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_chimint" dst="AS_chinqchint" gw_src="chimint-AS_chimint_router.lille.grid5000.fr" gw_dst="chinqchint-AS_chinqchint_router.lille.grid5000.fr">
         <link_ctn id="link_chimint"/>
         <link_ctn id="link_chinqchint"/>
-      </ASroute>
-      <ASroute src="AS_chimint" dst="AS_chirloute" gw_src="chimint-AS_chimint_router.lille.grid5000.fr" gw_dst="chirloute-AS_chirloute_router.lille.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_chimint" dst="AS_chirloute" gw_src="chimint-AS_chimint_router.lille.grid5000.fr" gw_dst="chirloute-AS_chirloute_router.lille.grid5000.fr">
         <link_ctn id="link_chimint"/>
         <link_ctn id="link_chirloute"/>
-      </ASroute>
+      </zoneRoute>
  
-      <ASroute src="AS_chicon" dst="AS_chinqchint" gw_src="chicon-AS_chicon_router.lille.grid5000.fr" gw_dst="chinqchint-AS_chinqchint_router.lille.grid5000.fr">
+      <zoneRoute src="AS_chicon" dst="AS_chinqchint" gw_src="chicon-AS_chicon_router.lille.grid5000.fr" gw_dst="chinqchint-AS_chinqchint_router.lille.grid5000.fr">
         <link_ctn id="link_chicon"/>
         <link_ctn id="link_chinqchint"/>
-      </ASroute>
-      <ASroute src="AS_chicon" dst="AS_chirloute" gw_src="chicon-AS_chicon_router.lille.grid5000.fr" gw_dst="chirloute-AS_chirloute_router.lille.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_chicon" dst="AS_chirloute" gw_src="chicon-AS_chicon_router.lille.grid5000.fr" gw_dst="chirloute-AS_chirloute_router.lille.grid5000.fr">
         <link_ctn id="link_chicon"/>
         <link_ctn id="link_chirloute"/>
-      </ASroute>
-      <ASroute src="AS_chicon" dst="AS_chimint" gw_src="chicon-AS_chicon_router.lille.grid5000.fr" gw_dst="chimint-AS_chimint_router.lille.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_chicon" dst="AS_chimint" gw_src="chicon-AS_chicon_router.lille.grid5000.fr" gw_dst="chimint-AS_chimint_router.lille.grid5000.fr">
         <link_ctn id="link_chicon"/>
         <link_ctn id="link_chimint"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_chinqchint" dst="gw_AS_lille" gw_src="chinqchint-AS_chinqchint_router.lille.grid5000.fr" gw_dst="gw_lille">
+      <zoneRoute src="AS_chinqchint" dst="gw_AS_lille" gw_src="chinqchint-AS_chinqchint_router.lille.grid5000.fr" gw_dst="gw_lille">
         <link_ctn id="link_chinqchint"/>
-      </ASroute>
-      <ASroute src="AS_chirloute" dst="gw_AS_lille" gw_src="chirloute-AS_chirloute_router.lille.grid5000.fr" gw_dst="gw_lille">
+      </zoneRoute>
+      <zoneRoute src="AS_chirloute" dst="gw_AS_lille" gw_src="chirloute-AS_chirloute_router.lille.grid5000.fr" gw_dst="gw_lille">
         <link_ctn id="link_chirloute"/>
-      </ASroute>
-      <ASroute src="AS_chimint" dst="gw_AS_lille" gw_src="chimint-AS_chimint_router.lille.grid5000.fr" gw_dst="gw_lille">
+      </zoneRoute>
+      <zoneRoute src="AS_chimint" dst="gw_AS_lille" gw_src="chimint-AS_chimint_router.lille.grid5000.fr" gw_dst="gw_lille">
         <link_ctn id="link_chimint"/>
-      </ASroute>
-      <ASroute src="AS_chicon" dst="gw_AS_lille" gw_src="chicon-AS_chicon_router.lille.grid5000.fr" gw_dst="gw_lille">
+      </zoneRoute>
+      <zoneRoute src="AS_chicon" dst="gw_AS_lille" gw_src="chicon-AS_chicon_router.lille.grid5000.fr" gw_dst="gw_lille">
         <link_ctn id="link_chicon"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <AS id="AS_lyon" routing="Full">
+    <zone id="AS_lyon" routing="Full">
       <cluster id="AS_capricorne" prefix="capricorne-" suffix=".lyon.grid5000.fr" radical="1-56" speed="4.7233E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_capricorne" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
       <cluster id="AS_sagittaire" prefix="sagittaire-" suffix=".lyon.grid5000.fr" radical="1-79" speed="5.6693E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_sagittaire" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_lyon" routing="Full">
+      <zone id="gw_AS_lyon" routing="Full">
         <router id="gw_lyon"/>
-      </AS>
+      </zone>
       <link id="link_gw_lyon" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_capricorne" dst="AS_sagittaire" gw_src="capricorne-AS_capricorne_router.lyon.grid5000.fr" gw_dst="sagittaire-AS_sagittaire_router.lyon.grid5000.fr">
+      <zoneRoute src="AS_capricorne" dst="AS_sagittaire" gw_src="capricorne-AS_capricorne_router.lyon.grid5000.fr" gw_dst="sagittaire-AS_sagittaire_router.lyon.grid5000.fr">
         <link_ctn id="link_capricorne"/>
         <link_ctn id="link_sagittaire"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_sagittaire" dst="gw_AS_lyon" gw_src="sagittaire-AS_sagittaire_router.lyon.grid5000.fr" gw_dst="gw_lyon">
+      <zoneRoute src="AS_sagittaire" dst="gw_AS_lyon" gw_src="sagittaire-AS_sagittaire_router.lyon.grid5000.fr" gw_dst="gw_lyon">
         <link_ctn id="link_sagittaire"/>
-      </ASroute>
-      <ASroute src="AS_capricorne" dst="gw_AS_lyon" gw_src="capricorne-AS_capricorne_router.lyon.grid5000.fr" gw_dst="gw_lyon">
+      </zoneRoute>
+      <zoneRoute src="AS_capricorne" dst="gw_AS_lyon" gw_src="capricorne-AS_capricorne_router.lyon.grid5000.fr" gw_dst="gw_lyon">
         <link_ctn id="link_capricorne"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <AS id="AS_nancy" routing="Full">
-      <AS id="AS_graphene" routing="Full">
+    <zone id="AS_nancy" routing="Full">
+      <zone id="AS_graphene" routing="Full">
         <cluster id="AS_sgraphene1" prefix="graphene-" suffix=".nancy.grid5000.fr" radical="1-39" speed="16.673E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_sgraphene2" prefix="graphene-" suffix=".nancy.grid5000.fr" radical="40-74" speed="16.673E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_sgraphene3" prefix="graphene-" suffix=".nancy.grid5000.fr" radical="75-104" speed="16.673E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_sgraphene4" prefix="graphene-" suffix=".nancy.grid5000.fr" radical="105-144" speed="16.673E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
 
-        <AS id="gw_AS_graphene" routing="Full">
+        <zone id="gw_AS_graphene" routing="Full">
           <router id="graphene-AS_graphene_router.nancy.grid5000.fr"/>
-        </AS>
+        </zone>
         <link id="switch-graphene" bandwidth="1250000000Bps" latency="5E-4s"/>
 
-        <ASroute src="AS_sgraphene2" dst="AS_sgraphene4" gw_src="graphene-AS_sgraphene2_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene4_router.nancy.grid5000.fr">
+        <zoneRoute src="AS_sgraphene2" dst="AS_sgraphene4" gw_src="graphene-AS_sgraphene2_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene4_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        <ASroute src="AS_sgraphene3" dst="AS_sgraphene4" gw_src="graphene-AS_sgraphene3_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene4_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgraphene3" dst="AS_sgraphene4" gw_src="graphene-AS_sgraphene3_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene4_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        <ASroute src="AS_sgraphene3" dst="AS_sgraphene2" gw_src="graphene-AS_sgraphene3_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene2_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgraphene3" dst="AS_sgraphene2" gw_src="graphene-AS_sgraphene3_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene2_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        <ASroute src="AS_sgraphene1" dst="AS_sgraphene4" gw_src="graphene-AS_sgraphene1_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene4_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgraphene1" dst="AS_sgraphene4" gw_src="graphene-AS_sgraphene1_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene4_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        <ASroute src="AS_sgraphene1" dst="AS_sgraphene2" gw_src="graphene-AS_sgraphene1_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene2_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgraphene1" dst="AS_sgraphene2" gw_src="graphene-AS_sgraphene1_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene2_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        <ASroute src="AS_sgraphene1" dst="AS_sgraphene3" gw_src="graphene-AS_sgraphene1_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene3_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgraphene1" dst="AS_sgraphene3" gw_src="graphene-AS_sgraphene1_router.nancy.grid5000.fr" gw_dst="graphene-AS_sgraphene3_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
+        </zoneRoute>
 
-        <ASroute src="AS_sgraphene4" dst="gw_AS_graphene" gw_src="graphene-AS_sgraphene4_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
+        <zoneRoute src="AS_sgraphene4" dst="gw_AS_graphene" gw_src="graphene-AS_sgraphene4_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        <ASroute src="AS_sgraphene2" dst="gw_AS_graphene" gw_src="graphene-AS_sgraphene2_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgraphene2" dst="gw_AS_graphene" gw_src="graphene-AS_sgraphene2_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        <ASroute src="AS_sgraphene3" dst="gw_AS_graphene" gw_src="graphene-AS_sgraphene3_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgraphene3" dst="gw_AS_graphene" gw_src="graphene-AS_sgraphene3_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        <ASroute src="AS_sgraphene1" dst="gw_AS_graphene" gw_src="graphene-AS_sgraphene1_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgraphene1" dst="gw_AS_graphene" gw_src="graphene-AS_sgraphene1_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
           <link_ctn id="switch-graphene"/>
-        </ASroute>
-        </AS>
+        </zoneRoute>
+        </zone>
       <link id="link_graphene" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="AS_griffon" routing="Full">
+      <zone id="AS_griffon" routing="Full">
         <cluster id="AS_sgriffon1" prefix="griffon-" suffix=".nancy.grid5000.fr" radical="1-29,58-60" speed="20.678E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_sgriffon2" prefix="griffon-" suffix=".nancy.grid5000.fr" radical="30-57" speed="20.678E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_sgriffon3" prefix="griffon-" suffix=".nancy.grid5000.fr" radical="61-92" speed="20.678E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
 
-        <AS id="gw_AS_griffon" routing="Full">
+        <zone id="gw_AS_griffon" routing="Full">
           <router id="griffon-AS_griffon_router.nancy.grid5000.fr"/>
-        </AS>
+        </zone>
         <link id="switch-griffon" bandwidth="1250000000Bps" latency="5E-4s"/>
 
-        <ASroute src="AS_sgriffon2" dst="AS_sgriffon1" gw_src="griffon-AS_sgriffon2_router.nancy.grid5000.fr" gw_dst="griffon-AS_sgriffon1_router.nancy.grid5000.fr">
+        <zoneRoute src="AS_sgriffon2" dst="AS_sgriffon1" gw_src="griffon-AS_sgriffon2_router.nancy.grid5000.fr" gw_dst="griffon-AS_sgriffon1_router.nancy.grid5000.fr">
           <link_ctn id="switch-griffon"/>
-        </ASroute>
-        <ASroute src="AS_sgriffon3" dst="AS_sgriffon1" gw_src="griffon-AS_sgriffon3_router.nancy.grid5000.fr" gw_dst="griffon-AS_sgriffon1_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgriffon3" dst="AS_sgriffon1" gw_src="griffon-AS_sgriffon3_router.nancy.grid5000.fr" gw_dst="griffon-AS_sgriffon1_router.nancy.grid5000.fr">
           <link_ctn id="switch-griffon"/>
-        </ASroute>
-        <ASroute src="AS_sgriffon3" dst="AS_sgriffon2" gw_src="griffon-AS_sgriffon3_router.nancy.grid5000.fr" gw_dst="griffon-AS_sgriffon2_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgriffon3" dst="AS_sgriffon2" gw_src="griffon-AS_sgriffon3_router.nancy.grid5000.fr" gw_dst="griffon-AS_sgriffon2_router.nancy.grid5000.fr">
           <link_ctn id="switch-griffon"/>
-        </ASroute>
+        </zoneRoute>
 
-        <ASroute src="AS_sgriffon1" dst="gw_AS_griffon" gw_src="griffon-AS_sgriffon1_router.nancy.grid5000.fr" gw_dst="griffon-AS_griffon_router.nancy.grid5000.fr">
+        <zoneRoute src="AS_sgriffon1" dst="gw_AS_griffon" gw_src="griffon-AS_sgriffon1_router.nancy.grid5000.fr" gw_dst="griffon-AS_griffon_router.nancy.grid5000.fr">
           <link_ctn id="switch-griffon"/>
-        </ASroute>
-        <ASroute src="AS_sgriffon2" dst="gw_AS_griffon" gw_src="griffon-AS_sgriffon2_router.nancy.grid5000.fr" gw_dst="griffon-AS_griffon_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgriffon2" dst="gw_AS_griffon" gw_src="griffon-AS_sgriffon2_router.nancy.grid5000.fr" gw_dst="griffon-AS_griffon_router.nancy.grid5000.fr">
           <link_ctn id="switch-griffon"/>
-        </ASroute>
-        <ASroute src="AS_sgriffon3" dst="gw_AS_griffon" gw_src="griffon-AS_sgriffon3_router.nancy.grid5000.fr" gw_dst="griffon-AS_griffon_router.nancy.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_sgriffon3" dst="gw_AS_griffon" gw_src="griffon-AS_sgriffon3_router.nancy.grid5000.fr" gw_dst="griffon-AS_griffon_router.nancy.grid5000.fr">
           <link_ctn id="switch-griffon"/>
-        </ASroute>
-        </AS>
+        </zoneRoute>
+        </zone>
       <link id="link_griffon" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_nancy" routing="Full">
+      <zone id="gw_AS_nancy" routing="Full">
         <router id="gw_nancy"/>
-      </AS>
+      </zone>
       <link id="link_gw_nancy" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_griffon" dst="AS_graphene" gw_src="griffon-AS_griffon_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
+      <zoneRoute src="AS_griffon" dst="AS_graphene" gw_src="griffon-AS_griffon_router.nancy.grid5000.fr" gw_dst="graphene-AS_graphene_router.nancy.grid5000.fr">
         <link_ctn id="link_griffon"/>
         <link_ctn id="link_graphene"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_graphene" dst="gw_AS_nancy" gw_src="graphene-AS_graphene_router.nancy.grid5000.fr" gw_dst="gw_nancy">
+      <zoneRoute src="AS_graphene" dst="gw_AS_nancy" gw_src="graphene-AS_graphene_router.nancy.grid5000.fr" gw_dst="gw_nancy">
         <link_ctn id="link_graphene"/>
-      </ASroute>
-      <ASroute src="AS_griffon" dst="gw_AS_nancy" gw_src="griffon-AS_griffon_router.nancy.grid5000.fr" gw_dst="gw_nancy">
+      </zoneRoute>
+      <zoneRoute src="AS_griffon" dst="gw_AS_nancy" gw_src="griffon-AS_griffon_router.nancy.grid5000.fr" gw_dst="gw_nancy">
         <link_ctn id="link_griffon"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <AS id="AS_orsay" routing="Full">
-      <AS id="AS_gdx" routing="Full">
+    <zone id="AS_orsay" routing="Full">
+      <zone id="AS_gdx" routing="Full">
         <cluster id="AS_netgear01.orsay.grid5000.fr" prefix="gdx-" suffix=".orsay.grid5000.fr" radical="1-36" speed="4.7153E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_netgear02.orsay.grid5000.fr" prefix="gdx-" suffix=".orsay.grid5000.fr" radical="37-72" speed="4.7153E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_netgear03.orsay.grid5000.fr" prefix="gdx-" suffix=".orsay.grid5000.fr" radical="73-108" speed="4.7153E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_switch14.orsay.grid5000.fr" prefix="gdx-" suffix=".orsay.grid5000.fr" radical="181-186" speed="4.7153E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
         <cluster id="AS_switch15.orsay.grid5000.fr" prefix="gdx-" suffix=".orsay.grid5000.fr" radical="187-192" speed="4.7153E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
 
-        <AS id="gw_AS_gdx" routing="Full">
+        <zone id="gw_AS_gdx" routing="Full">
           <router id="gdx-AS_gdx_router.orsay.grid5000.fr"/>
-        </AS>
+        </zone>
         <link id="switch-gdx" bandwidth="1250000000Bps" latency="5E-4s"/>
 
-        <ASroute src="AS_netgear06.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        <zoneRoute src="AS_netgear06.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear08.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear08.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear08.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear08.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch14.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch14.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch14.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch14.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch14.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch14.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear05.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear05.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear05.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear05.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear05.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear05.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear05.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear05.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear03.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear03.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear03.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear03.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear03.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear03.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear03.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear03.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear03.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear03.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear07.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear07.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear07.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear07.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear07.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear07.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear07.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear07.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear07.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear07.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear07.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear07.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear01.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear01.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear01.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear01.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear07.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear01.orsay.grid5000.fr" dst="AS_netgear07.orsay.grid5000.fr" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear07.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear07.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear01.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="AS_netgear01.orsay.grid5000.fr" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear07.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear07.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear01.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_netgear01.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="AS_switch15.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="AS_switch15.orsay.grid5000.fr" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_procurve-bmc-09.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear06.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear08.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_switch14.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear05.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear03.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear07.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear07.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear01.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear01.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_switch15.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_switch15.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear02.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="AS_netgear02.orsay.grid5000.fr" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
+        </zoneRoute>
 
-        <ASroute src="AS_procurve-bmc-09.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        <zoneRoute src="AS_procurve-bmc-09.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_procurve-bmc-09.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear06.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear06.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear06.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear08.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear08.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear08.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch14.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch14.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_switch14.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear05.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear05.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear05.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear03.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear03.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear03.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear07.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear07.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear07.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear01.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear01.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear01.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_switch15.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_switch15.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_switch15.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear02.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear02.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear02.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-        <ASroute src="AS_netgear04.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
+        </zoneRoute>
+        <zoneRoute src="AS_netgear04.orsay.grid5000.fr" dst="gw_AS_gdx" gw_src="gdx-AS_netgear04.orsay.grid5000.fr_router.orsay.grid5000.fr" gw_dst="gdx-AS_gdx_router.orsay.grid5000.fr">
           <link_ctn id="switch-gdx"/>
-        </ASroute>
-      </AS>
+        </zoneRoute>
+      </zone>
       <link id="link_gdx" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
       <cluster id="AS_netgdx" prefix="netgdx-" suffix=".orsay.grid5000.fr" radical="1-30" speed="4.7144E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_netgdx" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_orsay" routing="Full">
+      <zone id="gw_AS_orsay" routing="Full">
         <router id="gw_orsay"/>
-      </AS>
+      </zone>
       <link id="link_gw_orsay" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_gdx" dst="AS_netgdx" gw_src="gdx-AS_gdx_router.orsay.grid5000.fr" gw_dst="netgdx-AS_netgdx_router.orsay.grid5000.fr">
+      <zoneRoute src="AS_gdx" dst="AS_netgdx" gw_src="gdx-AS_gdx_router.orsay.grid5000.fr" gw_dst="netgdx-AS_netgdx_router.orsay.grid5000.fr">
         <link_ctn id="link_gdx"/>
         <link_ctn id="link_netgdx"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_netgdx" dst="gw_AS_orsay" gw_src="netgdx-AS_netgdx_router.orsay.grid5000.fr" gw_dst="gw_orsay">
+      <zoneRoute src="AS_netgdx" dst="gw_AS_orsay" gw_src="netgdx-AS_netgdx_router.orsay.grid5000.fr" gw_dst="gw_orsay">
         <link_ctn id="link_netgdx"/>
-      </ASroute>
-      <ASroute src="AS_gdx" dst="gw_AS_orsay" gw_src="gdx-AS_gdx_router.orsay.grid5000.fr" gw_dst="gw_orsay">
+      </zoneRoute>
+      <zoneRoute src="AS_gdx" dst="gw_AS_orsay" gw_src="gdx-AS_gdx_router.orsay.grid5000.fr" gw_dst="gw_orsay">
         <link_ctn id="link_gdx"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <AS id="AS_rennes" routing="Full">
+    <zone id="AS_rennes" routing="Full">
       <cluster id="AS_paradent" prefix="paradent-" suffix=".rennes.grid5000.fr" radical="1-64" speed="21.496E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_paradent" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
       <cluster id="AS_parapluie" prefix="parapluie-" suffix=".rennes.grid5000.fr" radical="1-40" speed="27.391E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_parapluie" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_rennes" routing="Full">
+      <zone id="gw_AS_rennes" routing="Full">
         <router id="gw_rennes"/>
-      </AS>
+      </zone>
       <link id="link_gw_rennes" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_parapluie" dst="AS_paradent" gw_src="parapluie-AS_parapluie_router.rennes.grid5000.fr" gw_dst="paradent-AS_paradent_router.rennes.grid5000.fr">
+      <zoneRoute src="AS_parapluie" dst="AS_paradent" gw_src="parapluie-AS_parapluie_router.rennes.grid5000.fr" gw_dst="paradent-AS_paradent_router.rennes.grid5000.fr">
         <link_ctn id="link_parapluie"/>
         <link_ctn id="link_paradent"/>
-      </ASroute>
-      <ASroute src="AS_parapide" dst="AS_paradent" gw_src="parapide-AS_parapide_router.rennes.grid5000.fr" gw_dst="paradent-AS_paradent_router.rennes.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_parapide" dst="AS_paradent" gw_src="parapide-AS_parapide_router.rennes.grid5000.fr" gw_dst="paradent-AS_paradent_router.rennes.grid5000.fr">
         <link_ctn id="link_parapide"/>
         <link_ctn id="link_paradent"/>
-      </ASroute>
-      <ASroute src="AS_parapide" dst="AS_parapluie" gw_src="parapide-AS_parapide_router.rennes.grid5000.fr" gw_dst="parapluie-AS_parapluie_router.rennes.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_parapide" dst="AS_parapluie" gw_src="parapide-AS_parapide_router.rennes.grid5000.fr" gw_dst="parapluie-AS_parapluie_router.rennes.grid5000.fr">
         <link_ctn id="link_parapide"/>
         <link_ctn id="link_parapluie"/>
-      </ASroute>
-      <ASroute src="AS_paramount" dst="AS_paradent" gw_src="paramount-AS_paramount_router.rennes.grid5000.fr" gw_dst="paradent-AS_paradent_router.rennes.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_paramount" dst="AS_paradent" gw_src="paramount-AS_paramount_router.rennes.grid5000.fr" gw_dst="paradent-AS_paradent_router.rennes.grid5000.fr">
         <link_ctn id="link_paramount"/>
         <link_ctn id="link_paradent"/>
-      </ASroute>
-      <ASroute src="AS_paramount" dst="AS_parapluie" gw_src="paramount-AS_paramount_router.rennes.grid5000.fr" gw_dst="parapluie-AS_parapluie_router.rennes.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_paramount" dst="AS_parapluie" gw_src="paramount-AS_paramount_router.rennes.grid5000.fr" gw_dst="parapluie-AS_parapluie_router.rennes.grid5000.fr">
         <link_ctn id="link_paramount"/>
         <link_ctn id="link_parapluie"/>
-      </ASroute>
-      <ASroute src="AS_paramount" dst="AS_parapide" gw_src="paramount-AS_paramount_router.rennes.grid5000.fr" gw_dst="parapide-AS_parapide_router.rennes.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_paramount" dst="AS_parapide" gw_src="paramount-AS_paramount_router.rennes.grid5000.fr" gw_dst="parapide-AS_parapide_router.rennes.grid5000.fr">
         <link_ctn id="link_paramount"/>
         <link_ctn id="link_parapide"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_paradent" dst="gw_AS_rennes" gw_src="paradent-AS_paradent_router.rennes.grid5000.fr" gw_dst="gw_rennes">
+      <zoneRoute src="AS_paradent" dst="gw_AS_rennes" gw_src="paradent-AS_paradent_router.rennes.grid5000.fr" gw_dst="gw_rennes">
         <link_ctn id="link_paradent"/>
-      </ASroute>
-      <ASroute src="AS_parapluie" dst="gw_AS_rennes" gw_src="parapluie-AS_parapluie_router.rennes.grid5000.fr" gw_dst="gw_rennes">
+      </zoneRoute>
+      <zoneRoute src="AS_parapluie" dst="gw_AS_rennes" gw_src="parapluie-AS_parapluie_router.rennes.grid5000.fr" gw_dst="gw_rennes">
         <link_ctn id="link_parapluie"/>
-      </ASroute>
-      <ASroute src="AS_parapide" dst="gw_AS_rennes" gw_src="parapide-AS_parapide_router.rennes.grid5000.fr" gw_dst="gw_rennes">
+      </zoneRoute>
+      <zoneRoute src="AS_parapide" dst="gw_AS_rennes" gw_src="parapide-AS_parapide_router.rennes.grid5000.fr" gw_dst="gw_rennes">
         <link_ctn id="link_parapide"/>
-      </ASroute>
-      <ASroute src="AS_paramount" dst="gw_AS_rennes" gw_src="paramount-AS_paramount_router.rennes.grid5000.fr" gw_dst="gw_rennes">
+      </zoneRoute>
+      <zoneRoute src="AS_paramount" dst="gw_AS_rennes" gw_src="paramount-AS_paramount_router.rennes.grid5000.fr" gw_dst="gw_rennes">
         <link_ctn id="link_paramount"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <AS id="AS_sophia" routing="Full">
+    <zone id="AS_sophia" routing="Full">
       <cluster id="AS_helios" prefix="helios-" suffix=".sophia.grid5000.fr" radical="1-56" speed="7.7318E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_helios" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
       <cluster id="AS_suno" prefix="suno-" suffix=".sophia.grid5000.fr" radical="1-45" speed="23.530E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_suno" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_sophia" routing="Full">
+      <zone id="gw_AS_sophia" routing="Full">
         <router id="gw_sophia"/>
-      </AS>
+      </zone>
       <link id="link_gw_sophia" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_helios" dst="AS_sol" gw_src="helios-AS_helios_router.sophia.grid5000.fr" gw_dst="sol-AS_sol_router.sophia.grid5000.fr">
+      <zoneRoute src="AS_helios" dst="AS_sol" gw_src="helios-AS_helios_router.sophia.grid5000.fr" gw_dst="sol-AS_sol_router.sophia.grid5000.fr">
         <link_ctn id="link_helios"/>
         <link_ctn id="link_sol"/>
-      </ASroute>
-      <ASroute src="AS_suno" dst="AS_sol" gw_src="suno-AS_suno_router.sophia.grid5000.fr" gw_dst="sol-AS_sol_router.sophia.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_suno" dst="AS_sol" gw_src="suno-AS_suno_router.sophia.grid5000.fr" gw_dst="sol-AS_sol_router.sophia.grid5000.fr">
         <link_ctn id="link_suno"/>
         <link_ctn id="link_sol"/>
-      </ASroute>
-      <ASroute src="AS_suno" dst="AS_helios" gw_src="suno-AS_suno_router.sophia.grid5000.fr" gw_dst="helios-AS_helios_router.sophia.grid5000.fr">
+      </zoneRoute>
+      <zoneRoute src="AS_suno" dst="AS_helios" gw_src="suno-AS_suno_router.sophia.grid5000.fr" gw_dst="helios-AS_helios_router.sophia.grid5000.fr">
         <link_ctn id="link_suno"/>
         <link_ctn id="link_helios"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_sol" dst="gw_AS_sophia" gw_src="sol-AS_sol_router.sophia.grid5000.fr" gw_dst="gw_sophia">
+      <zoneRoute src="AS_sol" dst="gw_AS_sophia" gw_src="sol-AS_sol_router.sophia.grid5000.fr" gw_dst="gw_sophia">
         <link_ctn id="link_sol"/>
-      </ASroute>
-      <ASroute src="AS_helios" dst="gw_AS_sophia" gw_src="helios-AS_helios_router.sophia.grid5000.fr" gw_dst="gw_sophia">
+      </zoneRoute>
+      <zoneRoute src="AS_helios" dst="gw_AS_sophia" gw_src="helios-AS_helios_router.sophia.grid5000.fr" gw_dst="gw_sophia">
         <link_ctn id="link_helios"/>
-      </ASroute>
-      <ASroute src="AS_suno" dst="gw_AS_sophia" gw_src="suno-AS_suno_router.sophia.grid5000.fr" gw_dst="gw_sophia">
+      </zoneRoute>
+      <zoneRoute src="AS_suno" dst="gw_AS_sophia" gw_src="suno-AS_suno_router.sophia.grid5000.fr" gw_dst="gw_sophia">
         <link_ctn id="link_suno"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <AS id="AS_toulouse" routing="Full">
+    <zone id="AS_toulouse" routing="Full">
       <cluster id="AS_pastel" prefix="pastel-" suffix=".toulouse.grid5000.fr" radical="1-80" speed="9.5674E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_pastel" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
       <cluster id="AS_violette" prefix="violette-" suffix=".toulouse.grid5000.fr" radical="1-52" speed="5.1143E9f" bw="1.25E8Bps" lat="1.0E-4s" bb_bw="1.25E9Bps" bb_lat="1.0E-4s"/>
       <link id="link_violette" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <AS id="gw_AS_toulouse" routing="Full">
+      <zone id="gw_AS_toulouse" routing="Full">
         <router id="gw_toulouse"/>
-      </AS>
+      </zone>
       <link id="link_gw_toulouse" bandwidth="1.25E9Bps" latency="1.0E-4s"/>
 
-      <ASroute src="AS_violette" dst="AS_pastel" gw_src="violette-AS_violette_router.toulouse.grid5000.fr" gw_dst="pastel-AS_pastel_router.toulouse.grid5000.fr">
+      <zoneRoute src="AS_violette" dst="AS_pastel" gw_src="violette-AS_violette_router.toulouse.grid5000.fr" gw_dst="pastel-AS_pastel_router.toulouse.grid5000.fr">
         <link_ctn id="link_violette"/>
         <link_ctn id="link_pastel"/>
-      </ASroute>
+      </zoneRoute>
 
-      <ASroute src="AS_pastel" dst="gw_AS_toulouse" gw_src="pastel-AS_pastel_router.toulouse.grid5000.fr" gw_dst="gw_toulouse">
+      <zoneRoute src="AS_pastel" dst="gw_AS_toulouse" gw_src="pastel-AS_pastel_router.toulouse.grid5000.fr" gw_dst="gw_toulouse">
         <link_ctn id="link_pastel"/>
-      </ASroute>
-      <ASroute src="AS_violette" dst="gw_AS_toulouse" gw_src="violette-AS_violette_router.toulouse.grid5000.fr" gw_dst="gw_toulouse">
+      </zoneRoute>
+      <zoneRoute src="AS_violette" dst="gw_AS_toulouse" gw_src="violette-AS_violette_router.toulouse.grid5000.fr" gw_dst="gw_toulouse">
         <link_ctn id="link_violette"/>
-      </ASroute>
-    </AS>
+      </zoneRoute>
+    </zone>
 
-    <ASroute src="AS_toulouse" dst="AS_interne" gw_src="gw_toulouse" gw_dst="toulouse">
+    <zoneRoute src="AS_toulouse" dst="AS_interne" gw_src="gw_toulouse" gw_dst="toulouse">
       <link_ctn id="link_gw_toulouse"/>
-    </ASroute>
-    <ASroute src="AS_sophia" dst="AS_interne" gw_src="gw_sophia" gw_dst="sophia">
+    </zoneRoute>
+    <zoneRoute src="AS_sophia" dst="AS_interne" gw_src="gw_sophia" gw_dst="sophia">
       <link_ctn id="link_gw_sophia"/>
-    </ASroute>
-    <ASroute src="AS_rennes" dst="AS_interne" gw_src="gw_rennes" gw_dst="rennes">
+    </zoneRoute>
+    <zoneRoute src="AS_rennes" dst="AS_interne" gw_src="gw_rennes" gw_dst="rennes">
       <link_ctn id="link_gw_rennes"/>
-    </ASroute>
-    <ASroute src="AS_orsay" dst="AS_interne" gw_src="gw_orsay" gw_dst="paris">
+    </zoneRoute>
+    <zoneRoute src="AS_orsay" dst="AS_interne" gw_src="gw_orsay" gw_dst="paris">
       <link_ctn id="link_gw_orsay"/>
-    </ASroute>
-    <ASroute src="AS_nancy" dst="AS_interne" gw_src="gw_nancy" gw_dst="nancy">
+    </zoneRoute>
+    <zoneRoute src="AS_nancy" dst="AS_interne" gw_src="gw_nancy" gw_dst="nancy">
       <link_ctn id="link_gw_nancy"/>
-    </ASroute>
-    <ASroute src="AS_lyon" dst="AS_interne" gw_src="gw_lyon" gw_dst="lyon">
+    </zoneRoute>
+    <zoneRoute src="AS_lyon" dst="AS_interne" gw_src="gw_lyon" gw_dst="lyon">
       <link_ctn id="link_gw_lyon"/>
-    </ASroute>
-    <ASroute src="AS_lille" dst="AS_interne" gw_src="gw_lille" gw_dst="lille">
+    </zoneRoute>
+    <zoneRoute src="AS_lille" dst="AS_interne" gw_src="gw_lille" gw_dst="lille">
       <link_ctn id="link_gw_lille"/>
-    </ASroute>
-    <ASroute src="AS_grenoble" dst="AS_interne" gw_src="gw_grenoble" gw_dst="grenoble">
+    </zoneRoute>
+    <zoneRoute src="AS_grenoble" dst="AS_interne" gw_src="gw_grenoble" gw_dst="grenoble">
       <link_ctn id="link_gw_grenoble"/>
-    </ASroute>
-    <ASroute src="AS_bordeaux" dst="AS_interne" gw_src="gw_bordeaux" gw_dst="bordeaux">
+    </zoneRoute>
+    <zoneRoute src="AS_bordeaux" dst="AS_interne" gw_src="gw_bordeaux" gw_dst="bordeaux">
       <link_ctn id="link_gw_bordeaux"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index 69ac6e4..8aeb176 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS_griffon"  routing="Full">
+<platform version="4.1">
+  <zone id="AS_griffon"  routing="Full">
     <cluster id="griffon_cluster_cabinet1" prefix="griffon-" suffix=".nancy.grid5000.fr"
              radical="1-29,58,59,60" speed="286.087kf" bw="125MBps" lat="24us"
              bb_bw="1.25GBps" bb_lat="0" sharing_policy="FULLDUPLEX" bb_sharing_policy="SHARED"/>
 
     <link id="backbone" bandwidth="1.25GBps" latency="24us" sharing_policy="SHARED"/>
 
-    <ASroute src="griffon_cluster_cabinet1" dst="griffon_cluster_cabinet2" 
+    <zoneRoute src="griffon_cluster_cabinet1" dst="griffon_cluster_cabinet2" 
              gw_src="griffon-griffon_cluster_cabinet1_router.nancy.grid5000.fr"
              gw_dst="griffon-griffon_cluster_cabinet2_router.nancy.grid5000.fr">
       <link_ctn id="backbone"/>
-    </ASroute>
-    <ASroute src="griffon_cluster_cabinet2" dst="griffon_cluster_cabinet3" 
+    </zoneRoute>
+    <zoneRoute src="griffon_cluster_cabinet2" dst="griffon_cluster_cabinet3" 
              gw_src="griffon-griffon_cluster_cabinet2_router.nancy.grid5000.fr"
            gw_dst="griffon-griffon_cluster_cabinet3_router.nancy.grid5000.fr">
       <link_ctn id="backbone"/>
-    </ASroute>
-    <ASroute src="griffon_cluster_cabinet1" dst="griffon_cluster_cabinet3" 
+    </zoneRoute>
+    <zoneRoute src="griffon_cluster_cabinet1" dst="griffon_cluster_cabinet3" 
              gw_src="griffon-griffon_cluster_cabinet1_router.nancy.grid5000.fr"
              gw_dst="griffon-griffon_cluster_cabinet3_router.nancy.grid5000.fr">
       <link_ctn id="backbone"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index 98d6c22..e30ce55 100644 (file)
@@ -1,29 +1,29 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
-    <AS  id="my_cluster1"  routing="Cluster">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
+    <zone  id="my_cluster1"  routing="Cluster">
       <cabinet id="cabinet1" prefix="host-" suffix=".cluster1" speed="1Gf" bw="125MBps" lat="100us" radical="1-10"/>
       <cabinet id="cabinet2" prefix="host-" suffix=".cluster1" speed="1Gf" bw="125MBps" lat="100us" radical="11-20"/>
       <cabinet id="cabinet3" prefix="host-" suffix=".cluster1" speed="1Gf" bw="125MBps" lat="100us" radical="21-30"/>
 
       <router  id="router1"/>
       <backbone id="backbone1" bandwidth="2.25GBps" latency="500us"/>
-    </AS>
+    </zone>
 
-    <AS  id="my_cluster2"  routing="Cluster">
+    <zone  id="my_cluster2"  routing="Cluster">
       <cabinet id="cabinet1" prefix="host-" suffix=".cluster2" speed="1Gf" bw="125MBps" lat="100us" radical="1-10"/>
       <cabinet id="cabinet2" prefix="host-" suffix=".cluster2" speed="1Gf" bw="125MBps" lat="100us" radical="11-20"/>
       <cabinet id="cabinet3" prefix="host-" suffix=".cluster2" speed="1Gf" bw="125MBps" lat="100us" radical="21-30"/>
 
       <router  id="router2"/>
       <backbone id="backbone2" bandwidth="2.25GBps" latency="500us"/>
-    </AS>
+    </zone>
 
     <link id="link1-2" bandwidth="2.25GBps" latency="500us"/>
 
-    <ASroute src="my_cluster1" dst="my_cluster2" gw_src="router1" gw_dst="router2">
+    <zoneRoute src="my_cluster1" dst="my_cluster2" gw_src="router1" gw_dst="router2">
       <link_ctn id="link1-2" />
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index 93134dc..68c0e21 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0" routing="Full">
+<platform version="4.1">
+  <zone  id="AS0" routing="Full">
     <host id="Tremblay" speed="98.095Mf" core="6"/>
-  </AS>
+  </zone>
 </platform>
index 2a86803..4682e74 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <!---   S1 <-> link 1 <-> C1  -->
     <!---        (10kB, 10ms)     -->
 
@@ -11,5 +11,5 @@
     <route src="S1" dst="C1">
       <link_ctn id="1"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index eb22be6..fdf39cf 100644 (file)
@@ -1,21 +1,21 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!-- This file describe a super simple platform which main interest is to define some properties on hosts, 
        processes and links. It is used in several regression cases on properties -->
-  <AS  id="AS0"  routing="Full">
+  <zone  id="AS0"  routing="Full">
     <prop id="filename" value="prop.xml"/>
     <prop id="date" value="31-08-12"/>
     <prop id="author" value="pnavarro"/>
 
-    <AS id="AS3"  routing="Full">
-      <AS id="AS1" routing="None">
+    <zone id="AS3"  routing="Full">
+      <zone id="AS1" routing="None">
         <prop id="name" value="AS1"/>
-      </AS>
-      <AS id="AS2" routing="None">
+      </zone>
+      <zone id="AS2" routing="None">
         <prop id="name" value="AS2"/>
-     </AS>
-    </AS>
+     </zone>
+    </zone>
 
     <cluster id="acme" prefix="node-" suffix=".acme.org" radical="0-4" speed="1Gf"
              bw="125MBps" lat="50us" bb_bw="2.25GBps"  bb_lat="500us">
@@ -24,7 +24,7 @@
       <prop id="mem"  value="42"/>
     </cluster>
 
-    <AS  id="AS4"  routing="Full">
+    <zone  id="AS4"  routing="Full">
       <host id="host1" speed="1Gf">
         <prop id="Hdd" value="180"/>
         <prop id="mem" value="4"/>
@@ -44,6 +44,6 @@
         <link_ctn id="l1"/>
         <link_ctn id="l2"/>
       </route>
-    </AS>
-  </AS>
+    </zone>
+  </zone>
 </platform>
index a5e242e..872b303 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 <!--              router1 - - - - - - link1-2 - - - - - - router2
        __________________________                   _________________________
        |                        |                   |                        |
@@ -11,8 +11,8 @@ l1_up / / l1_down  | l3   l2_up\ \ l2_down   l4_up / / l4_down  | l6   l5_up\ \
      / /           |            \ \               / /           |            \ \
     host1         host3         host2           host4         host6          host5
 -->
-  <AS id="AS0" routing="Full">
-    <AS  id="my_cluster1"  routing="Cluster">
+  <zone id="AS0" routing="Full">
+    <zone  id="my_cluster1"  routing="Cluster">
       <router id="router1"/>
 
       <host id="host1" speed="1Gf"/>
@@ -29,9 +29,9 @@ l1_up / / l1_down  | l3   l2_up\ \ l2_down   l4_up / / l4_down  | l6   l5_up\ \
       <host_link id="host3" up="l3" down="l3"/>
 
       <backbone id="backbone1" bandwidth="2.25GBps" latency="500us"/>
-    </AS>
+    </zone>
 
-    <AS  id="my_cluster2"  routing="Cluster">
+    <zone  id="my_cluster2"  routing="Cluster">
       <router id="router2"/>
 
       <host id="host4" speed="1Gf"/>
@@ -48,12 +48,12 @@ l1_up / / l1_down  | l3   l2_up\ \ l2_down   l4_up / / l4_down  | l6   l5_up\ \
       <host_link id="host6" up="l6" down="l6"/>
 
       <backbone id="backbone2" bandwidth="2.25GBps" latency="500us"/>
-    </AS>
+    </zone>
 
     <link id="link1-2" bandwidth="2.25GBps" latency="500us"/>
 
-    <ASroute src="my_cluster1" dst="my_cluster2" gw_src="router1" gw_dst="router2">
+    <zoneRoute src="my_cluster1" dst="my_cluster2" gw_src="router1" gw_dst="router2">
       <link_ctn id="link1-2" />
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index 01da662..5cd432c 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 <!--     This platform does not use any routing. It is what Constant network model expects. -->
-  <AS id="AS0" routing="None">
+  <zone id="AS0" routing="None">
     <host id="node-0.acme.org" speed="1Gf"/>
     <host id="node-1.acme.org" speed="1Gf"/>
     <host id="node-2.acme.org" speed="1Gf"/>
@@ -13,5 +13,5 @@
     <host id="node-7.acme.org" speed="1Gf"/>
     <host id="node-8.acme.org" speed="1Gf"/>
     <host id="node-9.acme.org" speed="1Gf"/>
-  </AS>
+  </zone>
 </platform>
index 9c41850..3887685 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 <!-- This is a random platform, generated with Simulacrum.
         http://pda.gforge.inria.fr/tools/download.html
      Unfortunately, the generation parameters were lost with the years. -->
 
-  <AS  id="AS0" routing="Full">
+  <zone  id="AS0" routing="Full">
     <host id="Host 26" speed="3.300140519709234Gf"/>
     <host id="Host 27" speed="3.867398877553016Gf"/>
     <host id="Host 28" speed="1.6522665718098645Gf"/>
     <route src="Host 31" dst="Host 32">
       <link_ctn id="l173"/>
     </route>
-  </AS>
+  </zone>
 </platform>
 
index 0f6c5f5..576fa7b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone id="zone0" routing="Full">
     <host id="Tremblay" speed="98.095Mf"/>
     <host id="Jupiter" speed="76.296Mf"/>
     <host id="Fafard" speed="76.296Mf"/>
       <link_ctn id="78"/>
       <link_ctn id="80"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index cf056b5..6376744 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <host id="Tremblay" speed="98.095Mf"/>
     <host id="Ruby" speed="98.095Mf"/>
     <host id="Perl" speed="98.095Mf"/>
@@ -24,5 +24,5 @@
     <route src="Ruby" dst="Perl">
       <link_ctn id="4"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 0be82e2..faaad67 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="Tremblay" speed="98.095Mf"/>
     <host id="Jupiter" speed="76.296Mf"/>
     <host id="Fafard" speed="76.296Mf"/>
@@ -70,5 +70,5 @@
     <route src="Bourassa" dst="Lovelace">
       <link_ctn id="14"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 6dc6f93..a19986c 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="Tremblay" speed="25Mf"/>
     <host id="Jupiter"  speed="25Mf" state_file="trace/jupiter_state.trace"/>
     <host id="Fafard"   speed="25Mf" state_file="trace/fafard_state.trace" />
@@ -66,5 +66,5 @@
     <route src="Ginette" dst="Bourassa">
       <link_ctn id="10"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 91f619c..688d71c 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="Tremblay" speed="98.095Mf"/>
     <host id="Jupiter" speed="76.296Mf"/>
     <host id="Fafard" speed="76.296Mf"/>
       <link_ctn id="6"/>
       <link_ctn id="7"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 3caa9db..b654b9c 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <config>
     <prop id="path" value="../examples/platforms/"/>
   </config>
 
-  <AS id="AS0" routing="Full">
+  <zone id="AS0" routing="Full">
     <storage_type id="SATA-II_HDD" size="500GB" model="linear_no_lat"
                   content_type="txt_unix" content="content/small_content.txt">
       <model_prop id="Bread" value="92MBps"/> 
@@ -56,5 +56,5 @@
     <route src="carl" dst="dave">
       <link_ctn id="link6"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 6372351..449438e 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <config>
     <prop id="path" value="../examples/platforms/"/>
   </config>
 
-  <AS id="AS0" routing="Full">
+  <zone id="AS0" routing="Full">
     <storage_type id="single_HDD" size="500GiB" model="linear_no_lat" 
                   content="content/storage_content.txt" content_type="txt_unix">
       <model_prop id="Bwrite" value="30MBps" />
@@ -46,5 +46,5 @@
     <route src="bob" dst="alice">
       <link_ctn id="link1" />
     </route>
-  </AS>
+  </zone>
 </platform>
index cbc9f00..0b237da 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="siteA" routing="Full">
+<platform version="4.1">
+  <zone id="siteA" routing="Full">
     <host id="PM0" speed="8.095Gf" core="4"/>
     <host id="PM1" speed="8.095Gf" core="4"/>
     <host id="PM2" speed="8.095Gf" core="2"/>
@@ -17,5 +17,5 @@
     <route src="PM1" dst="PM2">
       <link_ctn id="link1"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 8550f51..33719c8 100644 (file)
@@ -1,2 +1,2 @@
-0.0 0.5
-2.0 1.0
\ No newline at end of file
+0 0.5
+2 1.0
\ No newline at end of file
index 0514220..fd47a86 100644 (file)
@@ -1,3 +1,3 @@
-PERIODICITY 6.0
-2.0 62500000
-4.0 31250000
+2 62500000
+4 31250000
+LOOPAFTER 6
index 34a24c3..5320d5d 100644 (file)
@@ -1,5 +1,6 @@
-PERIODICITY 8.0
 1.007044263744508 6.846527733924368E7
 4.199387092709633 1.0335587797993976E8
 5.319464737378834 1.0591433767387845E7
 7.237437222882919 7.037797434537312E7
+LOOPAFTER 0.76256277712
+# Wait until t=8
index 73f8eb8..78c04c4 100644 (file)
@@ -1,4 +1,4 @@
-PERIODICITY 1.0
-0.0 1.0
-11.0 0.5
-20.0 0.9
+0 1.0
+11 0.5
+20 0.9
+LOOPAFTER 1
index e94c255..38da833 100644 (file)
@@ -1,4 +1,4 @@
-PERIODICITY 10.00
-0.0 1.0
-10.0 0.8
-20.0 0.4
+0 1.0
+10 0.8
+20 0.4
+LOOPAFTER 10
index bc85678..29ec619 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 <!--                  _________________________________________
                  ____|_____                                    |
                 |          |                                   |
@@ -22,7 +22,7 @@ node-0.acme.org                     node-9.acme.org            |
       |                                |
 node-10.acme.org               node-19.acme.org -->
 
-  <AS id="AS0" routing="Full">
+  <zone id="AS0" routing="Full">
     <cluster id="my_cluster_1" prefix="node-" suffix=".acme.org" radical="0-9" speed="1Gf" 
              bw="125MBps" lat="50us" bb_bw="2.25GBps" bb_lat="500us" />
 
@@ -31,9 +31,9 @@ node-10.acme.org               node-19.acme.org -->
 
     <link id="backbone" bandwidth="1.25GBps" latency="500us" />
 
-    <ASroute src="my_cluster_1" dst="my_cluster_2" gw_src="node-my_cluster_1_router.acme.org"
+    <zoneRoute src="my_cluster_1" dst="my_cluster_2" gw_src="node-my_cluster_1_router.acme.org"
              gw_dst="node-my_cluster_2_router.acme.org">
       <link_ctn id="backbone" />
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index 2aebc98..b6d03ba 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <host id="Tremblay" speed="25Mf"/>
     <host id="Jupiter" speed="25Mf" availability_file="trace/jupiter_speed.trace"/>
 
@@ -10,7 +10,7 @@
     <route src="Tremblay" dst="Jupiter">
       <link_ctn id="1"/>
     </route>
-  </AS>
+  </zone>
 
   <trace id="Tremblay_power" periodicity="6.0">
     1.0 0.5
index 23e1d82..362f8a8 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0" routing="Full">
+<platform version="4.1">
+  <zone  id="AS0" routing="Full">
     <host id="cpu0" speed="4Gf"/>
     <host id="cpu1" speed="4Gf"/>
 
@@ -16,5 +16,5 @@
     <route src="cpu1" dst="cpu1">
       <link_ctn id="link0"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index c9d6e49..217b7a3 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="Cpu A" speed="10f" availability_file="trace/trace_A.txt" state_file="trace/trace_A_failure.txt"/>
     <host id="Cpu B" speed="10f" availability_file="trace/trace_B.txt"/>
     <link id="LinkA" bandwidth="10MBps" latency="200ms"/>
     <route src="Cpu A" dst="Cpu B">
       <link_ctn id="LinkA"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 3eb160f..b6fc419 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <trace id="A" periodicity="1.0">
     0.0 1.0
     11.0 0.5
     20.0 0.4
   </trace>
 
-  <AS id="AS0" routing="Full">
+  <zone id="AS0" routing="Full">
     <host id="Cpu A" speed="10f"/>
     <host id="Cpu B" speed="10f"/>
     <link id="LinkA" bandwidth="10MBps" latency="200ms"/>
     <route src="Cpu A" dst="Cpu B">
       <link_ctn id="LinkA"/>
     </route>
-  </AS>
+  </zone>
 
   <trace_connect kind="SPEED" trace="A" element="Cpu A"/>
   <trace_connect kind="HOST_AVAIL" trace="A_failure" element="Cpu A"/>
index 92ac5d5..7236326 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Vivaldi">
+<platform version="4.1">
+  <zone id="AS0" routing="Vivaldi">
     <peer id="100030591" coordinates="25.5 9.4 1.4" speed="1.5Gf" bw_in="2.25GBps" bw_out="2.25GBps" />
     <peer id="100036570" coordinates="-12.7 -9.9 2.1" speed="730Mf" bw_in="2.25GBps" bw_out="2.25GBps" />
-  </AS>
+  </zone>
 </platform>
index f93727d..2bb79ed 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Vivaldi">
+<platform version="4.1">
+  <zone id="AS0" routing="Vivaldi">
     <host id="100030591" coordinates="25.5 9.4 1.4" speed="1.5Gf" />
     <host id="100036570" coordinates="-12.7 -9.9 2.1" speed="730Mf" />
     <host id="100041334" coordinates="-15.7 9.9 14.7" speed="2.8Gf" />
@@ -42,5 +42,5 @@
     <host id="100422926" coordinates="-23.1 -7.6 39.9" speed="1.6Gf" />
     <host id="100427449" coordinates="135.5 -21.0 83.4" speed="1.4Gf" />
     <host id="100429957" coordinates="17.5 6.7 18.8" speed="830Mf" />
-  </AS>
+  </zone>
 </platform>
index cce14e3..4e597fc 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="p0"/>
-  <process host="Ruby" function="p1"/>
+<platform version="4.1">
+  <actor host="Tremblay" function="p0"/>
+  <actor host="Ruby" function="p1"/>
 </platform>
index a88cf27..71d521a 100644 (file)
@@ -1,14 +1,14 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-<!-- Example file of how to use trace replay, with actions split in separate files, one per process.
+<platform version="4.1">
+<!-- Example file of how to use trace replay, with actions split in separate files, one per actor.
      Launch it like this:
          ./actions-comm ../../platforms/platform.xml actions-comm_split_d.xml  -->
 
-  <process host="Tremblay" function="p0">
+  <actor host="Tremblay" function="p0">
     <argument value="s4u_actions-comm_split_p0.txt"/>
-  </process>
-  <process host="Ruby"     function="p1">
+  </actor>
+  <actor host="Ruby"     function="p1">
     <argument value="s4u_actions-comm_split_p1.txt"/>
-  </process>
+  </actor>
 </platform>
index d2eb682..3f52ae6 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="denise" function="p0"/>
+<platform version="4.1">
+  <actor host="denise" function="p0"/>
 </platform>
index 6cdc3da..11e719b 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 
   <!-- This a weird deployment file: we only start one actor from here and the others from the main().
     -
@@ -8,8 +8,8 @@
     -  Instead, you want to start all your actors from the deployment file.
     -->
    
-  <process host="Fafard" function="receiver">
+  <actor host="Fafard" function="receiver">
     <!-- Pass the right mailbox name to the actor -->
     <argument value="mb42" />
-  </process>
+  </actor>
 </platform>
index 869db93..feadead 100644 (file)
@@ -1,27 +1,27 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="master">
     <argument value="20"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="5"/>         <!-- Number of workers -->
-  </process>
+  </actor>
   <!-- The worker processes (with mailbox to listen on as argument) -->
-  <process host="Tremblay" function="worker" on_failure="RESTART">
+  <actor host="Tremblay" function="worker" on_failure="RESTART">
     <argument value="0"/> 
-  </process>
-  <process host="Jupiter" function="worker" on_failure="RESTART">
+  </actor>
+  <actor host="Jupiter" function="worker" on_failure="RESTART">
     <argument value="1"/> 
-  </process>
-  <process host="Fafard" function="worker" on_failure="RESTART">
+  </actor>
+  <actor host="Fafard" function="worker" on_failure="RESTART">
     <argument value="2"/> 
-  </process>
-  <process host="Ginette" function="worker" on_failure="RESTART">
+  </actor>
+  <actor host="Ginette" function="worker" on_failure="RESTART">
     <argument value="3"/> 
-  </process>
-  <process host="Bourassa" function="worker" on_failure="RESTART">
+  </actor>
+  <actor host="Bourassa" function="worker" on_failure="RESTART">
     <argument value="4"/> 
-  </process>
+  </actor>
 </platform>
index 26e2b17..d2af449 100644 (file)
@@ -1,44 +1,44 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="node-0.acme.org" function="node">
+<platform version="4.1">
+  <actor host="node-0.acme.org" function="node">
     <argument value="42"/>
     <argument value="1000"/>
-  </process>
-  <process host="node-1.acme.org" function="node">
+  </actor>
+  <actor host="node-1.acme.org" function="node">
     <argument value="366680" />
     <argument value="42" />
     <argument value="10" />
     <argument value="200" />
-  </process>
-  <process host="node-2.acme.org" function="node">
+  </actor>
+  <actor host="node-2.acme.org" function="node">
     <argument value="533744" />
     <argument value="366680" />
     <argument value="20" />
     <argument value="400" />
-  </process>
-  <process host="node-3.acme.org" function="node">
+  </actor>
+  <actor host="node-3.acme.org" function="node">
     <argument value="1319738" />
     <argument value="42" />
     <argument value="30" />
     <argument value="150" />
-  </process>
-  <process host="node-4.acme.org" function="node">
+  </actor>
+  <actor host="node-4.acme.org" function="node">
     <argument value="16509405" />
     <argument value="366680" />
     <argument value="40" />
     <argument value="300" />
-  </process>
-  <process host="node-5.acme.org" function="node">
+  </actor>
+  <actor host="node-5.acme.org" function="node">
     <argument value="10874876" />
     <argument value="533744" />
     <argument value="250" />
     <argument value="600" />
-  </process>
-  <process host="node-6.acme.org" function="node">
+  </actor>
+  <actor host="node-6.acme.org" function="node">
     <argument value="16728096" />
     <argument value="1319738" />
     <argument value="60" />
     <argument value="800" />
-  </process>
-</platform>
\ No newline at end of file
+  </actor>
+</platform>
index 279f364..4d667c6 100644 (file)
@@ -28,7 +28,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/availability/sd_availability ${srcdir:=.}/../platf
 > [9.000400] [sd_avail/INFO] Jupiter: speed=25000000
 > [9.000400] [sd_avail/INFO] Tremblay: speed=25000000
 > [9.000400] [sd_avail/INFO] Task 'c3' start time: 8.000300, finish time: 9.000400
-> [10.000800] [sd_avail/INFO] link1: bw=62500000, lat=0.000100
-> [10.000800] [sd_avail/INFO] Jupiter: speed=25000000
-> [10.000800] [sd_avail/INFO] Tremblay: speed=12500000
-> [10.000800] [sd_avail/INFO] Task 't4' start time: 9.000400, finish time: 10.000800
+> [10.000400] [sd_avail/INFO] link1: bw=31250000, lat=0.000100
+> [10.000400] [sd_avail/INFO] Jupiter: speed=25000000
+> [10.000400] [sd_avail/INFO] Tremblay: speed=25000000
+> [10.000400] [sd_avail/INFO] Task 't4' start time: 9.000400, finish time: 10.000400
index 0dcf287..a949e73 100644 (file)
@@ -8,7 +8,7 @@
 #include <string.h>
 #include "simgrid/simdag.h"
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 #include "simgrid/jedule/jedule_sd_binding.h"
 #endif
 
@@ -231,7 +231,7 @@ int main(int argc, char **argv)
   XBT_INFO("Simulation Time: %f", SD_get_clock());
   XBT_INFO("------------------- Produce the trace file---------------------------");
   XBT_INFO("Producing a jedule output (if active) of the run into %s", tracefilename?tracefilename:"minmin_test.jed");
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
   jedule_sd_dump(tracefilename);
 #endif
   free(tracefilename);
index 376a992..ace4e78 100644 (file)
@@ -15,7 +15,7 @@ if(enable_smpi)
 
   foreach(x bugged1 bugged2 bugged1_liveness only_send_deterministic mutual_exclusion non_termination1 
             non_termination2 non_termination3 non_termination4)
-    if(HAVE_MC)
+    if(SIMGRID_HAVE_MC)
       add_executable       (smpi_${x} ${CMAKE_CURRENT_SOURCE_DIR}/mc/${x}.c)
       target_link_libraries(smpi_${x} simgrid)
       set_target_properties(smpi_${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mc)
@@ -55,7 +55,7 @@ set(txt_files     ${txt_files}     ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions0.t
                                    ${CMAKE_CURRENT_SOURCE_DIR}/replay/split_traces                         PARENT_SCOPE)
 
 if(enable_smpi)
-  if(HAVE_MC)
+  if(SIMGRID_HAVE_MC)
     ADD_TESH(smpi-mc-only-send-determinism --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/mc --cd ${CMAKE_BINARY_DIR}/examples/smpi/mc ${CMAKE_HOME_DIRECTORY}/examples/smpi/mc/only_send_deterministic.tesh)
   endif()
 
index 58e2a0e..e454081 100755 (executable)
@@ -114,7 +114,7 @@ APPLICATIONTMP=$(echo ${PROC_ARGS}|cut -d' ' -f2 -s)
 cat > ${APPLICATIONTMP} <<APPLICATIONHEAD
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 APPLICATIONHEAD
 
 ##---- cache hostnames of hostfile---------------
@@ -168,7 +168,7 @@ if [ -n "${DESCRIPTIONFILE}" ] && [ -f "${DESCRIPTIONFILE}" ]; then
 ##  hostfile has less than i lines.
 ##----------------------------------------------------------
 
-##---- generate <process> tags------------------------------
+##---- generate <actor> tags------------------------------
         do
            if [ -n "${HOSTFILE}" ]; then
                j=$(( ${NUMPROCS} % ${NUMHOSTS} +1))
@@ -180,13 +180,13 @@ if [ -n "${DESCRIPTIONFILE}" ] && [ -f "${DESCRIPTIONFILE}" ]; then
                host="${hostname}"
             fi
         
-            echo "  <process host=\"${host}\" function=\"${instance}\"> <!-- function name used only for logging -->" >> ${APPLICATIONTMP}
+            echo "  <actor host=\"${host}\" function=\"${instance}\"> <!-- function name used only for logging -->" >> ${APPLICATIONTMP}
             echo "    <argument value=\"${instance}\"/> <!-- instance -->" >> ${APPLICATIONTMP}
             echo "    <argument value=\"${i}\"/> <!-- rank -->" >> ${APPLICATIONTMP}
             echo "    <argument value=\"$(echo $hosttrace|cut -d' ' -f$(($i+1)))\"/>" >> ${APPLICATIONTMP}
            
             echo "    <argument value=\"${sleeptime}\"/> <!-- delay -->" >> ${APPLICATIONTMP}
-            echo "  </process>" >> ${APPLICATIONTMP}
+            echo "  </actor>" >> ${APPLICATIONTMP}
             NUMPROCS=$(( ${NUMPROCS} +1))
         done
         # return IFS back to newline for "for" loop
index e879f74..75266f9 100644 (file)
@@ -1,39 +1,39 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <!-- The master process (with some arguments) -->
-  <process host="Tremblay" function="master">
+<platform version="4.1">
+  <!-- The master actor (with some arguments) -->
+  <actor host="Tremblay" function="master">
     <argument value="20"/>       <!-- Number of tasks -->
     <argument value="50000000"/>  <!-- Computation size of tasks -->
     <argument value="1000000"/>   <!-- Communication size of tasks -->
     <argument value="1"/>         <!-- Number of slaves -->
-  </process>
+  </actor>
   <!-- The slave processes (with mailbox to listen on as argument) -->
-  <process host="Tremblay" function="slave">
+  <actor host="Tremblay" function="slave">
     <argument value="0"/>
-  </process>
-  <process host="Ginette" function="master_mpi">
+  </actor>
+  <actor host="Ginette" function="master_mpi">
     <argument value="master_mpi"/>
     <argument value="0"/>
-  </process>
-  <process host="Bourassa" function="master_mpi">
+  </actor>
+  <actor host="Bourassa" function="master_mpi">
     <argument value="master_mpi"/>
     <argument value="1"/>
-  </process>
-  <process host="Ginette" function="alltoall_mpi">
+  </actor>
+  <actor host="Ginette" function="alltoall_mpi">
     <argument value="alltoall_mpi"/>
     <argument value="0"/>
-  </process>
-  <process host="Bourassa" function="alltoall_mpi">
+  </actor>
+  <actor host="Bourassa" function="alltoall_mpi">
     <argument value="alltoall_mpi"/>
     <argument value="1"/>
-  </process>
-  <process host="Jupiter" function="alltoall_mpi">
+  </actor>
+  <actor host="Jupiter" function="alltoall_mpi">
     <argument value="alltoall_mpi"/>
     <argument value="2"/>
-  </process>
-  <process host="Fafard" function="alltoall_mpi">
+  </actor>
+  <actor host="Fafard" function="alltoall_mpi">
     <argument value="alltoall_mpi"/>
     <argument value="3"/>
-  </process>
+  </actor>
 </platform>
index 6f81a81..628f1e5 100644 (file)
@@ -97,8 +97,8 @@ typedef enum {
 } e_surf_trace_connect_kind_t;
 
 typedef enum {
-  SURF_PROCESS_ON_FAILURE_DIE = 1,
-  SURF_PROCESS_ON_FAILURE_RESTART = 0
+  SURF_ACTOR_ON_FAILURE_DIE = 1,
+  SURF_ACTOR_ON_FAILURE_RESTART = 0
 } e_surf_process_on_failure_t;
 
 
index 8d7fd7b..43387f2 100644 (file)
@@ -12,7 +12,7 @@
 #include "jedule_events.hpp"
 #include "jedule_platform.hpp"
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 
 XBT_ATTRIB_UNUSED static std::unordered_map <const char *, jed_container_t> host2_simgrid_parent_container;
 XBT_ATTRIB_UNUSED static std::unordered_map <std::string, jed_container_t> container_name2container;
index 0cf00db..aa16099 100644 (file)
@@ -15,7 +15,7 @@
 
 #include "jedule_platform.hpp"
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 namespace simgrid {
 namespace jedule{
 
index 195ca91..caaf672 100644 (file)
@@ -13,7 +13,7 @@
 #include <unordered_map>
 #include <vector>
 #include <string>
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 
 namespace simgrid {
 namespace jedule{
index 9a494b7..909ad6c 100644 (file)
@@ -10,7 +10,7 @@
 #include "simgrid_config.h"
 #include "simgrid/simdag.h"
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 SG_BEGIN_DECL()
 XBT_PUBLIC(void) jedule_log_sd_event(SD_task_t task);
 XBT_PUBLIC(void) jedule_sd_init(void);
index a097953..0b920bb 100644 (file)
@@ -16,8 +16,9 @@
 #define SIMGRID_MODELCHECKER_H
 
 #include <stdbool.h>
+#include <stddef.h> /* size_t */
 
-#include <simgrid_config.h> /* HAVE_MC ? */
+#include <simgrid_config.h> /* SIMGRID_HAVE_MC ? */
 
 #include <xbt/base.h>
 
@@ -25,7 +26,7 @@ SG_BEGIN_DECL()
 
 XBT_PUBLIC(int) MC_random(int min, int max);
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 
 /* Internal variable used to check if we're running under the MC
  *
index df2c744..a96060d 100644 (file)
@@ -176,14 +176,48 @@ XBT_PUBLIC(void) MSG_set_function(const char *host_id,
 XBT_PUBLIC(double) MSG_get_clock();
 XBT_PUBLIC(unsigned long int) MSG_get_sent_msg();
 
-/************************** Environment ***********************************/
-XBT_PUBLIC(msg_netzone_t) MSG_environment_get_routing_root();
-XBT_PUBLIC(const char*) MSG_environment_as_get_name(msg_netzone_t as);
-XBT_PUBLIC(msg_netzone_t) MSG_environment_as_get_by_name(const char* name);
-XBT_PUBLIC(xbt_dict_t) MSG_environment_as_get_routing_sons(msg_netzone_t as);
-XBT_PUBLIC(const char*) MSG_environment_as_get_property_value(msg_netzone_t as, const char* name);
-XBT_PUBLIC(void) MSG_environment_as_set_property_value(msg_netzone_t netzone, const char* name, char* value);
-XBT_PUBLIC(xbt_dynar_t) MSG_environment_as_get_hosts(msg_netzone_t as);
+/************************** Net Zones ***********************************/
+XBT_PUBLIC(msg_netzone_t) MSG_zone_get_root();
+XBT_PUBLIC(const char*) MSG_zone_get_name(msg_netzone_t zone);
+XBT_PUBLIC(msg_netzone_t) MSG_zone_get_by_name(const char* name);
+XBT_PUBLIC(void) MSG_zone_get_sons(msg_netzone_t zone, xbt_dict_t whereto);
+XBT_PUBLIC(const char*) MSG_zone_get_property_value(msg_netzone_t as, const char* name);
+XBT_PUBLIC(void) MSG_zone_set_property_value(msg_netzone_t netzone, const char* name, char* value);
+XBT_PUBLIC(void) MSG_zone_get_hosts(msg_netzone_t zone, xbt_dynar_t whereto);
+
+/* Deprecated forms of the previous functions */
+static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_root since v3.16")
+    msg_netzone_t MSG_environment_get_routing_root() {
+  return MSG_zone_get_root();
+}
+static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_name since v3.16")
+    const char* MSG_environment_as_get_name(msg_netzone_t zone) {
+  return MSG_zone_get_name(zone);
+}
+static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_by_name since v3.16")
+    msg_netzone_t MSG_environment_as_get_by_name(const char* name) {
+  return MSG_zone_get_by_name(name);
+}
+static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_sons since v3.16")
+    xbt_dict_t MSG_environment_as_get_routing_sons(msg_netzone_t zone) {
+  xbt_dict_t res = xbt_dict_new_homogeneous(NULL);
+  MSG_zone_get_sons(zone, res);
+  return res;
+}
+static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_property_value since v3.16")
+    const char* MSG_environment_as_get_property_value(msg_netzone_t zone, const char* name) {
+  return MSG_zone_get_property_value(zone, name);
+}
+static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_set_property_value since v3.16")
+    void MSG_environment_as_set_property_value(msg_netzone_t zone, const char* name, char* value) {
+  MSG_zone_set_property_value(zone, name, value);
+}
+static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_hosts since v3.16")
+    xbt_dynar_t MSG_environment_as_get_hosts(msg_netzone_t zone) {
+  xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t), NULL);
+  MSG_zone_get_hosts(zone, res);
+  return res;
+}
 
 /************************** File handling ***********************************/
 XBT_PUBLIC(sg_size_t) MSG_file_read(msg_file_t fd, sg_size_t size);
index b4a1a64..fe0ec58 100644 (file)
@@ -10,6 +10,7 @@
 #include <simgrid/s4u/Actor.hpp>
 #include <simgrid/s4u/Engine.hpp>
 #include <simgrid/s4u/Host.hpp>
+#include <simgrid/s4u/Link.hpp>
 #include <simgrid/s4u/Mailbox.hpp>
 
 #include <simgrid/s4u/Comm.hpp>
index 24f7437..bef7072 100644 (file)
@@ -269,6 +269,10 @@ public:
 
   /** Returns the internal implementation of this actor */
   simix::ActorImpl* getImpl();
+
+  /** Retrieve the property value (or nullptr if not set) */
+  const char* property(const char* key);
+  void setProperty(const char* key, const char* value);
 };
 
 /** @ingroup s4u_api
index 2a49c55..e2db122 100644 (file)
@@ -23,7 +23,7 @@ XBT_PUBLIC_CLASS Comm : public Activity
 {
   Comm() : Activity() {}
 public:
-  ~Comm() override;
+  virtual ~Comm() = default;
 
   /*! take a range of s4u::Comm* (last excluded) and return when one of them is finished. The return value is an
    * iterator on the finished Comms. */
index b3b3c18..b0accf1 100644 (file)
@@ -40,7 +40,6 @@ protected:
 
   explicit NetZone(NetZone * father, const char* name);
   virtual ~NetZone();
-  std::vector<Host*> hosts_;
 
 public:
   /** @brief Seal your netzone once you're done adding content, and before routing stuff through it */
@@ -49,7 +48,7 @@ public:
   NetZone* father();
 
   std::vector<NetZone*>* children(); // Sub netzones
-  std::vector<Host*>* hosts(); // my content as a vector of hosts
+  void hosts(std::vector<s4u::Host*> * whereto); // retrieve my content as a vector of hosts
 
   /** Get the properties assigned to a host */
   std::unordered_map<std::string, std::string>* properties();
index e06f54f..02fdab7 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2007-2010, 2012-2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -53,10 +52,6 @@ typedef struct s_smx_mailbox *smx_mailbox_t;
 
 #endif
 
-/**************************** Scalar Values **********************************/
-
-typedef union u_smx_scalar u_smx_scalar_t;
-
 /* ******************************** Host ************************************ */
 /** @brief Host datatype
     @ingroup simix_host_management
@@ -102,7 +97,6 @@ typedef struct s_smx_file *smx_file_t;
 
 /********************************** Storage *************************************/
 typedef xbt_dictelm_t smx_storage_t;
-typedef struct s_smx_storage_priv *smx_storage_priv_t;
 
 /* ****************************** Process *********************************** */
 
@@ -369,8 +363,6 @@ XBT_PUBLIC(int) simcall_file_seek(smx_file_t fd, sg_offset_t offset, int origin)
 XBT_PUBLIC(int) simcall_file_move(smx_file_t fd, const char* fullpath);
 /*****************************   Storage   **********************************/
 XBT_PUBLIC(xbt_dict_t) simcall_storage_get_properties(smx_storage_t storage);
-XBT_PUBLIC(const char*) SIMIX_storage_get_name(smx_storage_t storage);
-
 /************************** MC simcalls   **********************************/
 XBT_PUBLIC(int) simcall_mc_random(int min, int max);
 
index f27c4ac..f2517b4 100644 (file)
@@ -33,14 +33,14 @@ SG_END_DECL()
 #define SIMGRID_VERSION_STRING "@SIMGRID_VERSION_STRING@"
 
 /* Was Jedule compiled in?  */
-#cmakedefine01 HAVE_JEDULE
+#cmakedefine01 SIMGRID_HAVE_JEDULE
 /* Was the Lua support compiled in? */
-#cmakedefine01 HAVE_LUA
+#cmakedefine01 SIMGRID_HAVE_LUA
 /* Were mallocators (object pools) compiled in? */
-#cmakedefine01 HAVE_MALLOCATOR
+#cmakedefine01 SIMGRID_HAVE_MALLOCATOR
 /* Was the model-checking compiled in? */
-#cmakedefine01 HAVE_MC
+#cmakedefine01 SIMGRID_HAVE_MC
 /* Was the NS3 support compiled in? */
-#cmakedefine01 HAVE_NS3
+#cmakedefine01 SIMGRID_HAVE_NS3
 
 #endif /* SIMGRID_PUBLIC_CONFIG_H */
index 5021574..671d22e 100644 (file)
@@ -24,7 +24,7 @@
 #define nanosleep(x, y) smpi_nanosleep(x, y)
 #define clock_gettime(x, y) smpi_clock_gettime(x, y)
 #endif
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 #undef assert
 #define assert(x) MC_assert(x)
 #endif
index 47ac1b8..2b54c71 100644 (file)
@@ -15,7 +15,6 @@
 #include <simgrid/datatypes.h>
 #include <smpi/forward.hpp>
 #include <stddef.h>
-#include <xbt/function_types.h>
 #include <xbt/misc.h>
 
 #ifdef _WIN32
@@ -844,6 +843,7 @@ XBT_PUBLIC(void) smpi_process_set_user_data(void *);
 
 XBT_PUBLIC(void) smpi_execute_flops(double flops);
 XBT_PUBLIC(void) smpi_execute(double duration);
+XBT_PUBLIC(void) smpi_execute_benched(double duration);
 
 XBT_PUBLIC(double) smpi_get_host_power_peak_at(int pstate_index);
 XBT_PUBLIC(double) smpi_get_host_current_power_peak();
index ce7ec7a..83fa79e 100644 (file)
@@ -13,13 +13,9 @@ SG_BEGIN_DECL()
 
 // FIXME: this header file should die
 
-XBT_PUBLIC_DATA(int) SIMIX_STORAGE_LEVEL; //Simix storage level
-
 XBT_PUBLIC_DATA(xbt_lib_t) storage_lib;
 XBT_PUBLIC_DATA(int) ROUTING_STORAGE_LEVEL;        //Routing storage level
 XBT_PUBLIC_DATA(int) SURF_STORAGE_LEVEL;  // Surf storage level
-XBT_PUBLIC_DATA(xbt_lib_t) storage_type_lib;
-XBT_PUBLIC_DATA(int) ROUTING_STORAGE_TYPE_LEVEL;   //Routing storage_type level
 
 SG_END_DECL()
 
index c30e685..9d5510e 100644 (file)
@@ -19,7 +19,6 @@
 #include <xbt/log.h>
 
 #include <xbt/module.h>
-#include <xbt/strbuff.h>
 
 #include <xbt/dynar.h>
 #include <xbt/dict.h>
index de8f8ce..108003c 100644 (file)
@@ -45,9 +45,9 @@
      __attribute__((__format__ (__scanf__, format_idx, arg_idx)))
 #endif
 
-#define XBT_ATTRIB_NORETURN __attribute__((__noreturn__))
-#define XBT_ATTRIB_UNUSED  __attribute__((__unused__))
-#define XBT_ATTRIB_DEPRECATED(m)  __attribute__((__deprecated__(m)))
+#define XBT_ATTRIB_NORETURN __attribute__((noreturn))
+#define XBT_ATTRIB_UNUSED  __attribute__((unused))
+#define XBT_ATTRIB_DEPRECATED(m)  __attribute__((deprecated(m)))
 
 /* Constructor priorities exist since gcc 4.3.  Apparently, they are however not
  * supported on Macs. */
index cde2d3e..efd8eee 100644 (file)
@@ -62,9 +62,8 @@
  *  @ingroup XBT_ex_c
  */
 struct XBT_PUBLIC() xbt_ex :
-  public std::runtime_error,
-  public simgrid::xbt::WithContextException {
-public:
+  std::runtime_error,
+  simgrid::xbt::WithContextException {
 
   xbt_ex() :
     std::runtime_error("")
@@ -80,7 +79,7 @@ public:
     simgrid::xbt::WithContextException(throwpoint, simgrid::xbt::backtrace())
   {}
 
-  ~xbt_ex() override;
+  ~xbt_ex() = default;
 
   /** Category (what went wrong) */
   xbt_errcat_t category = unknown_error;
index 7596ef6..10c16bf 100644 (file)
@@ -39,11 +39,12 @@ public:
   {}
   void operator()() const
   {
+    char noarg[] = {'\0'};
     const int argc = args_->size();
     std::vector<std::string> args = *args_;
     std::unique_ptr<char*[]> argv(new char*[argc + 1]);
     for (int i = 0; i != argc; ++i)
-      argv[i] = args[i].empty() ? const_cast<char*>(""): &args[i].front();
+      argv[i] = args[i].empty() ? noarg : &args[i].front();
     argv[argc] = nullptr;
     code_(argc, argv.get());
   }
index 3ec9eb4..a6be428 100644 (file)
@@ -321,6 +321,7 @@ XBT_PUBLIC(xbt_log_appender_t) xbt_log_appender2_file_new(char *arg,int roll);
 /* ********************************** */
 /* Functions that you shouldn't call  */
 /* ********************************** */
+XBT_PUBLIC(void) xbt_log_init(int *argc, char **argv);
 XBT_PUBLIC(void) _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...) XBT_ATTRIB_PRINTF(2, 3);
 XBT_PUBLIC(int) _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority);
 
index f6ae73f..6d0d3cb 100644 (file)
@@ -15,7 +15,8 @@
 SG_BEGIN_DECL()
 
 typedef struct {
-  unsigned int lines, rows;
+  unsigned int lines;
+  unsigned int rows;
   unsigned long elmsize;
 
   char *data;
diff --git a/include/xbt/memory.hpp b/include/xbt/memory.hpp
deleted file mode 100644 (file)
index 3673943..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Copyright (c) 2016. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef SIMGRIX_XBT_MEMORY_HPP
-#define SIMGRIX_XBT_MEMORY_HPP
-
-#include <memory>
-
-namespace simgrid {
-namespace xbt {
-
-}
-}
-
-#endif
index 78d7b3b..0f10bef 100644 (file)
@@ -41,7 +41,6 @@ XBT_PUBLIC(char *) xbt_str_join(xbt_dynar_t dynar, const char *sep);
 XBT_PUBLIC(char *) xbt_str_join_array(const char *const *strs, const char *sep);
 
 XBT_PUBLIC(void) xbt_str_subst(char *str, char from, char to, int amount);
-XBT_PUBLIC(char *) xbt_str_varsubst(const char *str, xbt_dict_t patterns);
 
 XBT_PUBLIC(long int) xbt_str_parse_int(const char* str, const char* error_msg);
 XBT_PUBLIC(double) xbt_str_parse_double(const char* str, const char* error_msg);
diff --git a/include/xbt/strbuff.h b/include/xbt/strbuff.h
deleted file mode 100644 (file)
index b81e435..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/* strbuff -- string buffers                                                */
-
-/* Copyright (c) 2007-2011, 2013-2014. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef XBT_STRBUFF_H
-#define XBT_STRBUFF_H
-
-#include "xbt/sysdep.h"
-#include "xbt/function_types.h"
-#include "xbt/log.h"
-#include "xbt/str.h"
-#include "xbt/dict.h"
-
-SG_BEGIN_DECL()
-
-/** @defgroup xbt_strbuff String buffers 
- *  @ingroup XBT_adt
- * 
- *  This data container is very similar to the Java StringBuffer: 
- *  that's a string to which you can add content with a lesser performance 
- *  penalty than if you recreate a new string from scratch. Once done building 
- *  your string, you must retrieve the content and free its container.
- * 
- *  @{
- */
-
-/** @brief Buffer data container **/
-typedef struct xbt_strbuff {
-  char *data;
-  int used;
-  int size;
-} s_xbt_strbuff_t;
-typedef s_xbt_strbuff_t* xbt_strbuff_t;
-
-XBT_PUBLIC(void) xbt_strbuff_clear(xbt_strbuff_t b);
-XBT_PUBLIC(xbt_strbuff_t) xbt_strbuff_new(void);
-XBT_PUBLIC(xbt_strbuff_t) xbt_strbuff_new_from(const char *s);
-XBT_PUBLIC(void) xbt_strbuff_free(xbt_strbuff_t b);
-XBT_PUBLIC(void) xbt_strbuff_free_container(xbt_strbuff_t b);
-XBT_PUBLIC(void) xbt_strbuff_append(xbt_strbuff_t b, const char *toadd);
-XBT_PUBLIC(void) xbt_strbuff_printf(xbt_strbuff_t b, const char *fmt, ...);
-XBT_PUBLIC(void) xbt_strbuff_chomp(xbt_strbuff_t b);
-XBT_PUBLIC(void) xbt_strbuff_trim(xbt_strbuff_t b);
-XBT_PUBLIC(void) xbt_strbuff_varsubst(xbt_strbuff_t b, xbt_dict_t patterns);
-
-/** @} */
-SG_END_DECL()
-#endif
index 0c9221a..b163867 100644 (file)
@@ -13,7 +13,7 @@
 #include <cstdarg>
 #include <stdlib.h>
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 
 #include <stdexcept>
 #include <cstddef>
@@ -28,7 +28,7 @@
 namespace simgrid {
 namespace xbt {
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 
 /** POD structure representation of a string
  */
index 09d8db4..095130f 100644 (file)
@@ -46,7 +46,7 @@ class integer_sequence {
 namespace bits {
   template<class T, long long N, long long... M>
   struct make_integer_sequence :
-    public make_integer_sequence<T, N-1, N-1, M...>
+    make_integer_sequence<T, N-1, N-1, M...>
   {};
   template<class T, long long... M>
   struct make_integer_sequence<T, 0, M...> {
index 6eccae3..80b897e 100644 (file)
@@ -13,7 +13,7 @@ sonar.sources=src,examples,include,teshsuite
 
 
 # Disable some rules on some files
-sonar.issue.ignore.multicriteria=j1,jni1,jni2,c1,c2a,c2b,c3,c4a,c4b
+sonar.issue.ignore.multicriteria=j1,jni1,jni2,c1,c2a,c2b,c3,c4a,c4b,f1
 
 # The Object.finalize() method should not be overriden
 # But we need to clean the native memory with JNI
@@ -30,6 +30,7 @@ sonar.issue.ignore.multicriteria.jni1.resourceKey=src/bindings/java/*.cpp
 sonar.issue.ignore.multicriteria.jni2.ruleKey=cpp:S1172
 sonar.issue.ignore.multicriteria.jni2.resourceKey=src/bindings/java/*.cpp
 
+
 # Pointers should not be cast to integral types
 # But we need that for jMSG, smpi and other places
 sonar.issue.ignore.multicriteria.c1.ruleKey=cpp:S1767
@@ -55,6 +56,12 @@ sonar.issue.ignore.multicriteria.c4b.ruleKey=cpp:GlobalNamespaceMembers
 sonar.issue.ignore.multicriteria.c4b.resourceKey=examples/**/*.hpp
 
 
+# "reinterpret_cast" should not be used
+# But we need this to interface C and Fortran
+sonar.issue.ignore.multicriteria.f1.ruleKey=cpp:S3630
+sonar.issue.ignore.multicriteria.f1.resourceKey=src/smpi/smpi_f77.cpp
+
+
 # Exclude some files from the analysis:
 #  - our unit tests 
 #  - the tests that we borrowed elsewhere (MPICH and ISP)
index 265fd61..a677fda 100644 (file)
@@ -39,7 +39,6 @@
 SG_BEGIN_DECL()
 
 int JAVA_HOST_LEVEL = -1;
-int JAVA_STORAGE_LEVEL = -1;
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java);
 
@@ -89,13 +88,8 @@ static void __JAVA_host_priv_free(void *host)
 {
 }
 
-static void __JAVA_storage_priv_free(void *storage)
-{
-}
-
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs)
 {
-  char **argv = nullptr;
   int index;
   int argc = 0;
   jstring jval;
@@ -118,7 +112,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, j
     argc = static_cast<int>(env->GetArrayLength(jargs));
 
   argc++;
-  argv = xbt_new(char *, argc + 1);
+  char** argv = new char*[argc + 1];
   argv[0] = xbt_strdup("java");
 
   for (index = 0; index < argc - 1; index++) {
@@ -132,14 +126,13 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, j
   MSG_init(&argc, argv);
 
   JAVA_HOST_LEVEL = simgrid::s4u::Host::extension_create(__JAVA_host_priv_free);
-  JAVA_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, __JAVA_storage_priv_free);
 
   for (index = 0; index < argc - 1; index++) {
     env->SetObjectArrayElement(jargs, index, (jstring)env->NewStringUTF(argv[index + 1]));
     free(argv[index]);
   }
   free(argv[argc]);
-  free(argv);
+  delete[] argv;
 }
 
 JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass cls)
@@ -164,15 +157,8 @@ JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass
   xbt_dynar_free(&hosts);
 
   /* Cleanup java storages */
-  xbt_dynar_t storages = MSG_storages_as_dynar();
-  if(!xbt_dynar_is_empty(storages)){
-    for (unsigned long index = 0; index < xbt_dynar_length(storages) - 1; index++) {
-      jobject jstorage = (jobject) xbt_lib_get_level(xbt_dynar_get_as(storages,index,msg_storage_t), JAVA_STORAGE_LEVEL);
-      if (jstorage)
-        jstorage_unref(env, jstorage);
-    }
-  }
-  xbt_dynar_free(&storages);
+  for (auto elm : java_storage_map)
+    jstorage_unref(env, elm.second);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, jstring jplatformFile)
@@ -186,7 +172,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env,
 
 JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNIEnv * env, jclass cls)
 {
-  msg_netzone_t as = MSG_environment_get_routing_root();
+  msg_netzone_t as = MSG_zone_get_root();
   jobject jas      = jnetzone_new_instance(env);
   if (!jas) {
     jxbt_throw_jni(env, "java As instantiation failed");
index de18540..34ba2a2 100644 (file)
@@ -7,8 +7,9 @@
 
 #ifndef MSG4JAVA_H
 #define MSG4JAVA_H
-#include <simgrid/msg.h>
 #include <jni.h>
+#include <simgrid/msg.h>
+#include <unordered_map>
 
 SG_BEGIN_DECL()
 
@@ -22,7 +23,7 @@ SG_BEGIN_DECL()
 /* end of eclipse-mandated pimple */
 
 extern int JAVA_HOST_LEVEL;
-extern int JAVA_STORAGE_LEVEL;
+static std::unordered_map<char*, jobject> java_storage_map;
 
 JavaVM *get_java_VM();
 JNIEnv *get_current_thread_env();
index 9b4f7bf..09d996d 100644 (file)
@@ -106,7 +106,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobje
   }
   const char *name = env->GetStringUTFChars(static_cast<jstring>(jname), 0);
 
-  const char *property = MSG_environment_as_get_property_value(as, name);
+  const char* property = MSG_zone_get_property_value(as, name);
   if (!property) {
     return nullptr;
   }
@@ -126,11 +126,13 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jo
   simgrid::s4u::NetZone* as = jnetzone_get_native(env, jas);
 
   jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host");
-  std::vector<sg_host_t>* table = as->hosts();
   if (!cls)
     return nullptr;
 
-  jtable = env->NewObjectArray(static_cast<jsize>(table->size()), cls, nullptr);
+  std::vector<sg_host_t> table;
+  as->hosts(&table);
+
+  jtable = env->NewObjectArray(static_cast<jsize>(table.size()), cls, nullptr);
 
   if (!jtable) {
     jxbt_throw_jni(env, "Hosts table allocation failed");
@@ -138,7 +140,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jo
   }
 
   int index = 0;
-  for (auto host : *table) {
+  for (auto host : table) {
     jhost = static_cast<jobject>(host->extension(JAVA_HOST_LEVEL));
     if (!jhost) {
       jname = env->NewStringUTF(host->cname());
index 7b45e78..1169daf 100644 (file)
@@ -282,7 +282,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Host_getAttachedStorage(JNIE
     jstorage_name = env->NewStringUTF(storage_name);
     env->SetObjectArrayElement(jtable, index, jstorage_name);
   }
-
+  xbt_dynar_free_container(&dyn);
   return jtable;
 }
 
index 48e73bc..15bd3fe 100644 (file)
@@ -53,7 +53,7 @@ void jstorage_unref(JNIEnv * env, jobject jstorage) {
 
 JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Storage_getByName(JNIEnv * env, jclass cls, jstring jname) {
   msg_storage_t storage;
-  jobject jstorage;
+  jobject jstorage = nullptr;
 
   /* get the C string from the java string */
   if (jname == nullptr) {
@@ -70,8 +70,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Storage_getByName(JNIEnv * env, j
   }
   env->ReleaseStringUTFChars(jname, name);
 
-  if (!xbt_lib_get_level(storage, JAVA_STORAGE_LEVEL)) {       /* native host not associated yet with java host */
-
+  if (java_storage_map.find(storage->key) == java_storage_map.end()) {
     /* Instantiate a new java storage */
     jstorage = jstorage_new_instance(env);
 
@@ -95,11 +94,12 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Storage_getByName(JNIEnv * env, j
     /* the native storage data field is set with the global reference to the
      * java storage returned by this function
      */
-    xbt_lib_set(storage_lib, storage->key, JAVA_STORAGE_LEVEL, (void *) jstorage);
-  }
+    java_storage_map.insert({storage->key, jstorage});
+  } else
+    jstorage = java_storage_map.at(storage->key);
 
   /* return the global reference to the java storage instance */
-  return (jobject) xbt_lib_get_level(storage, JAVA_STORAGE_LEVEL);
+  return (jobject)jstorage;
 }
 
 JNIEXPORT jlong JNICALL Java_org_simgrid_msg_Storage_getSize(JNIEnv * env,jobject jstorage) {
@@ -216,9 +216,9 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Storage_all(JNIEnv * env, jc
 
   for (index = 0; index < count; index++) {
     storage = xbt_dynar_get_as(table,index,msg_storage_t);
-    jstorage = (jobject) (xbt_lib_get_level(storage, JAVA_STORAGE_LEVEL));
-
-    if (!jstorage) {
+    if (java_storage_map.find(storage->key) != java_storage_map.end()) {
+      jstorage = java_storage_map.at(storage->key);
+    } else {
       jname = env->NewStringUTF(MSG_storage_get_name(storage));
       jstorage = Java_org_simgrid_msg_Storage_getByName(env, cls_arg, jname);
     }
index 8ca9c1a..3f5864c 100644 (file)
@@ -6,12 +6,8 @@
 #ifndef MC_MC_H
 #define MC_MC_H
 
-#include <src/internal_config.h>
+#include <simgrid/modelchecker.h> /* our public interface (and definition of SIMGRID_HAVE_MC) */
 #include <simgrid/simix.h>
-#include <simgrid/modelchecker.h> /* our public interface (and definition of HAVE_MC) */
-#if HAVE_UCONTEXT_H
-#include <ucontext.h>           /* context relative declarations */
-#endif
 
 /* Maximum size of the application heap.
  *
@@ -66,15 +62,6 @@ XBT_PUBLIC(void) MC_process_clock_add(smx_actor_t, double);
 XBT_PUBLIC(double) MC_process_clock_get(smx_actor_t);
 XBT_PRIVATE void MC_automaton_load(const char *file);
 
-/****************************** MC ignore **********************************/
-XBT_PUBLIC(void) MC_ignore_heap(void *address, size_t size);
-XBT_PUBLIC(void) MC_remove_ignore_heap(void *address, size_t size);
-XBT_PUBLIC(void) MC_ignore_local_variable(const char *var_name, const char *frame);
-XBT_PUBLIC(void) MC_ignore_global_variable(const char *var_name);
-#if HAVE_UCONTEXT_H
-XBT_PUBLIC(void) MC_register_stack_area(void *stack, smx_actor_t process, ucontext_t* context, size_t size);
-#endif
-
 /********************************* Memory *************************************/
 XBT_PUBLIC(void) MC_memory_init();  /* Initialize the memory subsystem */
 XBT_PUBLIC(void) MC_memory_exit();
index 6cf5b49..09941a4 100644 (file)
@@ -322,6 +322,7 @@ XBT_PUBLIC(xbt_dict_t) surf_storage_action_get_ls_dict(surf_action_t action);
  * may not exist.
  */
 XBT_PUBLIC(const char * ) surf_storage_get_host(surf_resource_t resource);
+XBT_PUBLIC(const char * ) surf_storage_get_name(surf_resource_t resource);
 
 /** @} */
 
index e0040f7..974d10f 100644 (file)
@@ -4,12 +4,41 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #ifndef INSTR_SMPI_H_
-#define INSTR_SMPI_H_ 
+#define INSTR_SMPI_H_
+
 #ifdef __cplusplus
 #include <string>
-extern "C" {
 #endif
 
+#include "smpi/smpi.h"
+#include "src/instr/instr_private.h"
+
+SG_BEGIN_DECL()
+
+XBT_PRIVATE void TRACE_internal_smpi_set_category(const char* category);
+XBT_PRIVATE const char* TRACE_internal_smpi_get_category();
+XBT_PRIVATE void TRACE_smpi_collective_in(int rank, int root, const char* operation, instr_extra_data extra);
+XBT_PRIVATE void TRACE_smpi_collective_out(int rank, int root, const char* operation);
+XBT_PRIVATE void TRACE_smpi_computing_init(int rank);
+XBT_PRIVATE void TRACE_smpi_computing_out(int rank);
+XBT_PRIVATE void TRACE_smpi_computing_in(int rank, instr_extra_data extra);
+XBT_PRIVATE void TRACE_smpi_sleeping_init(int rank);
+XBT_PRIVATE void TRACE_smpi_sleeping_out(int rank);
+XBT_PRIVATE void TRACE_smpi_sleeping_in(int rank, instr_extra_data extra);
+XBT_PRIVATE void TRACE_smpi_testing_out(int rank);
+XBT_PRIVATE void TRACE_smpi_testing_in(int rank, instr_extra_data extra);
+XBT_PRIVATE void TRACE_smpi_alloc();
+XBT_PRIVATE void TRACE_smpi_release();
+XBT_PRIVATE void TRACE_smpi_ptp_in(int rank, int src, int dst, const char* operation, instr_extra_data extra);
+XBT_PRIVATE void TRACE_smpi_ptp_out(int rank, int src, int dst, const char* operation);
+XBT_PRIVATE void TRACE_smpi_send(int rank, int src, int dst, int tag, int size);
+XBT_PRIVATE void TRACE_smpi_recv(int rank, int src, int dst, int tag);
+XBT_PRIVATE void TRACE_smpi_init(int rank);
+XBT_PRIVATE void TRACE_smpi_finalize(int rank);
+XBT_PRIVATE char* smpi_container(int rank, char* container, int n);
+
+XBT_PRIVATE const char* encode_datatype(MPI_Datatype datatype, int* known);
+
 typedef struct smpi_trace_call_location {
   const char* filename;
   int linenumber;
@@ -25,7 +54,6 @@ typedef struct smpi_trace_call_location {
 
 } smpi_trace_call_location_t;
 
-#ifdef __cplusplus
-}
-#endif
+SG_END_DECL()
+
 #endif
index ed3d6e5..86dbae5 100644 (file)
@@ -7,7 +7,7 @@
 #include "xbt/asserts.h"
 #include "simgrid/jedule/jedule.hpp"
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 
 namespace simgrid{
 namespace jedule {
index 1b43029..95a591b 100644 (file)
@@ -4,14 +4,11 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "simgrid/jedule/jedule_events.hpp"
-
 #include "simgrid/jedule/jedule.hpp"
-#include "simgrid/jedule/jedule_platform.hpp"
 #include "simgrid/s4u/NetZone.hpp"
 #include "xbt/asserts.h"
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 namespace simgrid{
 namespace jedule{
 
index acc3e9b..1bc42af 100644 (file)
@@ -1,17 +1,14 @@
-/* Copyright (c) 2010-2016. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "simgrid/jedule/jedule.hpp"
-#include "simgrid/jedule/jedule_platform.hpp"
 #include "simgrid/s4u/NetZone.hpp"
 #include "xbt/asserts.h"
-#include "xbt/dynar.h"
 #include <algorithm>
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 
 namespace simgrid {
 namespace jedule {
@@ -65,7 +62,9 @@ void Container::createHierarchy(sg_netzone_t from_as)
   if (from_as->children()->empty()) {
     // I am no AS
     // add hosts to jedule platform
-    this->addResources(*from_as->hosts());
+    std::vector<sg_host_t> table;
+    from_as->hosts(&table);
+    this->addResources(table);
   } else {
     for (auto nz : *from_as->children()) {
       jed_container_t child_container = new simgrid::jedule::Container(std::string(nz->name()));
index 782bb6e..e22d6a8 100644 (file)
@@ -3,15 +3,13 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "simgrid/jedule/jedule_sd_binding.h"
-
 #include "simgrid/jedule/jedule.hpp"
 #include "src/simdag/simdag_private.hpp"
 
 #include "simgrid/s4u/Engine.hpp"
 #include "simgrid/s4u/NetZone.hpp"
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 
 XBT_LOG_NEW_CATEGORY(jedule, "Logging specific to Jedule");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(jed_sd, jedule, "Logging specific to Jedule SD binding");
index 7a56db9..b114b25 100644 (file)
@@ -34,7 +34,7 @@ namespace activity {
     e_smx_comm_type_t type;         /* Type of the communication (SIMIX_COMM_SEND or SIMIX_COMM_RECEIVE) */
     smx_mailbox_t mbox = nullptr;   /* Rendez-vous where the comm is queued */
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
     smx_mailbox_t mbox_cpy = nullptr; /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR
                                        (comm.mbox set to nullptr when the communication is removed from the mailbox
                                        (used as garbage collector)) */
index 2288faa..97b1985 100644 (file)
@@ -1,21 +1,14 @@
-/* Copyright (c) 2007-2010, 2012-2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include <cstdint>
-
-#include <memory>
-#include <functional>
-#include <utility>
-
-#include <simgrid/simix.hpp>
-
 #include "mc/mc.h"
 
 #include "src/kernel/context/Context.hpp"
 #include "src/simix/smx_private.h"
+#include "src/mc/mc_ignore.h"
+
 
 /**
  * @brief creates a new context for a user level process
@@ -47,7 +40,7 @@ Context* ContextFactory::self()
 
 void ContextFactory::declare_context(void* context, std::size_t size)
 {
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   /* Store the address of the stack in heap to compare it apart of heap comparison */
   if(MC_is_active())
     MC_ignore_heap(context, size);
index 051dc6f..aa1ce97 100644 (file)
@@ -86,8 +86,8 @@ BoostContextFactory::~BoostContextFactory()
 #endif
 }
 
-smx_context_t BoostContextFactory::create_context(std::function<void()>  code,
-  void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
+smx_context_t BoostContextFactory::create_context(std::function<void()> code, void_pfn_smxprocess_t cleanup_func,
+                                                  smx_actor_t process)
 {
   BoostContext* context = nullptr;
   if (BoostContext::parallel_)
@@ -140,12 +140,11 @@ BoostContext::BoostContext(std::function<void()> code,
   : Context(std::move(code), cleanup_func, process)
 {
 
-  /* if the user provided a function for the process then use it,
-     otherwise it is the context for maestro */
+  /* if the user provided a function for the process then use it, otherwise it is the context for maestro */
   if (has_code()) {
     this->stack_ = SIMIX_context_stack_new();
-    // We need to pass the bottom of the stack to make_fcontext,
-    // depending on the stack direction it may be the lower or higher address:
+// We need to pass the bottom of the stack to make_fcontext, depending on the stack direction it may be the lower
+// or higher address:
 #if PTH_STACKGROWTH == -1
     void* stack = static_cast<char*>(this->stack_) + smx_context_usable_stack_size - 1;
 #else
@@ -191,15 +190,15 @@ void BoostSerialContext::suspend()
 {
   /* determine the next context */
   BoostSerialContext* next_context = nullptr;
-  unsigned long int i = process_index_++;
+  unsigned long int i              = process_index_;
+  process_index_++;
 
   if (i < xbt_dynar_length(simix_global->process_to_run)) {
     /* execute the next process */
     XBT_DEBUG("Run next process");
-    next_context = static_cast<BoostSerialContext*>(xbt_dynar_get_as(
-        simix_global->process_to_run, i, smx_actor_t)->context);
-  }
-  else {
+    next_context =
+        static_cast<BoostSerialContext*>(xbt_dynar_get_as(simix_global->process_to_run, i, smx_actor_t)->context);
+  } else {
     /* all processes were run, return to maestro */
     XBT_DEBUG("No more process to run");
     next_context = static_cast<BoostSerialContext*>(maestro_context_);
@@ -230,11 +229,9 @@ void BoostParallelContext::suspend()
   if (next_work != nullptr) {
     XBT_DEBUG("Run next process");
     next_context = static_cast<BoostParallelContext*>(next_work->context);
-  }
-  else {
+  } else {
     XBT_DEBUG("No more processes to run");
-    uintptr_t worker_id =
-      (uintptr_t) xbt_os_thread_get_specific(worker_id_key_);
+    uintptr_t worker_id = (uintptr_t)xbt_os_thread_get_specific(worker_id_key_);
     next_context = static_cast<BoostParallelContext*>(workers_context_[worker_id]);
   }
 
index 8ad2f11..5afc40f 100644 (file)
@@ -1,22 +1,15 @@
-/* Copyright (c) 2009-2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include <math.h>
-
-#include <utility>
-#include <functional>
-
 #include "src/internal_config.h" 
 
-#include "xbt/log.h"
 #include "xbt/parmap.h"
-#include "xbt/dynar.h"
 
 #include "src/simix/smx_private.h"
 #include "mc/mc.h"
+#include "src/mc/mc_ignore.h"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
 
index 8c51f67..ac2a4b5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2015. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -7,10 +7,12 @@
 
 #include <ucontext.h>           /* context relative declarations */
 
-#include "mc/mc.h"
 #include "src/simix/ActorImpl.hpp"
 #include "src/simix/smx_private.h"
 #include "xbt/parmap.h"
+#include "mc/mc.h"
+#include "src/mc/mc_ignore.h"
+
 
 /** Many integers are needed to store a pointer
  *
@@ -218,7 +220,7 @@ UContext::UContext(std::function<void()> code,
       sysv_maestro_context = this;
   }
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   if (MC_is_active() && has_code()) {
     MC_register_stack_area(this->stack_, process,
                       &(this->uc_), smx_context_usable_stack_size);
index d0e07ee..f987ae3 100644 (file)
@@ -236,11 +236,12 @@ void DijkstraZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_cb
   }
 
   /* compose route path with links */
-  NetPoint *gw_src = nullptr;
-  NetPoint *gw_dst;
-  NetPoint *prev_gw_src;
-  NetPoint *first_gw = nullptr;
-  NetPoint *gw_dst_net_elm = nullptr, *prev_gw_src_net_elm = nullptr;
+  NetPoint* gw_src = nullptr;
+  NetPoint* gw_dst;
+  NetPoint* prev_gw_src;
+  NetPoint* first_gw            = nullptr;
+  NetPoint* gw_dst_net_elm      = nullptr;
+  NetPoint* prev_gw_src_net_elm = nullptr;
 
   for (int v = dst_node_id; v != src_node_id; v = pred_arr[v]) {
     xbt_node_t node_pred_v = xbt_dynar_get_as(nodes, pred_arr[v], xbt_node_t);
index b19cd34..2e089ed 100644 (file)
 typedef struct graph_node_data {
   int id;
   int graph_id; /* used for caching internal graph id's */
-} s_graph_node_data_t, *graph_node_data_t;
+} s_graph_node_data_t;
+typedef s_graph_node_data_t* graph_node_data_t;
 
 typedef struct graph_node_map_element {
   xbt_node_t node;
-} s_graph_node_map_element_t, *graph_node_map_element_t;
+} s_graph_node_map_element_t;
+typedef s_graph_node_map_element_t* graph_node_map_element_t;
 
 typedef struct route_cache_element {
   int* pred_arr;
   int size;
-} s_route_cache_element_t, *route_cache_element_t;
+} s_route_cache_element_t;
+typedef s_route_cache_element_t* route_cache_element_t;
 
 namespace simgrid {
 namespace kernel {
index 5a64836..4a2dd54 100644 (file)
@@ -21,8 +21,8 @@ namespace routing {
 class BypassRoute {
 public:
   explicit BypassRoute(NetPoint* gwSrc, NetPoint* gwDst) : gw_src(gwSrc), gw_dst(gwDst) {}
-  const NetPoint* gw_src;
-  const NetPoint* gw_dst;
+  NetPoint* gw_src;
+  NetPoint* gw_dst;
   std::vector<surf::LinkImpl*> links;
 };
 
@@ -292,14 +292,14 @@ bool NetZoneImpl::getBypassRoute(routing::NetPoint* src, routing::NetPoint* dst,
               "calls to getRoute",
               src->cname(), dst->cname(), bypassedRoute->links.size());
     if (src != key.first)
-      getGlobalRoute(src, const_cast<NetPoint*>(bypassedRoute->gw_src), links, latency);
+      getGlobalRoute(src, bypassedRoute->gw_src, links, latency);
     for (surf::LinkImpl* link : bypassedRoute->links) {
       links->push_back(link);
       if (latency)
         *latency += link->latency();
     }
     if (dst != key.second)
-      getGlobalRoute(const_cast<NetPoint*>(bypassedRoute->gw_dst), dst, links, latency);
+      getGlobalRoute(bypassedRoute->gw_dst, dst, links, latency);
     return true;
   }
   XBT_DEBUG("No bypass route from '%s' to '%s'.", src->cname(), dst->cname());
index f066b6f..dde414e 100644 (file)
@@ -22,6 +22,8 @@
 #include "src/mc/mc_state.h"
 #include "src/mc/remote/Client.hpp"
 
+#include "src/smpi/smpi_request.hpp"
+
 using simgrid::mc::remote;
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_comm_determinism, mc,
index a428ac8..9b095c1 100644 (file)
@@ -17,7 +17,6 @@
 #include <simgrid_config.h>
 #include <xbt/base.h>
 #include <xbt/automaton.h>
-#include <xbt/memory.hpp>
 #include "src/mc/mc_state.h"
 #include "src/mc/checker/Checker.hpp"
 
index edcf150..681efc3 100644 (file)
@@ -3,47 +3,27 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include <cassert>
-
 #include <simgrid_config.h>
 
-#include <xbt/log.h>
-#include <xbt/asserts.h>
-#include <xbt/dynar.h>
-
-#include <simgrid/simix.h>
-
 #include "mc/mc.h"
 #include "src/mc/mc_base.h"
 #include "src/mc/mc_replay.h"
-#include "src/mc/remote/mc_protocol.h"
 #include "src/simix/smx_private.h"
 
-#include "src/kernel/activity/ActivityImpl.hpp"
-#include "src/kernel/activity/SynchroIo.hpp"
-#include "src/kernel/activity/SynchroComm.hpp"
-#include "src/kernel/activity/SynchroRaw.hpp"
-#include "src/kernel/activity/SynchroSleep.hpp"
-#include "src/kernel/activity/SynchroExec.hpp"
-
-#if HAVE_MC
-#include "src/mc/mc_request.h"
-#include "src/mc/Process.hpp"
+#if SIMGRID_HAVE_MC
 #include "src/mc/ModelChecker.hpp"
-#include "src/mc/mc_smx.h"
 
 using simgrid::mc::remote;
 #endif
 
-XBT_LOG_NEW_CATEGORY(mc, "All MC categories");
+XBT_LOG_NEW_DEFAULT_CATEGORY(mc, "All MC categories");
 
 int MC_random(int min, int max)
 {
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   xbt_assert(mc_model_checker == nullptr);
-  /* TODO, if the MC is disabled we do not really need to make a simcall for
-   * this :) */
 #endif
+  /* TODO, if the MC is disabled we do not really need to make a simcall for this :) */
   return simcall_mc_random(min, max);
 }
 
@@ -52,7 +32,7 @@ namespace mc {
 
 void wait_for_requests(void)
 {
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   xbt_assert(mc_model_checker == nullptr);
 #endif
 
@@ -68,7 +48,7 @@ void wait_for_requests(void)
         SIMIX_simcall_handle(req, 0);
     }
   }
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   xbt_dynar_reset(simix_global->actors_vector);
   for (std::pair<aid_t, smx_actor_t> kv : simix_global->process_list) {
     xbt_dynar_push_as(simix_global->actors_vector, smx_actor_t, kv.second);
@@ -96,18 +76,13 @@ bool request_is_enabled(smx_simcall_t req)
   case SIMCALL_NONE:
     return false;
 
-  case SIMCALL_SEM_ACQUIRE:
-    xbt_die("Don't use semaphores in model-checked code, it's not supported yet");
-  case SIMCALL_COND_WAIT:
-    xbt_die("Don't use condition variables in model-checked code, it's not supported yet");
-
   case SIMCALL_COMM_WAIT:
   {
     /* FIXME: check also that src and dst processes are not suspended */
     simgrid::kernel::activity::Comm *act =
         static_cast<simgrid::kernel::activity::Comm*>(simcall_comm_wait__get__comm(req));
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
     // Fetch from MCed memory:
     // HACK, type puning
     if (mc_model_checker != nullptr) {
@@ -135,7 +110,7 @@ bool request_is_enabled(smx_simcall_t req)
     simgrid::kernel::activity::Comm *act =
         static_cast<simgrid::kernel::activity::Comm*>(simcall_comm_wait__get__comm(req));
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
     s_xbt_dynar_t comms_buffer;
     size_t buffer_size = 0;
     if (mc_model_checker != nullptr) {
@@ -158,7 +133,7 @@ bool request_is_enabled(smx_simcall_t req)
 #endif
 
     for (index = 0; index < comms->used; ++index) {
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
       // Fetch act from MCed memory:
       // HACK, type puning
       simgrid::mc::Remote<simgrid::kernel::activity::Comm> temp_comm;
@@ -178,7 +153,7 @@ bool request_is_enabled(smx_simcall_t req)
 
   case SIMCALL_MUTEX_LOCK: {
     smx_mutex_t mutex = simcall_mutex_lock__get__mutex(req);
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
     simgrid::mc::Remote<simgrid::simix::Mutex> temp_mutex;
     if (mc_model_checker != nullptr) {
       mc_model_checker->process().read(temp_mutex.getBuffer(), remote(mutex));
@@ -188,7 +163,7 @@ bool request_is_enabled(smx_simcall_t req)
 
     if(mutex->owner == nullptr)
       return true;
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
     else if (mc_model_checker != nullptr) {
       simgrid::mc::Process& modelchecked = mc_model_checker->process();
       // TODO, *(mutex->owner) :/
@@ -200,9 +175,25 @@ bool request_is_enabled(smx_simcall_t req)
       return mutex->owner->pid == req->issuer->pid;
     }
 
-  default:
-    /* The rest of the requests are always enabled */
-    return true;
+    case SIMCALL_SEM_ACQUIRE: {
+      static int warned = 0;
+      if (!warned)
+        XBT_INFO("Using semaphore in model-checked code is still experimental. Use at your own risk");
+      warned = 1;
+      return true;
+    }
+
+    case SIMCALL_COND_WAIT: {
+      static int warned = 0;
+      if (!warned)
+        XBT_INFO("Using condition variables in model-checked code is still experimental. Use at your own risk");
+      warned = 1;
+      return true;
+    }
+
+    default:
+      /* The rest of the requests are always enabled */
+      return true;
   }
 }
 
index 3716919..f1b4c2d 100644 (file)
 
 #include "src/internal_config.h"
 #include "src/mc/mc_private.h"
-#include "xbt/module.h"
-#include <xbt/mmalloc.h>
-#include <xbt/memory.hpp>
 #include "src/smpi/private.h"
+#include "xbt/mmalloc.h"
+#include "xbt/module.h"
 
 #include "src/xbt/mmalloc/mmprivate.h"
 
index 67bebd4..621f502 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <simgrid/sg_config.h>
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 #include "src/mc/mc_safety.h"
 #include "src/mc/mc_private.h"
 #endif
@@ -23,7 +23,7 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_config, mc,
                                 "Configuration of MC");
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 namespace simgrid {
 namespace mc {
 /* Configuration support */
@@ -32,7 +32,7 @@ simgrid::mc::ReductionMode reduction_mode = simgrid::mc::ReductionMode::unset;
 }
 #endif
 
-#if !HAVE_MC
+#if !SIMGRID_HAVE_MC
 #define _sg_do_model_check 0
 #endif
 
@@ -46,7 +46,7 @@ void _mc_cfg_cb_timeout(const char *name)
   _sg_mc_timeout = xbt_cfg_get_boolean(name);
 }
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 int _sg_do_model_check = 0;
 int _sg_do_model_check_record = 0;
 int _sg_mc_checkpoint = 0;
index 1d4dd5f..b3140e1 100644 (file)
 
 #include "src/simix/ActorImpl.hpp"
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 #include <libunwind.h>
 #include "src/mc/mc_comm_pattern.h"
+#include "src/mc/mc_ignore.h"
 #include "src/mc/mc_request.h"
 #include "src/mc/mc_safety.h"
 #include "src/mc/mc_snapshot.h"
@@ -55,7 +56,7 @@ std::vector<double> processes_time;
 }
 }
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 
 /* Liveness */
 
index b62bfb1..cf42fd1 100644 (file)
@@ -6,12 +6,25 @@
 #ifndef SIMGRID_MC_IGNORE_H
 #define SIMGRID_MC_IGNORE_H
 
-#include <xbt/base.h>           /* SG_BEGIN_DECL */
-#include <xbt/dynar.h>
+#include "src/internal_config.h"
+#include "xbt/dynar.h"
+
+#if HAVE_UCONTEXT_H
+#include <ucontext.h>           /* context relative declarations */
+#endif
+
 
 SG_BEGIN_DECL();
 
-XBT_PRIVATE xbt_dynar_t MC_checkpoint_ignore_new(void);
+XBT_PUBLIC(void) MC_ignore_heap(void *address, size_t size);
+XBT_PUBLIC(void) MC_remove_ignore_heap(void *address, size_t size);
+XBT_PUBLIC(void) MC_ignore_local_variable(const char *var_name, const char *frame);
+XBT_PUBLIC(void) MC_ignore_global_variable(const char *var_name);
+
+#if HAVE_UCONTEXT_H
+XBT_PUBLIC(void) MC_register_stack_area(void *stack, smx_actor_t process, ucontext_t* context, size_t size);
+#endif
+
 
 SG_END_DECL();
 
index d2c382c..2881f48 100644 (file)
@@ -26,7 +26,7 @@
 #include "src/mc/mc_base.h"
 #include "src/mc/Transition.hpp"
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 #include "src/mc/mc_request.h"
 #include "src/mc/mc_private.h"
 #include "src/mc/mc_state.h"
@@ -103,7 +103,7 @@ RecordTrace parseRecordTrace(const char* data)
   return res;
 }
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 
 std::string traceToString(simgrid::mc::RecordTrace const& trace)
 {
index 9759c21..b4a8aed 100644 (file)
@@ -242,7 +242,7 @@ void Client::declareStack(void* stack, size_t size, smx_actor_t process, ucontex
   message.type         = MC_MESSAGE_STACK_REGION;
   message.stack_region = region;
   if (channel_.send(message))
-    xbt_die("Coule not send STACK_REGION to model-checker");
+    xbt_die("Could not send STACK_REGION to model-checker");
 }
 }
 }
index ead07fe..7974601 100644 (file)
@@ -58,7 +58,7 @@ public:
 
 SG_BEGIN_DECL()
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 void MC_ignore(void* addr, std::size_t size);
 #endif
 
index 65b69cc..c4236de 100644 (file)
@@ -7,6 +7,7 @@
 #include "mc/mc.h"
 #include "src/instr/instr_private.h"
 #include "src/msg/msg_private.h"
+#include "src/mc/mc_ignore.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_msg, instr, "MSG instrumentation");
 
index e50abe0..fc067f7 100644 (file)
@@ -7,7 +7,7 @@
 #include "simgrid/s4u/NetZone.hpp"
 #include "src/msg/msg_private.h"
 
-#if HAVE_LUA
+#if SIMGRID_HAVE_LUA
 #include <lua.h>
 #include <lauxlib.h>
 #include <lualib.h>
@@ -43,54 +43,49 @@ void MSG_post_create_environment() {
 
   /* Initialize MSG storages */
   xbt_lib_foreach(storage_lib, cursor, name, data) {
-    if(data[SIMIX_STORAGE_LEVEL])
-      __MSG_storage_create(xbt_dict_cursor_get_elm(cursor));
+    __MSG_storage_create(xbt_dict_cursor_get_elm(cursor));
   }
 }
 
-msg_netzone_t MSG_environment_get_routing_root()
+msg_netzone_t MSG_zone_get_root()
 {
   return simgrid::s4u::Engine::instance()->netRoot();
 }
 
-const char* MSG_environment_as_get_name(msg_netzone_t netzone)
+const char* MSG_zone_get_name(msg_netzone_t netzone)
 {
   return netzone->name();
 }
 
-msg_netzone_t MSG_environment_as_get_by_name(const char* name)
+msg_netzone_t MSG_zone_get_by_name(const char* name)
 {
   return simgrid::s4u::Engine::instance()->netzoneByNameOrNull(name);
 }
 
-xbt_dict_t MSG_environment_as_get_routing_sons(msg_netzone_t netzone)
+void MSG_zone_get_sons(msg_netzone_t netzone, xbt_dict_t whereto)
 {
-  xbt_dict_t res = xbt_dict_new_homogeneous(nullptr);
   for (auto elem : *netzone->children()) {
-    xbt_dict_set(res, elem->name(), static_cast<void*>(elem), nullptr);
+    xbt_dict_set(whereto, elem->name(), static_cast<void*>(elem), nullptr);
   }
-  return res;
 }
 
-const char* MSG_environment_as_get_property_value(msg_netzone_t netzone, const char* name)
+const char* MSG_zone_get_property_value(msg_netzone_t netzone, const char* name)
 {
   return netzone->property(name);
 }
 
-void MSG_environment_as_set_property_value(msg_netzone_t netzone, const char* name, char* value)
+void MSG_zone_set_property_value(msg_netzone_t netzone, const char* name, char* value)
 {
   netzone->setProperty(name, value);
 }
 
-xbt_dynar_t MSG_environment_as_get_hosts(msg_netzone_t netzone)
+void MSG_zone_get_hosts(msg_netzone_t netzone, xbt_dynar_t whereto)
 {
-  xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t), nullptr);
-
-  for (auto host : *netzone->hosts()) {
-    xbt_dynar_push(res, &host);
-  }
-
-  return res;
+  /* converts vector to dynar */
+  std::vector<simgrid::s4u::Host*> hosts;
+  netzone->hosts(&hosts);
+  for (auto host : hosts)
+    xbt_dynar_push(whereto, &host);
 }
 
 SG_END_DECL()
index 1eefcc5..a75e536 100644 (file)
@@ -9,6 +9,7 @@
 #include "instr/instr_interface.h"
 #include "mc/mc.h"
 #include "src/msg/msg_private.h"
+#include "src/mc/mc_ignore.h"
 
 XBT_LOG_NEW_CATEGORY(msg, "All MSG categories");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_kernel, msg, "Logging specific to MSG (kernel)");
@@ -37,7 +38,7 @@ void MSG_init_nocheck(int *argc, char **argv) {
   xbt_getpid = &MSG_process_self_PID;
   if (!msg_global) {
 
-    msg_global = xbt_new0(s_MSG_Global_t, 1);
+    msg_global = new s_MSG_Global_t();
 
     xbt_cfg_register_boolean("msg/debug-multiple-use", "no", _sg_cfg_cb_msg_debug_multiple_use,
         "Print backtraces of both processes when there is a conflict of multiple use of a task");
@@ -120,7 +121,7 @@ static void MSG_exit() {
 
   TRACE_surf_resource_utilization_release();
   TRACE_end();
-  free(msg_global);
+  delete msg_global;
   msg_global = nullptr;
 }
 
index 282f46a..702e0ab 100644 (file)
@@ -118,19 +118,15 @@ sg_size_t MSG_file_read(msg_file_t fd, sg_size_t size)
   if (strcmp(storage_priv_src->hostname, MSG_host_self()->cname())) {
     /* the file is hosted on a remote host, initiate a communication between src and dest hosts for data transfer */
     XBT_DEBUG("File is on %s remote host, initiate data transfer of %llu bytes.", storage_priv_src->hostname, read_size);
-    msg_host_t *m_host_list = nullptr;
-    m_host_list = xbt_new0(msg_host_t, 2);
-
-    m_host_list[0] = MSG_host_self();
-    m_host_list[1] = attached_host;
-    double flops_amount[] = { 0, 0};
-    double bytes_amount[] = { 0, 0, static_cast<double>(read_size), 0 };
+    msg_host_t m_host_list[] = {MSG_host_self(), attached_host};
+    double flops_amount[]    = {0, 0};
+    double bytes_amount[]    = {0, 0, static_cast<double>(read_size), 0};
 
     msg_task_t task = MSG_parallel_task_create("file transfer for read", 2, m_host_list, flops_amount, bytes_amount,
                       nullptr);
     msg_error_t transfer = MSG_parallel_task_execute(task);
     MSG_task_destroy(task);
-    xbt_free(m_host_list);
+
     if(transfer != MSG_OK){
       if (transfer == MSG_HOST_FAILURE)
         XBT_WARN("Transfer error, %s remote host just turned off!", attached_host->cname());
@@ -163,19 +159,15 @@ sg_size_t MSG_file_write(msg_file_t fd, sg_size_t size)
   if (strcmp(storage_priv_src->hostname, MSG_host_self()->cname())) {
     /* the file is hosted on a remote host, initiate a communication between src and dest hosts for data transfer */
     XBT_DEBUG("File is on %s remote host, initiate data transfer of %llu bytes.", storage_priv_src->hostname, size);
-    msg_host_t *m_host_list = nullptr;
-    m_host_list = xbt_new0(msg_host_t, 2);
-
-    m_host_list[0] = MSG_host_self();
-    m_host_list[1] = attached_host;
-    double flops_amount[] = { 0, 0 };
-    double bytes_amount[] = { 0, static_cast<double>(size), 0, 0 };
+    msg_host_t m_host_list[] = {MSG_host_self(), attached_host};
+    double flops_amount[]    = {0, 0};
+    double bytes_amount[]    = {0, static_cast<double>(size), 0, 0};
 
     msg_task_t task = MSG_parallel_task_create("file transfer for write", 2, m_host_list, flops_amount, bytes_amount,
                                                nullptr);
     msg_error_t transfer = MSG_parallel_task_execute(task);
     MSG_task_destroy(task);
-    free(m_host_list);
+
     if(transfer != MSG_OK){
       if (transfer == MSG_HOST_FAILURE)
         XBT_WARN("Transfer error, %s remote host just turned off!", attached_host->cname());
@@ -332,14 +324,14 @@ msg_error_t MSG_file_rcopy (msg_file_t file, msg_host_t host, const char* fullpa
   char *mount_name;
   char *storage_name;
   xbt_dict_foreach(storage_list,cursor,mount_name,storage_name){
-    char* file_mount_name = static_cast<char *>(xbt_malloc ((strlen(mount_name)+1)));
-    strncpy(file_mount_name,fullpath,strlen(mount_name)+1);
+    char* file_mount_name = static_cast<char*>(xbt_malloc(strlen(mount_name) + 1));
+    strncpy(file_mount_name, fullpath, strlen(mount_name) + 1);
     file_mount_name[strlen(mount_name)] = '\0';
 
-    if(!strcmp(file_mount_name,mount_name) && strlen(mount_name)>longest_prefix_length){
+    if (!strcmp(file_mount_name, mount_name) && strlen(mount_name) > longest_prefix_length) {
       /* The current mount name is found in the full path and is bigger than the previous*/
       longest_prefix_length = strlen(mount_name);
-      storage_dest = (msg_storage_t) xbt_lib_get_elm_or_null(storage_lib, storage_name);
+      storage_dest          = (msg_storage_t)xbt_lib_get_elm_or_null(storage_lib, storage_name);
     }
     xbt_free(file_mount_name);
   }
@@ -358,19 +350,15 @@ msg_error_t MSG_file_rcopy (msg_file_t file, msg_host_t host, const char* fullpa
 
   XBT_DEBUG("Initiate data transfer of %llu bytes between %s and %s.", read_size, storage_priv_src->hostname,
             host_name_dest);
-  msg_host_t *m_host_list = nullptr;
-  m_host_list = xbt_new0(msg_host_t, 2);
-
-  m_host_list[0] = attached_host;
-  m_host_list[1] = host_dest;
-  double flops_amount[] = { 0, 0 };
-  double bytes_amount[] = { 0, static_cast<double>(read_size), 0, 0 };
+  msg_host_t m_host_list[] = {attached_host, host_dest};
+  double flops_amount[]    = {0, 0};
+  double bytes_amount[]    = {0, static_cast<double>(read_size), 0, 0};
 
   msg_task_t task =
       MSG_parallel_task_create("file transfer for write", 2, m_host_list, flops_amount, bytes_amount, nullptr);
   msg_error_t transfer = MSG_parallel_task_execute(task);
   MSG_task_destroy(task);
-  xbt_free(m_host_list);
+
   if(transfer != MSG_OK){
     if (transfer == MSG_HOST_FAILURE)
       XBT_WARN("Transfer error, %s remote host just turned off!", host_name_dest);
@@ -421,7 +409,7 @@ msg_storage_t __MSG_storage_create(smx_storage_t storage)
 {
   msg_storage_priv_t storage_private = xbt_new0(s_msg_storage_priv_t, 1);
 
-  storage_private->name     = SIMIX_storage_get_name(storage);
+  storage_private->name     = surf_storage_get_name(storage);
   storage_private->hostname = surf_storage_get_host(storage);
   storage_private->size     = surf_storage_get_size(storage);
 
index 17d3e9c..14d524b 100644 (file)
@@ -12,9 +12,6 @@ namespace simgrid {
 namespace vm {
 simgrid::xbt::Extension<s4u::Host, VmHostExt> VmHostExt::EXTENSION_ID;
 
-VmHostExt::~VmHostExt()
-{
-}
 void VmHostExt::ensureVmExtInstalled()
 {
   if (!EXTENSION_ID.valid())
index 0a0bedb..ee657b0 100644 (file)
@@ -14,7 +14,7 @@ namespace vm {
 class VmHostExt {
 public:
   static simgrid::xbt::Extension<simgrid::s4u::Host, VmHostExt> EXTENSION_ID;
-  virtual ~VmHostExt();
+  virtual ~VmHostExt() = default;
 
   sg_size_t ramsize = 0;    /* available ramsize (0= not taken into account) */
   bool overcommit   = true; /* Whether the host allows overcommiting more VM than the avail ramsize allows */
index de5b546..4841225 100644 (file)
@@ -151,6 +151,18 @@ void Actor::killAll(int resetPid)
   simcall_process_killall(resetPid);
 }
 
+/** Retrieve the property value (or nullptr if not set) */
+const char* Actor::property(const char* key)
+{
+  return (char*)xbt_dict_get_or_null(simcall_process_get_properties(pimpl_), key);
+}
+void Actor::setProperty(const char* key, const char* value)
+{
+  simgrid::simix::kernelImmediate([this, key, value] {
+    xbt_dict_set(simcall_process_get_properties(pimpl_), key, (char*)value, (void_f_pvoid_t) nullptr);
+  });
+}
+
 // ***** this_actor *****
 
 namespace this_actor {
index 5fecc95..9ecedf2 100644 (file)
@@ -14,12 +14,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_comm,s4u_activity,"S4U asynchronous communic
 namespace simgrid {
 namespace s4u {
 
-Comm::~Comm() {
-
-}
-
-
-
 s4u::Comm &Comm::send_init(s4u::MailboxPtr chan) {
   s4u::Comm *res = new s4u::Comm();
   res->sender_ = SIMIX_process_self();
index 17035d2..f539136 100644 (file)
@@ -71,15 +71,13 @@ NetZone* NetZone::father()
   return father_;
 }
 
-std::vector<s4u::Host*>* NetZone::hosts()
+void NetZone::hosts(std::vector<s4u::Host*>* whereto)
 {
-  if (hosts_.empty()) // Lazy initialization
-    for (auto card : vertices_) {
-      s4u::Host* host = simgrid::s4u::Host::by_name_or_null(card->name());
-      if (host != nullptr)
-        hosts_.push_back(host);
-    }
-  return &hosts_;
+  for (auto card : vertices_) {
+    s4u::Host* host = simgrid::s4u::Host::by_name_or_null(card->name());
+    if (host != nullptr)
+      whereto->push_back(host);
+  }
 }
 
 int NetZone::addComponent(kernel::routing::NetPoint* elm)
index 4a83abd..543cb63 100644 (file)
@@ -237,12 +237,14 @@ xbt_dynar_t SD_daxload(const char *filename)
       /* If some tasks do not take files as input, connect them to the root
        * if they don't produce files, connect them to the end node.
        */
-      if ((file != root_task) && file->inputs->empty())
-        SD_task_dependency_add(nullptr, nullptr, root_task, file);
-      if ((file != end_task) && file->outputs->empty())
-        SD_task_dependency_add(nullptr, nullptr, file, end_task);
+      if ((file != root_task) && (file != end_task)) {
+        if (file->inputs->empty())
+          SD_task_dependency_add(nullptr, nullptr, root_task, file);
+        if (file->outputs->empty())
+          SD_task_dependency_add(nullptr, nullptr, file, end_task);
+      }
     } else {
-       THROW_IMPOSSIBLE;
+      THROW_IMPOSSIBLE;
     }
   }
 
index 0248689..cb9f44a 100644 (file)
@@ -201,7 +201,7 @@ void SD_create_environment(const char *platform_file)
   simgrid::s4u::Engine::instance()->loadPlatform(platform_file);
 
   XBT_DEBUG("Host number: %zu, link number: %d", sg_host_count(), sg_link_count());
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
   jedule_sd_init();
 #endif
   XBT_VERB("Starting simulation...");
@@ -247,7 +247,7 @@ double SD_get_clock() {
 void SD_exit()
 {
   TRACE_end();
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
   jedule_sd_exit();
 #endif
   delete sd_global;
index 3cf0a0e..e6ee5cf 100644 (file)
@@ -289,7 +289,7 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state)
     task->start_time = task->surf_action->getStartTime();
     if (new_state == SD_DONE){
       task->finish_time = task->surf_action->getFinishTime();
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
       jedule_log_sd_event(task);
 #endif
     } else
index 9cd87ba..58d88e7 100644 (file)
@@ -12,7 +12,7 @@
 
 #ifndef SIMDAG_PRIVATE_HPP
 #define SIMDAG_PRIVATE_HPP
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
 #include "simgrid/jedule/jedule_sd_binding.h"
 #endif
 
index 308a135..919fb94 100644 (file)
@@ -236,8 +236,6 @@ double sg_host_route_bandwidth(sg_host_t from, sg_host_t to)
 void sg_host_dump(sg_host_t host)
 {
   xbt_dict_t props;
-  xbt_dict_cursor_t cursor=nullptr;
-  char *key,*data;
 
   XBT_INFO("Displaying host %s", host->cname());
   XBT_INFO("  - speed: %.0f", host->speed());
@@ -246,6 +244,9 @@ void sg_host_dump(sg_host_t host)
 
   if (!xbt_dict_is_empty(props)){
     XBT_INFO("  - properties:");
+    xbt_dict_cursor_t cursor = nullptr;
+    char* key;
+    char* data;
 
     xbt_dict_foreach(props,cursor,key,data) {
       XBT_INFO("    %s->%s",key,data);
index 9b99689..729f1ee 100644 (file)
@@ -45,7 +45,8 @@ int _sg_cfg_exit_asap = 0;
 static void sg_config_cmd_line(int *argc, char **argv)
 {
   int shall_exit = 0;
-  int i, j;
+  int i;
+  int j;
 
   for (j = i = 1; i < *argc; i++) {
     if (!strncmp(argv[i], "--cfg=", strlen("--cfg="))) {
@@ -208,7 +209,7 @@ static void _sg_cfg_cb_model_check_replay(const char *name) {
     MC_record_path = nullptr;
 }
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 extern int _sg_do_model_check_record;
 static void _sg_cfg_cb_model_check_record(const char *name) {
   _sg_do_model_check_record = xbt_cfg_get_boolean(name);
@@ -375,7 +376,7 @@ void sg_config_init(int *argc, char **argv)
     xbt_cfg_register_string("model-check/replay", nullptr, _sg_cfg_cb_model_check_replay,
         "Model-check path to replay (as reported by SimGrid when a violation is reported)");
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
     /* do model-checking-record */
     xbt_cfg_register_boolean("model-check/record", "no", _sg_cfg_cb_model_check_record, "Record the model-checking paths");
 
index e1ffbda..9b7e47b 100644 (file)
@@ -14,7 +14,8 @@
 typedef struct s_smx_process_exit_fun {
   int_f_pvoid_pvoid_t fun;
   void *arg;
-} s_smx_process_exit_fun_t, *smx_process_exit_fun_t;
+} s_smx_process_exit_fun_t;
+typedef s_smx_process_exit_fun_t* smx_process_exit_fun_t;
 
 namespace simgrid {
 namespace simix {
index 1314c04..c488326 100644 (file)
@@ -6,7 +6,7 @@
 
 #include "smx_private.h"
 #include "xbt/xbt_os_thread.h"
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 #include "src/mc/mc_private.h"
 #endif
 
index 9e47729..968e7bc 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <xbt/base.h>
 #include "smx_private.h"
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 #include "src/mc/mc_forward.hpp"
 #endif
 
index bc4a5c0..706dc92 100755 (executable)
@@ -290,7 +290,7 @@ if __name__ == '__main__':
 
     fd.write('#include <xbt/base.h>\n')
     fd.write('#include "smx_private.h"\n')
-    fd.write('#if HAVE_MC\n')
+    fd.write('#if SIMGRID_HAVE_MC\n')
     fd.write('#include "src/mc/mc_forward.hpp"\n')
     fd.write('#endif\n')
     fd.write('\n')
index b382461..712ab9c 100644 (file)
@@ -106,6 +106,20 @@ void SIMIX_context_mod_init()
   xbt_os_thread_key_create(&smx_current_context_key);
 #endif
 
+#if defined(__APPLE__) || defined(__NetBSD__)
+  if (context_factory_name == std::string("thread") &&
+      strcmp(xbt_cfg_get_string("smpi/privatization"), "dlopen") == 0) {
+    XBT_WARN("dlopen+thread broken on Apple and BSD. Switching to raw contexts.");
+    context_factory_name = "raw";
+  }
+#endif
+#if defined(__FreeBSD__)
+  if (context_factory_name == std::string("thread") && strcmp(xbt_cfg_get_string("smpi/privatization"), "no") != 0) {
+    XBT_WARN("mmap broken on FreeBSD, but dlopen+thread broken too. Switching to dlopen+raw contexts.");
+    context_factory_name = "raw";
+  }
+#endif
+
   /* select the context factory to use to create the contexts */
   if (simgrid::kernel::context::factory_initializer) { // Give Java a chance to hijack the factory mechanism
     simix_global->context_factory = simgrid::kernel::context::factory_initializer();
@@ -168,8 +182,8 @@ void *SIMIX_context_stack_new()
 #endif
 
     size_t size = smx_context_stack_size + smx_context_guard_size;
-#if HAVE_MC
-    /* Cannot use posix_memalign when HAVE_MC. Align stack by hand, and save the
+#if SIMGRID_HAVE_MC
+    /* Cannot use posix_memalign when SIMGRID_HAVE_MC. Align stack by hand, and save the
      * pointer returned by xbt_malloc0. */
     char *alloc = (char*)xbt_malloc0(size + xbt_pagesize);
     stack = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize;
@@ -223,7 +237,7 @@ void SIMIX_context_stack_delete(void *stack)
       XBT_WARN("Failed to remove page protection: %s", strerror(errno));
       /* try to pursue anyway */
     }
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
     /* Retrieve the saved pointer.  See SIMIX_context_stack_new above. */
     stack = *((void **)stack - 1);
 #endif
index 569d96b..daa1b11 100644 (file)
@@ -147,7 +147,7 @@ void SIMIX_process_set_function(const char *process_host,
   process.host = process_host;
   process.kill_time = process_kill_time;
   process.start_time = process_start_time;
-  process.on_failure = SURF_PROCESS_ON_FAILURE_DIE;
+  process.on_failure = SURF_ACTOR_ON_FAILURE_DIE;
   sg_platf_new_process(&process);
 }
 
index 09313d8..9292bf6 100644 (file)
 #include "src/mc/mc_replay.h"
 #include "simgrid/sg_config.h"
 
+#include "src/smpi/smpi_process.hpp"
+
 #include "src/kernel/activity/SynchroExec.hpp"
 #include "src/kernel/activity/SynchroComm.hpp"
 #include "src/kernel/activity/SynchroSleep.hpp"
 #include "src/kernel/activity/SynchroIo.hpp"
 #include "src/kernel/activity/SynchroRaw.hpp"
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 #include "src/mc/mc_private.h"
 #include "src/mc/remote/Client.hpp"
 #include "src/mc/remote/mc_protocol.h"
@@ -191,7 +193,7 @@ void SIMIX_set_maestro(void (*code)(void*), void* data)
  */
 void SIMIX_global_init(int *argc, char **argv)
 {
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   // The communication initialization is done ASAP.
   // We need to communicate  initialization of the different layers to the model-checker.
   simgrid::mc::Client::initialize();
@@ -236,11 +238,7 @@ void SIMIX_global_init(int *argc, char **argv)
       // TODO, create sg_storage_by_name
       sg_storage_t s = xbt_lib_get_elm_or_null(storage_lib, name);
       xbt_assert(s != nullptr, "Storage not found for name %s", name);
-
-      SIMIX_storage_create(name, s, nullptr);
     });
-
-    SIMIX_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, SIMIX_storage_destroy);
   }
   if (!simix_timers)
     simix_timers = xbt_heap_new(8, [](void* p) {
@@ -302,7 +300,7 @@ void SIMIX_clean()
 
   xbt_os_mutex_destroy(simix_global->mutex);
   simix_global->mutex = nullptr;
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   xbt_dynar_free(&simix_global->actors_vector);
 #endif
 
index 88892bf..38659ca 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_io, simix, "Logging specific to SIMIX (io)");
 
-/**
- * \brief Internal function to create a SIMIX storage.
- * \param name name of the storage to create
- * \param storage the SURF storage to encapsulate
- * \param data some user data (may be nullptr)
- */
-smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data)
-{
-  smx_storage_priv_t smx_storage = xbt_new0(s_smx_storage_priv_t, 1);
-
-  smx_storage->data = data;
-
-  /* Update global variables */
-  xbt_lib_set(storage_lib,name,SIMIX_STORAGE_LEVEL,smx_storage);
-  return xbt_lib_get_elm_or_null(storage_lib, name);
-}
-
-/**
- * \brief Internal function to destroy a SIMIX storage.
- *
- * \param s the host to destroy (a smx_storage_t)
- */
-void SIMIX_storage_destroy(void *s)
-{
-  smx_storage_priv_t storage = static_cast<smx_storage_priv_t>(s);
-
-  xbt_assert((storage != nullptr), "Invalid parameters");
-  if (storage->data)
-    free(storage->data);
-
-  /* Clean storage structure */
-  free(storage);
-}
-
 //SIMIX FILE READ
 void simcall_HANDLER_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size, sg_host_t host)
 {
@@ -214,10 +180,6 @@ xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage){
   return surf_storage_get_properties(storage);
 }
 
-const char* SIMIX_storage_get_name(smx_storage_t storage){
-  return sg_storage_name(storage);
-}
-
 void SIMIX_io_destroy(smx_activity_t synchro)
 {
   simgrid::kernel::activity::Io *io = static_cast<simgrid::kernel::activity::Io*>(synchro);
index 114f9c0..0f9bfd3 100644 (file)
 #include "simgrid/simix.h"
 #include "popping_private.h"
 
-/** @brief Storage datatype */
-typedef struct s_smx_storage_priv {
-  void *data;              /**< @brief user data */
-} s_smx_storage_priv_t;
-
-
-static inline smx_storage_priv_t SIMIX_storage_priv(smx_storage_t storage){
-  return (smx_storage_priv_t) xbt_lib_get_level(storage, SIMIX_STORAGE_LEVEL);
-}
-
-XBT_PRIVATE smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data);
-XBT_PRIVATE void SIMIX_storage_destroy(void *s);
 XBT_PRIVATE smx_activity_t SIMIX_file_read(smx_file_t fd, sg_size_t size, sg_host_t host);
 XBT_PRIVATE smx_activity_t SIMIX_file_write(smx_file_t fd, sg_size_t size, sg_host_t host);
 XBT_PRIVATE smx_activity_t SIMIX_file_open(const char* fullpath, sg_host_t host);
index 852db10..2da73fd 100644 (file)
@@ -59,7 +59,7 @@ _find_matching_comm(boost::circular_buffer_space_optimized<smx_activity_t>* dequ
       if (remove_matching)
         deque->erase(it);
       comm->ref();
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
       comm->mbox_cpy = comm->mbox;
 #endif
       comm->mbox = nullptr;
index 9ec2107..f600d35 100644 (file)
@@ -22,7 +22,7 @@ public:
   xbt_dynar_t process_to_run = nullptr;
   xbt_dynar_t process_that_ran = nullptr;
   std::map<aid_t, smx_actor_t> process_list;
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   /* MCer cannot read the std::map above in the remote process, so we copy the info it needs in a dynar.
    * FIXME: This is supposed to be a temporary hack.
    * A better solution would be to change the split between MCer and MCed, where the responsibility
index 13ff6f0..44dc246 100644 (file)
@@ -1,15 +1,14 @@
-/* Copyright (c) 2013-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2013-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "../colls_private.h"
+#include "src/smpi/smpi_status.hpp"
 
 namespace simgrid{
 namespace smpi{
 
-
 int
 Coll_allgather_rdb::allgather(void *sbuf, int send_count,
                               MPI_Datatype send_type, void *rbuf,
index 08b9cb4..fb374b9 100644 (file)
@@ -1,12 +1,13 @@
-/* Copyright (c) 2013-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2013-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-        /* Short or medium size message and power-of-two no. of processes. Use
-         * recursive doubling algorithm */
+/* Short or medium size message and power-of-two no. of processes. Use
+ * recursive doubling algorithm */
+
 #include "../colls_private.h"
+#include "src/smpi/smpi_status.hpp"
 
 namespace simgrid{
 namespace smpi{
index 8500d14..f4f2357 100644 (file)
     }                                                                        \
 
 #include "../colls_private.h"
+
 namespace simgrid{
 namespace smpi{
 int 
index 58a20df..fae85c5 100644 (file)
@@ -5,6 +5,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "../colls_private.h"
+#include "src/smpi/smpi_win.hpp"
 
 /*****************************************************************************
 
index 5a6d18f..0a16b23 100644 (file)
@@ -5,6 +5,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "../colls_private.h"
+#include "src/smpi/smpi_status.hpp"
 
 /*****************************************************************************
 
index ca0112d..66ac6bb 100644 (file)
@@ -1,10 +1,10 @@
-/* Copyright (c) 2013-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2013-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "../colls_private.h"
+#include "src/smpi/smpi_status.hpp"
 
 /*****************************************************************************
 
index f4a7d4b..1a1fe1a 100644 (file)
@@ -1,4 +1,11 @@
+/* Copyright (c) 2011-2017. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "../colls_private.h"
+#include "src/smpi/smpi_status.hpp"
+
 namespace simgrid{
 namespace smpi{
 
index 7ae80dc..c621957 100644 (file)
@@ -9,9 +9,11 @@
 #include <math.h>
 #include "smpi/mpi.h"
 #include "src/smpi/private.h"
-#include "xbt/ex.h"
-#include "xbt.h"
-#include "../smpi_coll.hpp"
+#include "src/smpi/smpi_coll.hpp"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_op.hpp"
+#include "src/smpi/smpi_request.hpp"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_colls);
 
index aece1eb..cac0ea2 100644 (file)
@@ -9,6 +9,8 @@
 #include <exception>
 
 #include "colls_private.h"
+#include "src/smpi/smpi_process.hpp"
+
 
 //attempt to do a quick autotuning version of the collective,
 
index d85e7c4..546c2b7 100644 (file)
@@ -7,6 +7,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "colls_private.h"
+#include "src/smpi/smpi_process.hpp"
 
 namespace simgrid{
 namespace smpi{
index 921bab8..b589dc7 100644 (file)
@@ -61,20 +61,20 @@ static const char *smpi_colors[] ={
 
 static char *str_tolower (const char *str)
 {
-  char *ret = xbt_strdup (str);
-  int i, n = strlen (ret);
-  for (i = 0; i < n; i++)
+  char* ret = xbt_strdup(str);
+  int n     = strlen(ret);
+  for (int i = 0; i < n; i++)
     ret[i] = tolower (str[i]);
   return ret;
 }
 
 static const char *instr_find_color (const char *state)
 {
-  char *target = str_tolower (state);
-  const char *ret = nullptr;
-  unsigned int i = 0;
-  const char *current = smpi_colors[i];
-  while ((current != nullptr)){
+  char* target        = str_tolower(state);
+  const char* ret     = nullptr;
+  unsigned int i      = 0;
+  const charcurrent = smpi_colors[i];
+  while (current != nullptr) {
     if (strcmp (state, current) == 0 //exact match
         || strstr(target, current) != 0 ){//as substring
          ret = smpi_colors[i+1]; 
index a01bc88..fd8553a 100644 (file)
@@ -6,30 +6,10 @@
 #ifndef SMPI_PRIVATE_H
 #define SMPI_PRIVATE_H
 
-#include "simgrid/simix.h"
 #include "smpi/smpi.h"
-#include "src/instr/instr_private.h"
-#include "src/internal_config.h"
-#include "xbt.h"
-#include "xbt/base.h"
-#include "xbt/synchro.h"
-#include "xbt/xbt_os_time.h"
-#include "src/smpi/smpi_process.hpp"
-#include "src/smpi/smpi_f2c.hpp"
-#include "src/smpi/smpi_keyvals.hpp"
-#include "src/smpi/smpi_group.hpp"
-#include "src/smpi/smpi_topo.hpp"
-#include "src/smpi/smpi_coll.hpp"
-#include "src/smpi/smpi_comm.hpp"
-#include "src/smpi/smpi_info.hpp"
-#include "src/smpi/smpi_op.hpp"
-#include "src/smpi/smpi_datatype.hpp"
-#include "src/smpi/smpi_datatype_derived.hpp"
-#include "src/smpi/smpi_request.hpp"
-#include "src/smpi/smpi_status.hpp"
-#include "src/smpi/smpi_win.hpp"
-SG_BEGIN_DECL()
+#include "simgrid/msg.h" // msg_bar_t
 
+SG_BEGIN_DECL()
 
 #define PERSISTENT     0x1
 #define NON_PERSISTENT 0x2
@@ -386,38 +366,13 @@ void mpi_file_set_view_ ( int* fh, long long int* offset, int* etype, int* filet
 void mpi_file_read_ ( int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr);
 void mpi_file_write_ ( int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr);
 
-/********** Tracing **********/
-/* from instr_smpi.c */
-XBT_PRIVATE void TRACE_internal_smpi_set_category (const char *category);
-XBT_PRIVATE const char *TRACE_internal_smpi_get_category ();
-XBT_PRIVATE void TRACE_smpi_collective_in(int rank, int root, const char *operation, instr_extra_data extra);
-XBT_PRIVATE void TRACE_smpi_collective_out(int rank, int root, const char *operation);
-XBT_PRIVATE void TRACE_smpi_computing_init(int rank);
-XBT_PRIVATE void TRACE_smpi_computing_out(int rank);
-XBT_PRIVATE void TRACE_smpi_computing_in(int rank, instr_extra_data extra);
-XBT_PRIVATE void TRACE_smpi_sleeping_init(int rank);
-XBT_PRIVATE void TRACE_smpi_sleeping_out(int rank);
-XBT_PRIVATE void TRACE_smpi_sleeping_in(int rank, instr_extra_data extra);
-XBT_PRIVATE void TRACE_smpi_testing_out(int rank);
-XBT_PRIVATE void TRACE_smpi_testing_in(int rank, instr_extra_data extra);
-XBT_PRIVATE void TRACE_smpi_alloc();
-XBT_PRIVATE void TRACE_smpi_release();
-XBT_PRIVATE void TRACE_smpi_ptp_in(int rank, int src, int dst, const char *operation,  instr_extra_data extra);
-XBT_PRIVATE void TRACE_smpi_ptp_out(int rank, int src, int dst, const char *operation);
-XBT_PRIVATE void TRACE_smpi_send(int rank, int src, int dst, int tag, int size);
-XBT_PRIVATE void TRACE_smpi_recv(int rank, int src, int dst, int tag);
-XBT_PRIVATE void TRACE_smpi_init(int rank);
-XBT_PRIVATE void TRACE_smpi_finalize(int rank);
-XBT_PRIVATE char *smpi_container(int rank, char *container, int n);
-
-XBT_PRIVATE const char* encode_datatype(MPI_Datatype datatype, int* known);
-
 // TODO, make this static and expose it more cleanly
 
 typedef struct s_smpi_privatisation_region {
   void* address;
   int file_descriptor;
-} s_smpi_privatisation_region_t, *smpi_privatisation_region_t;
+} s_smpi_privatisation_region_t;
+typedef s_smpi_privatisation_region_t* smpi_privatisation_region_t;
 
 extern XBT_PRIVATE smpi_privatisation_region_t smpi_privatisation_regions;
 extern XBT_PRIVATE int smpi_loaded_page;
index a5c1aed..42792da 100644 (file)
@@ -9,6 +9,7 @@
 #include "src/instr/instr_smpi.h"
 #include <unordered_map>
 #include <vector>
+#include "src/internal_config.h"
 
 /**
  * Get the address of the beginning of the memory page where addr is located.
index c27028a..52736c8 100644 (file)
@@ -3,29 +3,18 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include <cstring>
-
-#include <unordered_map>
-#include <utility>
-
 #include "src/internal_config.h"
 #include "private.h"
 #include "private.hpp"
-#include <xbt/ex.hpp>
-#include "xbt/dict.h"
-#include "xbt/sysdep.h"
-#include "xbt/ex.h"
-#include "surf/surf.h"
-#include "simgrid/sg_config.h"
 #include "simgrid/modelchecker.h"
 #include "src/mc/mc_replay.h"
+#include "src/smpi/smpi_process.hpp"
+#include "src/smpi/smpi_comm.hpp"
 
-#include <sys/types.h>
 #ifndef WIN32
 #include <sys/mman.h>
 #endif
 #include <math.h> // sqrt
-#include <stdio.h>
 
 #if HAVE_PAPI
 #include <papi.h>
@@ -89,6 +78,13 @@ void smpi_execute(double duration)
   }
 }
 
+void smpi_execute_benched(double duration)
+{
+  smpi_bench_end();
+  smpi_execute(duration);
+  smpi_bench_begin();
+}
+
 void smpi_bench_begin()
 {
   if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
index 9bee615..326f462 100644 (file)
@@ -6,12 +6,12 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-
-#include "private.h"
-#include "simgrid/sg_config.h"
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_coll.hpp"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_op.hpp"
+#include "src/smpi/smpi_request.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi, "Logging specific to SMPI (coll)");
 
index 6f8672c..8410ae7 100644 (file)
@@ -8,9 +8,7 @@
 #ifndef SMPI_COLL_HPP
 #define SMPI_COLL_HPP
 
-#include <xbt/base.h>
-
-#include "private.h"
+#include "xbt/base.h"
 
 /** \brief MPI collective description */
 
@@ -38,8 +36,8 @@ static ret cat  (COLL_UNPAREN args); \
 
 #define COLL_APPLY(action, sig, name) action(sig, name)
 #define COLL_COMMA ,
-#define COLL_NOsep 
-#define COLL_NOTHING(...) 
+#define COLL_NOsep
+#define COLL_NOTHING(...)
 
 #define COLL_GATHER_SIG gather, int, \
                       (void *send_buff, int send_count, MPI_Datatype send_type, \
@@ -92,31 +90,30 @@ typedef struct mpi_coll_description  s_mpi_coll_description_t;
 
 class Colls{
   public:
-
     static XBT_PUBLIC(void) coll_help(const char *category, s_mpi_coll_description_t * table);
     static XBT_PUBLIC(int) find_coll_description(s_mpi_coll_description_t * table, const char *name, const char *desc);
     static void set_collectives();
 
-    // for each collective type, create the set_* prototype, the description array
-    // and the function pointer
-    COLL_APPLY(COLL_DEFS,COLL_GATHER_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_ALLGATHER_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_ALLGATHERV_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_REDUCE_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_ALLREDUCE_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_REDUCE_SCATTER_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_SCATTER_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_BARRIER_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_BCAST_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_ALLTOALL_SIG,"");
-    COLL_APPLY(COLL_DEFS,COLL_ALLTOALLV_SIG,"");
-
-//These fairly unused collectives only have one implementation in SMPI
-
-    static int gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm);
-    static int scatterv(void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);
-    static int scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
-    static int exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
+    // for each collective type, create the set_* prototype, the description array and the function pointer
+    COLL_APPLY(COLL_DEFS, COLL_GATHER_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_ALLGATHER_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_ALLGATHERV_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_REDUCE_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_ALLREDUCE_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_REDUCE_SCATTER_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_SCATTER_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_BARRIER_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_BCAST_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_ALLTOALL_SIG, "");
+    COLL_APPLY(COLL_DEFS, COLL_ALLTOALLV_SIG, "");
+
+    // These fairly unused collectives only have one implementation in SMPI
+    static int gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int* recvcounts, int* displs,
+                       MPI_Datatype recvtype, int root, MPI_Comm comm);
+    static int scatterv(void* sendbuf, int* sendcounts, int* displs, MPI_Datatype sendtype, void* recvbuf,
+                        int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);
+    static int scan(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
+    static int exscan(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
 
     static void (*smpi_coll_cleanup_callback)();
 };
@@ -241,7 +238,6 @@ COLL_ALLREDUCES(COLL_PROTO, COLL_NOsep)
  * ALLTOALL *
  ************/
 
-
 #define COLL_ALLTOALLS(action, COLL_sep) \
 COLL_APPLY(action, COLL_ALLTOALL_SIG, default) COLL_sep \
 COLL_APPLY(action, COLL_ALLTOALL_SIG, 2dmesh) COLL_sep \
@@ -324,7 +320,6 @@ COLL_APPLY(action, COLL_BCAST_SIG, automatic)
 
 COLL_BCASTS(COLL_PROTO, COLL_NOsep)
 
-
 /**********
  * REDUCE *
  **********/
@@ -370,11 +365,8 @@ COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mvapich2) COLL_sep \
 COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, impi) COLL_sep \
 COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, automatic)
 
-
-
 COLL_REDUCE_SCATTERS(COLL_PROTO, COLL_NOsep)
 
-
 /*************
  * SCATTER *
  *************/
@@ -414,8 +406,6 @@ COLL_APPLY(action, COLL_BARRIER_SIG, automatic)
 
 COLL_BARRIERS(COLL_PROTO, COLL_NOsep)
 
-
 }
 }
-
 #endif
index a3b9f5f..213a822 100644 (file)
@@ -5,8 +5,15 @@
 
 #include "simgrid/s4u/Host.hpp"
 
-#include "private.h"
 #include "src/simix/smx_private.h"
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_coll.hpp"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_process.hpp"
+#include "src/smpi/smpi_request.hpp"
+#include "src/smpi/smpi_status.hpp"
+#include "src/smpi/smpi_win.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_comm, smpi, "Logging specific to SMPI (comm)");
 
index 9076cc0..992c922 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2010-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -7,8 +6,10 @@
 #ifndef SMPI_COMM_HPP_INCLUDED
 #define SMPI_COMM_HPP_INCLUDED
 
-#include "private.h"
 #include <list>
+#include "src/smpi/smpi_keyvals.hpp"
+#include "src/smpi/smpi_group.hpp"
+#include "src/smpi/smpi_topo.hpp"
 
 namespace simgrid{
 namespace smpi{
index 6dfe3bd..49cf5a8 100644 (file)
@@ -1,20 +1,14 @@
-/* smpi_datatype.cpp -- MPI primitives to handle datatypes                      */
-/* Copyright (c) 2009-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* smpi_datatype.cpp -- MPI primitives to handle datatypes                  */
+/* Copyright (c) 2009-2017. The SimGrid Team.  All rights reserved.         */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "mc/mc.h"
-#include "private.h"
 #include "simgrid/modelchecker.h"
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <string>
-#include <unordered_map>
-#include <xbt/ex.hpp>
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_datatype_derived.hpp"
+#include "src/smpi/smpi_op.hpp"
+#include "src/smpi/smpi_process.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (datatype)");
 
@@ -24,7 +18,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (
     sizeof(type),   /* size */                        \
     0,              /* lb */                          \
     sizeof(type),   /* ub = lb + size */              \
-    DT_FLAG_BASIC  /* flags */                       \
+    DT_FLAG_BASIC  /* flags */                        \
   );                                                  \
 const MPI_Datatype name = &mpi_##name;
 
@@ -107,7 +101,7 @@ std::unordered_map<int, smpi_key_elem> Datatype::keyvals_;
 int Datatype::keyval_id_=0;
 
 Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(1){
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   if(MC_is_active())
     MC_ignore(&(refcount_), sizeof(refcount_));
 #endif
@@ -115,7 +109,7 @@ Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr
 
 //for predefined types, so in_use = 0.
 Datatype::Datatype(char* name, int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(name), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(0){
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   if(MC_is_active())
     MC_ignore(&(refcount_), sizeof(refcount_));
 #endif
@@ -170,7 +164,7 @@ void Datatype::ref(){
 
   refcount_++;
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   if(MC_is_active())
     MC_ignore(&(refcount_), sizeof(refcount_));
 #endif
@@ -184,7 +178,7 @@ void Datatype::unref(MPI_Datatype datatype)
   if (datatype->refcount_ == 0  && !(datatype->flags_ & DT_FLAG_PREDEFINED))
     delete datatype;
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   if(MC_is_active())
     MC_ignore(&(datatype->refcount_), sizeof(datatype->refcount_));
 #endif
index f2263b0..220a424 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2009-2010, 2012-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -7,10 +6,8 @@
 #ifndef SMPI_DATATYPE_HPP
 #define SMPI_DATATYPE_HPP
 
-#include <xbt/base.h>
-
-#include "private.h"
-
+#include "src/smpi/smpi_f2c.hpp"
+#include "src/smpi/smpi_keyvals.hpp"
 
 #define DT_FLAG_DESTROYED     0x0001  /**< user destroyed but some other layers still have a reference */
 #define DT_FLAG_COMMITED      0x0002  /**< ready to be used for a send/recv operation */
index 326dee8..cc00885 100644 (file)
@@ -1,18 +1,11 @@
-/* smpi_datatype.cpp -- MPI primitives to handle datatypes                      */
-/* Copyright (c) 2009-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* smpi_datatype.cpp -- MPI primitives to handle datatypes                  */
+/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "mc/mc.h"
-#include "private.h"
-
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <string>
+#include "src/smpi/smpi_datatype_derived.hpp"
+#include "src/smpi/smpi_op.hpp"
 
 XBT_LOG_EXTERNAL_CATEGORY(smpi_datatype);
 
index 12e1829..03ac756 100644 (file)
@@ -7,14 +7,12 @@
 #ifndef SMPI_DATATYPE_DERIVED_HPP
 #define SMPI_DATATYPE_DERIVED_HPP
 
-#include <xbt/base.h>
-
-#include "private.h"
+#include "src/smpi/smpi_datatype.hpp"
 
 namespace simgrid{
 namespace smpi{
 
-class Type_Contiguous: public Datatype{
+class Type_Contiguous: public Datatype {
   private:
     int block_count_;
     MPI_Datatype old_type_;
index 2dcf26e..475688f 100644 (file)
@@ -4,10 +4,10 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "private.h"
 #include "simgrid/msg.h" /* barrier */
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_comm.hpp"
 #include "src/smpi/SmpiHost.hpp"
-#include "xbt/log.h"
 
 namespace simgrid {
 namespace smpi {
index 1126c87..978722d 100644 (file)
@@ -1,12 +1,13 @@
-/* Copyright (c) 2007-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "private.h"
-#include <vector>
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_f2c.hpp"
+#include "src/smpi/smpi_process.hpp"
 
+#include <cstdio>
 
 namespace simgrid{
 namespace smpi{
@@ -31,12 +32,12 @@ int F2C::f2c_id(){
 };
 
 char* F2C::get_key(char* key, int id) {
-  snprintf(key, KEY_SIZE, "%x",id);
+  std::snprintf(key, KEY_SIZE, "%x",id);
   return key;
 }
 
 char* F2C::get_key_id(char* key, int id) {
-  snprintf(key, KEY_SIZE, "%x_%d",id, smpi_process()->index());
+  std::snprintf(key, KEY_SIZE, "%x_%d",id, smpi_process()->index());
   return key;
 }
 
index 3f28535..bfe726b 100644 (file)
@@ -9,8 +9,7 @@
 #ifndef SMPI_F2C_HPP_INCLUDED
 #define SMPI_F2C_HPP_INCLUDED
 
-#include "private.h"
-
+#include "xbt/dict.h"
 
 #define KEY_SIZE (sizeof(int) * 2 + 1)
 
index be97ecd..73d502c 100644 (file)
@@ -1,13 +1,15 @@
-/* Copyright (c) 2010-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include <limits.h>
-#include <stdio.h>
-#include "private.h"
-#include "xbt.h"
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_op.hpp"
+#include "src/smpi/smpi_process.hpp"
+#include "src/smpi/smpi_request.hpp"
+#include "src/smpi/smpi_win.hpp"
 
 static int running_processes = 0;
 
index 7f62db8..ff2da6f 100644 (file)
@@ -3,40 +3,27 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include <dlfcn.h>
-#include <fcntl.h>
-#include <spawn.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
 #include "mc/mc.h"
-#include "private.h"
-#include "private.hpp"
 #include "simgrid/s4u/Mailbox.hpp"
-#include "smpi/smpi_shared_malloc.hpp"
-#include "simgrid/sg_config.h"
-#include "src/kernel/activity/SynchroComm.hpp"
-#include "src/mc/mc_record.h"
-#include "src/mc/mc_replay.h"
+#include "simgrid/s4u/Host.hpp"
 #include "src/msg/msg_private.h"
 #include "src/simix/smx_private.h"
 #include "src/surf/surf_interface.hpp"
 #include "src/smpi/SmpiHost.hpp"
-#include "surf/surf.h"
-#include "xbt/replay.hpp"
-#include <xbt/config.hpp>
+#include "xbt/config.hpp"
+#include "src/smpi/private.h"
+#include "smpi/smpi_shared_malloc.hpp"
+#include "src/smpi/smpi_coll.hpp"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_group.hpp"
+#include "src/smpi/smpi_info.hpp"
+#include "src/smpi/smpi_process.hpp"
 
+#include <dlfcn.h>
+#include <fcntl.h>
+#include <sys/stat.h>
 #include <float.h> /* DBL_MAX */
 #include <fstream>
-#include <map>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string>
-#include <utility>
-#include <vector>
-#include <memory>
 
 #if HAVE_SENDFILE
 #include <sys/sendfile.h>
@@ -54,9 +41,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke
 #define RTLD_DEEPBIND 0
 #endif
 
-/* Mac OSX does not have any header file providing that definition so we have to duplicate it here. Bummers. */
-extern char** environ; /* we use it in posix_spawnp below */
-
 #if HAVE_PAPI
 #include "papi.h"
 const char* papi_default_config_name = "default";
@@ -86,8 +70,6 @@ static simgrid::config::Flag<double> smpi_init_sleep(
 
 void (*smpi_comm_copy_data_callback) (smx_activity_t, void*, size_t) = &smpi_comm_copy_buffer_callback;
 
-
-
 int smpi_process_count()
 {
   return process_count;
@@ -119,6 +101,14 @@ int smpi_process_index(){
   return smpi_process()->index();
 }
 
+void * smpi_process_get_user_data(){
+  return smpi_process()->get_user_data();
+}
+
+void smpi_process_set_user_data(void *data){
+  return smpi_process()->set_user_data(data);
+}
+
 
 int smpi_global_size()
 {
@@ -190,7 +180,8 @@ void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t b
        XBT_DEBUG("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !");
 
        smpi_switch_data_segment(
-           (static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->src_proc->data)->data))->index()));
+           static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->src_proc->data)->data))
+               ->index());
        tmpbuff = static_cast<void*>(xbt_malloc(buff_size));
        memcpy_private(tmpbuff, buff, private_blocks);
   }
@@ -199,7 +190,8 @@ void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t b
       && ((char*)comm->dst_buff < smpi_start_data_exe + smpi_size_data_exe )){
        XBT_DEBUG("Privatization : We are copying to a zone inside global memory - Switch data segment");
        smpi_switch_data_segment(
-           (static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->dst_proc->data)->data))->index()));
+           static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->dst_proc->data)->data))
+               ->index());
   }
   XBT_DEBUG("Copying %zu bytes from %p to %p", buff_size, tmpbuff,comm->dst_buff);
   memcpy_private(comm->dst_buff, tmpbuff, private_blocks);
@@ -468,6 +460,13 @@ static void smpi_init_options(){
     else
       xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option);
 
+#if defined(__FreeBSD__)
+    if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
+      XBT_INFO("Mixing mmap privatization is broken on FreeBSD, switching to dlopen privatization instead.");
+      smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN;
+    }
+#endif
+
     if (smpi_cpu_threshold < 0)
       smpi_cpu_threshold = DBL_MAX;
 
@@ -490,10 +489,11 @@ typedef void (*smpi_fortran_entry_point_type)();
 
 static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector<std::string> args)
 {
+  char noarg[]   = {'\0'};
   const int argc = args.size();
   std::unique_ptr<char*[]> argv(new char*[argc + 1]);
   for (int i = 0; i != argc; ++i)
-    argv[i] = args[i].empty() ? const_cast<char*>(""): &args[i].front();
+    argv[i] = args[i].empty() ? noarg : &args[i].front();
   argv[argc] = nullptr;
 
   int res = entry_point(argc, argv.get());
@@ -667,8 +667,8 @@ int smpi_main(const char* executable, int argc, char *argv[])
     }
   }
   int count = smpi_process_count();
-  int i, ret=0;
-  for (i = 0; i < count; i++) {
+  int ret   = 0;
+  for (int i = 0; i < count; i++) {
     if(process_data[i]->return_value()!=0){
       ret=process_data[i]->return_value();//return first non 0 value
       break;
index bf30577..590ba5e 100644 (file)
@@ -1,10 +1,10 @@
-/* Copyright (c) 2010, 2013-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "private.h"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_group.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_group, smpi, "Logging specific to SMPI (group)");
 
index 461ea7f..aa01f3c 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef SMPI_GROUP_HPP_INCLUDED
 #define SMPI_GROUP_HPP_INCLUDED
 
-#include "private.h"
+#include "src/smpi/smpi_f2c.hpp"
 
 namespace simgrid{
 namespace smpi{
index 9690b78..5dac6d2 100644 (file)
@@ -4,9 +4,9 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "private.h"
-#include <vector>
-#include <xbt/ex.hpp>
+#include "src/smpi/smpi_info.hpp"
+#include "xbt/ex.hpp"
+#include "xbt/sysdep.h"
 
 namespace simgrid{
 namespace smpi{
index 5555fe3..5eb096d 100644 (file)
@@ -7,9 +7,9 @@
 #ifndef SMPI_INFO_HPP
 #define SMPI_INFO_HPP
 
-#include <xbt/base.h>
-
-#include "private.h"
+#include "src/smpi/smpi_f2c.hpp"
+#include "smpi/smpi.h"
+#include "xbt/dict.h"
 
 namespace simgrid{
 namespace smpi{
index 3808b65..53cf51f 100644 (file)
@@ -4,9 +4,8 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "private.h"
-#include <unordered_map>
-#include <xbt/ex.hpp>
+//#include "private.h"
+#include "src/smpi/smpi_keyvals.hpp"
 
 namespace simgrid{
 namespace smpi{
index c302a55..92f3384 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2010, 2013-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -7,9 +6,10 @@
 #ifndef SMPI_KEYVALS_HPP_INCLUDED
 #define SMPI_KEYVALS_HPP_INCLUDED
 
-#include "private.h"
+#include "smpi/smpi.h"
+#include "xbt/ex.hpp"
+
 #include <unordered_map>
-#include <xbt/ex.hpp>
 
 typedef struct smpi_delete_fn{
   MPI_Comm_delete_attr_function          *comm_delete_fn;
index 8091464..d371616 100644 (file)
@@ -1,11 +1,11 @@
-/* Copyright (c) 2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2015-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <cstdint>
 #include <climits>
+#include <cstring>
 
 #include <vector>
 
@@ -21,9 +21,9 @@
 #include <sys/mman.h>
 #include <unistd.h>
 
-#include "../xbt/memory_map.hpp"
+#include "src/xbt/memory_map.hpp"
 
-#include "private.h"
+#include "src/smpi/private.h"
 #include "private.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_memory, smpi, "Memory layout support for SMPI");
index 805647b..599c0c2 100644 (file)
@@ -3,8 +3,10 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "mc/mc.h"
-#include "private.h"
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_op.hpp"
+#include "src/smpi/smpi_process.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_op, smpi, "Logging specific to SMPI (op)");
 
index a11d3c9..167a346 100644 (file)
@@ -7,9 +7,7 @@
 #ifndef SMPI_OP_HPP
 #define SMPI_OP_HPP
 
-#include <xbt/base.h>
-
-#include "private.h"
+#include "src/smpi/smpi_info.hpp"
 
 namespace simgrid{
 namespace smpi{
index 91e1456..1d9a5f3 100644 (file)
@@ -5,8 +5,15 @@
 
 #include "simgrid/s4u/Engine.hpp"
 #include "simgrid/s4u/Host.hpp"
-
-#include "private.h"
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_coll.hpp"
+#include "src/smpi/smpi_datatype_derived.hpp"
+#include "src/smpi/smpi_op.hpp"
+#include "src/smpi/smpi_process.hpp"
+#include "src/smpi/smpi_request.hpp"
+#include "src/smpi/smpi_status.hpp"
+#include "src/smpi/smpi_win.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_pmpi, smpi, "Logging specific to SMPI (pmpi)");
 
index 92cd1d3..27bc512 100644 (file)
@@ -1,13 +1,18 @@
+/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "mc/mc.h"
-#include "private.h"
-#include "simgrid/s4u/Mailbox.hpp"
-#include "src/kernel/activity/SynchroComm.hpp"
-#include "src/mc/mc_record.h"
+#include "src/mc/mc_ignore.h"
 #include "src/mc/mc_replay.h"
 #include "src/msg/msg_private.h"
 #include "src/simix/smx_private.h"
-#include "surf/surf.h"
-#include "xbt/replay.hpp"
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_process.hpp"
+#include "src/smpi/smpi_group.hpp"
+#include "src/smpi/smpi_comm.hpp"
+
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_process, smpi, "Logging specific to SMPI (kernel)");
 
@@ -139,6 +144,16 @@ bool Process::replaying(){
     return false;
 }
 
+void Process::set_user_data(void *data)
+{
+  data_ = data;
+}
+
+void *Process::get_user_data()
+{
+  return data_;
+}
+
 smx_actor_t Process::process(){
   return process_;
 }
index 9cc8a2a..8960249 100644 (file)
@@ -7,11 +7,9 @@
 #ifndef SMPI_PROCESS_HPP
 #define SMPI_PROCESS_HPP
 
-
-#include <xbt/base.h>
 #include "src/instr/instr_smpi.h"
-#include "private.h"
 #include "simgrid/s4u/Mailbox.hpp"
+#include "xbt/synchro.h"
 
 namespace simgrid{
 namespace smpi{
@@ -28,6 +26,7 @@ class Process {
     MPI_Comm comm_self_   = MPI_COMM_NULL;
     MPI_Comm comm_intra_  = MPI_COMM_NULL;
     MPI_Comm* comm_world_ = nullptr;
+    void* data_           = nullptr; /* user data */
     int index_            = MPI_UNDEFINED;
     char state_;
     int sampling_                   = 0; /* inside an SMPI_SAMPLE_ block? */
@@ -51,6 +50,8 @@ class Process {
     void mark_as_initialized();
     void set_replaying(bool value);
     bool replaying();
+    void set_user_data(void *data);
+    void *get_user_data();
     smpi_trace_call_location_t* call_location();
     int index();
     MPI_Comm comm_world();
index e226821..059bd0c 100644 (file)
@@ -3,8 +3,15 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "private.h"
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_coll.hpp"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_group.hpp"
+#include "src/smpi/smpi_process.hpp"
+#include "src/smpi/smpi_request.hpp"
 #include "xbt/replay.hpp"
+
 #include <unordered_map>
 #include <vector>
 
index 4bc218b..1838d94 100644 (file)
@@ -3,11 +3,16 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "private.h"
 #include "mc/mc.h"
 #include "src/mc/mc_replay.h"
 #include "src/smpi/SmpiHost.hpp"
 #include "src/kernel/activity/SynchroComm.hpp"
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_op.hpp"
+#include "src/smpi/smpi_process.hpp"
+#include "src/smpi/smpi_request.hpp"
 
 #include <algorithm>
 
index 06e28da..f9c8446 100644 (file)
@@ -7,12 +7,12 @@
 #ifndef SMPI_REQUEST_HPP_INCLUDED
 #define SMPI_REQUEST_HPP_INCLUDED
 
-#include "private.h"
+#include "src/smpi/smpi_f2c.hpp"
 
 namespace simgrid{
 namespace smpi{
 
-class Request : public F2C{
+class Request : public F2C {
   private :
     void *buf_;
     /* in the case of non-contiguous memory the user address should be keep
index 02f5194..09d9030 100644 (file)
  *                                                                      ----
  */
 #include <map>
+#include <cstring>
 
 #include "private.h"
 #include "private.hpp"
 #include "smpi/smpi_shared_malloc.hpp"
 #include "xbt/dict.h"
+#include "xbt/ex.hpp"
 #include <errno.h>
 
 #include <sys/types.h>
@@ -361,7 +363,8 @@ std::vector<std::pair<size_t, size_t>> shift_and_frame_private_blocks(const std:
 
 std::vector<std::pair<size_t, size_t>> merge_private_blocks(std::vector<std::pair<size_t, size_t>> src, std::vector<std::pair<size_t, size_t>> dst) {
   std::vector<std::pair<size_t, size_t>> result;
-  unsigned i_src=0, i_dst=0;
+  unsigned i_src = 0;
+  unsigned i_dst = 0;
   while(i_src < src.size() && i_dst < dst.size()) {
     std::pair<size_t, size_t> block;
     if(src[i_src].second <= dst[i_dst].first) {
index 4353c7f..0a8b280 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2011-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2011-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
index eebea33..22c84bb 100644 (file)
@@ -1,11 +1,12 @@
-/* Copyright (c) 2007-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "private.h"
 #include "src/simix/smx_private.h"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_status.hpp"
 
 namespace simgrid{
 namespace smpi{
index 7172194..8ac700b 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef SMPI_STATUS_HPP
 #define SMPI_STATUS_HPP
 
-#include "private.h"
+#include "smpi/smpi.h"
 
 namespace simgrid{
 namespace smpi{
index 44a111b..e23a623 100644 (file)
@@ -8,6 +8,8 @@
 #include "private.h"
 #include <vector>
 #include <math.h>
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_topo.hpp"
 
 /* static functions */
 static int assignnodes(int ndim, int nfactor, int *pfacts,int **pdims);
index f4ce792..9e419cf 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (c) 2010-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -7,7 +6,8 @@
 #ifndef SMPI_TOPO_HPP_INCLUDED
 #define SMPI_TOPO_HPP_INCLUDED
 
-#include "private.h"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_status.hpp"
 
 typedef enum MPIR_Topo_type {
   MPI_GRAPH=1,
index 7f43538..91e01ce 100644 (file)
@@ -38,15 +38,14 @@ std::vector<s_smpi_factor_t> parse_factor(const char *smpi_coef_string)
       xbt_die("Malformed radical for smpi factor: '%s'", smpi_coef_string);
     }
     unsigned int iteration = 0;
-    for (Tokenizer::iterator factor_iter = factor_values.begin();
-         factor_iter != factor_values.end(); factor_iter++, iteration++) {
+    for (Tokenizer::iterator factor_iter = factor_values.begin(); factor_iter != factor_values.end(); factor_iter++) {
+      iteration++;
       char *errmsg;
 
       if (factor_iter == factor_values.begin()) { /* first element */
         errmsg = bprintf("Invalid factor in chunk #%zu: %%s", smpi_factor.size()+1);
         fact.factor = xbt_str_parse_int(factor_iter->c_str(), errmsg);
-      }
-      else {
+      } else {
         errmsg = bprintf("Invalid factor value %d in chunk #%zu: %%s", iteration, smpi_factor.size()+1);
         fact.values.push_back(xbt_str_parse_double(factor_iter->c_str(), errmsg));
       }
index e2d6b5f..0240e93 100644 (file)
@@ -1,11 +1,17 @@
-/* Copyright (c) 2007-2017. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "private.h"
-#include <vector>
+#include "src/smpi/private.h"
+#include "src/smpi/smpi_coll.hpp"
+#include "src/smpi/smpi_comm.hpp"
+#include "src/smpi/smpi_datatype.hpp"
+#include "src/smpi/smpi_info.hpp"
+#include "src/smpi/smpi_keyvals.hpp"
+#include "src/smpi/smpi_process.hpp"
+#include "src/smpi/smpi_request.hpp"
+#include "src/smpi/smpi_win.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_rma, smpi, "Logging specific to SMPI (RMA operations)");
 
index ddbdae4..dd837b6 100644 (file)
@@ -7,7 +7,9 @@
 #ifndef SMPI_WIN_HPP_INCLUDED
 #define SMPI_WIN_HPP_INCLUDED
 
-#include "private.h"
+#include "src/smpi/smpi_keyvals.hpp"
+#include "xbt/synchro.h"
+
 #include <vector>
 #include <list>
 
index 579d646..a9765ac 100755 (executable)
@@ -18,15 +18,18 @@ CMAKE_LINKARGS="-L@libdir@"
 
 list_set CFLAGS
 list_set LINKARGS
-if [ "@WIN32@" != "1" ]; then
-    # list_add CFLAGS "-Dmain=smpi_simulated_main_"
-    list_add CFLAGS "-fpic"
-    list_add LINKARGS "-shared" "-lsimgrid" "-Wl,-z,defs"
-else
+if [ "x@WIN32@" = "x1" ]; then
     list_add CFLAGS "-include" "@includedir@/smpi/smpi_main.h"
     list_add LINKARGS "@libdir@\libsimgrid.dll"
+elif [ "x@APPLE@" = "x1" ]; then
+    list_add CFLAGS "-fpic"
+    list_add LINKARGS "-shared" "-lsimgrid" "-Wl,-undefined,error"
+else
+    list_add CFLAGS "-fpic"
+    list_add LINKARGS "-shared" "-lsimgrid" "-Wl,-z,defs"
 fi
 
+
 list_set CMDARGS
 while [ $# -gt 0 ]; do
     ARG="$1"
index 5d962e4..a8c75e1 100755 (executable)
@@ -33,7 +33,7 @@ usage () {
 Usage: $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> program [program-options]
 Options:
   -keep-temps                # don't remove the generated files after execution
-  -wrapper <command>         # use command to run the program (e.g. "valgrind")
+  -wrapper <command>         # use command to run the program (e.g. "valgrind" or "gdb --args")
   -map                       # display the machine on which each process rank is mapped
   -np <numprocs>             # use that amount of processes from the hostfile.
                              # By default, all processes of the hostfile are used.
@@ -323,7 +323,7 @@ if [ -z "${NUMPROCS}" ] ; then
 fi
 
 if [ ${NUMPROCS} -gt ${hostfile_procs} ] ; then
-    echo "You requested to use ${NUMPROCS} processes, but there is only ${hostfile_procs} processes in your hostfile..." >&2
+    echo "You requested to use ${NUMPROCS} ranks, but there is only ${hostfile_procs} processes in your hostfile..." >&2
 fi
 
 ##-------------------------------- DEFAULT or SPECIFIED PLATFORM --------------------------------------
@@ -333,8 +333,8 @@ if [ -z "${PLATFORM}" ]; then
     cat > ${PLATFORMTMP} <<PLATFORMHEAD
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-<AS id="AS0" routing="Full">
+<platform version="4.1">
+<zone id="AS0" routing="Full">
 PLATFORMHEAD
 
     i=${NUMPROCS}
@@ -360,7 +360,7 @@ PLATFORMHEAD
     done
 
     cat >> ${PLATFORMTMP} <<PLATFORMFOOT
-</AS>
+</zone>
 </platform>
 PLATFORMFOOT
 
@@ -375,7 +375,7 @@ APPLICATIONTMP="$(mktemp smpitmp-appXXXXXX)"
 cat > ${APPLICATIONTMP} <<APPLICATIONHEAD
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
 APPLICATIONHEAD
 
 ##---- cache hostnames of hostfile---------------
@@ -415,7 +415,7 @@ fi
 
 set -- $hostnames
 
-##---- generate <process> tags------------------------------
+##---- generate <actor> tags------------------------------
 #prepare arguments at once
 for ARG in $PROC_ARGS; do
   XML_ARGS="${XML_ARGS}""<argument value=\"${ARG}\"/>
@@ -427,12 +427,12 @@ do
     j=$(( $i % ${hostfile_procs} + 1 ))
     host=$(eval "echo \${$j}")
 
-    ##---- optional display of ranks to process mapping
+    ##---- optional display of ranks to actor mapping
     if [ ${MAPOPT} = 1 ]; then
       echo "[rank $i] -> $host"
     fi
 
-    echo "  <process host=\"${host}\" function=\"$i\"> <!-- function name used only for logging -->
+    echo "  <actor host=\"${host}\" function=\"$i\"> <!-- function name used only for logging -->
     <argument value=\"1\"/> <!-- instance -->
     <argument value=\"$i\"/> <!-- rank -->" >> ${APPLICATIONTMP}
     if [ ${REPLAY} = 1 ]; then
@@ -444,7 +444,7 @@ do
     else 
     echo ${XML_ARGS} >> ${APPLICATIONTMP}
     fi
-    echo "  </process>" >> ${APPLICATIONTMP}
+    echo "  </actor>" >> ${APPLICATIONTMP}
 done
 
 cat >> ${APPLICATIONTMP} <<APPLICATIONFOOT
index f9835fa..8c11636 100644 (file)
@@ -119,7 +119,7 @@ void CpuCas01::onSpeedChange() {
   Cpu::onSpeedChange();
 }
 
-void CpuCas01::apply_event(tmgr_trace_iterator_t event, double value)
+void CpuCas01::apply_event(tmgr_trace_event_t event, double value)
 {
   if (event == speed_.event) {
     /* TODO (Hypervisor): do the same thing for constraint_core[i] */
@@ -179,7 +179,7 @@ CpuAction *CpuCas01::sleep(double duration)
   // FIXME: sleep variables should not consume 1.0 in lmm_expand
   action->maxDuration_ = duration;
   action->suspended_ = 2;
-  if (duration == NO_MAX_DURATION) {
+  if (duration < 0) { // NO_MAX_DURATION
     /* Move to the *end* of the corresponding action set. This convention is used to speed up update_resource_state */
     action->getStateSet()->erase(action->getStateSet()->iterator_to(*action));
     action->stateSet_ = static_cast<CpuCas01Model*>(model())->p_cpuRunningActionSetThatDoesNotNeedBeingChecked;
index f05453d..0955ce2 100644 (file)
@@ -39,7 +39,7 @@ class CpuCas01 : public Cpu {
 public:
   CpuCas01(CpuCas01Model *model, simgrid::s4u::Host *host, std::vector<double> *speedPerPstate, int core);
   ~CpuCas01() override;
-  void apply_event(tmgr_trace_iterator_t event, double value) override;
+  void apply_event(tmgr_trace_event_t event, double value) override;
   CpuAction *execution_start(double size) override;
   CpuAction *sleep(double duration) override;
 
index 040472e..6443263 100644 (file)
@@ -174,13 +174,13 @@ void Cpu::setStateTrace(tmgr_trace_t trace)
 {
   xbt_assert(stateEvent_ == nullptr, "Cannot set a second state trace to Host %s", host_->cname());
 
-  stateEvent_ = future_evt_set->add_trace(trace, 0.0, this);
+  stateEvent_ = future_evt_set->add_trace(trace, this);
 }
 void Cpu::setSpeedTrace(tmgr_trace_t trace)
 {
   xbt_assert(speed_.event == nullptr, "Cannot set a second speed trace to Host %s", host_->cname());
 
-  speed_.event = future_evt_set->add_trace(trace, 0.0, this);
+  speed_.event = future_evt_set->add_trace(trace, this);
 }
 
 
index 11c8ca0..c36600b 100644 (file)
@@ -121,7 +121,7 @@ public:
   virtual void setStateTrace(tmgr_trace_t trace); /*< setup the trace file with states events (ON or OFF). Trace must contain boolean values (0 or 1). */
   virtual void setSpeedTrace(tmgr_trace_t trace); /*< setup the trace file with availability events (peak speed changes due to external load). Trace must contain relative values (ratio between 0 and 1) */
 
-  tmgr_trace_iterator_t stateEvent_ = nullptr;
+  tmgr_trace_event_t stateEvent_ = nullptr;
   s_surf_metric_t speed_ = {1.0, 0, nullptr};
 };
 
index 7f00160..e3b612a 100644 (file)
@@ -37,8 +37,8 @@ CpuTiTrace::CpuTiTrace(tmgr_trace_t speedTrace)
   for (auto val : speedTrace->event_list) {
     timePoints_[i] = time;
     integral_[i] = integral;
-    integral += val.delta * val.value;
-    time += val.delta;
+    integral += val.date_ * val.value_;
+    time += val.date_;
     i++;
   }
   timePoints_[i] = time;
@@ -237,8 +237,8 @@ double CpuTiTgmr::getPowerScale(double a)
 {
   double reduced_a = a - floor(a / lastTime_) * lastTime_;
   int point = trace_->binarySearch(trace_->timePoints_, reduced_a, 0, trace_->nbPoints_ - 1);
-  s_tmgr_event_t val = speedTrace_->event_list.at(point);
-  return val.value;
+  trace_mgr::DatedValue val = speedTrace_->event_list.at(point);
+  return val.value_;
 }
 
 /**
@@ -264,9 +264,9 @@ CpuTiTgmr::CpuTiTgmr(tmgr_trace_t speedTrace, double value) :
 
   /* only one point available, fixed trace */
   if (speedTrace->event_list.size() == 1) {
-    s_tmgr_event_t val = speedTrace->event_list.front();
+    trace_mgr::DatedValue val = speedTrace->event_list.front();
     type_ = TRACE_FIXED;
-    value_ = val.value;
+    value_                    = val.value_;
     return;
   }
 
@@ -274,7 +274,7 @@ CpuTiTgmr::CpuTiTgmr(tmgr_trace_t speedTrace, double value) :
 
   /* count the total time of trace file */
   for (auto val : speedTrace->event_list)
-    total_time += val.delta;
+    total_time += val.date_;
 
   trace_ = new CpuTiTrace(speedTrace);
   lastTime_ = total_time;
@@ -422,13 +422,13 @@ void CpuTi::setSpeedTrace(tmgr_trace_t trace)
 
   /* add a fake trace event if periodicity == 0 */
   if (trace && trace->event_list.size() > 1) {
-    s_tmgr_event_t val = trace->event_list.back();
-    if (val.delta < 1e-12)
-      speed_.event = future_evt_set->add_trace(tmgr_empty_trace_new(), 0.0, this);
+    trace_mgr::DatedValue val = trace->event_list.back();
+    if (val.date_ < 1e-12)
+      speed_.event = future_evt_set->add_trace(new simgrid::trace_mgr::trace(), this);
   }
 }
 
-void CpuTi::apply_event(tmgr_trace_iterator_t event, double value)
+void CpuTi::apply_event(tmgr_trace_event_t event, double value)
 {
   if (event == speed_.event) {
     tmgr_trace_t speedTrace;
@@ -441,12 +441,12 @@ void CpuTi::apply_event(tmgr_trace_iterator_t event, double value)
     modified(true);
 
     speedTrace = speedIntegratedTrace_->speedTrace_;
-    s_tmgr_event_t val = speedTrace->event_list.back();
+    trace_mgr::DatedValue val = speedTrace->event_list.back();
     delete speedIntegratedTrace_;
-    speed_.scale = val.value;
+    speed_.scale = val.value_;
 
-    trace = new CpuTiTgmr(TRACE_FIXED, val.value);
-    XBT_DEBUG("value %f", val.value);
+    trace = new CpuTiTgmr(TRACE_FIXED, val.value_);
+    XBT_DEBUG("value %f", val.value_);
 
     speedIntegratedTrace_ = trace;
 
index 6eca45a..4059783 100644 (file)
@@ -116,7 +116,7 @@ public:
 
   void setSpeedTrace(tmgr_trace_t trace) override;
 
-  void apply_event(tmgr_trace_iterator_t event, double value) override;
+  void apply_event(tmgr_trace_event_t event, double value) override;
   void updateActionsFinishTime(double now);
   void updateRemainingAmount(double now);
 
index d6c424a..270a399 100644 (file)
@@ -4,11 +4,12 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
 #include "maxmin_private.hpp"
-#include <stdlib.h>
+#include "xbt/log.h"
+#include "xbt/sysdep.h"
+#include <float.h>
 #include <math.h>
+#include <stdlib.h>
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_maxmin);
 #define SHOW_EXPR_G(expr) XBT_DEBUG(#expr " = %g",expr);
@@ -113,10 +114,11 @@ void bottleneck_solve(lmm_system_t sys)
 
     xbt_swag_foreach_safe(_var, _var_next, var_list) {
       var = static_cast<lmm_variable_t>(_var);
-      double min_inc =  var->cnsts[0].constraint->usage / var->cnsts[0].value;
-      for (int i = 1; i < var->cnsts_number; i++) {
+      double min_inc = DBL_MAX;
+      for (int i = 0; i < var->cnsts_number; i++) {
         lmm_element_t elm = &var->cnsts[i];
-        min_inc = MIN(min_inc, elm->constraint->usage / elm->value);
+        if (elm->value > 0)
+          min_inc = MIN(min_inc, elm->constraint->usage / elm->value);
       }
       if (var->bound > 0)
         min_inc = MIN(min_inc, var->bound - var->value);
index 0ab8b4d..99fc2a1 100644 (file)
@@ -8,7 +8,6 @@
 
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
-#include "xbt/strbuff.h"
 #include "xbt/mallocator.h"
 #include "maxmin_private.hpp"
 #include <stdlib.h>
index 22f0325..75af96b 100644 (file)
@@ -88,7 +88,7 @@ void surf_network_model_init_Reno()
   if (surf_network_model)
     return;
 
-  surf_network_model = new simgrid::surf::NetworkCm02Model(lagrange_solve);
+  surf_network_model = new simgrid::surf::NetworkCm02Model(&lagrange_solve);
   all_existing_models->push_back(surf_network_model);
 
   lmm_set_default_protocol_function(func_reno_f, func_reno_fp, func_reno_fpi);
@@ -104,7 +104,7 @@ void surf_network_model_init_Reno2()
   if (surf_network_model)
     return;
 
-  surf_network_model = new simgrid::surf::NetworkCm02Model(lagrange_solve);
+  surf_network_model = new simgrid::surf::NetworkCm02Model(&lagrange_solve);
   all_existing_models->push_back(surf_network_model);
 
   lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp, func_reno2_fpi);
@@ -119,7 +119,7 @@ void surf_network_model_init_Vegas()
   if (surf_network_model)
     return;
 
-  surf_network_model = new simgrid::surf::NetworkCm02Model(lagrange_solve);
+  surf_network_model = new simgrid::surf::NetworkCm02Model(&lagrange_solve);
   all_existing_models->push_back(surf_network_model);
 
   lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp, func_vegas_fpi);
@@ -234,7 +234,7 @@ void NetworkCm02Model::updateActionsStateFull(double now, double delta)
           double_update(&(deltap), action->latency_, sg_surf_precision);
           action->latency_ = 0.0;
         }
-        if (action->latency_ == 0.0 && !(action->isSuspended()))
+        if (action->latency_ <= 0.0 && !(action->isSuspended()))
           lmm_update_variable_weight(maxminSystem_, action->getVariable(), action->weight_);
       }
       if (TRACE_is_enabled()) {
@@ -250,17 +250,16 @@ void NetworkCm02Model::updateActionsStateFull(double now, double delta)
         }
       }
       if (!lmm_get_number_of_cnst_from_var (maxminSystem_, action->getVariable())) {
-        /* There is actually no link used, hence an infinite bandwidth.
-         * This happens often when using models like vivaldi.
-         * In such case, just make sure that the action completes immediately.
+        /* There is actually no link used, hence an infinite bandwidth. This happens often when using models like
+         * vivaldi. In such case, just make sure that the action completes immediately.
          */
         action->updateRemains(action->getRemains());
       }
     action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta);
-                  
-    if (action->getMaxDuration() != NO_MAX_DURATION)
+
+    if (action->getMaxDuration() > NO_MAX_DURATION)
       action->updateMaxDuration(delta);
-      
+
     if (((action->getRemains() <= 0) && (lmm_get_variable_weight(action->getVariable()) > 0)) ||
         ((action->getMaxDuration() > NO_MAX_DURATION) && (action->getMaxDuration() <= 0))) {
       action->finish();
@@ -391,9 +390,8 @@ NetworkCm02Link::NetworkCm02Link(NetworkCm02Model* model, const char* name, doub
   simgrid::s4u::Link::onCreation(this->piface_);
 }
 
-void NetworkCm02Link::apply_event(tmgr_trace_iterator_t triggered, double value)
+void NetworkCm02Link::apply_event(tmgr_trace_event_t triggered, double value)
 {
-
   /* Find out which of my iterators was triggered, and react accordingly */
   if (triggered == bandwidth_.event) {
     setBandwidth(value);
@@ -487,14 +485,10 @@ void NetworkCm02Link::setLatency(double value)
   }
 }
 
-NetworkCm02Link::~NetworkCm02Link() {}
-
 /**********
  * Action *
  **********/
 
-NetworkCm02Action::~NetworkCm02Action() {}
-
 void NetworkCm02Action::updateRemainingLazy(double now)
 {
   if (suspended_ != 0)
@@ -509,11 +503,11 @@ void NetworkCm02Action::updateRemainingLazy(double now)
     XBT_DEBUG("Updating action(%p): remains is now %f", this, remains_);
   }
 
-  if (maxDuration_ != NO_MAX_DURATION)
+  if (maxDuration_ > NO_MAX_DURATION)
     double_update(&maxDuration_, delta, sg_surf_precision);
 
   if ((remains_ <= 0 && (lmm_get_variable_weight(getVariable()) > 0)) ||
-      (((maxDuration_ > NO_MAX_DURATION) && (maxDuration_ <= 0)))){
+      ((maxDuration_ > NO_MAX_DURATION) && (maxDuration_ <= 0))) {
     finish();
     setState(Action::State::done);
     heapRemove(getModel()->getActionHeap());
index 9f160e4..0870271 100644 (file)
@@ -59,8 +59,8 @@ namespace simgrid {
     public:
       NetworkCm02Link(NetworkCm02Model* model, const char* name, double bandwidth, double latency,
                       e_surf_link_sharing_policy_t policy, lmm_system_t system);
-      ~NetworkCm02Link() override;
-      void apply_event(tmgr_trace_iterator_t event, double value) override;
+      virtual ~NetworkCm02Link() = default;
+      void apply_event(tmgr_trace_event_t event, double value) override;
       void setBandwidth(double value) override;
       void setLatency(double value) override;
       virtual void gapAppend(double size, const LinkImpl* link, NetworkAction* action);
@@ -76,7 +76,7 @@ namespace simgrid {
     public:
       NetworkCm02Action(Model *model, double cost, bool failed)
       : NetworkAction(model, cost, failed) {};
-      ~NetworkCm02Action() override;
+      virtual ~NetworkCm02Action() = default;
       void updateRemainingLazy(double now) override;
     protected:
       double senderGap_;
index ac9b8a8..f132f83 100644 (file)
@@ -24,7 +24,7 @@ namespace simgrid {
       NetworkAction *action;
       double init_rate;
       ActiveComm() : destination(nullptr),action(nullptr),init_rate(-1){};
-      ~ActiveComm(){};
+      virtual ~ActiveComm() = default;
     };
 
     class IBNode{
@@ -37,7 +37,7 @@ namespace simgrid {
       //number of comms the node is receiving
       int nbActiveCommsDown;
       explicit IBNode(int id) : id(id),nbActiveCommsDown(0){};
-      ~IBNode(){};
+      virtual ~IBNode() = default;
     };
 
     class XBT_PRIVATE NetworkIBModel : public NetworkSmpiModel {
index 13c24e0..8b4f978 100644 (file)
@@ -35,9 +35,10 @@ namespace simgrid {
     LinkImpl** LinkImpl::linksList()
     {
       LinkImpl** res = xbt_new(LinkImpl*, (int)links->size());
-      int i=0;
+      int i          = 0;
       for (auto kv : *links) {
-        res[i++] = kv.second;
+        res[i] = kv.second;
+        i++;
       }
       return res;
     }
@@ -168,17 +169,17 @@ namespace simgrid {
     void LinkImpl::setStateTrace(tmgr_trace_t trace)
     {
       xbt_assert(stateEvent_ == nullptr, "Cannot set a second state trace to Link %s", cname());
-      stateEvent_ = future_evt_set->add_trace(trace, 0.0, this);
+      stateEvent_ = future_evt_set->add_trace(trace, this);
     }
     void LinkImpl::setBandwidthTrace(tmgr_trace_t trace)
     {
       xbt_assert(bandwidth_.event == nullptr, "Cannot set a second bandwidth trace to Link %s", cname());
-      bandwidth_.event = future_evt_set->add_trace(trace, 0.0, this);
+      bandwidth_.event = future_evt_set->add_trace(trace, this);
     }
     void LinkImpl::setLatencyTrace(tmgr_trace_t trace)
     {
       xbt_assert(latency_.event == nullptr, "Cannot set a second latency trace to Link %s", cname());
-      latency_.event = future_evt_set->add_trace(trace, 0.0, this);
+      latency_.event = future_evt_set->add_trace(trace, this);
     }
 
 
index 2e6d67b..01a2372 100644 (file)
@@ -157,7 +157,7 @@ public:
       tmgr_trace_t trace); /*< setup the trace file with latency events (peak latency changes due to external load).
                                    Trace must contain absolute values */
 
-  tmgr_trace_iterator_t stateEvent_ = nullptr;
+  tmgr_trace_event_t stateEvent_    = nullptr;
   s_surf_metric_t latency_          = {1.0, 0, nullptr};
   s_surf_metric_t bandwidth_        = {1.0, 0, nullptr};
 
index e27db35..adf7d54 100644 (file)
@@ -271,7 +271,7 @@ LinkNS3::LinkNS3(NetworkNS3Model* model, const char* name, double bandwidth, dou
 
 LinkNS3::~LinkNS3() = default;
 
-void LinkNS3::apply_event(tmgr_trace_iterator_t event, double value)
+void LinkNS3::apply_event(tmgr_trace_event_t event, double value)
 {
   THROW_UNIMPLEMENTED;
 }
index be32134..ecdb950 100644 (file)
@@ -35,7 +35,7 @@ public:
   explicit LinkNS3(NetworkNS3Model* model, const char* name, double bandwidth, double latency);
   ~LinkNS3();
 
-  void apply_event(tmgr_trace_iterator_t event, double value) override;
+  void apply_event(tmgr_trace_event_t event, double value) override;
   void setBandwidth(double value) override { THROW_UNIMPLEMENTED; }
   void setLatency(double value) override { THROW_UNIMPLEMENTED; }
   void setBandwidthTrace(tmgr_trace_t trace) override;
index cc883f5..a963b8c 100644 (file)
@@ -326,7 +326,8 @@ bool LinkL07::isUsed(){
   return lmm_constraint_used(model()->getMaxminSystem(), constraint());
 }
 
-void CpuL07::apply_event(tmgr_trace_iterator_t triggered, double value){
+void CpuL07::apply_event(tmgr_trace_event_t triggered, double value)
+{
   XBT_DEBUG("Updating cpu %s (%p) with value %g", cname(), this, value);
   if (triggered == speed_.event) {
     speed_.scale = value;
@@ -345,7 +346,8 @@ void CpuL07::apply_event(tmgr_trace_iterator_t triggered, double value){
   }
 }
 
-void LinkL07::apply_event(tmgr_trace_iterator_t triggered, double value) {
+void LinkL07::apply_event(tmgr_trace_event_t triggered, double value)
+{
   XBT_DEBUG("Updating link %s (%p) with value=%f", cname(), this, value);
   if (triggered == bandwidth_.event) {
     setBandwidth(value);
index 4a2d68d..5d25d4e 100644 (file)
@@ -75,7 +75,7 @@ public:
   CpuL07(CpuL07Model *model, simgrid::s4u::Host *host, std::vector<double> * speedPerPstate, int core);
   ~CpuL07() override;
   bool isUsed() override;
-  void apply_event(tmgr_trace_iterator_t event, double value) override;
+  void apply_event(tmgr_trace_event_t event, double value) override;
   Action *execution_start(double size) override;
   Action *sleep(double duration) override;
 protected:
@@ -88,7 +88,7 @@ public:
           e_surf_link_sharing_policy_t policy);
   ~LinkL07() override;
   bool isUsed() override;
-  void apply_event(tmgr_trace_iterator_t event, double value) override;
+  void apply_event(tmgr_trace_event_t event, double value) override;
   void setBandwidth(double value) override;
   void setLatency(double value) override;
 };
index 283970c..6c0cbf4 100644 (file)
@@ -470,7 +470,7 @@ void sg_platf_new_process(sg_platf_process_cbarg_t process)
 
   double start_time = process->start_time;
   double kill_time  = process->kill_time;
-  int auto_restart = process->on_failure == SURF_PROCESS_ON_FAILURE_DIE ? 0 : 1;
+  int auto_restart = process->on_failure == SURF_ACTOR_ON_FAILURE_DIE ? 0 : 1;
 
   std::vector<std::string> args(process->argv, process->argv + process->argc);
   std::function<void()> code = factory(std::move(args));
index a2ef0eb..554c9a2 100644 (file)
@@ -6,7 +6,6 @@
 
 #include "storage_interface.hpp"
 #include "surf_private.h"
-#include "xbt/file.h" /* xbt_getline */
 #include <boost/algorithm/string.hpp>
 #include <boost/algorithm/string/join.hpp>
 #include <boost/algorithm/string/split.hpp>
@@ -15,7 +14,6 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf, "Logging specific to the SURF storage module");
 
 xbt_lib_t storage_lib;
-int SIMIX_STORAGE_LEVEL        = -1; // Simix storage level
 int MSG_STORAGE_LEVEL          = -1; // Msg storage level
 int ROUTING_STORAGE_LEVEL      = -1; // Routing for storage level
 int SURF_STORAGE_LEVEL = -1;
@@ -117,7 +115,7 @@ bool Storage::isUsed()
   return false;
 }
 
-void Storage::apply_event(tmgr_trace_iterator_t /*event*/, double /*value*/)
+void Storage::apply_event(tmgr_trace_event_t /*event*/, double /*value*/)
 {
   THROW_UNIMPLEMENTED;
 }
index eaeec0c..31c6dc8 100644 (file)
@@ -89,7 +89,7 @@ public:
   /** @brief Check if the Storage is used (if an action currently uses its resources) */
   bool isUsed() override;
 
-  void apply_event(tmgr_trace_iterator_t event, double value) override;
+  void apply_event(tmgr_trace_event_t event, double value) override;
 
   void turnOn() override;
   void turnOff() override;
index e57d90b..85582c5 100644 (file)
@@ -18,7 +18,7 @@ extern double NOW;
 void surf_presolve()
 {
   double next_event_date = -1.0;
-  tmgr_trace_iterator_t event = nullptr;
+  tmgr_trace_event_t event          = nullptr;
   double value = -1.0;
   simgrid::surf::Resource *resource = nullptr;
 
@@ -28,9 +28,8 @@ void surf_presolve()
       break;
 
     while ((event = future_evt_set->pop_leq(next_event_date, &value, &resource))) {
-      if (value >= 0){
+      if (value >= 0)
         resource->apply_event(event, value);
-      }
     }
   }
 
@@ -46,7 +45,7 @@ double surf_solve(double max_date)
   double model_next_action_end = -1.0;
   double value = -1.0;
   simgrid::surf::Resource *resource = nullptr;
-  tmgr_trace_iterator_t event = nullptr;
+  tmgr_trace_event_t event          = nullptr;
 
   if (max_date > 0.0) {
     xbt_assert(max_date > NOW,"You asked to simulate up to %f, but that's in the past already", max_date);
@@ -227,6 +226,10 @@ const char* surf_storage_get_host(surf_resource_t resource){
   return static_cast<simgrid::surf::Storage*>(surf_storage_resource_priv(resource))->attach_;
 }
 
+const char* surf_storage_get_name(surf_resource_t resource){
+  return static_cast<simgrid::surf::Storage*>(surf_storage_resource_priv(resource))->cname();
+}
+
 void surf_cpu_action_set_bound(surf_action_t action, double bound) {
   static_cast<simgrid::surf::CpuAction*>(action)->setBound(bound);
 }
index 2b1cfbb..7ef46e5 100644 (file)
@@ -77,7 +77,7 @@ void surf_network_model_init_IB() {
   xbt_die("Please activate SMPI support in cmake to use the IB network model.");
 }
 #endif
-#if !HAVE_NS3
+#if !SIMGRID_HAVE_NS3
 void surf_network_model_init_NS3() {
   xbt_die("Please activate NS3 support in cmake and install the dependencies to use the NS3 network model.");
 }
@@ -302,31 +302,31 @@ void sg_version()
   std::printf("This program was linked against %s (git: %s), found in %s.\n",
               SIMGRID_VERSION_STRING, SIMGRID_GIT_VERSION, SIMGRID_INSTALL_PREFIX);
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   std::printf("   Model-checking support compiled in.\n");
 #else
   std::printf("   Model-checking support disabled at compilation.\n");
 #endif
 
-#if HAVE_NS3
+#if SIMGRID_HAVE_NS3
   std::printf("   NS3 support compiled in.\n");
 #else
   std::printf("   NS3 support disabled at compilation.\n");
 #endif
 
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
   std::printf("   Jedule support compiled in.\n");
 #else
   std::printf("   Jedule support disabled at compilation.\n");
 #endif
 
-#if HAVE_LUA
+#if SIMGRID_HAVE_LUA
   std::printf("   Lua support compiled in.\n");
 #else
   std::printf("   Lua support disabled at compilation.\n");
 #endif
 
-#if HAVE_MALLOCATOR
+#if SIMGRID_HAVE_MALLOCATOR
   std::printf("   Mallocator support compiled in.\n");
 #else
   std::printf("   Mallocator support disabled at compilation.\n");
@@ -482,20 +482,19 @@ double Model::nextOccuringEventLazy(double now)
     }
 
     if ((action->getMaxDuration() > NO_MAX_DURATION) &&
-        (min == -1 || action->getStartTime() + action->getMaxDuration() < min)) {
+        (min <= -1 || action->getStartTime() + action->getMaxDuration() < min)) {
       // when the task will complete anyway because of the deadline if any
       min          = action->getStartTime() + action->getMaxDuration();
       max_dur_flag = true;
     }
 
-
     XBT_DEBUG("Action(%p) corresponds to variable %d", action, action->getVariable()->id_int);
 
     XBT_DEBUG("Action(%p) Start %f. May finish at %f (got a share of %f). Max_duration %f", action,
         action->getStartTime(), min, share,
         action->getMaxDuration());
 
-    if (min != -1) {
+    if (min > -1) {
       action->heapUpdate(actionHeap_, min, max_dur_flag ? MAX_DURATION : NORMAL);
       XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min, now);
     } else
index a5987f5..ac226cd 100644 (file)
@@ -52,10 +52,6 @@ extern XBT_PRIVATE simgrid::xbt::signal<void(void)> surfExitCallbacks;
 
 int XBT_PRIVATE __surf_is_absolute_file_path(const char *file_path);
 
-static inline char* sg_storage_name(sg_storage_t storage) {
-  return storage->key;
-}
-
 /***********
  * Classes *
  ***********/
@@ -357,7 +353,7 @@ private:
 typedef struct {
   double peak;              /**< The peak of the metric, ie its max value */
   double scale;             /**< Current availability of the metric according to the traces, in [0,1] */
-  tmgr_trace_iterator_t event; /**< The associated trace event associated to the metric */
+  tmgr_trace_event_t event; /**< The associated trace event associated to the metric */
 } s_surf_metric_t;
 
 namespace simgrid {
@@ -394,7 +390,7 @@ public:
    * @param event What happened
    * @param value [TODO]
    */
-  virtual void apply_event(tmgr_trace_iterator_t event, double value)=0;
+  virtual void apply_event(tmgr_trace_event_t event, double value) = 0;
 
   /** @brief Check if the current Resource is used (if it currently serves an action) */
   virtual bool isUsed()=0;
index 4656258..7fc1da1 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_trace, surf, "Surf trace management");
 
-static std::unordered_map<const char*, simgrid::trace_mgr::trace*> trace_list;
+namespace tmgr = simgrid::trace_mgr;
 
-simgrid::trace_mgr::trace::trace()=default;
-simgrid::trace_mgr::trace::~trace()=default;
-simgrid::trace_mgr::future_evt_set::future_evt_set()=default;
+static std::unordered_map<const char*, tmgr::trace*> trace_list;
 
+static inline bool doubleEq(double d1, double d2)
+{
+  return fabs(d1 - d2) < 0.0001;
+}
+namespace simgrid {
+namespace trace_mgr {
+
+bool DatedValue::operator==(DatedValue e2)
+{
+  return (doubleEq(date_, e2.date_)) && (doubleEq(value_, e2.value_));
+}
+std::ostream& operator<<(std::ostream& out, const DatedValue& e)
+{
+  out << e.date_ << " " << e.value_;
+  return out;
+}
+
+trace::trace()
+{
+  /* Add the first fake event storing the time at which the trace begins */
+  tmgr::DatedValue val(0, -1);
+  event_list.push_back(val);
+}
+trace::~trace()                  = default;
+future_evt_set::future_evt_set() = default;
 simgrid::trace_mgr::future_evt_set::~future_evt_set()
 {
-  xbt_heap_free(p_heap);
+  xbt_heap_free(heap_);
+}
+}
 }
 
 tmgr_trace_t tmgr_trace_new_from_string(const char* name, std::string input, double periodicity)
 {
   int linecount = 0;
-  tmgr_event_t last_event = nullptr;
+  tmgr_trace_t trace           = new simgrid::trace_mgr::trace();
+  tmgr::DatedValue* last_event = &(trace->event_list.back());
 
   xbt_assert(trace_list.find(name) == trace_list.end(), "Refusing to define trace %s twice", name);
-  xbt_assert(periodicity >= 0, "Invalid periodicity %g (must be positive)", periodicity);
-
-  tmgr_trace_t trace = new simgrid::trace_mgr::trace();
 
   std::vector<std::string> list;
   boost::split(list, input, boost::is_any_of("\n\r"));
   for (auto val : list) {
-    s_tmgr_event_t event;
+    tmgr::DatedValue event;
     linecount++;
     boost::trim(val);
     if (val[0] == '#' || val[0] == '\0' || val[0] == '%') // pass comments
       continue;
-    if (sscanf(val.c_str(), "PERIODICITY " "%lg" "\n", &periodicity) == 1)
+    if (sscanf(val.c_str(), "PERIODICITY %lg\n", &periodicity) == 1)
+      continue;
+    if (sscanf(val.c_str(), "LOOPAFTER %lg\n", &periodicity) == 1)
       continue;
 
-    xbt_assert(sscanf(val.c_str(), "%lg"
-                                   " "
-                                   "%lg"
-                                   "\n",
-                      &event.delta, &event.value) == 2,
-               "%s:%d: Syntax error in trace\n%s", name, linecount, input.c_str());
+    xbt_assert(sscanf(val.c_str(), "%lg  %lg\n", &event.date_, &event.value_) == 2, "%s:%d: Syntax error in trace\n%s",
+               name, linecount, input.c_str());
 
-    if (last_event) {
-      xbt_assert(last_event->delta <= event.delta,
-                 "%s:%d: Invalid trace: Events must be sorted, but time %g > time %g.\n%s", name, linecount,
-                 last_event->delta, event.delta, input.c_str());
+    xbt_assert(last_event->date_ <= event.date_,
+               "%s:%d: Invalid trace: Events must be sorted, but time %g > time %g.\n%s", name, linecount,
+               last_event->date_, event.date_, input.c_str());
+    last_event->date_ = event.date_ - last_event->date_;
 
-      last_event->delta = event.delta - last_event->delta;
-    } else {
-      if(event.delta > 0.0){
-        s_tmgr_event_t first_event;
-        first_event.delta=event.delta;
-        first_event.value=-1.0;
-        trace->event_list.push_back(first_event);
-      }
-    }
     trace->event_list.push_back(event);
     last_event = &(trace->event_list.back());
   }
-  if (last_event)
-    last_event->delta = periodicity;
+  if (last_event) {
+    if (periodicity > 0) {
+      last_event->date_ = periodicity + trace->event_list.at(0).date_;
+    } else {
+      last_event->date_ = -1;
+    }
+  }
 
   trace_list.insert({xbt_strdup(name), trace});
 
@@ -97,33 +114,15 @@ tmgr_trace_t tmgr_trace_new_from_file(const char *filename)
 
   std::stringstream buffer;
   buffer << f->rdbuf();
-  tmgr_trace_t trace = tmgr_trace_new_from_string(filename, buffer.str(), 0.);
-
   delete f;
 
-  return trace;
-}
-
-tmgr_trace_t tmgr_empty_trace_new()
-{
-  tmgr_trace_t trace = new simgrid::trace_mgr::trace();
-  s_tmgr_event_t event;
-  event.delta = 0.0;
-  event.value = 0.0;
-  trace->event_list.push_back(event);
-
-  return trace;
-}
-
-void tmgr_trace_free(tmgr_trace_t trace)
-{
-  delete trace;
+  return tmgr_trace_new_from_string(filename, buffer.str(), -1);
 }
 
 /** @brief Registers a new trace into the future event set, and get an iterator over the integrated trace  */
-tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t trace, double start_time, surf::Resource *resource)
+tmgr_trace_event_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t trace, surf::Resource* resource)
 {
-  tmgr_trace_iterator_t trace_iterator = nullptr;
+  tmgr_trace_event_t trace_iterator = nullptr;
 
   trace_iterator = xbt_new0(s_tmgr_trace_event_t, 1);
   trace_iterator->trace = trace;
@@ -132,7 +131,7 @@ tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t
 
   xbt_assert((trace_iterator->idx < trace->event_list.size()), "Your trace should have at least one event!");
 
-  xbt_heap_push(p_heap, trace_iterator, start_time);
+  xbt_heap_push(heap_, trace_iterator, 0. /*start_time*/);
 
   return trace_iterator;
 }
@@ -140,38 +139,37 @@ tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t
 /** @brief returns the date of the next occurring event (pure function) */
 double simgrid::trace_mgr::future_evt_set::next_date() const
 {
-  if (xbt_heap_size(p_heap))
-    return (xbt_heap_maxkey(p_heap));
-  else
-    return -1.0;
+  if (xbt_heap_size(heap_))
+    return (xbt_heap_maxkey(heap_));
+  return -1.0;
 }
 
 /** @brief Retrieves the next occurring event, or nullptr if none happens before #date */
-tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::pop_leq(
-    double date, double *value, simgrid::surf::Resource **resource)
+tmgr_trace_event_t simgrid::trace_mgr::future_evt_set::pop_leq(double date, double* value,
+                                                               simgrid::surf::Resource** resource)
 {
   double event_date = next_date();
   if (event_date > date)
     return nullptr;
 
-  tmgr_trace_iterator_t trace_iterator = (tmgr_trace_iterator_t)xbt_heap_pop(p_heap);
+  tmgr_trace_event_t trace_iterator = (tmgr_trace_event_t)xbt_heap_pop(heap_);
   if (trace_iterator == nullptr)
     return nullptr;
 
   tmgr_trace_t trace = trace_iterator->trace;
   *resource = trace_iterator->resource;
 
-  tmgr_event_t event = &(trace->event_list.at(trace_iterator->idx));
+  tmgr::DatedValue dateVal = trace->event_list.at(trace_iterator->idx);
 
-  *value = event->value;
+  *value = dateVal.value_;
 
   if (trace_iterator->idx < trace->event_list.size() - 1) {
-    xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
+    xbt_heap_push(heap_, trace_iterator, event_date + dateVal.date_);
     trace_iterator->idx++;
-  } else if (event->delta > 0) {        /* Last element, checking for periodicity */
-    xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
-    trace_iterator->idx = 1; /* not 0 as the first event is a placeholder to handle when events really start */
-  } else {                      /* We don't need this trace_event anymore */
+  } else if (dateVal.date_ > 0) { /* Last element. Shall we loop? */
+    xbt_heap_push(heap_, trace_iterator, event_date + dateVal.date_);
+    trace_iterator->idx = 1; /* idx=0 is a placeholder to store when events really start */
+  } else {                   /* If we don't loop, we don't need this trace_event anymore */
     trace_iterator->free_me = 1;
   }
 
@@ -184,9 +182,10 @@ void tmgr_finalize()
     xbt_free((char*)kv.first);
     delete kv.second;
   }
+  trace_list.clear();
 }
 
-void tmgr_trace_event_unref(tmgr_trace_iterator_t *trace_event)
+void tmgr_trace_event_unref(tmgr_trace_event_t* trace_event)
 {
   if ((*trace_event)->free_me) {
     xbt_free(*trace_event);
index 3b4761a..d33a538 100644 (file)
@@ -6,29 +6,22 @@
 #ifndef SURF_TMGR_H
 #define SURF_TMGR_H
 
-#include "xbt/heap.h"
 #include "simgrid/forward.h"
+#include "xbt/heap.h"
+#include "xbt/sysdep.h"
 #include <vector>
 
 SG_BEGIN_DECL()
 
-typedef struct tmgr_event {
-  double delta;
-  double value;
-} s_tmgr_event_t, *tmgr_event_t;
-
 /* Iterator within a trace */
-typedef struct tmgr_trace_iterator {
+typedef struct tmgr_trace_event {
   tmgr_trace_t trace;
   unsigned int idx;
   sg_resource_t resource;
   int free_me;
 } s_tmgr_trace_event_t;
-typedef struct tmgr_trace_iterator *tmgr_trace_iterator_t;
+typedef struct tmgr_trace_event* tmgr_trace_event_t;
 
-/* Creation functions */
-XBT_PUBLIC(tmgr_trace_t) tmgr_empty_trace_new(void);
-XBT_PUBLIC(void) tmgr_trace_free(tmgr_trace_t trace);
 /**
  * \brief Free a trace event structure
  *
@@ -36,7 +29,7 @@ XBT_PUBLIC(void) tmgr_trace_free(tmgr_trace_t trace);
  * This flag indicates whether the structure is still used somewhere or not.
  * When the structure is freed, the argument is set to nullptr
 */
-XBT_PUBLIC(void) tmgr_trace_event_unref(tmgr_trace_iterator_t *trace_event);
+XBT_PUBLIC(void) tmgr_trace_event_unref(tmgr_trace_event_t* trace_event);
 
 XBT_PUBLIC(void) tmgr_finalize(void);
 
@@ -47,17 +40,31 @@ SG_END_DECL()
 
 #ifdef __cplusplus
 namespace simgrid {
-/** @brief Modeling of the resource variations, such as those due to an external load
+/** @brief Modeling of the availability profile (due to an external load) or the churn
  *
- * There is 3 main concepts in this module:
- * - #trace: a set of dated values, ie a list of pair <timestamp, value>
- * - #trace_iterator: links a given trace to a given simgrid resource. A Cpu for example has 2 iterators: state (ie, is it ON/OFF) and speed, while a link has 3 iterators: state, bandwidth and latency.
+ * There is 4 main concepts in this module:
+ * - #DatedValue: a pair <timestamp, value> (both are of type double)
+ * - #trace: a list of dated values
+ * - #trace_event: links a given trace to a given SimGrid resource.
+ *   A Cpu for example has 2 kinds of events: state (ie, is it ON/OFF) and speed,
+ *   while a link has 3 iterators: state, bandwidth and latency.
  * - #future_evt_set: makes it easy to find the next occuring event of all traces
  */
-  namespace trace_mgr {
+namespace trace_mgr {
+XBT_PUBLIC_CLASS DatedValue
+{
+public:
+  double date_          = 0;
+  double value_         = 0;
+  explicit DatedValue() = default;
+  explicit DatedValue(double d, double v) : date_(d), value_(v) {}
+  bool operator==(DatedValue e2);
+  bool operator!=(DatedValue e2) { return !(*this == e2); }
+};
+std::ostream& operator<<(std::ostream& out, const DatedValue& e);
 
 /** @brief A trace_iterator links a trace to a resource */
-XBT_PUBLIC_CLASS trace_iterator {
+XBT_PUBLIC_CLASS trace_event{
 
 };
 
@@ -69,10 +76,10 @@ XBT_PUBLIC_CLASS trace_iterator {
 XBT_PUBLIC_CLASS trace {
 public:
   /**  Creates an empty trace */
-  trace();
+  explicit trace();
   virtual ~trace();
 //private:
-  std::vector<s_tmgr_event_t> event_list;
+  std::vector<DatedValue> event_list;
 };
 
 /** @brief Future Event Set (collection of iterators over the traces)
@@ -82,12 +89,12 @@ public:
   future_evt_set();
   virtual ~future_evt_set();
   double next_date() const;
-  tmgr_trace_iterator_t pop_leq(double date, double *value, simgrid::surf::Resource** resource);
-  tmgr_trace_iterator_t add_trace(tmgr_trace_t trace, double start_time, simgrid::surf::Resource *resource);
+  tmgr_trace_event_t pop_leq(double date, double* value, simgrid::surf::Resource** resource);
+  tmgr_trace_event_t add_trace(tmgr_trace_t trace, simgrid::surf::Resource * resource);
 
 private:
   // TODO: use a boost type for the heap (or a ladder queue)
-  xbt_heap_t p_heap = xbt_heap_new(8, xbt_free_f); /* Content: only trace_events (yep, 8 is an arbitrary value) */
+  xbt_heap_t heap_ = xbt_heap_new(8, xbt_free_f); /* Content: only trace_events (yep, 8 is an arbitrary value) */
 };
 
 }} // namespace simgrid::trace_mgr
diff --git a/src/surf/trace_mgr_test.cpp b/src/surf/trace_mgr_test.cpp
new file mode 100644 (file)
index 0000000..30b261e
--- /dev/null
@@ -0,0 +1,162 @@
+/* Copyright (c) 2017. The SimGrid Team. All rights reserved.               */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#define BOOST_TEST_MODULE Trace Manager tests
+bool init_unit_test(); // boost forget to give this prototype on NetBSD, which does not fit our paranoid flags
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_NO_MAIN
+#include <boost/test/unit_test.hpp>
+
+#include "src/surf/surf_interface.hpp"
+#include "src/surf/trace_mgr.hpp"
+
+#include "xbt/log.h"
+#include "xbt/misc.h"
+
+#include <math.h>
+
+namespace utf  = boost::unit_test;
+namespace tmgr = simgrid::trace_mgr;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(unit, "Unit tests of the Trace Manager");
+
+double thedate;
+class MockedResource : public simgrid::surf::Resource {
+public:
+  explicit MockedResource() : simgrid::surf::Resource(nullptr, "fake", nullptr) {}
+  void apply_event(tmgr_trace_event_t event, double value)
+  {
+    XBT_VERB("t=%.1f: Change value to %lg (idx: %d)", thedate, value, event->idx);
+    tmgr_trace_event_unref(&event);
+  }
+  bool isUsed() { return true; }
+};
+
+static void trace2vector(const char* str, std::vector<tmgr::DatedValue>* whereto)
+{
+  simgrid::trace_mgr::trace* trace = tmgr_trace_new_from_string("TheName", str, 0);
+  XBT_VERB("---------------------------------------------------------");
+  XBT_VERB("data>>\n%s<<data\n", str);
+  for (auto evt : trace->event_list)
+    XBT_VERB("event: d:%lg v:%lg", evt.date_, evt.value_);
+
+  MockedResource daResource;
+  simgrid::trace_mgr::future_evt_set fes;
+  tmgr_trace_event_t insertedIt = fes.add_trace(trace, &daResource);
+
+  while (fes.next_date() <= 20.0 && fes.next_date() >= 0) {
+    thedate = fes.next_date();
+    double value;
+    simgrid::surf::Resource* res;
+    tmgr_trace_event_t it = fes.pop_leq(thedate, &value, &res);
+    if (it == nullptr)
+      continue;
+
+    BOOST_CHECK_EQUAL(it, insertedIt); // Check that we find what we've put
+    if (value >= 0) {
+      res->apply_event(it, value);
+      whereto->push_back(tmgr::DatedValue(thedate, value));
+    } else {
+      XBT_DEBUG("%.1f: ignore an event (idx: %d)\n", thedate, it->idx);
+    }
+  }
+  tmgr_finalize();
+}
+
+/* Fails in a way that is difficult to test: xbt_assert should become throw
+BOOST_AUTO_TEST_CASE(no_evt_noloop) {
+  std::vector<Evt> got;
+  trace2vector("", &got);
+  std::vector<Evt> want;
+  BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end());
+}*/
+BOOST_AUTO_TEST_CASE(one_evt_noloop)
+{
+  std::vector<tmgr::DatedValue> got;
+  trace2vector("9.0 3.0\n", &got);
+
+  std::vector<tmgr::DatedValue> want;
+  want.push_back(tmgr::DatedValue(9, 3));
+  BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end());
+}
+BOOST_AUTO_TEST_CASE(two_evt_noloop)
+{
+  std::vector<tmgr::DatedValue> got;
+  trace2vector("3.0 1.0\n"
+               "9.0 3.0\n",
+               &got);
+
+  std::vector<tmgr::DatedValue> want;
+  want.push_back(tmgr::DatedValue(3, 1));
+  want.push_back(tmgr::DatedValue(9, 3));
+
+  BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end());
+}
+BOOST_AUTO_TEST_CASE(three_evt_noloop)
+{
+  std::vector<tmgr::DatedValue> got;
+  trace2vector("3.0 1.0\n"
+               "5.0 2.0\n"
+               "9.0 3.0\n",
+               &got);
+
+  std::vector<tmgr::DatedValue> want;
+  want.push_back(tmgr::DatedValue(3, 1));
+  want.push_back(tmgr::DatedValue(5, 2));
+  want.push_back(tmgr::DatedValue(9, 3));
+
+  BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end());
+}
+
+BOOST_AUTO_TEST_CASE(two_evt_loop)
+{
+  std::vector<tmgr::DatedValue> got;
+  trace2vector("1.0 1.0\n"
+               "3.0 3.0\n"
+               "LOOPAFTER 2\n",
+               &got);
+
+  std::vector<tmgr::DatedValue> want;
+  want.push_back(tmgr::DatedValue(1, 1));
+  want.push_back(tmgr::DatedValue(3, 3));
+  want.push_back(tmgr::DatedValue(6, 1));
+  want.push_back(tmgr::DatedValue(8, 3));
+  want.push_back(tmgr::DatedValue(11, 1));
+  want.push_back(tmgr::DatedValue(13, 3));
+  want.push_back(tmgr::DatedValue(16, 1));
+  want.push_back(tmgr::DatedValue(18, 3));
+
+  BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end());
+}
+BOOST_AUTO_TEST_CASE(two_evt_start0_loop)
+{
+  std::vector<tmgr::DatedValue> got;
+  trace2vector("0.0 1\n"
+               "5.0 2\n"
+               "LOOPAFTER 5\n",
+               &got);
+
+  std::vector<tmgr::DatedValue> want;
+  want.push_back(tmgr::DatedValue(0, 1));
+  want.push_back(tmgr::DatedValue(5, 2));
+  want.push_back(tmgr::DatedValue(10, 1));
+  want.push_back(tmgr::DatedValue(15, 2));
+  want.push_back(tmgr::DatedValue(20, 1));
+
+  BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end());
+}
+
+static bool init_function()
+{
+  // do your own initialization here (and return true on success)
+  // But, you CAN'T use testing tools here
+  return true;
+}
+
+int main(int argc, char** argv)
+{
+  xbt_log_init(&argc, argv);
+  return ::boost::unit_test::unit_test_main(&init_function, argc, argv);
+}
index 9768c00..ec62ccc 100644 (file)
@@ -50,13 +50,15 @@ typedef struct {
   tmgr_trace_t state_trace;
   const char* coord;
   xbt_dict_t properties;
-} s_sg_platf_host_cbarg_t, *sg_platf_host_cbarg_t;
+} s_sg_platf_host_cbarg_t;
+typedef s_sg_platf_host_cbarg_t* sg_platf_host_cbarg_t;
 
 typedef struct {
   const char* id;
   const char* link_up;
   const char* link_down;
-} s_sg_platf_host_link_cbarg_t, *sg_platf_host_link_cbarg_t;
+} s_sg_platf_host_link_cbarg_t;
+typedef s_sg_platf_host_link_cbarg_t* sg_platf_host_link_cbarg_t;
 
 class LinkCreationArgs {
 public:
@@ -114,7 +116,7 @@ typedef struct s_sg_platf_cluster_cbarg {
   e_surf_link_sharing_policy_t bb_sharing_policy;
 } s_sg_platf_cluster_cbarg_t;
 
-typedef struct s_sg_platf_cabinet_cbarg *sg_platf_cabinet_cbarg_t;
+typedef struct s_sg_platf_cabinet_cbargsg_platf_cabinet_cbarg_t;
 typedef struct s_sg_platf_cabinet_cbarg {
   const char* id;
   const char* prefix;
@@ -125,16 +127,18 @@ typedef struct s_sg_platf_cabinet_cbarg {
   double lat;
 } s_sg_platf_cabinet_cbarg_t;
 
-typedef struct {
+typedef struct s_sg_platf_storage_cbarg* sg_platf_storage_cbarg_t;
+typedef struct s_sg_platf_storage_cbarg {
   const char* id;
   const char* type_id;
   const char* content;
   const char* content_type;
   xbt_dict_t properties;
   const char* attach;
-} s_sg_platf_storage_cbarg_t, *sg_platf_storage_cbarg_t;
+} s_sg_platf_storage_cbarg_t;
 
-typedef struct {
+typedef struct s_sg_platf_storage_type_cbarg* sg_platf_storage_type_cbarg_t;
+typedef struct s_sg_platf_storage_type_cbarg {
   const char* id;
   const char* model;
   const char* content;
@@ -142,12 +146,13 @@ typedef struct {
   xbt_dict_t properties;
   std::map<std::string, std::string>* model_properties;
   sg_size_t size;
-} s_sg_platf_storage_type_cbarg_t, *sg_platf_storage_type_cbarg_t;
+} s_sg_platf_storage_type_cbarg_t;
 
-typedef struct {
+typedef struct s_sg_platf_mount_cbarg* sg_platf_mount_cbarg_t;
+typedef struct s_sg_platf_mount_cbarg {
   const char* storageId;
   const char* name;
-} s_sg_platf_mount_cbarg_t, *sg_platf_mount_cbarg_t;
+} s_sg_platf_mount_cbarg_t;
 
 typedef struct s_sg_platf_prop_cbarg *sg_platf_prop_cbarg_t;
 typedef struct s_sg_platf_prop_cbarg {
index b48edf2..1a6e627 100644 (file)
@@ -4,6 +4,12 @@
 More info: http://simgrid.gforge.inria.fr/simgrid/latest/doc/platform.html
 To upgrade your files, use the tool simgrid_update_xml
 
+* New in DTD version 4.1 (in SimGrid 3.16): backward compatible change (v4 files are valid v4.1 files)
+   - <zone> can be used as a synonym for the now deprecated <as>
+   - <zoneZoute> an be used as a synonym for the now deprecated <asroute>
+   - <bypassZoneRoute> an be used as a synonym for the now deprecated <bypassAsRoute>
+   - <actor>  can be used as a synonym for the now deprecated <process>
+
 * New in DTD version 4 (in SimGrid 3.13):
    - Rename (power->speed) the attributes describing the amount of flop
      that a <host>, <peer>, <cluster> or <cabinet> can deliver per second.
@@ -60,10 +66,11 @@ To upgrade your files, use the tool simgrid_update_xml
 
 -->
 
-<!ELEMENT platform ((config|random)*,(include|cluster|cabinet|peer|AS|trace|trace_connect)*,(process)*)>
+<!ELEMENT platform ((config|random)*,(include|cluster|cabinet|peer|AS|zone|trace|trace_connect)*,(process|actor)*)>
 <!ATTLIST platform version CDATA "0.0">
 
-<!ELEMENT include (include|cluster|cabinet|peer|AS|trace|trace_connect)*>
+<!-- tag include is deprecated. Not documented, and soon removed -->
+<!ELEMENT include (include|cluster|cabinet|peer|AS|zone|trace|trace_connect)*>
 <!ATTLIST include file CDATA #REQUIRED>
 
 <!ELEMENT trace (#PCDATA)>
@@ -86,10 +93,14 @@ To upgrade your files, use the tool simgrid_update_xml
 <!ATTLIST trace_connect trace CDATA #REQUIRED>
 <!ATTLIST trace_connect element CDATA #REQUIRED>
 
-<!ELEMENT AS ((prop*), ((AS|ASroute|include|storage_type|storage|link|backbone|cabinet|router|host|cluster|peer|host_link)*,(route|ASroute|trace|trace_connect|bypassRoute|bypassASroute)*))>
+<!ELEMENT AS ((prop*), ((AS|zone|ASroute|zoneRoute|include|storage_type|storage|link|backbone|cabinet|router|host|cluster|peer|host_link)*,(route|ASroute|zoneRoute|trace|trace_connect|bypassRoute|bypassASroute|bypassZoneRoute)*))>
 <!ATTLIST AS id CDATA #REQUIRED>
 <!ATTLIST AS routing (Full|Floyd|Dijkstra|DijkstraCache|None|Vivaldi|Cluster|ClusterTorus|ClusterFatTree|ClusterDragonfly) #REQUIRED>
 
+<!ELEMENT zone ((prop*), ((AS|zone|ASroute|zoneRoute|include|storage_type|storage|link|backbone|cabinet|router|host|cluster|peer|host_link)*,(route|ASroute|zoneRoute|trace|trace_connect|bypassRoute|bypassASroute|bypassZoneRoute)*))>
+<!ATTLIST zone id CDATA #REQUIRED>
+<!ATTLIST zone routing (Full|Floyd|Dijkstra|DijkstraCache|None|Vivaldi|Cluster|ClusterTorus|ClusterFatTree|ClusterDragonfly) #REQUIRED>
+
 <!ELEMENT storage_type ((model_prop|prop)*)>
 <!ATTLIST storage_type id       CDATA #REQUIRED>
 <!ATTLIST storage_type model    CDATA #REQUIRED>
@@ -191,6 +202,13 @@ To upgrade your files, use the tool simgrid_update_xml
 <!ATTLIST ASroute gw_dst CDATA #REQUIRED>
 <!ATTLIST ASroute symmetrical (YES|NO) "YES">
 
+<!ELEMENT zoneRoute (link_ctn*)>
+<!ATTLIST zoneRoute src CDATA #REQUIRED>
+<!ATTLIST zoneRoute dst CDATA #REQUIRED>
+<!ATTLIST zoneRoute gw_src CDATA #REQUIRED>
+<!ATTLIST zoneRoute gw_dst CDATA #REQUIRED>
+<!ATTLIST zoneRoute symmetrical (YES|NO) "YES">
+
 <!ELEMENT link_ctn EMPTY>
 <!ATTLIST link_ctn id CDATA #REQUIRED>
 <!ATTLIST link_ctn direction (UP|DOWN|NONE) "NONE">
@@ -205,6 +223,12 @@ To upgrade your files, use the tool simgrid_update_xml
 <!ATTLIST bypassASroute gw_src CDATA #REQUIRED>
 <!ATTLIST bypassASroute gw_dst CDATA #REQUIRED>
 
+<!ELEMENT bypassZoneRoute (link_ctn*)>
+<!ATTLIST bypassZoneRoute src CDATA #REQUIRED>
+<!ATTLIST bypassZoneRoute dst CDATA #REQUIRED>
+<!ATTLIST bypassZoneRoute gw_src CDATA #REQUIRED>
+<!ATTLIST bypassZoneRoute gw_dst CDATA #REQUIRED>
+
 <!ELEMENT process ((argument|prop)*)>
 <!ATTLIST process host CDATA #REQUIRED>
 <!ATTLIST process function CDATA #REQUIRED>
@@ -212,6 +236,13 @@ To upgrade your files, use the tool simgrid_update_xml
 <!ATTLIST process kill_time CDATA "-1.0">
 <!ATTLIST process on_failure (DIE|RESTART) "DIE">
 
+<!ELEMENT actor ((argument|prop)*)>
+<!ATTLIST actor host CDATA #REQUIRED>
+<!ATTLIST actor function CDATA #REQUIRED>
+<!ATTLIST actor start_time CDATA "-1.0">
+<!ATTLIST actor kill_time CDATA "-1.0">
+<!ATTLIST actor on_failure (DIE|RESTART) "DIE">
+
 <!ELEMENT argument EMPTY>
 <!ATTLIST argument value CDATA #REQUIRED>
 
index f95cef5..98336cb 100644 (file)
@@ -171,7 +171,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
 typedef size_t yy_size_t;
 #endif
 
-extern int surf_parse_leng;
+extern unsigned int surf_parse_leng;
 
 extern FILE *surf_parse_in, *surf_parse_out;
 
@@ -188,7 +188,7 @@ extern FILE *surf_parse_in, *surf_parse_out;
      */
     #define  YY_LESS_LINENO(n) \
             do { \
-                int yyl;\
+                unsigned int yyl;\
                 for ( yyl = n; yyl < surf_parse_leng; ++yyl )\
                     if ( surf_parse_text[yyl] == '\n' )\
                         --surf_parse_lineno;\
@@ -305,7 +305,7 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
 /* yy_hold_char holds the character lost when surf_parse_text is formed. */
 static char yy_hold_char;
 static int yy_n_chars;         /* number of characters read into yy_ch_buf */
-int surf_parse_leng;
+unsigned int surf_parse_leng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = NULL;
@@ -399,8 +399,8 @@ static void yynoreturn yy_fatal_error (yyconst char* msg  );
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 561
-#define YY_END_OF_BUFFER 562
+#define YY_NUM_RULES 651
+#define YY_END_OF_BUFFER 652
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -408,7 +408,7 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[3334] =
+static yyconst flex_int16_t yy_accept[3906] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -435,348 +435,411 @@ static yyconst flex_int16_t yy_accept[3334] =
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  562,  560,
-       15,   10,   10,   15,   15,  540,   10,  540,    5,    6,
-        5,    8,    9,    8,  556,  548,  549,  557,  554,  557,
-      555,  559,  548,  549,  559,   42,   10,   42,   42,   42,
-       40,   42,   42,   46,   10,   46,   46,  560,   46,  560,
-      560,   46,   63,   10,   63,   63,   63,   61,   63,   63,
-       63,   67,   10,   67,  560,   67,   74,   10,   74,   74,
-
-       74,   72,   74,   78,   10,   78,   89,   10,   89,   89,
-       89,   87,   89,   89,   89,   93,   10,   93,  106,   10,
-      106,  106,  106,  104,  106,  106,  106,  110,   10,  110,
-      110,  119,   10,  119,  119,  119,  117,  119,  119,  123,
-       10,  123,  123,  142,   10,  142,  142,  142,  140,  142,
-      142,  142,  142,  142,  142,  146,   10,  146,  199,   10,
-      199,  199,  199,  197,  199,  199,  199,  199,  199,  199,
-      199,  199,  203,   10,  203,  203,  210,   10,  210,  210,
-      210,  208,  210,  214,   10,  214,  214,  233,   10,  233,
-      233,  233,  231,  233,  233,  233,  233,  233,  237,   10,
-
-      237,  560,  237,  248,   10,  248,  248,  248,  246,  248,
-      248,  248,  252,   10,  252,  259,   10,  259,  259,  259,
-      257,  259,  263,   10,  263,  560,  263,  286,   10,  286,
-      286,  286,  284,  286,  286,  286,  286,  290,   10,  290,
-      290,  303,   10,  303,  303,  303,  301,  303,  303,  307,
-       10,  307,  316,   10,  316,  316,  316,  314,  316,  316,
-      320,   10,  320,  329,   10,  329,  329,  329,  327,  329,
-      329,  333,   10,  333,  354,   10,  354,  354,  354,  352,
-      354,  354,  354,  354,  354,  354,  358,   10,  358,  560,
-      365,   10,  365,  365,  365,  363,  365,  369,   10,  369,
-
-      369,  560,  369,  560,  369,  386,   10,  386,  386,  386,
-      384,  386,  386,  386,  386,  386,  390,   10,  390,  560,
-      390,  399,   10,  399,  399,  399,  397,  399,  399,  403,
-       10,  403,  430,   10,  430,  430,  430,  428,  430,  430,
-      430,  430,  430,  434,   10,  434,  447,   10,  447,  447,
-      447,  445,  447,  447,  451,   10,  451,  451,  460,   10,
-      460,  460,  460,  458,  460,  460,  464,   10,  464,  479,
-       10,  479,  479,  479,  477,  479,  479,  479,  479,  483,
-       10,  483,  483,  498,   10,  498,  498,  498,  496,  498,
-      498,  498,  498,  502,   10,  502,  560,  502,  513,   10,
-
-      513,  513,  513,  511,  513,  513,  513,  557,  556,  535,
-       10,  535,  535,  535,  533,  535,  535,  535,  539,   10,
-      539,   10,    0,    2,    2,    0,    4,    7,  551,  550,
-        0,    0,    0,    0,    0,    0,   41,   43,   43,   43,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       62,   64,   64,   64,   64,   64,    0,    0,   73,   75,
-       75,    0,   88,   90,   90,   90,   90,    0,  105,  107,
-      107,  107,  107,    0,  118,  120,  120,  120,    0,  141,
-
-      143,  143,  143,  143,  143,  143,  143,  143,    0,  198,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,    0,  209,  211,  211,    0,
-      232,  234,  234,  234,  234,  234,  234,  234,    0,    0,
-      247,  249,  249,  249,  249,    0,  258,  260,  260,    0,
-        0,  285,  287,  287,  287,  287,  287,  287,    0,  302,
-      304,  304,  304,    0,  315,  317,  317,  317,    0,  328,
-      330,  330,  330,    0,  353,  355,  355,  355,  355,  355,
-      355,  355,  355,    0,    0,  364,  366,  366,    0,    0,
-        0,    0,    0,    0,  385,  387,  387,  387,  387,  387,
-
-      387,    0,    0,  398,  400,  400,  400,    0,  429,  431,
-      431,  431,  431,  431,  431,  431,  431,  431,    0,  446,
-      448,  448,  448,  448,    0,  459,  461,  461,  461,    0,
-      478,  480,  480,  480,  480,  480,    0,  497,  499,  499,
-      499,  499,  499,    0,    0,  512,  514,  514,  514,  514,
-        0,    0,    0,  534,  536,  536,  536,  536,    0,    0,
-        0,    0,    0,    3,    0,    0,    0,    0,    0,    0,
-        0,  558,    0,    0,   43,    0,    0,   17,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   16,    0,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,   16,    0,
-        0,   64,   64,   64,   64,    0,    0,    0,   75,    0,
-        0,   90,    0,    0,   90,    0,    0,  107,  107,  107,
-        0,    0,  120,  120,    0,    0,    0,    0,    0,    0,
-      143,  143,  143,  143,  143,    0,    0,  200,    0,    0,
-      200,    0,    0,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,    0,    0,    0,    0,    0,    0,  234,
-      234,  234,    0,    0,  234,  234,  234,    0,    0,    0,
-      249,    0,    0,    0,    0,    0,    0,  260,    0,    0,
-       17,  287,    0,    0,  287,  287,  287,    0,    0,  304,
-
-        0,    0,    0,    0,    0,    0,  317,    0,    0,  330,
-      330,    0,    0,  355,  355,  355,    0,    0,  355,  355,
-      355,    0,    0,    0,  366,    0,    0,    0,    0,    0,
-      387,  387,  387,  387,  387,    0,    0,    0,    0,    0,
-      400,    0,    0,  431,    0,    0,  431,  431,  431,  431,
-      431,  431,    0,    0,  448,  448,  448,    0,    0,  461,
-        0,    0,    0,    0,  480,  480,    0,    0,  480,    0,
-        0,  499,    0,    0,  499,  499,    0,    0,    0,  514,
-        0,    0,  514,    0,    0,    0,  553,  536,  536,  536,
-        0,    0,    0,   14,    1,    0,    0,  546,    0,    0,
-
-        0,  543,  542,    0,    0,   19,   18,   43,    0,    0,
-       45,    0,   17,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   16,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       64,   64,    0,    0,   64,    0,    0,   66,    0,    0,
-       75,    0,    0,   77,    0,   90,    0,   84,   83,   90,
-        0,    0,   92,    0,    0,    0,  107,  107,    0,    0,
-        0,    0,  109,    0,    0,    0,    0,    0,    0,    0,
-      122,    0,    0,  127,  126,    0,  129,  128,    0,    0,
-
-      143,  143,  143,  143,    0,    0,  145,    0,  200,  200,
-      200,    0,  158,  157,  200,    0,  162,  161,    0,    0,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,    0,
-        0,  202,    0,    0,  207,  206,    0,    0,  213,    0,
-      234,  234,  234,    0,  224,  223,  234,  234,  234,    0,
-        0,  236,    0,    0,  249,    0,  243,  242,    0,  245,
-      244,    0,    0,  251,    0,  260,    0,    0,  262,    0,
-      287,    0,  271,  270,  287,  287,  287,    0,    0,  289,
-        0,  304,    0,  300,  299,    0,    0,  306,    0,    0,
-      311,  310,  317,    0,    0,  319,    0,  330,  330,    0,
-
-        0,  332,    0,  355,  355,  355,  355,    0,  345,  344,
-        0,    0,  355,  355,    0,    0,  357,    0,    0,  366,
-        0,    0,  368,    0,    0,    0,    0,  387,  387,  387,
-      387,  387,    0,    0,  389,    0,    0,    0,  394,  393,
-      400,    0,    0,  402,    0,  431,    0,  415,  414,    0,
-        0,  431,    0,    0,  431,  431,  431,    0,    0,  433,
-        0,    0,    0,    0,    0,  448,    0,    0,  450,    0,
-      461,    0,  457,  456,    0,    0,  463,    0,  480,  480,
-        0,  474,  473,  480,    0,    0,  482,    0,  499,    0,
-      491,  490,  499,  499,    0,    0,  501,    0,    0,  514,
-
-        0,  508,  507,  514,    0,    0,    0,  516,    0,  536,
-      536,  536,    0,    0,  538,    0,    0,    0,  547,  541,
-        0,    0,   43,    0,   44,    0,    0,    0,    0,    0,
-        0,    0,  216,    0,  265,    0,    0,  335,    0,    0,
-      392,    0,    0,    0,    0,  391,    0,    0,    0,    0,
-        0,  215,    0,  264,  334,    0,    0,    0,    0,    0,
-        0,   50,   49,   64,   64,    0,   56,   55,   64,    0,
-      264,   75,    0,   90,   90,    0,    0,   97,   96,  107,
-      107,    0,  103,  102,    0,    0,  114,  113,    0,  116,
-      115,    0,    0,  131,  130,  143,  143,  143,  143,    0,
-
-      200,  200,  200,    0,    0,    0,  164,  163,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,    0,    0,
-      234,  234,    0,    0,  234,  234,  234,    0,    0,    0,
-        0,    0,    0,    0,    0,  287,  287,  287,  287,    0,
-      304,    0,  317,    0,    0,    0,  330,    0,  355,  355,
-      355,  355,    0,  347,  346,  355,  355,    0,    0,  366,
-        0,    0,    0,    0,  387,    0,    0,  387,  387,  387,
-        0,    0,  400,    0,  431,    0,  417,  416,    0,    0,
-        0,  421,  420,  431,    0,    0,  431,    0,    0,  438,
-      437,    0,  440,  439,  448,    0,  461,    0,  480,  480,
-
-      480,    0,  499,  499,    0,    0,    0,    0,    0,    0,
-      514,    0,    0,  536,    0,    0,  536,    0,    0,    0,
-        0,   12,    0,  544,  545,   43,    0,    0,    0,    0,
-        0,    0,    0,  216,    0,    0,  265,    0,    0,  321,
-      335,    0,    0,  392,    0,  436,    0,  504,  391,    0,
-        0,    0,    0,    0,  215,    0,    0,  264,  334,  435,
-        0,  503,  436,  435,   64,   64,   64,    0,    0,    0,
-        0,    0,   90,   90,    0,  107,  107,    0,    0,  143,
-      143,    0,    0,  143,    0,    0,    0,  200,  200,    0,
-      160,  159,  200,  200,  200,  200,  200,  200,    0,    0,
-
-      200,  200,  200,    0,    0,  234,  234,    0,  222,  221,
-      234,    0,    0,  234,    0,  322,    0,  241,  240,    0,
-        0,  256,  255,    0,  287,  287,  287,  287,    0,  304,
-        0,    0,    0,    0,    0,  324,  323,  330,    0,  355,
-        0,    0,  355,  355,    0,    0,  355,    0,    0,  366,
-        0,    0,    0,    0,  387,    0,  375,  374,  387,  387,
-      387,    0,    0,    0,    0,    0,  431,    0,  419,  418,
-      431,    0,  425,  424,  431,    0,  448,    0,  461,    0,
-      480,  480,  480,    0,  499,    0,    0,    0,  495,  494,
-        0,    0,    0,  506,  505,  514,    0,    0,  536,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,   11,   43,
-        0,    0,    0,    0,    0,    0,  204,    0,    0,    0,
-        0,  321,    0,    0,  404,  436,  453,    0,  504,    0,
-        0,    0,    0,    0,    0,    0,    0,  435,  452,    0,
-      503,    0,    0,    0,    0,    0,   64,    0,    0,    0,
-       71,   70,    0,   90,   90,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  143,    0,  137,  136,    0,    0,
-        0,    0,  150,  149,    0,    0,  200,  200,  200,    0,
-        0,  200,  200,  200,    0,  184,  183,    0,    0,  200,
-      200,    0,    0,  234,  234,    0,    0,    0,  228,  227,
-
-      234,    0,  235,  322,    0,    0,  287,  287,  287,  287,
-        0,  288,  304,    0,    0,  313,  312,    0,  330,    0,
-      355,    0,  339,  338,    0,    0,  355,    0,  349,  348,
-      355,    0,  356,    0,  366,    0,  205,    0,  405,  387,
-      387,  387,  387,    0,    0,    0,  396,  395,    0,  401,
-      431,  431,  431,    0,  448,    0,  461,    0,    0,    0,
-      480,    0,    0,    0,  499,    0,  493,  492,    0,    0,
-      514,    0,    0,  536,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  532,  531,    0,    0,    0,    0,    0,
-        0,   48,    0,    0,    0,    0,  125,  148,  204,    0,
-
-      254,    0,    0,    0,  370,  404,  453,  466,    0,   47,
-        0,    0,    0,  124,  147,    0,  253,  452,  465,    0,
-        0,   52,   51,    0,   54,   53,   64,    0,    0,    0,
-       90,    0,    0,    0,    0,   99,   98,    0,  101,  100,
-        0,    0,    0,  133,  132,    0,    0,    0,  139,  138,
-        0,    0,  152,  151,  200,  200,  200,    0,  172,  171,
-        0,    0,  200,  200,    0,  186,  185,  200,  200,    0,
-        0,  234,  234,    0,  226,  225,  234,    0,    0,  287,
-        0,    0,  287,  287,  287,  304,    0,    0,  330,    0,
-      331,  355,    0,  341,  340,  355,  355,    0,    0,    0,
-
-        0,  205,  371,  405,  387,  387,  387,  387,    0,    0,
-      431,    0,    0,  431,    0,  448,    0,  449,  461,    0,
-        0,  468,  467,    0,    0,  480,    0,  476,  475,    0,
-        0,    0,  499,    0,    0,  514,    0,    0,  515,    0,
+      652,  650,   15,   10,   10,   15,   15,  630,   10,  630,
+
+        5,    6,    5,    8,    9,    8,  646,  638,  639,  647,
+      644,  647,  645,  649,  638,  639,  649,   42,   10,   42,
+       42,   42,   40,   42,   42,   46,   10,   46,   46,  650,
+       46,  650,  650,   46,   63,   10,   63,   63,   63,   61,
+       63,   63,   63,   67,   10,   67,  650,   67,   84,   10,
+       84,   84,   84,   82,   84,   84,   84,   84,   84,   88,
+       10,   88,  650,   88,   95,   10,   95,   95,   95,   93,
+       95,   99,   10,   99,  110,   10,  110,  110,  110,  108,
+      110,  110,  110,  114,   10,  114,  127,   10,  127,  127,
+      127,  125,  127,  127,  127,  131,   10,  131,  131,  140,
+
+       10,  140,  140,  140,  138,  140,  140,  144,   10,  144,
+      144,  157,   10,  157,  157,  157,  155,  157,  157,  157,
+      161,   10,  161,  161,  180,   10,  180,  180,  180,  178,
+      180,  180,  180,  180,  180,  180,  184,   10,  184,  237,
+       10,  237,  237,  237,  235,  237,  237,  237,  237,  237,
+      237,  237,  237,  241,   10,  241,  241,  248,   10,  248,
+      248,  248,  246,  248,  252,   10,  252,  252,  271,   10,
+      271,  271,  271,  269,  271,  271,  271,  271,  271,  275,
+       10,  275,  650,  275,  286,   10,  286,  286,  286,  284,
+      286,  286,  286,  290,   10,  290,  297,   10,  297,  297,
+
+      297,  295,  297,  301,   10,  301,  650,  301,  324,   10,
+      324,  324,  324,  322,  324,  324,  324,  324,  328,   10,
+      328,  328,  341,   10,  341,  341,  341,  339,  341,  341,
+      345,   10,  345,  354,   10,  354,  354,  354,  352,  354,
+      354,  358,   10,  358,  367,   10,  367,  367,  367,  365,
+      367,  367,  371,   10,  371,  392,   10,  392,  392,  392,
+      390,  392,  392,  392,  392,  392,  392,  396,   10,  396,
+      650,  403,   10,  403,  403,  403,  401,  403,  407,   10,
+      407,  407,  650,  407,  650,  407,  424,   10,  424,  424,
+      424,  422,  424,  424,  424,  424,  424,  428,   10,  428,
+
+      428,  437,   10,  437,  437,  437,  435,  437,  437,  441,
+       10,  441,  468,   10,  468,  468,  468,  466,  468,  468,
+      468,  468,  468,  472,   10,  472,  485,   10,  485,  485,
+      485,  483,  485,  485,  489,   10,  489,  489,  498,   10,
+      498,  498,  498,  496,  498,  498,  502,   10,  502,  517,
+       10,  517,  517,  517,  515,  517,  517,  517,  517,  521,
+       10,  521,  521,  536,   10,  536,  536,  536,  534,  536,
+      536,  536,  536,  540,   10,  540,  650,  540,  551,   10,
+      551,  551,  551,  549,  551,  551,  551,  647,  646,  573,
+       10,  573,  573,  573,  571,  573,  573,  573,  577,   10,
+
+      577,  604,   10,  604,  604,  604,  602,  604,  604,  608,
+       10,  608,  608,  608,  608,  625,   10,  625,  625,  625,
+      623,  625,  625,  625,  629,   10,  629,  629,   10,    0,
+        2,    2,    0,    4,    7,  641,  640,    0,    0,    0,
+        0,    0,    0,   41,   43,   43,   43,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   48,   68,
-       80,    0,    0,  125,  148,    0,  254,  291,    0,  359,
-      370,  466,    0,    0,   47,   79,    0,    0,  124,  147,
-        0,  253,  465,    0,    0,   64,    0,  292,    0,   90,
-        0,   86,   85,    0,    0,    0,    0,  135,  134,    0,
-
-      200,  200,  200,    0,  174,  173,  200,  200,  200,    0,
-        0,    0,    0,  212,  234,  234,  234,    0,    0,  287,
-        0,  273,  272,  287,  287,  287,  304,    0,    0,  330,
-      355,  355,  355,  360,    0,  362,  361,    0,  371,    0,
-        0,  387,  387,  387,    0,   69,  431,    0,  423,  422,
-      431,    0,  432,  448,  461,    0,  462,    0,  470,  469,
-      480,    0,    0,  487,  486,  499,    0,    0,  514,  552,
-        0,  520,  519,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   68,   80,    0,
-
-        0,  239,  291,    0,  359,    0,    0,   79,    0,    0,
-      238,    0,    0,   64,    0,   65,  292,    0,    0,    0,
-        0,    0,    0,    0,  144,  200,  200,  200,  200,    0,
-        0,  200,  200,    0,    0,    0,    0,  201,  234,  234,
-      234,    0,    0,  261,    0,    0,  287,  287,  287,  287,
-        0,    0,    0,    0,    0,    0,  355,  355,  355,  360,
-        0,    0,  373,  372,    0,    0,  387,  387,    0,  388,
-       69,    0,    0,  431,  448,  461,  480,    0,  481,  499,
-        0,    0,  514,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
+       62,   64,   64,   64,   64,   64,    0,    0,   83,   85,
+       85,   85,   85,   85,   85,    0,    0,   94,   96,   96,
+
+        0,  109,  111,  111,  111,  111,    0,  126,  128,  128,
+      128,  128,    0,  139,  141,  141,  141,    0,  156,  158,
+      158,  158,  158,    0,  179,  181,  181,  181,  181,  181,
+      181,  181,  181,    0,  236,  238,  238,  238,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+        0,  247,  249,  249,    0,  270,  272,  272,  272,  272,
+      272,  272,  272,    0,    0,  285,  287,  287,  287,  287,
+        0,  296,  298,  298,    0,    0,    0,  323,  325,  325,
+      325,  325,  325,  325,    0,  340,  342,  342,  342,    0,
+      353,  355,  355,  355,    0,  366,  368,  368,  368,    0,
+
+      391,  393,  393,  393,  393,  393,  393,  393,  393,    0,
+        0,  402,  404,  404,    0,    0,    0,    0,    0,    0,
+        0,  423,  425,  425,  425,  425,  425,  425,    0,  436,
+      438,  438,  438,    0,  467,  469,  469,  469,  469,  469,
+      469,  469,  469,  469,    0,  484,  486,  486,  486,  486,
+        0,  497,  499,  499,  499,    0,  516,  518,  518,  518,
+      518,  518,    0,  535,  537,  537,  537,  537,  537,    0,
+        0,  550,  552,  552,  552,  552,    0,    0,    0,  572,
+      574,  574,  574,  574,    0,  603,  605,  605,  605,    0,
+      624,  626,  626,  626,  626,  626,    0,    0,    0,    0,
+
+        0,    3,    0,    0,    0,    0,    0,    0,    0,  648,
+        0,    0,   43,    0,    0,   17,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  239,  308,    0,    0,    0,    0,  238,    0,    0,
-       64,    0,   76,    0,   82,   81,    0,   91,    0,    0,
-      200,  200,  200,  200,    0,  176,  175,  200,  200,    0,
-        0,    0,    0,    0,    0,  234,  234,    0,    0,    0,
-        0,  267,  266,  287,  287,  287,    0,    0,    0,    0,
-        0,    0,  305,    0,    0,  326,  325,  355,  355,    0,
-        0,    0,  367,    0,  377,  376,    0,    0,    0,    0,
-        0,    0,    0,  431,  448,  461,  480,  499,    0,  309,
-      514,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-
+        0,    0,    0,    0,    0,    0,   16,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   16,
+        0,    0,    0,   64,   64,   64,   64,    0,    0,    0,
+       85,   85,   85,   85,   85,    0,    0,    0,   96,    0,
+        0,  111,    0,    0,  111,    0,    0,  128,  128,  128,
+        0,    0,  141,  141,    0,    0,  158,  158,  158,    0,
+        0,    0,    0,    0,    0,  181,  181,  181,  181,  181,
+
+        0,    0,  238,    0,    0,  238,    0,    0,  238,  238,
+      238,  238,  238,  238,  238,  238,  238,  238,    0,    0,
+        0,    0,    0,    0,  272,  272,  272,    0,    0,  272,
+      272,  272,    0,    0,    0,  287,    0,    0,    0,    0,
+        0,    0,  298,    0,    0,   17,    0,  325,    0,    0,
+      325,  325,  325,    0,    0,  342,    0,    0,    0,    0,
+        0,    0,  355,    0,    0,  368,  368,    0,    0,  393,
+      393,  393,    0,    0,  393,  393,  393,    0,    0,    0,
+      404,    0,    0,    0,    0,    0,    0,  425,  425,  425,
+      425,  425,    0,    0,    0,    0,  438,    0,    0,  469,
+
+        0,    0,  469,  469,  469,  469,  469,  469,    0,    0,
+      486,  486,  486,    0,    0,  499,    0,    0,    0,    0,
+      518,  518,    0,    0,  518,    0,    0,  537,    0,    0,
+      537,  537,    0,    0,    0,  552,    0,    0,  552,    0,
+        0,    0,  643,  574,  574,  574,    0,    0,    0,    0,
+      605,    0,    0,  626,  626,  626,  626,    0,    0,    0,
+       14,    1,    0,    0,  636,    0,    0,    0,  633,  632,
+        0,    0,   19,   18,   43,    0,    0,   45,    0,   17,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  112,  308,
-        0,    0,    0,  111,    0,    0,    0,    0,    0,    0,
-      200,  200,    0,    0,  200,  200,  200,    0,    0,    0,
-        0,    0,    0,    0,    0,  234,    0,    0,    0,  230,
-      229,    0,  250,  287,  287,  287,    0,  283,  282,    0,
-        0,    0,    0,    0,    0,    0,  355,    0,    0,    0,
-      351,  350,    0,    0,    0,    0,  383,  382,    0,    0,
-        0,    0,    0,    0,  431,    0,    0,    0,    0,  480,
-      499,    0,  309,    0,    0,    0,    0,    0,    0,  524,
-
-        0,    0,    0,    0,  523,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  112,  485,    0,    0,  111,  484,    0,    0,
-        0,    0,    0,    0,  200,    0,    0,    0,  168,  167,
-        0,    0,  200,  200,    0,    0,    0,    0,    0,    0,
-        0,    0,  234,    0,  220,  219,  287,    0,    0,  287,
-        0,    0,    0,    0,    0,    0,    0,  318,  355,    0,
-      343,  342,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  431,    0,    0,    0,    0,  455,
-      454,    0,    0,    0,    0,    0,    0,  510,  509,    0,
 
+        0,    0,   16,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,   21,   29,    0,    0,    0,
-        0,   20,   28,    0,   95,  485,  518,   94,  484,  517,
-        0,    0,    0,    0,    0,    0,  121,  200,    0,  166,
-      165,    0,  170,  169,  200,  200,    0,    0,    0,    0,
-        0,    0,    0,    0,  234,  287,    0,  275,  274,  287,
-        0,    0,  294,    0,    0,  293,  355,    0,    0,    0,
+        0,   64,   64,    0,    0,   64,    0,    0,   66,    0,
+        0,   85,   85,   85,   85,   85,    0,    0,   87,    0,
+        0,   96,    0,    0,   98,    0,  111,    0,  105,  104,
+      111,    0,    0,  113,    0,    0,    0,  128,  128,    0,
+        0,    0,    0,  130,    0,    0,    0,    0,    0,    0,
+        0,  143,    0,    0,    0,  158,  158,    0,    0,    0,
+        0,  160,    0,    0,  165,  164,    0,  167,  166,    0,
+        0,  181,  181,  181,  181,    0,    0,  183,    0,  238,
+
+      238,  238,    0,  196,  195,  238,    0,  200,  199,    0,
+        0,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+        0,    0,  240,    0,    0,  245,  244,    0,    0,  251,
+        0,  272,  272,  272,    0,  262,  261,  272,  272,  272,
+        0,    0,  274,    0,    0,  287,    0,  281,  280,    0,
+      283,  282,    0,    0,  289,    0,  298,    0,    0,  300,
+        0,    0,  325,    0,  309,  308,  325,  325,  325,    0,
+        0,  327,    0,  342,    0,  338,  337,    0,    0,  344,
+        0,    0,  349,  348,  355,    0,    0,  357,    0,  368,
+      368,    0,    0,  370,    0,  393,  393,  393,  393,    0,
+
+      383,  382,    0,    0,  393,  393,    0,    0,  395,    0,
+        0,  404,    0,    0,  406,    0,    0,    0,    0,    0,
+      425,  425,  425,  425,  425,    0,    0,  427,    0,    0,
+      432,  431,  438,    0,    0,  440,    0,  469,    0,  453,
+      452,    0,    0,  469,    0,    0,  469,  469,  469,    0,
+        0,  471,    0,    0,    0,    0,    0,  486,    0,    0,
+      488,    0,  499,    0,  495,  494,    0,    0,  501,    0,
+      518,  518,    0,  512,  511,  518,    0,    0,  520,    0,
+      537,    0,  529,  528,  537,  537,    0,    0,  539,    0,
+        0,  552,    0,  546,  545,  552,    0,    0,    0,  554,
+
+        0,  574,  574,  574,    0,    0,  576,    0,    0,  581,
+      580,  605,    0,    0,  607,    0,    0,    0,  626,  626,
+        0,    0,  626,    0,    0,  628,    0,    0,    0,  637,
+      631,    0,    0,   43,    0,   44,    0,    0,    0,    0,
+        0,    0,    0,    0,  254,    0,  303,    0,    0,  373,
+        0,    0,  430,    0,    0,    0,    0,  579,  429,    0,
+        0,    0,    0,    0,  253,    0,  302,  372,    0,    0,
+        0,  578,    0,  578,    0,    0,   50,   49,   64,   64,
+        0,   56,   55,   64,    0,  302,   85,    0,    0,   85,
+       85,   85,    0,    0,   96,    0,  111,  111,    0,    0,
+
+      118,  117,  128,  128,    0,  124,  123,    0,    0,  135,
+      134,    0,  137,  136,    0,    0,  148,  147,  158,  158,
+        0,  154,  153,    0,    0,  169,  168,  181,  181,  181,
+      181,    0,  238,  238,  238,    0,    0,    0,  202,  201,
+      238,  238,  238,  238,  238,  238,  238,  238,  238,  238,
+        0,    0,  272,  272,    0,    0,  272,  272,  272,    0,
+        0,    0,    0,    0,    0,    0,    0,  579,  325,  325,
+      325,  325,    0,  342,    0,  355,    0,    0,    0,  368,
+        0,  393,  393,  393,  393,    0,  385,  384,  393,  393,
+        0,    0,  404,    0,    0,    0,    0,    0,  425,    0,
+
+        0,  425,  425,  425,    0,  438,    0,  469,    0,  455,
+      454,    0,    0,    0,  459,  458,  469,    0,    0,  469,
+        0,    0,  476,  475,    0,  478,  477,  486,    0,  499,
+        0,  518,  518,  518,    0,  537,  537,    0,    0,    0,
+        0,    0,    0,  552,    0,    0,  574,    0,    0,  574,
+        0,  605,    0,    0,  612,  611,  626,  626,    0,  618,
+      617,  626,    0,    0,    0,    0,   12,    0,  634,  635,
+       43,    0,   68,    0,    0,    0,    0,    0,    0,  254,
+        0,    0,  303,    0,    0,  359,  373,    0,    0,  430,
+        0,  474,    0,  542,  579,    0,  429,    0,    0,    0,
+
+        0,    0,  253,    0,    0,  302,  372,  473,    0,  541,
+      578,    0,  474,  473,   64,   64,   64,    0,    0,   85,
+        0,   73,   72,   85,   85,   85,    0,    0,    0,    0,
+        0,  111,  111,    0,  128,  128,    0,    0,  158,  158,
+        0,  181,  181,    0,    0,  181,    0,    0,    0,  238,
+      238,    0,  198,  197,  238,  238,  238,  238,  238,  238,
+        0,    0,  238,  238,  238,    0,    0,  272,  272,    0,
+      260,  259,  272,    0,    0,  272,    0,  360,    0,  279,
+      278,    0,    0,  294,  293,    0,  325,  325,  325,  325,
+        0,  342,    0,    0,    0,    0,    0,  362,  361,  368,
+
+        0,  393,    0,    0,  393,  393,    0,    0,  393,    0,
+        0,  404,    0,   69,    0,    0,    0,  425,    0,  413,
+      412,  425,  425,  425,    0,    0,    0,    0,  469,    0,
+      457,  456,  469,    0,  463,  462,  469,    0,  486,    0,
+      499,    0,  518,  518,  518,    0,  537,    0,    0,    0,
+      533,  532,    0,    0,    0,  544,  543,  552,    0,    0,
+      574,    0,    0,    0,    0,    0,    0,  605,    0,  626,
+      626,  626,    0,    0,    0,    0,   11,   43,    0,   68,
+        0,    0,    0,    0,    0,  242,    0,    0,    0,    0,
+      359,    0,    0,  442,  474,  491,    0,  542,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,  473,  490,    0,
+      541,    0,    0,    0,    0,    0,    0,   64,    0,    0,
+       85,   85,   85,   85,    0,    0,    0,   92,   91,    0,
+      111,  111,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  181,    0,  175,  174,
+        0,    0,    0,    0,  188,  187,    0,    0,  238,  238,
+      238,    0,    0,  238,  238,  238,    0,  222,  221,    0,
+        0,  238,  238,    0,    0,  272,  272,    0,    0,    0,
+      266,  265,  272,    0,  273,  360,    0,    0,  325,  325,
+      325,  325,    0,  326,  342,    0,    0,  351,  350,    0,
+
+      368,    0,  393,    0,  377,  376,    0,    0,  393,    0,
+      387,  386,  393,    0,  394,    0,  404,    0,   69,  243,
+        0,  443,  425,  425,  425,  425,    0,    0,  434,  433,
+        0,  439,  469,  469,  469,    0,  486,    0,  499,    0,
+        0,    0,  518,    0,    0,    0,  537,    0,  531,  530,
+        0,    0,  552,    0,    0,  574,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  570,  569,    0,  605,    0,
+      606,    0,    0,    0,    0,  626,    0,    0,    0,    0,
+        0,    0,   48,    0,    0,    0,    0,    0,  163,  186,
+      242,    0,  292,    0,    0,    0,  408,  442,  491,  504,
+
+        0,    0,   47,    0,    0,    0,    0,  162,  185,    0,
+      291,  490,  503,    0,    0,    0,   52,   51,    0,   54,
+       53,   64,    0,    0,   85,   85,   85,   85,    0,   86,
+        0,    0,  111,    0,    0,    0,    0,  120,  119,    0,
+      122,  121,    0,    0,    0,  150,  149,    0,  152,  151,
+        0,    0,  171,  170,    0,    0,    0,  177,  176,    0,
+        0,  190,  189,  238,  238,  238,    0,  210,  209,    0,
+        0,  238,  238,    0,  224,  223,  238,  238,    0,    0,
+      272,  272,    0,  264,  263,  272,    0,    0,  325,    0,
+        0,  325,  325,  325,  342,    0,    0,  368,    0,  369,
+
+      393,    0,  379,  378,  393,  393,    0,    0,    0,    0,
+      243,  409,  443,  425,  425,  425,  425,    0,  469,    0,
+        0,  469,    0,  486,    0,  487,  499,    0,    0,  506,
+      505,    0,    0,  518,    0,  514,  513,    0,    0,    0,
+      537,    0,    0,  552,    0,    0,  553,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  472,  471,    0,  489,
-      488,    0,    0,    0,  530,    0,    0,    0,  529,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   23,
-        0,    0,    0,   22,    0,   95,  518,   94,  517,    0,
-        0,    0,    0,    0,  200,    0,    0,  200,    0,    0,
-      190,    0,    0,    0,  189,    0,  234,    0,    0,    0,
-        0,    0,    0,    0,    0,  355,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  427,
-      426,    0,    0,    0,    0,    0,  500,    0,    0,    0,
+        0,    0,    0,  614,  613,    0,  616,  615,  626,    0,
+        0,    0,    0,    0,    0,    0,   48,   89,  101,    0,
+        0,    0,  163,  186,    0,  292,  329,    0,  397,  408,
+      504,    0,    0,    0,   47,  100,    0,    0,    0,  162,
+
+      185,    0,  291,  503,    0,    0,    0,   64,    0,  330,
+        0,    0,   85,   85,   85,   90,    0,  111,    0,  107,
+      106,    0,    0,    0,    0,    0,  173,  172,    0,  238,
+      238,  238,    0,  212,  211,  238,  238,  238,    0,    0,
+        0,    0,  250,  272,  272,  272,    0,    0,  325,    0,
+      311,  310,  325,  325,  325,  342,    0,    0,  368,  393,
+      393,  393,  398,    0,  400,  399,    0,  409,    0,    0,
+      425,  425,  425,    0,  469,    0,  461,  460,  469,    0,
+      470,  486,  499,    0,  500,    0,  508,  507,  518,    0,
+        0,  525,  524,  537,    0,    0,  552,  642,    0,  558,
+
+      557,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  626,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   60,    0,   59,    0,
-        0,  108,  200,    0,    0,    0,    0,    0,    0,    0,
-
-      192,    0,    0,  191,  234,    0,  269,  268,    0,    0,
-        0,  296,  298,  295,  297,  355,  379,    0,  378,    0,
-        0,  413,  409,    0,    0,  412,  408,    0,  444,    0,
-      443,    0,  528,    0,    0,  527,    0,    0,    0,  537,
-        0,    0,    0,   12,    0,   12,    0,   33,    0,    0,
-        0,    0,   31,   32,    0,    0,    0,    0,   30,   58,
-       57,  200,    0,    0,    0,    0,    0,  188,  187,    0,
-        0,    0,    0,  234,    0,    0,    0,    0,  355,    0,
-        0,    0,    0,    0,    0,  442,  441,  522,  526,  521,
-      525,    0,    0,    0,    0,    0,    0,    0,    0,   25,
-
-        0,    0,    0,    0,   24,    0,    0,    0,    0,    0,
+       89,  101,    0,    0,    0,  277,  329,    0,  397,    0,
+        0,  610,  100,    0,    0,    0,  276,    0,    0,  609,
+       64,    0,   65,  330,    0,   71,   70,    0,    0,   85,
+       85,   90,    0,    0,    0,    0,    0,    0,    0,    0,
+      182,  238,  238,  238,  238,    0,    0,  238,  238,    0,
+        0,    0,    0,  239,  272,  272,  272,    0,    0,  299,
+        0,    0,  325,  325,  325,  325,    0,    0,    0,    0,
+
+        0,    0,  393,  393,  393,  398,    0,    0,  411,  410,
+        0,    0,  425,  425,    0,  426,    0,    0,  469,  486,
+      499,  518,    0,  519,  537,    0,    0,  552,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  626,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  277,
+      346,    0,    0,  610,    0,    0,    0,  276,    0,    0,
+      609,   64,    0,   75,   74,    0,    0,    0,    0,    0,
+       97,    0,  103,  102,    0,  112,    0,    0,    0,  238,
+
+      238,  238,  238,    0,  214,  213,  238,  238,    0,    0,
+        0,    0,    0,    0,  272,  272,    0,    0,    0,    0,
+      305,  304,  325,  325,  325,    0,    0,    0,    0,    0,
+        0,  343,    0,    0,  364,  363,  393,  393,    0,    0,
+        0,  405,    0,  415,  414,    0,    0,    0,    0,    0,
+        0,    0,  469,  486,  499,  518,  537,    0,  347,  552,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  194,    0,  193,    0,  218,  217,
-        0,    0,    0,    0,    0,    0,    0,  337,  336,    0,
-        0,  407,    0,  406,    0,    0,   11,    0,    0,    0,
+        0,    0,    0,  626,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  196,  195,    0,    0,    0,
 
-        0,    0,    0,  381,  380,    0,    0,    0,    0,    0,
+        0,  133,    0,  346,    0,    0,    0,  132,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   81,   80,    0,
+        0,    0,  238,  238,    0,    0,  238,  238,  238,    0,
+        0,    0,    0,    0,    0,    0,    0,  272,    0,    0,
+        0,  268,  267,    0,  288,  325,  325,  325,    0,  321,
+      320,    0,    0,    0,    0,    0,    0,    0,  393,    0,
+        0,    0,  389,  388,    0,    0,    0,    0,  421,  420,
+        0,    0,    0,    0,    0,    0,  469,    0,    0,    0,
+        0,  518,  537,    0,  347,    0,    0,    0,    0,    0,
+        0,  562,    0,    0,    0,    0,  561,    0,    0,    0,
+
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  627,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  411,  410,    0,    0,    0,   35,    0,    0,
-        0,   34,    0,    0,    0,    0,    0,    0,    0,    0,
+      133,    0,  523,    0,    0,  132,    0,  522,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  238,
+        0,    0,    0,  206,  205,    0,    0,  238,  238,    0,
+        0,    0,    0,    0,    0,    0,    0,  272,    0,  258,
+      257,  325,    0,    0,  325,    0,    0,    0,    0,    0,
+        0,    0,  356,  393,    0,  381,  380,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  469,
+
+        0,    0,    0,    0,  493,  492,    0,    0,    0,    0,
+        0,    0,  548,  547,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   27,    0,    0,   26,    0,    0,    0,    0,
-        0,    0,  178,    0,    0,  177,    0,    0,  277,    0,
-        0,  276,    0,    0,   37,    0,   36,    0,    0,    0,
-        0,  182,    0,  181,    0,  279,    0,  278,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   21,   29,    0,    0,    0,
+        0,   20,   28,    0,  116,    0,  523,  556,  115,    0,
+      522,  555,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  142,    0,  238,    0,  204,  203,    0,  208,
+      207,  238,  238,    0,    0,    0,    0,    0,    0,    0,
+        0,  272,  325,    0,  313,  312,  325,    0,    0,  332,
 
+        0,    0,  331,  393,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  510,  509,    0,  527,  526,    0,    0,
+        0,  568,    0,    0,    0,  567,    0,    0,    0,    0,
+        0,  583,  591,    0,    0,    0,    0,  582,  590,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   23,    0,    0,    0,   22,    0,  116,    0,
+      556,  115,    0,  555,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  238,    0,    0,  238,    0,    0,
+      228,    0,    0,    0,  227,    0,  272,    0,    0,    0,
+
+        0,    0,    0,    0,    0,  393,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  465,
+      464,    0,    0,    0,    0,    0,  538,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  585,    0,    0,    0,
+      584,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  146,  145,
+       60,    0,   59,    0,   77,    0,   76,    0,    0,  129,
+        0,  238,    0,    0,    0,    0,    0,    0,    0,  230,
+        0,    0,  229,  272,    0,  307,  306,    0,    0,    0,
+      334,  336,  333,  335,  393,  417,    0,  416,    0,    0,
+
+      451,  447,    0,    0,  450,  446,    0,  482,    0,  481,
+        0,  566,    0,    0,  565,    0,    0,    0,  575,    0,
+        0,    0,    0,    0,    0,  622,    0,  621,    0,    0,
+        0,    0,   12,    0,   12,    0,   33,    0,    0,    0,
+        0,   31,   32,    0,    0,    0,    0,   30,  146,  145,
+       58,   57,    0,    0,    0,  238,    0,    0,    0,    0,
+        0,  226,  225,    0,    0,    0,    0,  272,    0,    0,
+        0,    0,  393,    0,    0,    0,    0,    0,    0,  480,
+      479,  560,  564,  559,  563,  595,    0,    0,    0,    0,
+      593,  594,    0,    0,    0,    0,  592,  620,  619,    0,
+
+        0,    0,    0,    0,    0,    0,    0,   25,    0,    0,
+        0,    0,   24,    0,    0,    0,    0,  159,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   39,   38,    0,  154,    0,  153,    0,    0,    0,
-        0,    0,    0,  156,  155,  180,  179,  281,  280,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  587,
+        0,    0,    0,    0,  586,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  232,    0,
+      231,    0,  256,  255,    0,    0,    0,    0,    0,    0,
+        0,  375,  374,    0,    0,  445,    0,  444,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,   11,    0,
+        0,    0,    0,    0,    0,    0,    0,   79,   78,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  234,
+      233,    0,    0,    0,    0,    0,    0,  419,  418,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  449,  448,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   35,    0,    0,
+        0,   34,    0,    0,    0,    0,    0,    0,    0,    0,
+
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  597,    0,    0,    0,  596,    0,    0,    0,    0,
+       27,    0,    0,   26,    0,    0,    0,    0,    0,    0,
+      216,    0,    0,  215,    0,    0,  315,    0,    0,  314,
+        0,    0,  589,    0,    0,  588,    0,    0,   37,    0,
+       36,    0,    0,    0,    0,  220,    0,  219,    0,  317,
+        0,  316,    0,    0,  599,    0,  598,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   39,   38,    0,  192,    0,  191,    0,    0,    0,
+        0,  601,  600,    0,    0,  194,  193,  218,  217,  319,
 
+      318,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   13,    0
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,   13,    0
     } ;
 
 static yyconst YY_CHAR yy_ec[256] =
@@ -789,12 +852,12 @@ static yyconst YY_CHAR yy_ec[256] =
        13,   14,   13,   13,   13,   15,   13,   16,   17,   18,
        19,   20,   21,    1,   22,   23,   24,   25,   26,   27,
        28,   29,   30,   31,   32,   33,   34,   35,   36,   37,
-       31,   38,   39,   40,   41,   42,   43,   44,   45,   31,
-       46,    1,   47,    1,   48,    1,   49,   50,   51,   52,
+       31,   38,   39,   40,   41,   42,   43,   44,   45,   46,
+       47,    1,   48,    1,   49,    1,   50,   51,   52,   53,
 
-       53,   54,   55,   56,   57,   58,   59,   60,   61,   62,
-       63,   64,   65,   66,   67,   68,   69,   70,   71,   72,
-       73,   74,    1,    1,    1,    1,    1,    1,    1,    1,
+       54,   55,   56,   57,   58,   59,   60,   61,   62,   63,
+       64,   65,   66,   67,   68,   69,   70,   71,   72,   73,
+       74,   75,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -811,3540 +874,4150 @@ static yyconst YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static yyconst YY_CHAR yy_meta[75] =
+static yyconst YY_CHAR yy_meta[76] =
     {   0,
         1,    2,    2,    2,    1,    1,    1,    1,    1,    3,
         3,    1,    4,    4,    4,    5,    6,    1,    7,    8,
         1,    9,    9,    9,    9,    9,    9,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    1,    1,    5,    9,    9,
-        9,    9,    9,    9,    5,    5,    5,    5,    5,    5,
+        5,    5,    5,    5,    5,    5,    1,    1,    5,    9,
+        9,    9,    9,    9,    9,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5
+        5,    5,    5,    5,    5
     } ;
 
-static yyconst flex_uint16_t yy_base[3813] =
+static yyconst flex_uint16_t yy_base[4472] =
     {   0,
         0,    0,    0,    3,    6,    9,   12,   29,   16,   19,
-       14,   17,   33,   36,   49,   55,   45,   61,  108,  174,
-       66,   72,   75,   78,   83,  128,  131,  134,  138,  141,
-      194,  197,  200,  204,  207,  224,  230,  233,  241,  250,
-      268,  335,  288,  291,  294,  298,  301,  355,  358,  361,
-      402,  472,  365,  368,  542,  602,  422,  425,  662,  729,
-      428,  432,  435,  452,  492,  495,  498,  502,  796,  863,
-      505,  522,  562,  565,  568,  572,  575,  622,  930,  997,
-      625,  628, 1064,    0,  632,  635,  682,  685,  688,  692,
-      695,  749, 1138, 1195,  752,  755,  759,  762,  816,  819,
-
-      822,  826, 1252, 1319,  829,  883,  886,  889,  893,  896,
-      950,  953, 1386, 1455,  956,  960, 1524, 1578,  963, 1017,
-     1020, 1023, 1027, 1030, 1158, 1161, 1632, 1699, 1164, 1168,
-     1171, 1215, 1218, 1221, 1225, 1228, 1766, 1823, 1272, 1275,
-     1880, 1950, 1278, 1282, 2020, 2087, 1339, 1342, 2154, 2221,
-     1345, 1349, 1406, 1409, 2288, 2358, 1412, 1416, 1419, 1475,
-     1478, 1481, 1485, 1488, 1544, 1547, 1550, 1554, 1557, 1598,
-     1601, 1604, 1608, 1611, 1652, 1655, 2428, 2495, 1658, 1662,
-     1665, 1719, 1722, 1725, 1729, 1732, 2562, 2632, 1786, 1789,
-     2702, 2769, 1792, 1796, 2836, 2903, 1799, 1843, 1846, 1849,
-
-     1853, 1856, 1900, 1903, 2970, 3027, 1906, 1910, 3084, 3152,
-     1913, 1930, 1970, 1973, 1976, 1980, 1983, 2000, 3220, 3287,
-     2040, 2043, 2046, 2050, 2053, 2107, 2110, 2113, 3354, 3418,
-     2132, 2134, 3482, 3550, 2174, 2180,    0,    0, 9063,11902,
-    11902,   95,  100,   29,   41,11902,  103,   51,11902,11902,
-     9052,11902,11902, 9039,11902, 9054, 9054,  164,11902,11902,
-    11902,11902, 9048, 9048, 9003,11902,  158, 9027,    0,  142,
-    11902, 8994, 8982,11902,  164, 3614, 8976, 3678, 2187, 1238,
-     9027,   31,11902,  253, 9018,    0,  143,11902, 8968, 8963,
-       84,11902,  258,  253, 9021, 8968,11902,  322, 9007,    0,
-
-      148,11902, 8977,11902,  325,  218,11902,  328, 9003,    0,
-      242,11902, 8973, 8969, 8967,11902,  389,  373,11902,  393,
-     8995,    0,  245,11902, 8947, 8940, 8944,11902,  396, 8997,
-       11,11902,  455, 8984,    0,  313,11902, 8936, 8936,11902,
-      458, 8987,   79,11902,  461, 8978,    0,  446,11902, 8926,
-     8940, 8942, 8924, 8938,   19,11902,  525,  509,11902,  529,
-     8966,    0,  447,11902,  101, 8922, 8928,  317, 8905,  258,
-      531, 8907,11902,  532, 8957,  246,11902,  535, 8944,    0,
-      576,11902, 8911,11902,  652, 8950,  287,11902,  716, 8937,
-        0,  577,11902, 8886, 8892, 8898, 8882,  320,11902,  719,
-
-      112, 8887,  377,11902,  722, 8923,    0,  580,11902, 8879,
-     8889, 8872,11902,  783,  639,11902,  786, 8915,    0,  636,
-    11902, 8877,11902,  789, 2129, 8917,  681,11902,  847, 8908,
-        0,  637,11902, 8878, 8870, 8872,  102,11902,  850, 8908,
-      704,11902,  853, 8895,    0,  640,11902, 8857, 8861,11902,
-      856,  900,11902,  914, 8888,    0,  706,11902, 8855, 8857,
-    11902,  920,  908,11902,  923, 8881,    0,  707,11902, 8851,
-     8831,11902,  980,  967,11902,  989, 8874,    0,  773,11902,
-     8823, 8821, 8824, 8834, 8836,  447,11902, 1047, 1034,  774,
-    11902, 1056, 8860,    0,  840,11902, 8826,11902, 1188, 1305,
-
-      748, 1183,  771, 8814,  815,11902, 1308, 8853,    0,  841,
-    11902, 8803, 8808, 8809, 8803, 8796,11902, 1311,  454, 8810,
-      882,11902, 1370, 8838,    0,  898,11902, 8805, 8803,11902,
-     1375, 1423,11902, 1378, 8831,    0,  964,11902, 8797, 8793,
-     1191, 8795,  137,11902, 1437, 1424,11902, 1444, 8823,    0,
-      965,11902, 8771,  518,11902, 1447, 8825,  204,11902, 1450,
-     8816,    0,  968,11902, 8768, 8778,11902, 1506, 1492,11902,
-     1512, 8809,    0, 1031,11902, 8756, 8760, 8770, 8744,11902,
-     1515, 8804,  949,11902, 1518, 8795,    0, 1032,11902, 8747,
-     8757, 8745, 8746,11902, 1682,  272, 8741, 1171,11902, 1691,
-
-     8781,    0, 1035,11902, 8739, 8743, 8741, 1669, 8742,11902,
-     1694, 8768,    0, 1172,11902, 8727, 8185, 8175,11902, 1749,
-     1736, 1758,  408, 8167,11902, 8228, 8217,11902,11902,11902,
-     1750,  153, 8168, 8167, 8165, 8213,11902,    0, 2120, 8162,
-     8208, 8189, 8153,  328, 1234, 8154, 8147, 8151, 8143, 1128,
-      259, 8132, 8132, 1185, 8155,  396, 1301, 8129, 8119, 8123,
-     1445,  584, 8102, 8103, 8128,  398, 1755,  652,  439,  979,
-    11902,    0, 8089, 8103, 8098, 8087, 8124, 8068,11902,    0,
-     8057, 8067,11902,    0, 8052, 2187, 8041, 8058,11902,    0,
-     8038, 8049, 8045, 8042,11902,    0, 8011, 8020, 8020,11902,
-
-        0, 2241, 2244, 8000, 8009, 8009, 8006, 7996, 7994,11902,
-        0, 7985, 2254, 7966, 2308, 7957, 7963, 7959, 7968, 7967,
-     7942, 7961, 7955, 7945, 7934, 7945,11902,    0, 2311, 7943,
-    11902,    0, 7925,  175, 2314, 7905, 7918, 7917, 7908, 7900,
-    11902,    0, 7890, 2317, 2320, 7891,11902,    0, 7868, 7869,
-     7886,11902,    0, 7861, 2338, 7844, 7852, 7851, 7838,11902,
-        0, 7827, 2378, 7832,11902,    0, 2381, 7829, 7826,11902,
-        0, 7825, 7821, 7821,11902,    0, 7832, 7831, 7802, 2384,
-     7796, 7809, 7808, 7790, 7788,11902,    0, 7780, 7773, 1506,
-     1812, 1242, 1514, 1813,11902,    0, 7774, 7763, 7769, 7779,
-
-     7767, 7749, 7742,11902,    0, 2387, 7746, 7741,11902,    0,
-     7741, 2390, 7723, 7745, 7702, 7710, 7705, 7701, 7679,11902,
-        0, 7676, 7683, 7672, 7657,11902,    0, 7659, 2408, 7654,
-    11902,    0, 7644, 7647, 2448, 7640, 7636,11902,    0, 7635,
-     2451, 7640, 7607, 7613, 7615,11902,    0, 7609, 2454, 7601,
-      512, 7594, 7641,11902,    0, 7606, 7588, 7593, 7572, 7608,
-     7613, 1272, 7561,11902, 1925,    0, 7556, 7539, 7584, 7582,
-     7534,11902, 2457, 2006, 7528, 2192, 2516, 2077, 7539, 7529,
-     7515, 7527, 7507, 7497, 7491, 7505, 7493, 1266, 7500, 7499,
-     7484, 7479, 7471, 7475, 7478, 7463, 2081, 7473, 7455, 7468,
-
-     7447, 7444, 7453, 7440, 7448, 7430, 7425, 7438, 2142, 7416,
-     7415, 2460, 2526, 2519, 2529, 2262, 2582, 7420, 7412, 2523,
-     2592, 7423, 2585, 2341, 7412, 2595, 2652, 2603, 2666, 2657,
-     2660, 2663, 2671, 2722, 2725, 2735, 2728, 2411, 2748, 2614,
-     2790, 2798, 2801, 2808, 2865, 2740, 2876, 1869, 2794, 2622,
-     7405, 2862, 2689, 2868, 7400, 7391, 7390, 7385, 7373, 7369,
-     7378, 7375, 7356, 2871, 2926, 2929, 2819, 2932, 2936, 7360,
-     7349, 7357, 2939, 2891, 7360, 7354, 7334, 2990, 2993, 1306,
-     7335, 2999, 2957, 3003, 3048, 3056, 3059, 7326, 3062, 3106,
-     2213, 7326, 3109, 3066, 7323, 7309, 7305, 3112, 3117, 7319,
-
-     3121, 3140, 3173, 3185, 3176, 3188, 7286, 3180, 3248, 7301,
-     7282, 3241, 3252, 7289,    3, 7279, 3244, 3204, 3255, 7290,
-     7265, 3310, 3317, 7283, 7263, 3320, 3323, 7263, 7258, 7257,
-     7267, 7248, 7251, 7252, 7238, 3374, 3377, 7248, 3383, 3276,
-     7232, 3386, 3389, 7240, 3438, 3343, 3442, 7226, 3447, 7230,
-     7233, 7232, 3450, 3456, 3504, 3507, 3511, 3514, 3517, 7213,
-     3529, 3401, 3571, 3574, 7225, 7205, 3579, 3465, 7218, 3582,
-     3585, 7193, 3597, 3536, 7207, 7201, 3604, 3608, 1333, 7195,
-     3611, 3636, 7190, 7221, 3629, 3648,11902, 7179, 7187, 7182,
-     3652, 3657, 7212,11902,11902,  882, 7170,11902, 7202, 7200,
-
-     7149,11902,11902, 7144, 3682,11902,11902, 7139, 3690, 3693,
-    11902, 3699, 1941, 7126, 7119, 7127, 7136, 7126, 7109, 7114,
-     7099, 7105, 7105, 7102, 7092, 7077, 7074,  718, 7085, 7068,
-     7068, 7074, 1566, 2070, 7061, 7060, 7069, 7059, 7048, 7039,
-     7046, 7042, 7034, 7026, 7023, 7035, 7007, 7001, 3702, 3745,
-     6999, 6988, 3705, 3753, 7000, 3713, 3761,11902, 3764, 6988,
-     6993, 3767, 3770,11902, 3773, 6973, 3776,11902,11902, 6974,
-     3792, 3795,11902, 3798, 3801, 3804, 6968, 6964, 3819, 3823,
-     3831, 3837,11902, 3840, 3843, 3850, 3861, 3864, 3872, 3875,
-    11902, 3879, 3882,11902,11902, 3894,11902,11902, 3903, 3906,
-
-     6972, 6976, 6973, 6967, 3914, 3917,11902, 3921, 6951, 6971,
-     6941, 3924,11902,11902, 3936, 3942,11902,11902, 3950, 3954,
-     6922, 6937, 6917, 6922, 6912, 6907, 6909, 6898, 1247, 3962,
-     3970,11902, 3973, 3977,11902,11902, 3985, 3992,11902, 3995,
-     6892, 6893, 3998, 4004,11902,11902, 6853, 6868, 6864, 4016,
-     4019,11902, 4023, 6837, 4026, 4029,11902,11902, 4044,11902,
-    11902, 4052, 4056,11902, 4059, 4062, 4065, 4071,11902, 4080,
-     6827, 4090,11902,11902, 6830, 6830, 6833, 4084, 4099,11902,
-     4103, 6833, 4106,11902,11902, 4114, 4118,11902, 4125, 4133,
-    11902,11902, 6823, 4144, 4147,11902, 4150, 4153, 4156, 4159,
-
-     4174,11902, 4178, 6815, 6811, 6803, 6814, 4182,11902,11902,
-     4193, 4197, 6810, 6798, 4205, 4211,11902, 4214, 6780, 6789,
-     4217, 4220,11902, 4224, 6788, 1567, 6784, 6767, 4239, 6785,
-     6783, 6759, 4246, 4249,11902, 4252, 6757, 4259,11902,11902,
-     6761, 4272, 4275,11902, 4278, 6740, 4281,11902,11902, 4297,
-     4300, 4308, 4315, 4319, 6751, 4327, 6732, 4333, 4336,11902,
-     4340, 4345, 4348, 4359, 4363, 6723, 4371, 4377,11902, 4380,
-     6723, 4383,11902,11902, 4391, 4401,11902, 4404, 6715, 6706,
-     4410,11902,11902, 6728, 4423, 4426,11902, 4430, 6703, 4433,
-    11902,11902, 6675, 4449, 4452, 4455,11902, 4458, 6651, 4461,
-
-     4479,11902,11902, 4467, 6653, 4487, 4492,11902, 4495, 6615,
-     4498, 6610, 4502, 4506,11902, 4516,  888, 4521,11902,11902,
-     6551, 6541, 6494, 4525,11902, 6458, 6454, 6446, 6396, 6374,
-     6313, 6307, 2073, 6294, 2281, 6301, 6291, 2116, 6304, 6286,
-     2216, 6201, 6132, 6066, 6057, 2272, 6035, 6047, 6020, 5997,
-     5974, 2350, 5870, 2420, 2486, 5855, 5807, 5798, 5722, 5719,
-     4529,11902,11902, 5684,   38, 4544,11902,11902,   26, 4552,
-     2829, 4555, 4558,   43,  195, 4564, 4567,11902,11902,  181,
-      216, 4577,11902,11902, 4585, 4588,11902,11902, 4597,11902,
-    11902, 4605, 4608,11902,11902,  239,  326, 4616,  370, 4626,
-
-     4629, 4634, 4637, 4640, 4658, 4666,11902,11902, 4647, 4674,
-     4677, 4685, 4688, 4695, 4706, 4709, 4713, 4716, 4727, 4735,
-      395,  460, 4739, 4742,  488, 4757,  525, 4760,  526, 4763,
-     4766, 4781, 4784, 4789, 4802,  539,  567,  616,  654, 4805,
-      636, 4809, 4812, 4816, 4831, 4835,  650, 4843,  658, 4851,
-      703,  715, 4869,11902,11902, 4855,  726, 4863,  782,  776,
-     4877,  784,  922,  932, 1005, 4882, 4885, 1086, 1112, 1130,
-     4896, 1119, 4900, 4904, 1138, 4908,11902,11902, 4918, 4924,
-     4932,11902,11902, 1162, 4940, 4946, 1173, 4954, 4958,11902,
-    11902, 4967,11902,11902, 1169, 4975, 1211, 4978, 1231, 1227,
-
-     1302, 4981, 1293, 4984, 4988, 5006, 5014, 1299, 5017, 5020,
-     1310, 1362, 5028, 1355, 5035, 5047, 5038, 5056, 1603, 1405,
-     5061,11902, 1406,11902,11902, 1376, 1374, 1418, 1423, 1427,
-     1442, 1447, 1468, 2490, 1480, 1512, 2557, 1516, 1525, 2684,
-     2762, 1513, 1527, 2965, 1548, 3411, 1565, 3212, 3021, 1553,
-     1564, 1561, 1610, 1618, 3215, 1612, 1623, 3314, 3476, 5064,
-     1622, 3618, 5067, 5070, 5080, 5083, 5086, 5089, 1636, 5092,
-     5113, 5121, 1636, 1618, 5124, 5135, 5143, 5146, 5153, 5157,
-     5161, 5165, 5183, 5175, 5168, 5193, 5196, 5204, 5207, 5213,
-    11902,11902, 5225, 5229, 5232, 5235, 5238, 5243, 5256, 5261,
-
-     5274, 5280, 5285, 5298, 5303, 1665, 1668, 5306,11902,11902,
-     5317, 5322, 5328, 1684, 5341, 3644, 5344,11902,11902, 5352,
-     5361,11902,11902, 5355, 1687, 1669, 1689, 1700, 5374, 1698,
-     5377, 5380, 5383, 5399, 5402,11902,11902, 1705, 5410, 1732,
-     5413, 5425, 5418, 1735, 5436, 5439, 1751, 5447, 1743, 1747,
-     5450, 1756, 1749, 1758, 1757, 5454,11902,11902, 1782, 1794,
-     1794, 5462, 1810, 5469, 5477, 5472, 1800, 5487,11902,11902,
-     1816, 5496,11902,11902, 1807, 5504, 1830, 5507, 1849, 5510,
-     5514, 5517, 5535, 5538, 1852, 5542, 5546, 5562,11902,11902,
-     5570, 1874, 5573,11902,11902, 1866, 1885, 5589, 1862, 5592,
-
-     1966, 2511, 5601, 5604, 5612, 1929, 1997, 1961,11902, 5619,
-     1882, 1879, 1884, 1968, 1879, 1926, 3728, 1936, 1947, 1943,
-     1949, 5622, 1950, 1952, 5625, 5631, 5637, 1983, 5641, 2000,
-     2007, 2000, 2048, 1995, 1999, 2012, 2025, 5644, 5647, 2050,
-     5650, 2075, 5653, 5657, 5665, 5671, 2070, 5679, 2061, 5683,
-    11902,11902, 5691, 2062, 5694, 5698, 5701, 5706, 5719, 5722,
-     5730, 5733, 5737, 5756, 5764, 5767,11902,11902, 5775, 5778,
-     5786, 5789,11902,11902, 5799, 5805, 2075, 2100, 2094, 5813,
-     5817, 5825, 2113, 2137, 5831,11902,11902, 5839, 5843, 2121,
-     2115, 5851, 5857, 2145, 2158, 5860, 5863, 5872,11902,11902,
-
-     2153, 5880,11902, 5883, 5886, 5889, 2145, 5892, 2201, 2193,
-     5895,11902, 2189, 5899, 5914,11902,11902, 5922, 2224, 5925,
-     2202, 5928,11902,11902, 5945, 5949, 2212, 5957,11902,11902,
-     2205, 5965,11902, 2203, 5969, 5972, 5975, 2210, 5978, 2218,
-     2225, 2218, 2247, 5987, 2263, 5991,11902,11902, 5999,11902,
-     2263, 6002, 2271, 6006, 2274, 6009, 2283, 6012, 6020, 6034,
-     6042, 6045, 6049, 6066, 6069, 6073,11902,11902, 6081, 2273,
-     2287, 2324, 6089, 6092, 2326, 2313, 2377, 2314, 2333, 2320,
-     2386, 2337, 6096,11902,11902, 6104, 2375, 2460, 2399, 6110,
-     6116, 6124, 2328, 2349, 2379, 2358, 6128, 6131, 6135, 2363,
-
-     6138, 2364, 2378, 2405, 6141, 6144, 6147, 6151, 2406, 6154,
-     2418, 2433, 2414, 6157, 6160, 2416, 6163, 6166, 6169, 2418,
-     6172,11902,11902, 6180,11902,11902, 2432, 6188, 2423, 6191,
-     2430, 6194, 6198, 6212, 6216,11902,11902, 6224,11902,11902,
-     6232, 6235, 6240,11902,11902, 6256, 6259, 6274,11902,11902,
-     6267, 6282,11902,11902, 2455, 2464, 2487, 6290,11902,11902,
-     6298, 6301, 2485, 2475, 6309,11902,11902, 2497, 6317, 6320,
-     6323, 2487, 2484, 6328,11902,11902, 2493, 6342, 6345, 2500,
-     6348, 6351, 2503, 2527, 2532, 2538, 6367, 6370, 2549, 6373,
-    11902, 2543, 6376,11902,11902, 2542, 2551, 2552, 6392, 6398,
-
-     6406, 6410, 6413, 6416, 6419, 6425, 6428, 6437, 6446, 2546,
-     2561, 6449, 6455, 2580, 6467, 2579, 6471,11902, 2580, 6477,
-     6480,11902,11902, 6497, 6500, 2589, 6508,11902,11902, 6516,
-     6519, 6522, 2603, 6530, 2611, 2624, 2636, 6537,11902, 6540,
-     6543, 2649, 2655, 2656, 2662, 2673, 2665, 2695, 2695, 2705,
-     2720, 6551, 6558, 2736, 2809, 6561, 2984, 3943, 6570, 6573,
-     6577, 2687, 2685, 6582, 6585, 2699, 6588, 6591, 2698, 6594,
-     6597, 6601, 2694, 2723, 6604, 6607, 2725, 2726, 6610, 6613,
-     2747, 6616, 6619, 2739, 2752, 2769, 6622, 6625, 6628, 6631,
-     6634,11902,11902, 6642, 6649, 6652, 6655,11902,11902, 6663,
-
-     2764, 2777, 2839, 6671,11902,11902, 6682, 2796, 2799, 6687,
-     6696, 6690, 6705,11902, 2805, 2810, 2832, 6709, 6714, 6717,
-     6724,11902,11902, 6720, 6738, 6741, 6744, 6747, 6750, 6770,
-     2829, 2837, 2839, 6776, 6779,11902,11902, 6788, 6793, 6796,
-     6801, 6809, 6815, 6818, 6821, 6827, 6836, 6841,11902,11902,
-     6850, 6854,11902, 2849, 2848, 6857,11902, 6861,11902,11902,
-     2829, 6876, 6879,11902,11902, 2853, 6887, 2864, 2869,11902,
-     6891,11902,11902, 2919, 2905, 2921, 2919, 2927, 2929, 2917,
-     2936, 2932, 2939, 6899, 6902, 3029, 3023, 2938, 2943, 3058,
-     2941, 2955, 2954, 2958, 3069, 2957, 2996, 6906, 6909, 2992,
-
-     2999, 6912, 6921, 3007, 6924, 3004, 3021, 6927, 3037, 3038,
-     6930, 3034, 3055, 3074, 6934,11902, 6937, 6940, 6944, 6947,
-     6955, 6965, 6968, 6974,11902, 3088, 3077, 3074, 3098, 6977,
-     6980, 3088, 3097, 6989, 3784, 3862, 6997,11902, 3083, 3114,
-     7000, 7003, 7006,11902, 7009, 7012, 3131, 3126, 3136, 7030,
-     7036, 7039, 7048, 7054, 7057, 7061, 3134, 3137, 7069, 7075,
-     7078, 7081,11902,11902, 7089, 7093, 7101, 7107, 7110,11902,
-     7119, 7125, 7129, 7137, 3151, 3145, 3172, 7143,11902, 3185,
-     7146, 3189, 3189, 3221, 3217, 3234, 3222, 3248, 3232, 3228,
-     3248, 3236, 3261, 7149, 3290, 3492, 3319, 3234, 3251, 3265,
-
-     3269, 3269, 3262, 3266, 3278, 3278, 3282, 3289, 3283, 3315,
-     3342, 7155, 7158, 3332, 3345, 3330, 3359, 7168, 3352, 3364,
-     7171, 7175,11902, 7178,11902,11902, 7189,11902, 7195, 7198,
-     3370, 3388, 7201, 3380, 7204,11902,11902, 3399, 3394, 3425,
-     3503, 3437, 3443, 3557, 3462, 3431, 7219, 7222, 7225, 7233,
-     7240,11902,11902, 3465, 3471, 3470, 7248, 7253, 7266, 3632,
-     3999, 7261,11902, 7274, 7280,11902,11902, 3470, 7288, 7293,
-     7296, 7306,11902, 7311,11902,11902, 7320, 7325, 7333, 7338,
-     7347, 3687, 3715, 7355, 7358, 7361, 3491, 3493, 7364, 7367,
-     7379, 3517, 3544, 3568, 3571, 3589, 3574, 3595, 3599, 3603,
-
-     3618, 7383, 3609, 3649, 3698, 3567, 3582, 3570, 3584, 3609,
-     3630, 3620, 3630, 3617, 3638, 3667, 3677, 3668, 7386, 7389,
-     3684, 3690, 3675, 7392, 3699, 3707, 7397, 7402, 7410, 7418,
-     3698, 7421, 7424, 7430, 7444, 3732, 3733, 3766, 3749, 3769,
-     3754, 3792, 3776, 3795, 3781, 3783, 7447, 7450, 7458,11902,
-    11902, 7466,11902, 3776, 7470, 3786, 7474,11902,11902, 3812,
-     3814, 3818, 3822, 3825, 3832, 7488, 3823, 7491, 7494, 7503,
-    11902,11902, 7511, 3876, 3904, 7519,11902,11902, 3834, 3854,
-     3914, 3855, 3858, 3969, 7527, 7530, 7533, 7541, 7548, 7559,
-     7562, 7565, 7568, 7571, 7589, 3886, 3871, 3886, 3890,11902,
-
-     3910, 3905, 3905, 3917,11902, 7580, 3941, 3994, 7584, 3894,
-     3917, 3940, 3997, 4005, 3956, 3969, 3974, 3992, 4042, 4043,
-     4010, 4018, 7603, 7606, 4009, 4025, 7609, 7612, 4012, 7615,
-     4079, 4095, 7623, 7628, 4029, 7632, 7635, 7643,11902,11902,
-     7651, 7654, 4022, 4031, 4070, 4063, 4073, 4084, 4104, 4085,
-     4101, 4102, 4090, 7662,11902,11902, 4113, 7670, 7673, 4095,
-     4126, 4136, 4167, 4131, 4148, 4180, 7681,11902, 4136, 7684,
-    11902,11902, 4162, 4167, 4174, 4184, 4189, 4194, 4195, 4204,
-     4211, 4200, 4201, 4210, 7692, 7696, 4225, 4251, 7704,11902,
-    11902, 7712, 7715, 7723, 7726, 7734, 7737,11902,11902, 4199,
-
-     4223, 4240, 4235, 4219, 4242, 4262, 4266, 7745, 4304, 7748,
-     7753, 7757, 4236, 4223, 4287,11902,11902, 4242, 4244, 4237,
-     4298,11902,11902, 4256, 7767, 7772, 7776, 7779, 7782, 7786,
-     4277, 4288, 4284, 4300, 7789, 7795,11902, 4275, 7798,11902,
-    11902, 7808,11902,11902, 7816, 4266, 4309, 4315, 4353, 4329,
-     4334, 4331, 4367, 4338, 4331, 7819, 7822,11902,11902, 7830,
-     4355, 4370,11902, 4363, 4373,11902, 4344, 4383, 4371, 4389,
-     4378, 4383, 4394, 4397, 4384, 4396, 4412, 4415, 4402, 7837,
-     7841, 4408, 4419, 4411, 4422, 7849,11902,11902, 7857,11902,
-    11902, 7865, 4437, 4437,11902, 4444, 4447, 4447,11902, 4449,
-
-     7868, 4514, 7871, 7874, 7893, 7936, 7983, 4418, 4421,11902,
-     4435, 4437, 4445,11902, 4456, 7901, 7904, 7907, 7912, 4508,
-     4477, 4528, 4500, 7915, 4489, 7927, 7918, 7930, 4508, 4511,
-    11902, 4545, 4517, 4525,11902, 4555, 4515, 7948, 7956, 7974,
-     7966, 4576, 4579, 4584, 4586, 4536, 4592, 4562, 4595, 4573,
-     4591, 4615, 4616, 4584, 4601, 4636, 4638, 4612, 8003,11902,
-    11902, 4649, 4618, 4649, 4624, 7977,11902, 4659, 4638, 4640,
-     4665, 4649, 4651, 8011, 4674, 8014, 4716, 4686, 8034, 8081,
-     4926, 4636, 4695, 5241, 4654, 4696,11902, 4715,11902, 4715,
-     8024,11902, 4653, 8054, 4751, 4803, 8045, 8063, 4700, 4707,
-
-    11902, 4723, 4726,11902, 4700, 8101,11902,11902, 8109, 4813,
-     4821,11902,11902,11902,11902, 4703,11902, 4749,11902, 4751,
-     4760,11902,11902, 4758, 4783,11902,11902, 4761,11902, 4794,
-    11902, 4793,11902, 4804, 4811,11902, 4812, 4814, 8071,11902,
-     4831, 4870, 4806, 4818, 4823, 4847, 8074,11902, 4795, 4828,
-     4819, 4889,11902,11902, 4827, 4847, 4846, 4916,11902,11902,
-    11902, 8117, 4924, 4886, 4953, 4889, 8120,11902,11902, 4890,
-     4905, 4906, 4928, 8128, 4992, 4934, 5003, 4943, 8131, 4951,
-     4955, 4981, 4971, 4984, 4974,11902,11902,11902,11902,11902,
-    11902, 8135, 4996, 4983, 4996, 8138, 4962, 4945, 4961,11902,
-
-     4979, 4986, 4977, 4986,11902, 5006, 8141, 8150, 5021, 5029,
-     5053, 5037, 5045, 5075, 5053, 5094, 5056, 5094, 8159, 8162,
-     5064, 5073, 5086, 5070, 5079, 5091, 8170, 8173, 5078, 5080,
-     5115, 5107, 5123, 5112, 8181, 5115, 5085, 5102, 5074, 5100,
-     5098, 5135, 5112, 5132, 8184, 5164, 5216, 5153, 5160, 5163,
-     5167, 5181, 5180, 5218,11902, 5216,11902, 8193,11902,11902,
-     5212, 5219, 5215, 5219, 5228, 5231, 8201,11902,11902, 5265,
-     5263,11902, 5240,11902, 5245, 5272,11902, 5222, 5224, 5227,
-     5240, 5234, 5237, 5244, 5257, 5292, 5287, 5300, 5298, 5298,
-     5308, 5309, 5308, 5314, 5316,11902,11902, 5319, 5326, 5326,
-
-     5332, 5343, 5343,11902,11902, 5365, 5364, 5354, 5326, 5337,
-     5385, 5342, 5334, 5345, 5398, 5356, 5370, 5396, 5383, 5404,
-     5396, 5394, 5411, 5407, 5405, 5422, 5424, 5421, 5443, 5432,
-     5436, 5459,11902,11902, 5483, 5431, 5434,11902, 5488, 5441,
-     5444,11902, 5492, 5485, 5487, 5489, 5490, 5503, 5494, 5526,
-     5508, 5498, 5534, 5521, 5514, 5547, 5530, 5520, 5550, 5558,
-     5502, 5563,11902, 5510, 5571,11902, 5551, 5557, 5556, 5562,
-     5583, 5564,11902, 5590, 5567,11902, 5596, 5578,11902, 5603,
-     5584,11902, 5642, 5545,11902, 5557,11902, 5594, 5611, 5600,
-     5633,11902, 5638,11902, 5644,11902, 5645,11902, 5652, 8209,
-
-     5673, 5679, 5664, 5685, 5680, 5698, 5670, 5672, 5673, 5675,
-     8212,11902,11902, 5721,11902, 5720,11902, 5724, 5733, 5737,
-     5736, 5729, 5743,11902,11902,11902,11902,11902,11902, 5728,
-     5737, 5744, 5754, 5766, 5784, 5735, 5894, 5734, 5893, 5923,
-     5924, 5790, 5887, 5793, 5811, 5860, 5937, 5818, 5963, 5804,
-     5918, 5942, 5976, 5913, 6005, 6030, 6045, 6007, 6008, 5902,
-     5966, 5967, 5997, 6014, 6157, 6011, 6061, 6159, 6168, 6220,
-     6236, 6167, 6209, 6183, 6186, 6185, 6262, 6252, 6259, 6054,
-     6160, 6270, 6278, 6069, 6275, 6318, 6322, 6294, 6321, 6190,
-     6230, 6346, 6348, 6247, 6336, 6369, 6405, 6371, 6422, 6386,
-
-     6435, 6413, 6425, 6434, 6473, 6470, 6515, 6509, 6619, 6447,
-     6487, 6475, 6627, 6485, 6621, 6640, 6711, 6629, 6651, 6372,
-     6659, 6712, 6717, 6694, 6718, 6735, 6741, 6456, 5816, 8220,
-     8223,11902,11902, 8243, 8252, 8261, 8270, 8279, 8288, 8297,
-     8306, 8315, 8324, 8333, 8342, 8351, 8360, 8369, 8378, 8387,
-     8396, 8405, 8414, 8423, 8432, 8441, 8450, 8459, 8468, 8477,
-     8486, 8495, 8504, 8513, 8522, 8531, 8540, 8549, 8558, 8567,
-     8576, 8585, 8594, 8603, 8612, 8621, 8630, 8639, 8648, 8657,
-     8666, 8675, 8684, 8693, 8702, 8711, 8720, 8729, 8738, 8747,
-     8756, 8765, 8774, 8781, 8788, 8795, 8802, 8809, 8816, 8823,
-
-     8830, 8837, 8844, 8851, 8858, 8865, 8872, 8879, 8886, 8893,
-     8900, 8907, 8914, 8921, 8928, 8935, 8942, 8949, 8956, 8963,
-     8972, 8979, 8984, 8991, 8996, 9003, 9008, 9015, 9020, 9027,
-     9032, 9039, 9044, 9051, 9056, 9063, 9068, 9075, 9080, 9087,
-     9092, 9099, 9104, 9111, 9116, 9123, 9128, 9135, 9140, 9147,
-     9152, 9159, 9164, 9171, 9176, 9183, 9188, 9195, 9200, 9207,
-     9212, 9219, 9224, 9231, 9236, 9243, 9248, 9255, 9260, 9267,
-     9272, 9279, 9284, 9291, 9296, 9305, 9311, 9318, 9326, 9334,
-     9342, 9349, 9357, 9364, 9372, 9380, 9388, 9396, 9404, 9412,
-     9420, 9427, 9435, 9443, 9450, 9458, 9465, 9473, 9480, 9488,
-
-     9495, 9503, 9510, 9518, 9525, 9533, 9540, 9548, 9555, 9563,
-     9570, 9578, 9585, 9593, 9600, 9608, 9615, 9623, 9631, 9639,
-     9646, 9654, 9661, 9669, 9676, 9684, 9691, 9699, 9706, 9714,
-     9723, 9729, 9736, 9744, 9751, 9759, 9766, 9774, 9781, 9789,
-     9796, 9804, 9812, 9819, 9827, 9834, 9842, 9850, 9857, 9865,
-     9873, 9881, 9889, 9897, 9904, 9912, 9919, 9927, 9934, 9942,
-     9950, 9958, 9965, 9973, 9980, 9988, 9995,10003,10010,10018,
-    10025,10033,10040,10048,10055,10063,10070,10078,10085,10093,
-    10101,10109,10116,10124,10133,10142,10149,10156,10164,10172,
-    10180,10187,10195,10202,10210,10218,10225,10233,10241,10249,
-
-    10257,10264,10272,10280,10288,10295,10303,10310,10318,10326,
-    10334,10341,10349,10356,10364,10371,10379,10386,10394,10402,
-    10410,10417,10425,10432,10440,10447,10455,10462,10470,10477,
-    10485,10492,10500,10507,10515,10524,10533,10540,10548,10556,
-    10564,10571,10579,10587,10595,10603,10611,10619,10627,10635,
-    10643,10650,10658,10666,10674,10681,10689,10696,10704,10712,
-    10719,10727,10734,10742,10749,10757,10764,10772,10780,10787,
-    10795,10802,10810,10817,10825,10833,10841,10848,10856,10863,
-    10871,10878,10886,10895,10904,10912,10919,10927,10935,10942,
-    10950,10958,10966,10974,10982,10989,10997,11005,11012,11020,
-
-    11028,11035,11042,11050,11058,11065,11073,11080,11088,11096,
-    11103,11111,11118,11126,11133,11141,11148,11156,11164,11172,
-    11180,11188,11195,11203,11211,11219,11228,11237,11244,11252,
-    11260,11267,11275,11283,11291,11299,11306,11314,11322,11329,
-    11337,11345,11352,11359,11367,11375,11382,11389,11397,11405,
-    11413,11420,11428,11435,11442,11450,11457,11465,11472,11480,
-    11487,11495,11504,11513,11520,11528,11536,11544,11552,11560,
-    11568,11576,11583,11591,11598,11606,11614,11622,11630,11638,
-    11646,11654,11661,11669,11677,11685,11693,11700,11707,11714,
-    11722,11729,11737,11744,11752,11761,11770,11777,11785,11793,
-
-    11801,11809,11816,11823,11831,11838,11847,11856,11865,11874,
-    11883,11892
+       14,   17,   33,   36,   49,   55,   45,   61,  109,  176,
+       66,   72,   76,   79,   83,  129,  132,  135,  140,  157,
+      196,  199,  202,  207,  224,  227,  233,  236,  244,  253,
+      271,  339,  291,  294,  297,  302,  319,  359,  362,  365,
+      407,  475,  370,  387,  427,  430,  433,  438,  455,  495,
+      543,  614,  498,  501,  685,  746,  506,  523,  807,  875,
+      563,  566,  569,  574,  591,  594,  634,  637,  943, 1011,
+      640,  645,  662,  665,  705,  708,  711,  716, 1079, 1147,
+      766,  769,  772,  777,  827,  830,  833,  838, 1215, 1283,
+
+      855,  895, 1351, 1420,  898,  901,  906,  923,  963,  966,
+      969,  974, 1489, 1547,  991, 1031, 1034, 1037, 1042, 1059,
+     1099, 1102, 1605, 1673, 1105, 1110, 1127, 1167, 1170, 1173,
+     1178, 1195, 1741, 1811, 1235, 1238, 1881, 1936, 1241, 1246,
+     1303, 1306, 1309, 1314, 1371, 1374, 1991, 2059, 1377, 1382,
+     1440, 1443, 1446, 1451, 1509, 1512, 2127, 2185, 1515, 1520,
+     2243, 2314, 1567, 1570, 2385, 2453, 1573, 1578, 2521, 2589,
+     1625, 1628, 1631, 1636, 2657, 2728, 1693, 1696, 1699, 1704,
+     1761, 1764, 1767, 1772, 1789, 1831, 1834, 1837, 1842, 1859,
+     1901, 1904, 1907, 1912, 1956, 1959, 2799, 2867, 1962, 1967,
+
+     2011, 2014, 2017, 2022, 2079, 2082, 2935, 3006, 2085, 2090,
+     3077, 3145, 2147, 2150, 3213, 3281, 2153, 2158, 2205, 2208,
+     2211, 2216, 2263, 2266, 3349, 3407, 2269, 2274, 3465, 3534,
+     2291, 2294, 2334, 2337, 2340, 2345, 2362, 2365, 3603, 3671,
+     2405, 2408, 2411, 2416, 2433, 2473, 2476, 2479, 3739, 3804,
+      204, 2495, 3869, 3938, 2484, 2502, 4007, 4074, 2542, 2545,
+     2548, 2552, 2609, 2612, 2615, 2620, 2677, 2680, 2683, 2688,
+     2705, 2708, 2748, 2751, 2754, 2759, 2776, 2779, 4141, 4209,
+     2819, 2822, 2825, 2830, 2847, 2887, 2890, 2893,    0,    0,
+    10406,13997,13997,   96,  100,   29,   41,13997,  103,   51,
+
+    13997,13997,10395,13997,13997,10380,13997,10395,10395,  674,
+    13997,13997,13997,13997,10389,10389,10343,13997,  160,10366,
+        0,   87,13997,10332,10320,13997,  166, 4273,10314, 4344,
+     2906, 1200,10366,   31,13997,  169,10357,    0,  120,13997,
+    10304,10299,   21,13997,  256,  154,   84,  153,13997,  261,
+    10350,    0,  211,13997,10295,10300,10305,10295,10288,13997,
+      264,   16,10306,  237,13997,  326,10331,    0,  248,13997,
+    10300,13997,  329,  305,13997,  332,10329,    0,  282,13997,
+    10294,10290,10292,13997,  394,  373,13997,  397,10317,    0,
+      350,13997,10268,10263,10263,13997,  400,  453,  249,13997,
+
+      466,10309,    0,  418,13997,10260,10256,13997,  534,  521,
+      381,13997,  597,10302,    0,  439,13997,10253,10244,10248,
+    13997,  600,  595,  426,13997,  668,10294,    0,  442,13997,
+    10237,10255,10257,10235,10251,   81,13997,  671,  716,13997,
+      674,10280,    0,  445,13997,  141, 9610, 9620,   90, 9604,
+       27,  450, 9606,13997,  796, 9657,  441,13997,  799, 9648,
+        0,  507,13997, 9614,13997,  862, 9654,  509,13997,  865,
+     9645,    0,  554,13997, 9592, 9598, 9607, 9584,  242,13997,
+      868,  313, 9589,  594,13997,  930, 9621,    0,  584,13997,
+     9576, 9585, 9568,13997,  933,  784,13997,  936, 9612,    0,
+
+      625,13997, 9568,13997,  995, 2911, 9612,  713,13997,  998,
+     9603,    0,  696,13997, 9571, 9563, 9565,  164,13997, 1001,
+     9597,  726,13997, 1004, 9588,    0,  818,13997, 9540, 9544,
+    13997, 1063,  841,13997, 1066, 9575,    0,  886,13997, 9534,
+     9536,13997, 1069,  909,13997, 1072, 9564,    0,  954,13997,
+     9531, 9507,13997, 1134, 1113,13997, 1137, 9555,    0, 1022,
+    13997, 9498, 9496, 9499, 9509, 9501,  514,13997, 1140, 1181,
+     1187,13997, 1202, 9530,    0, 1090,13997, 9487,13997, 1207,
+     1534,  664, 1203,  727,  677,  773,13997, 1275, 9512,    0,
+     1158,13997, 9461, 9459, 9464, 9457, 9446,13997, 1333,  258,
+
+      917,13997, 1336, 9494,    0, 1226,13997, 9455, 9447,13997,
+     1343, 1321,13997, 1402, 9476,    0, 1253,13997, 9430, 9427,
+     1265, 9427,  920,13997, 1411, 1389,13997, 1471, 9455,    0,
+     1362,13997, 9403,  583,13997, 1480, 1395, 1045,13997, 1537,
+     9449,    0, 1431,13997, 9404, 9413,13997, 1540, 1458,13997,
+     1600, 9429,    0, 1500,13997, 9379, 9373, 9380, 9357,13997,
+     1656, 9418, 1189,13997, 1662, 9408,    0, 1524,13997, 9361,
+     9370, 9355, 9348,13997, 1665,  449, 9343, 1195,13997, 1724,
+     9383,    0, 1558,13997, 9340, 9344, 9341, 1775, 9332,13997,
+     1730, 9345,    0, 1616,13997, 9302, 9304, 9292,13997, 1733,
+
+     1845,13997, 1798, 9338,    0, 1640,13997, 9303, 9287,13997,
+     1801, 4415, 9285, 2977, 1234,13997, 1806, 9318,    0, 1651,
+    13997, 9265, 9249,  776,13997, 1868, 1522, 1249, 1871, 1247,
+     9240,13997, 9301, 9290,13997,13997,13997, 1973,   90, 9239,
+     9228, 9216, 9265,13997,    0, 2555, 9213, 9256, 9238, 1276,
+      332,  320, 9210, 9209, 9213, 9205, 1651,  467, 9198, 9199,
+     9200, 1859, 9211,  712,  856, 9185, 9184, 9183, 1914,  797,
+     9169, 9165, 9166, 9187,  732, 1969,  992, 9156,  868, 1069,
+    13997,    0, 9145, 9164, 9159, 9138, 9177, 9139,13997,    0,
+     9129, 9123, 9128, 9139, 9136, 9134, 1330,13997,    0, 9122,
+
+     9131,13997,    0, 9098, 2897, 9091, 9092,13997,    0, 9071,
+     9090, 9085, 9085,13997,    0, 9065, 9070, 9070,13997,    0,
+     9046, 9061, 9057, 9048,13997,    0, 2900, 2958, 9029, 9034,
+     9034, 9031, 9022, 9022,13997,    0, 9020, 3028, 9001, 3031,
+     8993, 8995, 8992, 9000, 8993, 8975, 8992, 8987, 8984, 8973,
+     8984,13997,    0, 3036, 8975,13997,    0, 8975,  177, 3054,
+     8951, 8965, 8967, 8952, 8944,13997,    0, 8934, 3057, 3097,
+     8944,13997,    0, 8938, 8940, 8957, 8929,13997,    0, 8928,
+     3100, 8905, 8923, 8921, 8909,13997,    0, 8901, 3103, 8884,
+    13997,    0, 3107, 8883, 8880,13997,    0, 8878, 8871, 8872,
+
+    13997,    0, 8882, 8871, 8855, 3110, 8844, 8857, 8860, 8843,
+     8829,13997,    0, 8822, 8814, 1341, 1401, 1980, 1416, 1528,
+     1983,13997,    0, 8815, 8808, 8807, 8818, 8815, 8795,13997,
+        0, 3165, 8798, 8792,13997,    0, 8789, 3168, 8772, 8793,
+     8779, 8787, 8775, 8775, 8759,13997,    0, 8756, 8770, 8759,
+     8752,13997,    0, 8742, 3171, 8731,13997,    0, 8727, 8722,
+     3175, 8719, 8712,13997,    0, 8710, 3178, 8719, 8679, 8685,
+     8687,13997,    0, 8689, 3233, 8681,   13, 8673, 8720,13997,
+        0, 8681, 8671, 8682, 8655,13997,    0, 3236, 8653, 8643,
+    13997,    0, 8648, 8656, 8644, 8633, 8618, 8672, 8665, 1693,
+
+     8612,13997, 1918,    0, 8607, 8603, 8649, 8647, 8599,13997,
+     3239, 2109, 8588, 2964, 3301, 2052, 8586, 8598, 8597, 8583,
+     8591, 8567, 8573, 8557, 8571, 8552, 1406, 8560, 8562, 8543,
+     8543, 8534, 8529, 8540, 8522, 8520, 2175, 8526, 8508, 8521,
+     8499, 8500, 8514, 8502, 8509, 8488, 8493, 8501, 8487, 2233,
+     8478, 8474, 8465, 3243, 3312, 3246, 3316, 3304, 3307, 8471,
+     8480, 8460, 8446, 8449, 8432, 3369, 3379, 8440, 8415, 3372,
+     3382, 8431, 3431, 2301, 8425, 3436, 3440, 3443, 3497, 3485,
+     3489, 3494, 3503, 3554, 3557, 3560, 3568, 3572, 3624, 3627,
+     3633, 3691, 2372, 3694, 2436, 3697, 3718, 3762, 3772, 3776,
+
+     3642, 3780, 1866, 3766, 2505, 8424, 3825, 2574, 3830, 8410,
+     8402, 8410, 8393, 8381, 8374, 8386, 8375, 8364, 3833, 3836,
+     3839, 2640, 3843, 3890, 8369, 8355, 8367, 3896, 2711, 8364,
+     8355, 8339, 3899, 3902, 1687, 8343, 3905, 2782, 3909, 2988,
+     3958, 3967, 8351, 3961, 3970, 2584, 8337, 8335, 3980, 3063,
+     8333, 8309, 8305, 3973, 4032, 8316, 4037, 3128, 4040, 4043,
+     4047, 3196, 8288, 4094, 4100, 8301, 8283, 4103, 4106, 8291,
+      385, 8277, 4109, 3265, 4114, 8289, 8268, 4163, 4171, 8286,
+     8266, 4175, 4178, 8254, 8259, 8251, 8250, 8258, 8240, 8224,
+     8229, 8215, 4182, 4229, 4232, 3335, 8207, 4238, 4241, 8222,
+
+     4244, 3522, 4250, 8211, 4264, 8211, 8214, 8217, 4268, 4271,
+     4278, 4296, 4299, 4302, 4307, 8197, 4310, 3591, 4342, 4350,
+     8213, 8192, 4353, 3654, 8206, 4356, 4365, 8189, 4371, 3700,
+     8203, 8182, 4377, 4380, 1725, 8180, 4384, 3722, 8175, 8207,
+     4413, 4419,13997, 8168, 8170, 8153, 4422, 4426, 4389, 3928,
+     8129, 4441, 4448, 4451, 4455, 4460, 4485, 4493, 4496, 8176,
+    13997,13997,  721, 8130,13997, 8173, 8171, 8090,13997,13997,
+     8088, 4055,13997,13997, 8090, 4499, 4507,13997, 4518, 1876,
+     8075, 8074, 8063, 8066, 8074, 8053, 8042, 8053, 8031, 8038,
+     8037, 8042, 8026, 8020, 8017,  477, 8028, 8011, 8011, 8021,
+
+     8012, 1721, 2119, 7972, 7974, 7983, 7957, 7945, 7937, 7943,
+     7932, 7919, 7916, 7916, 7930, 7926, 7908, 7922, 7905, 4522,
+     4197, 7905, 7889, 4526, 4530, 7901, 4546, 4549,13997, 4552,
+     7893, 7881, 4540, 7899, 7893, 7862, 4559, 4571,13997, 4574,
+     7854, 7864, 4578, 4581,13997, 4584, 7839, 4593,13997,13997,
+     7843, 4603, 4606,13997, 4609, 4612, 4618, 7832, 7831, 4630,
+     4633, 4642, 4648,13997, 4651, 4654, 4661, 4672, 4675, 4683,
+     4686,13997, 4690, 4693, 4696, 7827, 7820, 4705, 4711, 4719,
+     4723,13997, 4726, 4729,13997,13997, 4738,13997,13997, 4746,
+     4750, 7821, 7811, 7795, 7789, 4758, 4764,13997, 4767, 7773,
+
+     7772, 7762, 4770,13997,13997, 4778, 4786,13997,13997, 4796,
+     4799, 7734, 7698, 7676, 7679, 7672, 7649, 7653, 7641, 1129,
+     4807, 4810,13997, 4817, 4820,13997,13997, 4829, 4832,13997,
+     4836, 7611, 7598, 4839, 4842,13997,13997, 7557, 7481, 7473,
+     4851, 4857,13997, 4860, 7460, 4863, 4866,13997,13997, 4882,
+    13997,13997, 4890, 4893,13997, 4898, 4901, 4904, 4912,13997,
+     4919, 7452, 7365, 4927,13997,13997, 7351, 7354, 7317, 4923,
+     4938,13997, 4942, 7309, 4945,13997,13997, 4953, 4957,13997,
+     4961, 4966,13997,13997, 7220, 4976, 4980,13997, 4983, 4987,
+     4990, 4995, 5008,13997, 5014, 7142, 7066, 7035, 6932, 5017,
+
+    13997,13997, 5027, 5035, 6892, 6885, 5045, 5048,13997, 5051,
+     6810,   13, 5054, 5057,13997, 5060,   25,  119, 1732,  197,
+      244, 5079,  267,  288,  307, 5083, 5086,13997, 5089, 5093,
+    13997,13997,  325, 5109, 5112,13997, 5115,  385, 5118,13997,
+    13997, 5135, 5138, 5146, 5153, 5157,  420, 5165,  421, 5171,
+     5174,13997, 5178, 5183, 5186, 5197, 5201,  480, 5209, 5215,
+    13997, 5218,  487, 5221,13997,13997, 5229, 5240,13997, 5243,
+      528,  531, 5248,13997,13997,  558, 5262, 5265,13997, 5269,
+      554, 5272,13997,13997,  549, 5288, 5291, 5294,13997, 5297,
+      557, 5300, 5306,13997,13997, 5318,  588, 5321, 5324,13997,
+
+     5327,  591, 5332,  597, 5336, 5346,13997, 5350, 5356,13997,
+    13997,  595, 5365, 5369,13997, 5372, 5376, 5384,  586,  612,
+     5394, 5399,  628, 5407, 5412,13997, 5416, 1309, 5419,13997,
+    13997,  667,  705,  681, 5422,13997,  713,  721,  782,  798,
+      784,  811,  842,  854, 2179,  845, 2237,  918,  911, 2122,
+      928,  931, 2515,  922,  934,  960,  993, 2650, 2858,  978,
+      999,  983,  990,  985, 2999, 1008, 3139, 3206, 1061, 1066,
+     1067, 3274, 1068, 3391, 1070, 5441,13997,13997, 1077, 1131,
+     5449,13997,13997, 1115, 5426, 3402, 1129, 5457, 5460, 1120,
+     1156, 1222, 5468, 1213, 5478, 5471, 1223, 1268, 5482, 5490,
+
+    13997,13997, 1253, 1273, 5501,13997,13997, 5509, 5512,13997,
+    13997, 5521,13997,13997, 5531, 5534,13997,13997, 1318, 1336,
+     5543,13997,13997, 5551, 5554,13997,13997, 1317, 1341, 5563,
+     1323, 5566, 5570, 5573, 5576, 5581, 5600, 5608,13997,13997,
+     5594, 5616, 5619, 5625, 5628, 5637, 5648, 5651, 5655, 5658,
+     5661, 5676, 1361, 1359, 5669, 5680, 1403, 5695, 1428, 5699,
+     1417, 5702, 5706, 5714, 5723, 5734, 5742, 3992, 1462, 1473,
+     1463, 1479, 5745, 1462, 5749, 5752, 5756, 5770, 5775, 1476,
+     5784, 1485, 5788, 1521, 1535, 5791,13997,13997, 5809, 1548,
+     5812, 1543, 1536, 5815, 1569, 1583, 1588, 1580, 1589, 5818,
+
+     5821, 1579, 1592, 1602, 5836, 5839, 5842, 1612, 5846,13997,
+    13997, 5857, 5861, 5869,13997,13997, 1621, 5878, 5883, 1635,
+     5891, 5896,13997,13997, 5906,13997,13997, 1635, 5914, 1651,
+     5917, 1653, 1652, 1663, 5920, 1656, 5923, 5926, 5929, 5944,
+     1663, 5947, 5950, 1677, 1717, 5958, 1709, 5965, 5968, 5977,
+     5986, 1714, 5989, 5995,13997,13997, 1712, 1731, 6010,13997,
+    13997, 1729, 6019, 1822, 1786, 6022,13997, 1807,13997,13997,
+     1787, 1778, 3516, 1794, 1787, 1785, 1800, 1802, 1809, 3586,
+     1807, 1823, 3664, 1845, 1863, 3732, 3759, 1854, 1853, 3786,
+     1861, 3799, 1868, 3999, 3923, 1888, 4002, 1898, 1908, 1905,
+
+     1922, 1924, 4065, 1918, 1929, 4068, 4127, 4503, 1933, 6025,
+     4132, 1926, 6028, 6031, 6042, 6045, 6048, 6051, 1955, 1958,
+     6054,13997,13997, 1969, 1967, 1962, 6066, 1979, 6075, 6078,
+     6086, 1990, 1971, 6098, 6101, 6105, 6108, 6123, 6127, 6132,
+     6135, 6138, 6150, 6156, 6159, 6168, 6175, 6178, 6190, 6181,
+     6186, 6204,13997,13997, 6212, 6215, 6218, 6221, 6224, 6242,
+     6245, 6248, 6256, 6266, 6274, 6284, 6287, 1997, 1988, 6293,
+    13997,13997, 6306, 6309, 6315, 1998, 6329, 4135, 6332,13997,
+    13997, 6340, 6348,13997,13997, 6344, 2004, 1984, 2019, 2035,
+     6359, 2033, 6363, 6366, 6369, 6378, 6384,13997,13997, 2041,
+
+     6393, 2045, 6397, 6400, 6415, 2035, 6418, 6421, 2044, 6429,
+     2037, 2039, 6438, 6441, 2048, 2037, 2047, 2050, 6444,13997,
+    13997, 2058, 2082, 2089, 6452, 6457, 6461, 6471, 2090, 6475,
+    13997,13997, 2102, 6483,13997,13997, 2093, 6492, 2099, 6495,
+     2104, 6498, 6501, 6505, 6519, 6523, 2100, 6526, 6530, 6538,
+    13997,13997, 6551, 2121, 6555,13997,13997, 2114, 2133, 6563,
+     2115, 6566, 3303, 3609, 6574, 6578, 6586, 2145, 6592, 6595,
+     6600, 6605, 6618, 2262, 2196, 2254,13997, 6623, 2163, 6626,
+     2158, 2159, 2308, 2155, 2158, 6629, 2169, 2176, 2162, 2210,
+     6632, 2212, 2212, 6641, 6644, 6647, 2229, 6650, 2233, 2218,
+
+     2235, 2239, 2379, 2237, 2244, 2255, 2291, 6655, 6658, 2296,
+     6661, 2299, 2283, 6664, 6667, 6675, 6678, 2298, 6686, 2288,
+     2296, 2298, 2300, 2313, 6689, 2310, 6693,13997,13997, 6708,
+     2308, 6701, 6711, 6714, 6720, 6732, 6735, 6743, 6746, 6750,
+     6755, 6768, 6774, 6782, 6786, 6789, 6797, 6804,13997,13997,
+     6815, 6818, 6826, 6829,13997,13997, 6837, 6845, 2321, 2333,
+     2324, 6840, 6858, 6866, 2358, 2372, 6869,13997,13997, 6879,
+     6884, 2355, 2350, 6892, 6897, 2369, 2378, 6900, 6904, 6912,
+    13997,13997, 2372, 6920,13997, 6923, 6927, 6930, 2362, 6933,
+     2392, 2385, 6939,13997, 2380, 6952, 6958,13997,13997, 6966,
+
+     2416, 6971, 2389, 6975,13997,13997, 6990, 6993, 2399, 7004,
+    13997,13997, 2392, 7014,13997, 2385, 7017, 7020, 7023, 7026,
+     2401, 7029, 2421, 2423, 2419, 2432, 7035, 7039,13997,13997,
+     7047,13997, 2428, 7050, 2435, 7054, 2437, 7057, 2446, 7060,
+     7068, 7079, 7087, 7090, 7093, 7108, 7111, 7115,13997,13997,
+     7129, 2445, 2460, 2493, 7135, 7138, 2515, 2517, 2545, 2524,
+     2540, 2528, 2598, 2528, 7141,13997,13997, 7149, 7159, 7163,
+    13997, 7168, 7171, 7186, 7190, 2523, 7198, 2605, 2669, 2565,
+     7204, 7207, 7217, 2515, 2551, 2582, 2562, 2565, 7222, 7225,
+     7228, 2571, 7231, 2572, 2578, 2586, 7234, 7237, 7240, 7243,
+
+     2591, 2587, 7246, 2619, 2654, 2630, 2632, 7249, 7252, 2634,
+     7255, 7261, 7264, 2635, 2631, 7267,13997,13997, 7275,13997,
+    13997, 2650, 7283, 2640, 7286, 7291, 7295, 7298, 7304,13997,
+     2647, 7316, 2661, 7319, 7323, 7331, 7337,13997,13997, 7346,
+    13997,13997, 7354, 7361, 7364,13997,13997, 7380,13997,13997,
+     7388, 7394,13997,13997, 7402, 7407, 7416,13997,13997, 7424,
+     7427,13997,13997, 2656, 2661, 2675, 7436,13997,13997, 7444,
+     7447, 2672, 2662, 7455,13997,13997, 2694, 7463, 7466, 7469,
+     2698, 2691, 7472,13997,13997, 2703, 7481, 7488, 2708, 7492,
+     7496, 2712, 2703, 2709, 2708, 7510, 7515, 2720, 7518,13997,
+
+     2713, 7522,13997,13997, 2718, 2728, 2728, 7541, 7544, 7552,
+     7555, 7559, 7562, 7565, 7571, 7574, 7583, 7579, 2725, 7592,
+     7601, 2743, 7610, 2743, 7613,13997, 2727, 7618, 7625,13997,
+    13997, 7633, 7640, 2729, 7651,13997,13997, 7659, 7662, 7665,
+     2746, 7673, 2763, 2773, 2788, 7680,13997, 7683, 7686, 2801,
+     2799, 2799, 2806, 2816, 2809, 2806, 2812, 2818, 2829, 7694,
+     7701, 7706, 7715,13997,13997, 7726,13997,13997, 2805, 7734,
+     7737, 2846, 2838, 7741, 5101, 7353, 7749, 7756, 7759, 2797,
+     2813, 2835, 7762, 7765, 2847, 7768, 7771, 2845, 7774, 7777,
+     7780, 2843, 2850, 2863, 7783, 7786, 2853, 2851, 2862, 7789,
+
+     7792, 2866, 7795, 7798, 2860, 2867, 2878, 2884, 7803, 7806,
+     7809, 7812, 7822, 7827, 7830, 7833, 7836, 7840, 7848,13997,
+    13997, 7858, 7862, 7865, 7868, 7871,13997,13997, 7887, 2895,
+     2900, 2913, 7890,13997,13997, 7900, 2895, 2903, 7906, 7911,
+     7919, 7924,13997, 2912, 2918, 2924, 7931, 7934, 7938, 7943,
+    13997,13997, 7956, 7959, 7962, 7965, 7968, 7987, 7993, 2921,
+     2931, 2933, 7996, 7999,13997,13997, 8007, 8015, 8018, 8026,
+     8022, 8036, 8040, 8043, 8046, 8058,13997,13997, 8049, 8054,
+    13997, 2938, 2941, 8068,13997, 8073,13997,13997, 2922, 8081,
+     8089,13997,13997, 2924, 8100, 2936, 2935,13997, 8103,13997,
+
+    13997, 2980, 2982, 3003, 3004, 3011, 3016, 3003, 3019, 3017,
+     3025, 8111, 8119, 8092, 8105, 3012, 8133, 8139, 3055, 3103,
+     3002, 3010, 3057, 3006, 3013, 3013, 3035, 3115, 3051, 3059,
+     8142, 8148, 3056, 3052, 3074, 8152, 8158, 3071, 8161, 3064,
+     3077, 8164, 8167, 3119, 3117, 3135, 8170, 3117, 3132, 8174,
+     3135, 8177,13997, 8180, 8183,13997,13997, 8191, 8197, 8205,
+     8209, 8212, 8215, 8218, 8223, 8236, 8239, 8242, 8245, 8248,
+    13997, 3155, 3143, 3139, 3179, 8251, 8269, 3183, 3197, 8277,
+     3232, 3363, 8285,13997, 3184, 3186, 8288, 8291, 8294,13997,
+     8297, 8315, 3201, 3202, 3203, 8323, 8326, 8329, 8300, 8337,
+
+     8344, 8350, 3201, 3205, 8358, 8362, 8365, 8369,13997,13997,
+     8377, 8380, 8388, 8391, 8395,13997, 8400, 8414, 3217, 3218,
+     3212, 3232, 8409,13997, 3248, 8422, 3252, 3248, 3280, 3276,
+     3295, 3284, 3318, 3302, 3298, 3313, 3328, 3354, 8429, 3326,
+     3333, 3362, 3334, 3342, 3369, 3378, 3387, 3373, 3383, 3391,
+     8432, 3433, 3444, 3644, 3388, 3402, 3399, 3420, 3432, 3432,
+     3438, 3451, 3447, 3460, 3464, 3458, 3460, 3478, 3495, 8435,
+     8441, 3501, 3513, 8444, 3499, 3524, 3541, 8451, 3518, 3531,
+     8454, 8457, 8460,13997,13997, 8468, 8471, 8479, 8491, 8486,
+    13997, 8499,13997,13997, 8507,13997, 8510, 8513, 8516, 3531,
+
+     3538, 8519, 3530, 8522,13997,13997, 3543, 3533, 3581, 3619,
+     3597, 3601, 3637, 3613, 3580, 8537, 8540, 8543, 8551, 8558,
+    13997,13997, 3611, 3633, 3647, 8573, 8577, 8585, 4251, 4291,
+     8593,13997, 8596, 8599,13997,13997, 3637, 8607, 8615, 8618,
+     8626,13997, 8629,13997,13997, 8637, 8641, 8649, 8656, 8667,
+     3692, 3829, 3648, 8675, 8678, 3660, 3661, 8681, 8684, 8687,
+     3702, 3716, 3731, 3745, 3765, 3742, 3755, 3768, 3771, 3787,
+     8696, 3728, 3740, 3784, 3789, 3792, 3786, 3790, 3802, 3801,
+     3807, 3822, 3820, 8700, 8705, 3947, 3916, 3960, 3827, 3836,
+     3840, 3857, 3866, 3871, 3865, 3875, 3894, 3927, 3935, 3941,
+
+     3931, 8708, 3965, 8711, 3978, 3985, 3969, 8718, 3989, 4008,
+     4021, 8724, 8727, 8735, 4102, 4138, 8743,13997,13997, 8754,
+     8758, 8761, 4035, 8764, 8767, 8773, 8785, 4048, 4061, 4097,
+     4084, 4103, 4119, 4146, 4129, 4149, 4134, 4138, 8788, 8791,
+     8799,13997,13997, 8807,13997, 4129, 8811, 4140, 8814,13997,
+    13997, 4157, 4160, 4167, 4169, 4171, 4171, 8829, 4188, 8832,
+     8835, 8844,13997,13997, 8852, 4282, 4312, 8860,13997,13997,
+     4200, 4214, 4329, 4217, 4223, 4396, 4197, 8868, 8871, 8879,
+     8882, 8890, 8893, 8897, 8900, 8903, 8912, 4239, 4237, 4239,
+     4245,13997, 4264, 4248, 4248, 4275,13997, 8921, 4251, 4268,
+
+     4259, 4275, 4285, 4293, 4279, 4303, 4303, 4317, 4335, 4348,
+     8924, 8927, 8935,13997, 4379, 4384, 8944, 4338, 4342, 4379,
+     4429, 4432, 4380, 4378, 4388, 4407, 4460, 4462, 4414, 4424,
+     8947, 4411, 8950, 4416, 4437, 8954, 4422, 8957, 4425, 8963,
+     4522, 4523, 4484, 4489, 4487, 4492, 8974, 8977, 8980, 4470,
+     8983, 8986, 9001,13997,13997, 9009, 9012, 4461, 4470, 4512,
+     4497, 4524, 4524, 4543, 4540, 4550, 4551, 4538, 9020,13997,
+    13997, 4546, 9028, 9031, 4529, 4574, 4583, 4619, 4585, 4595,
+     4629, 9046,13997, 4586, 9049,13997,13997, 4617, 4622, 4629,
+     4634, 4644, 4634, 4637, 4652, 4660, 4648, 4666, 4676, 9057,
+
+     9061, 4740, 4748, 9069,13997,13997, 9077, 9080, 9088, 9091,
+     9099, 9102,13997,13997, 4671, 4696, 4713, 4712, 4696, 4715,
+     4736, 4729, 9110, 4688, 4690, 4710, 4758, 4771, 4725, 4725,
+     4728, 4751, 4797, 4798, 4755, 9114, 4812, 4838, 4854, 9122,
+     9125, 9129, 4763, 4756, 4822,13997,13997, 4797, 4822, 4809,
+     4870,13997,13997, 4828, 9144, 4820, 9148, 9152, 9155, 4821,
+     9161, 9164, 4862, 4885, 4876, 4891, 4893, 4895, 4909, 4898,
+     9167, 9170,13997, 9173, 4880, 9176,13997,13997, 9192,13997,
+    13997, 9200, 4882, 4916, 4913, 4961, 4935, 4940, 4948, 4986,
+     4962, 4944, 9203, 9206,13997,13997, 9214, 4969, 4981,13997,
+
+     4973, 4987,13997, 4956, 4996, 4986, 5001, 4993, 4998, 5009,
+     5017, 5004, 5010, 5040, 5042, 5030, 9221, 9225, 5034, 5046,
+     5037, 5049, 9233,13997,13997, 9242,13997,13997, 9250, 5047,
+     5048,13997, 5049, 5065, 5070,13997, 5071, 9253, 5050, 5038,
+     5102,13997,13997, 5070, 5076, 5062, 5124,13997,13997, 5081,
+     5109, 5120, 5115, 5126, 5142, 9256, 9259, 9278, 9322, 9370,
+     5091, 5097,13997, 5112, 5104, 5116,13997, 5135, 9286, 5142,
+     9289, 9292, 5143, 9297, 5202, 5170, 5205, 5176, 5220, 5188,
+     5225, 5196, 9300, 9312, 5185, 9333, 9303, 9342, 5204, 5202,
+    13997, 5242, 5218, 5217,13997, 5247, 5197, 9345, 9351, 9364,
+
+     9390, 5253, 5255, 5253, 5261, 5216, 5273, 5240, 5274, 5244,
+     5261, 5281, 5299, 5266, 5291, 5309, 5323, 5302, 9398,13997,
+    13997, 5337, 5306, 5337, 5316, 9406,13997, 5351, 5330, 5331,
+     5372, 5350, 5351, 9409, 5324, 5327,13997, 5341, 5337, 5339,
+    13997, 5349, 5406, 5378, 5422, 5394, 5428, 9418, 5448, 5429,
+     9438, 9486, 5609, 5384, 5431, 6367, 5391, 5447, 9315, 9382,
+    13997, 5451,13997, 5456,13997, 5445,13997, 5455, 9412,13997,
+     9458, 5404, 9461, 5462, 5481, 9432, 9470, 5456, 5461,13997,
+     5471, 5474,13997, 5452, 9507,13997,13997, 9515, 5492, 5523,
+    13997,13997,13997,13997, 5455,13997, 5495,13997, 5500, 5512,
+
+    13997,13997, 5490, 5525,13997,13997, 5506,13997, 5542,13997,
+     5552,13997, 5558, 5581,13997, 5579, 5581, 9479,13997, 6510,
+     5541, 5587, 6849, 5544, 5590,13997, 5599,13997, 5598, 5623,
+     5670, 5625, 5602, 5719, 5607, 9523,13997, 5558, 5583, 5573,
+     5663,13997,13997, 5601, 5641, 5629, 5726,13997, 9450, 9498,
+    13997,13997, 5656, 5669, 9526, 9533, 5689, 5684, 5739, 5694,
+     9536,13997,13997, 5699, 5707, 5708, 5731, 9545, 5741, 5735,
+     5744, 5738, 9551, 5732, 5737, 5781, 5772, 5784, 5775,13997,
+    13997,13997,13997,13997,13997,13997, 5735, 5756, 5744, 5827,
+    13997,13997, 5759, 5779, 5767, 5844,13997,13997,13997, 9554,
+
+     5828, 5815, 5845, 9557, 5807, 5797, 5802,13997, 5824, 5827,
+     5814, 5823,13997, 5841, 5856, 5861, 9563,13997, 9569, 9576,
+     5863, 5871, 5884, 5873, 5881, 5914, 5894, 5935, 5898, 5946,
+     9587, 9590, 5917, 5925, 5941, 5925, 5940, 5953, 9598, 9601,
+     5936, 5942, 5979, 5972, 5986, 5978, 5952, 5934, 5938,13997,
+     5957, 5958, 5946, 5950,13997, 5968, 9610, 6000, 5980, 5997,
+     5970, 5989, 6003, 6022, 5995, 6014, 6066, 6066, 9616, 6058,
+     6105, 6046, 6058, 6054, 6059, 6066, 6075, 6108,13997, 6107,
+    13997, 9625,13997,13997, 6080, 6086, 6084, 6086, 6112, 6109,
+     9633,13997,13997, 6144, 6147,13997, 6130,13997, 6132, 6111,
+
+     6133, 6104, 6134, 6142, 6161, 6132, 6152, 6210,13997, 6145,
+     6145, 6161, 6175, 6169, 6168, 6168, 6182,13997,13997, 6219,
+     6213, 6234, 6233, 6233, 6240, 6240, 6241, 6247, 6248,13997,
+    13997, 6250, 6256, 6257, 6254, 6267, 6268,13997,13997, 6294,
+     6292, 6239, 6238, 6238, 6257, 6251, 6253, 6254, 6266, 6317,
+     6263, 6273, 6323, 6285, 6277, 6301, 6349, 6305, 6334, 6355,
+     6344, 6369, 6368, 6367, 6385, 6374, 6374, 6401, 6391, 6388,
+     6410, 6399, 6397, 6426,13997,13997, 6389, 6403, 6460, 6414,
+     6406, 6417, 6471, 6428, 6470, 6428, 6434,13997, 6505, 6458,
+     6460,13997, 6508, 6482, 6493, 6509, 6510, 6525, 6523, 6556,
+
+     6537, 6542, 6576, 6560, 6554, 6586, 6574, 6568, 6601, 6556,
+     6559,13997, 6609, 6561, 6564,13997, 6614, 6681, 6576, 6633,
+    13997, 6580, 6646,13997, 6644, 6649, 6655, 6660, 6692, 6667,
+    13997, 6699, 6686,13997, 6715, 6692,13997, 6718, 6697,13997,
+     6671, 6734,13997, 6681, 6734,13997, 6740, 6682,13997, 6691,
+    13997, 6730, 6743, 6736, 6754,13997, 6755,13997, 6756,13997,
+     6768,13997, 6770, 6723,13997, 6729,13997, 9641, 6798, 6800,
+     6786, 6809, 6797, 6816, 6782, 6792, 6793, 6801, 6846, 6844,
+     9644,13997,13997, 6849,13997, 6848,13997, 6857, 6856, 6860,
+     6868,13997,13997, 6871, 6891,13997,13997,13997,13997,13997,
+
+    13997, 6889, 6918, 6929, 6931, 6900, 6924, 6960, 6985, 6872,
+     6885, 6951, 6991, 6946, 7055, 7015, 7046, 7024, 7045, 7078,
+     7100, 7058, 7059, 7088, 7128, 6937, 7048, 7148, 7171, 7102,
+     7156, 6992, 7080, 7197, 7240, 7263, 7292, 7159, 7255, 7262,
+     7333, 7184, 7382, 7164, 7289, 7134, 7252, 7308, 7334, 7311,
+     7365, 7026, 7322, 7404, 7421, 7397, 7442, 7387, 7440, 7423,
+     7467, 7276, 7435, 7457, 7512, 7489, 7490, 7460, 7484, 7521,
+     7551, 7581, 7612, 7161, 7571, 7517, 7577, 7468, 7572, 7636,
+     7653, 7586, 7588, 7603, 7660, 7658, 7681, 7797, 7800, 7638,
+     7702, 7589, 7722, 7703, 7833, 7529, 7807, 7863, 7877, 7973,
+
+     7271, 9652, 9655,13997,13997, 9675, 9684, 9693, 9702, 9711,
+     9720, 9729, 9738, 9747, 9756, 9765, 9774, 9783, 9792, 9801,
+     9810, 9819, 9828, 9837, 9846, 9855, 9864, 9873, 9882, 9891,
+     9900, 9909, 9918, 9927, 9936, 9945, 9954, 9963, 9972, 9981,
+     9990, 9999,10008,10017,10026,10035,10044,10053,10062,10071,
+    10080,10089,10098,10107,10116,10125,10134,10143,10152,10161,
+    10170,10179,10188,10197,10206,10215,10224,10233,10242,10251,
+    10260,10269,10278,10287,10294,10301,10308,10315,10322,10329,
+    10336,10343,10350,10357,10364,10371,10378,10385,10392,10399,
+    10406,10413,10420,10427,10434,10441,10448,10455,10462,10469,
+
+    10476,10483,10490,10497,10504,10513,10520,10525,10532,10537,
+    10544,10549,10556,10561,10568,10573,10580,10585,10592,10597,
+    10604,10609,10616,10621,10628,10633,10640,10645,10652,10657,
+    10664,10669,10676,10681,10688,10693,10700,10705,10712,10717,
+    10724,10729,10736,10741,10748,10753,10760,10765,10772,10777,
+    10784,10789,10796,10801,10808,10813,10820,10825,10832,10837,
+    10844,10849,10856,10861,10868,10873,10880,10885,10894,10900,
+    10907,10915,10923,10931,10938,10946,10953,10961,10968,10976,
+    10984,10992,11000,11008,11016,11024,11032,11040,11047,11055,
+    11063,11070,11078,11085,11093,11100,11108,11115,11123,11130,
+
+    11138,11145,11153,11160,11168,11175,11183,11190,11198,11205,
+    11213,11220,11228,11235,11243,11251,11259,11266,11274,11281,
+    11289,11296,11304,11311,11319,11326,11334,11341,11349,11357,
+    11365,11374,11380,11387,11395,11402,11410,11417,11425,11432,
+    11440,11447,11455,11462,11470,11478,11485,11493,11500,11508,
+    11515,11523,11531,11538,11546,11554,11562,11570,11578,11585,
+    11593,11600,11608,11615,11623,11631,11639,11646,11654,11661,
+    11669,11676,11684,11691,11699,11706,11714,11721,11729,11736,
+    11744,11751,11759,11766,11774,11782,11790,11797,11805,11812,
+    11820,11827,11835,11844,11853,11860,11867,11875,11882,11890,
+
+    11898,11906,11913,11921,11928,11936,11944,11951,11959,11966,
+    11974,11982,11990,11998,12005,12013,12021,12029,12036,12044,
+    12051,12059,12067,12075,12082,12090,12097,12105,12112,12120,
+    12127,12135,12143,12151,12158,12166,12173,12181,12188,12196,
+    12203,12211,12218,12226,12233,12241,12248,12256,12263,12271,
+    12278,12286,12295,12304,12311,12319,12327,12334,12342,12350,
+    12357,12365,12373,12381,12389,12397,12405,12413,12421,12429,
+    12437,12445,12452,12460,12468,12476,12483,12491,12498,12506,
+    12514,12521,12529,12536,12544,12551,12559,12566,12574,12582,
+    12589,12597,12604,12612,12619,12627,12635,12643,12650,12658,
+
+    12665,12673,12680,12688,12695,12703,12711,12719,12728,12737,
+    12745,12752,12760,12767,12775,12783,12790,12798,12806,12814,
+    12822,12830,12838,12845,12853,12861,12868,12876,12884,12891,
+    12898,12906,12914,12921,12929,12936,12944,12952,12959,12967,
+    12974,12982,12989,12997,13004,13012,13020,13028,13036,13044,
+    13051,13059,13067,13075,13083,13090,13098,13107,13116,13123,
+    13131,13139,13147,13154,13162,13170,13178,13186,13194,13201,
+    13209,13217,13224,13232,13240,13247,13254,13262,13270,13277,
+    13284,13292,13300,13308,13315,13323,13330,13337,13345,13352,
+    13360,13367,13375,13382,13390,13397,13405,13414,13423,13430,
+
+    13438,13446,13454,13462,13470,13478,13486,13494,13502,13509,
+    13517,13524,13532,13540,13548,13556,13564,13572,13580,13587,
+    13595,13603,13611,13619,13626,13633,13640,13648,13655,13663,
+    13670,13678,13685,13693,13702,13711,13718,13726,13734,13742,
+    13750,13758,13766,13773,13780,13788,13795,13803,13811,13818,
+    13826,13834,13841,13848,13855,13862,13869,13877,13884,13892,
+    13899,13907,13916,13925,13933,13942,13951,13960,13969,13978,
+    13987
     } ;
 
-static yyconst flex_int16_t yy_def[3813] =
+static yyconst flex_int16_t yy_def[4472] =
     {   0,
-     3334, 3334, 3335, 3335, 3335, 3335, 3336, 3336, 3337, 3337,
-     3338, 3338, 3339, 3339, 3339, 3339, 3340, 3340, 3341, 3341,
-     3342, 3342, 3342, 3342, 3334, 3334, 3342, 3342, 3342, 3342,
-     3334, 3334, 3342, 3342, 3334, 3334, 3342, 3342, 3342, 3342,
-     3343, 3343, 3344, 3344, 3334, 3334, 3344, 3344, 3344, 3344,
-     3345, 3345, 3346, 3346, 3347, 3347, 3348, 3348, 3349, 3349,
-     3350, 3350, 3334, 3334, 3350, 3350, 3350, 3350, 3351, 3351,
-     3352, 3352, 3334, 3334, 3352, 3352, 3352, 3352, 3353, 3353,
-     3354, 3354, 3333,   83, 3355, 3355, 3334, 3334, 3355, 3355,
-     3355, 3355, 3356, 3356, 3357, 3357, 3334, 3334, 3357, 3357,
-
-     3357, 3357, 3358, 3358, 3359, 3359, 3334, 3334, 3359, 3359,
-     3359, 3359, 3360, 3360, 3361, 3361, 3362, 3362, 3363, 3363,
-     3334, 3334, 3363, 3363, 3363, 3363, 3364, 3364, 3365, 3365,
-     3334, 3334, 3365, 3365, 3365, 3365, 3366, 3366, 3367, 3367,
-     3368, 3368, 3369, 3369, 3370, 3370, 3371, 3371, 3372, 3372,
-     3373, 3373, 3334, 3334, 3374, 3374, 3375, 3375, 3375, 3375,
-     3334, 3334, 3375, 3375, 3375, 3375, 3334, 3334, 3375, 3375,
-     3334, 3334, 3375, 3375, 3375, 3375, 3376, 3376, 3377, 3377,
-     3334, 3334, 3377, 3377, 3377, 3377, 3378, 3378, 3379, 3379,
-     3380, 3380, 3381, 3381, 3382, 3382, 3383, 3383, 3334, 3334,
-
-     3383, 3383, 3383, 3383, 3384, 3384, 3385, 3385, 3386, 3386,
-     3387, 3387, 3334, 3334, 3387, 3387, 3387, 3387, 3388, 3388,
-     3389, 3389, 3334, 3334, 3389, 3389, 3389, 3389, 3390, 3390,
-     3391, 3391, 3392, 3392, 3393, 3393, 3334, 3334, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3394, 3333,
-     3333, 3394, 3394, 3333, 3333, 3333,  276, 3333,  278,  276,
-      279,  278, 3333, 3333, 3333, 3395, 3333, 3333, 3395, 3395,
-     3395, 3333, 3333,  278,  294,  294, 3333, 3333, 3333, 3396,
-
-     3333, 3333, 3396, 3333, 3333, 3333, 3333, 3333, 3333, 3397,
-     3333, 3333, 3397, 3397, 3397, 3333, 3333, 3333, 3333, 3333,
-     3333, 3398, 3333, 3333, 3398, 3398, 3398, 3333, 3333,  294,
-      294, 3333, 3333, 3333, 3399, 3333, 3333, 3399, 3399, 3333,
-     3333,  294,  294, 3333, 3333, 3333, 3400, 3333, 3333, 3400,
-     3400, 3400, 3400, 3400, 3400, 3333, 3333, 3333, 3333, 3333,
-     3333, 3401, 3333, 3333, 3401, 3401, 3401, 3401, 3401, 3401,
-     3401, 3401, 3333, 3333,  278,  278, 3333, 3333, 3333, 3402,
-     3333, 3333, 3402, 3333, 3333,  278,  278, 3333, 3333, 3333,
-     3403, 3333, 3333, 3403, 3403, 3403, 3403, 3403, 3333, 3333,
-
-      278,  278,  278, 3333, 3333, 3333, 3404, 3333, 3333, 3404,
-     3404, 3404, 3333, 3333, 3333, 3333, 3333, 3333, 3405, 3333,
-     3333, 3405, 3333, 3333,  278,  425,  278, 3333, 3333, 3333,
-     3406, 3333, 3333, 3406, 3406, 3406, 3406, 3333, 3333,  278,
-      278, 3333, 3333, 3333, 3407, 3333, 3333, 3407, 3407, 3333,
-     3333, 3333, 3333, 3333, 3333, 3408, 3333, 3333, 3408, 3408,
-     3333, 3333, 3333, 3333, 3333, 3333, 3409, 3333, 3333, 3409,
-     3409, 3333, 3333, 3333, 3333, 3333, 3333, 3410, 3333, 3333,
-     3410, 3410, 3410, 3410, 3410, 3410, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3411, 3333, 3333, 3411, 3333, 3333,  425,
-
-      425,  278,  278,  278,  278, 3333, 3333, 3333, 3412, 3333,
-     3333, 3412, 3412, 3412, 3412, 3412, 3333, 3333,  278,  278,
-      278, 3333, 3333, 3333, 3413, 3333, 3333, 3413, 3413, 3333,
-     3333, 3333, 3333, 3333, 3333, 3414, 3333, 3333, 3414, 3414,
-     3414, 3414, 3414, 3333, 3333, 3333, 3333, 3333, 3333, 3415,
-     3333, 3333, 3415, 3415, 3333, 3333,  294,  294, 3333, 3333,
-     3333, 3416, 3333, 3333, 3416, 3416, 3333, 3333, 3333, 3333,
-     3333, 3333, 3417, 3333, 3333, 3417, 3417, 3417, 3417, 3333,
-     3333,  278,  278, 3333, 3333, 3333, 3418, 3333, 3333, 3418,
-     3418, 3418, 3418, 3333, 3333,  278,  278,  278, 3333, 3333,
-
-     3333, 3419, 3333, 3333, 3419, 3419, 3419, 3333, 3333, 3333,
-     3333, 3333, 3420, 3333, 3333, 3420, 3420, 3420, 3333, 3333,
-     3333, 3333, 3421, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3422, 3422, 3422,
-     3423, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3424, 3424, 3424, 3424, 3424, 3425, 3333, 3333, 3426,
-     3426, 3427, 3333, 3428, 3428, 3428, 3428, 3429, 3333, 3430,
-     3430, 3430, 3430, 3431, 3333, 3432, 3432, 3432, 3433, 3333,
-
-     3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3435, 3333,
-     3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436,
-     3436, 3436, 3436, 3436, 3436, 3437, 3333, 3438, 3438, 3439,
-     3333, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3441, 3333,
-     3333, 3442, 3442, 3442, 3442, 3443, 3333, 3444, 3444, 3445,
-     3333, 3333, 3446, 3446, 3446, 3446, 3446, 3446, 3447, 3333,
-     3448, 3448, 3448, 3449, 3333, 3450, 3450, 3450, 3451, 3333,
-     3452, 3452, 3452, 3453, 3333, 3454, 3454, 3454, 3454, 3454,
-     3454, 3454, 3454, 3455, 3333, 3333, 3456, 3456, 3457, 3333,
-     3333, 3333, 3333, 3333, 3333, 3458, 3458, 3458, 3458, 3458,
-
-     3458, 3459, 3333, 3333, 3460, 3460, 3460, 3461, 3333, 3462,
-     3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3463, 3333,
-     3464, 3464, 3464, 3464, 3465, 3333, 3466, 3466, 3466, 3467,
-     3333, 3468, 3468, 3468, 3468, 3468, 3469, 3333, 3470, 3470,
-     3470, 3470, 3470, 3471, 3333, 3333, 3472, 3472, 3472, 3472,
-     3333, 3473, 3333, 3333, 3474, 3474, 3474, 3474, 3475, 3476,
-     3333, 3476, 3333, 3333, 3333, 3477, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3478, 3479, 3479, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3480, 3480, 3480, 3480, 3481, 3481, 3333, 3482, 3483,
-     3483, 3484, 3333, 3333, 3484, 3485, 3485, 3486, 3486, 3486,
-     3487, 3487, 3488, 3488, 3489, 3489, 3333, 3333, 3333, 3333,
-     3490, 3490, 3490, 3490, 3490, 3491, 3491, 3492, 3333, 3333,
-     3492, 3333, 3333, 3492, 3492, 3492, 3492, 3492, 3492, 3492,
-     3492, 3492, 3492, 3493, 3493, 3333, 3333, 3494, 3494, 3495,
-     3495, 3495, 3333, 3333, 3495, 3495, 3495, 3496, 3496, 3333,
-     3497, 3333, 3333, 3333, 3333, 3498, 3498, 3499, 3500, 3500,
-     3333, 3501, 3333, 3333, 3501, 3501, 3501, 3502, 3502, 3503,
-
-     3333, 3333, 3504, 3504, 3333, 3333, 3505, 3506, 3506, 3507,
-     3507, 3508, 3508, 3509, 3509, 3509, 3333, 3333, 3509, 3509,
-     3509, 3510, 3510, 3333, 3511, 3512, 3512, 3333, 3333, 3333,
-     3513, 3513, 3513, 3513, 3513, 3514, 3514, 3333, 3333, 3333,
-     3515, 3516, 3516, 3517, 3333, 3333, 3517, 3517, 3517, 3517,
-     3517, 3517, 3518, 3518, 3519, 3519, 3519, 3520, 3520, 3521,
-     3333, 3333, 3522, 3522, 3523, 3523, 3333, 3333, 3523, 3524,
-     3524, 3525, 3333, 3333, 3525, 3525, 3526, 3526, 3333, 3527,
-     3333, 3333, 3527, 3333, 3528, 3528, 3333, 3529, 3529, 3529,
-     3530, 3530, 3531, 3333, 3333, 3531, 3333, 3333, 3532, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3533, 3333, 3534,
-     3333, 3534, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3535, 3535, 3333, 3333, 3535, 3333, 3536, 3333, 3536, 3333,
-     3537, 3333, 3538, 3333, 3538, 3539, 3333, 3333, 3333, 3539,
-     3333, 3540, 3333, 3540, 3333, 3333, 3541, 3541, 3333, 3333,
-     3333, 3542, 3333, 3542, 3333, 3333, 3333, 3333, 3333, 3543,
-     3333, 3543, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3544, 3544, 3544, 3544, 3333, 3545, 3333, 3545, 3546, 3546,
-     3546, 3333, 3333, 3333, 3546, 3333, 3333, 3333, 3333, 3333,
-     3546, 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3333,
-     3547, 3333, 3547, 3333, 3333, 3333, 3333, 3548, 3333, 3548,
-     3549, 3549, 3549, 3333, 3333, 3333, 3549, 3549, 3549, 3333,
-     3550, 3333, 3550, 3333, 3551, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3552, 3333, 3552, 3553, 3333, 3554, 3333, 3554,
-     3555, 3333, 3333, 3333, 3555, 3555, 3555, 3333, 3556, 3333,
-     3556, 3557, 3333, 3333, 3333, 3333, 3558, 3333, 3558, 3333,
-     3333, 3333, 3559, 3333, 3560, 3333, 3560, 3561, 3561, 3333,
-
-     3562, 3333, 3562, 3563, 3563, 3563, 3563, 3333, 3333, 3333,
-     3333, 3333, 3563, 3563, 3333, 3564, 3333, 3564, 3333, 3565,
-     3333, 3566, 3333, 3566, 3333, 3333, 3333, 3567, 3567, 3567,
-     3567, 3567, 3333, 3568, 3333, 3568, 3333, 3333, 3333, 3333,
-     3569, 3333, 3570, 3333, 3570, 3571, 3333, 3333, 3333, 3333,
-     3333, 3571, 3333, 3333, 3571, 3571, 3571, 3333, 3572, 3333,
-     3572, 3333, 3333, 3333, 3333, 3573, 3333, 3574, 3333, 3574,
-     3575, 3333, 3333, 3333, 3333, 3576, 3333, 3576, 3577, 3577,
-     3333, 3333, 3333, 3577, 3333, 3578, 3333, 3578, 3579, 3333,
-     3333, 3333, 3579, 3579, 3333, 3580, 3333, 3580, 3333, 3581,
-
-     3333, 3333, 3333, 3581, 3333, 3333, 3582, 3333, 3582, 3583,
-     3583, 3583, 3333, 3584, 3333, 3584, 3585, 3586, 3333, 3333,
-     3333, 3333, 3587, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3588, 3588, 3333, 3333, 3333, 3588, 3589,
-     3333, 3590, 3591, 3592, 3592, 3593, 3333, 3333, 3333, 3594,
-     3594, 3333, 3333, 3333, 3595, 3333, 3333, 3333, 3333, 3333,
-     3333, 3596, 3333, 3333, 3333, 3597, 3597, 3597, 3597, 3598,
-
-     3599, 3599, 3599, 3333, 3333, 3333, 3333, 3333, 3599, 3599,
-     3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3600, 3601,
-     3602, 3602, 3333, 3333, 3602, 3602, 3602, 3603, 3333, 3333,
-     3333, 3604, 3333, 3333, 3605, 3606, 3606, 3606, 3606, 3607,
-     3608, 3609, 3610, 3611, 3333, 3333, 3612, 3613, 3614, 3614,
-     3614, 3614, 3333, 3333, 3333, 3614, 3614, 3615, 3333, 3616,
-     3617, 3333, 3333, 3333, 3618, 3333, 3333, 3618, 3618, 3618,
-     3619, 3333, 3620, 3621, 3622, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3622, 3333, 3333, 3622, 3623, 3333, 3333,
-     3333, 3333, 3333, 3333, 3624, 3625, 3626, 3627, 3628, 3628,
-
-     3628, 3629, 3630, 3630, 3333, 3333, 3631, 3333, 3333, 3333,
-     3632, 3333, 3633, 3634, 3333, 3333, 3634, 3635, 3636, 3637,
-     3637, 3333, 3637, 3333, 3333, 3638, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3639, 3639, 3639, 3640, 3333, 3333,
-     3333, 3641, 3642, 3642, 3643, 3644, 3644, 3645, 3646, 3647,
-     3647, 3333, 3333, 3647, 3648, 3333, 3333, 3649, 3649, 3333,
-     3333, 3333, 3649, 3649, 3649, 3649, 3649, 3649, 3333, 3333,
-
-     3649, 3649, 3649, 3650, 3651, 3652, 3652, 3333, 3333, 3333,
-     3652, 3333, 3333, 3652, 3653, 3333, 3333, 3333, 3333, 3654,
-     3333, 3333, 3333, 3655, 3656, 3656, 3656, 3656, 3657, 3658,
-     3659, 3333, 3333, 3660, 3333, 3333, 3333, 3661, 3662, 3663,
-     3333, 3333, 3663, 3663, 3333, 3333, 3663, 3664, 3333, 3665,
-     3666, 3333, 3333, 3333, 3667, 3333, 3333, 3333, 3667, 3667,
-     3667, 3668, 3333, 3333, 3333, 3669, 3670, 3333, 3333, 3333,
-     3670, 3333, 3333, 3333, 3670, 3671, 3672, 3673, 3674, 3675,
-     3676, 3676, 3676, 3677, 3678, 3333, 3333, 3333, 3333, 3333,
-     3679, 3333, 3333, 3333, 3333, 3680, 3333, 3681, 3682, 3333,
-
-     3333, 3333, 3333, 3333, 3683, 3684, 3685, 3685, 3333, 3686,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3687, 3688, 3333, 3333,
-     3333, 3333, 3689, 3690, 3690, 3691, 3333, 3333, 3333, 3333,
-     3692, 3693, 3333, 3333, 3694, 3333, 3333, 3333, 3333, 3333,
-     3695, 3333, 3333, 3333, 3333, 3333, 3696, 3696, 3696, 3333,
-     3333, 3696, 3696, 3696, 3333, 3333, 3333, 3333, 3333, 3696,
-     3696, 3697, 3698, 3699, 3699, 3333, 3333, 3333, 3333, 3333,
-
-     3699, 3333, 3333, 3333, 3700, 3701, 3702, 3702, 3702, 3702,
-     3333, 3333, 3703, 3704, 3333, 3333, 3333, 3705, 3706, 3707,
-     3708, 3333, 3333, 3333, 3333, 3333, 3708, 3333, 3333, 3333,
-     3708, 3333, 3333, 3333, 3709, 3710, 3333, 3333, 3333, 3711,
-     3711, 3711, 3711, 3712, 3333, 3333, 3333, 3333, 3333, 3333,
-     3713, 3713, 3713, 3714, 3715, 3716, 3717, 3718, 3333, 3333,
-     3719, 3333, 3333, 3720, 3721, 3333, 3333, 3333, 3722, 3333,
-     3723, 3333, 3724, 3725, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3726, 3727, 3728, 3728, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3729, 3730, 3333, 3731,
-     3732, 3333, 3333, 3733, 3333, 3333, 3333, 3333, 3333, 3333,
-     3734, 3735, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3736, 3333, 3333, 3333, 3737, 3737, 3737, 3333, 3333, 3333,
-     3333, 3333, 3737, 3737, 3333, 3333, 3333, 3737, 3737, 3738,
-     3739, 3740, 3740, 3333, 3333, 3333, 3740, 3741, 3742, 3743,
-     3333, 3333, 3743, 3743, 3743, 3744, 3745, 3746, 3747, 3333,
-     3333, 3748, 3333, 3333, 3333, 3748, 3748, 3333, 3333, 3333,
-
-     3749, 3333, 3333, 3333, 3750, 3750, 3750, 3750, 3751, 3333,
-     3752, 3333, 3333, 3752, 3753, 3754, 3333, 3333, 3755, 3756,
-     3333, 3333, 3333, 3333, 3333, 3757, 3333, 3333, 3333, 3758,
-     3333, 3333, 3759, 3760, 3333, 3761, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3762, 3763, 3764, 3764, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3765, 3766, 3333, 3767, 3768,
-     3333, 3333, 3333, 3769, 3770, 3771, 3333, 3333, 3333, 3772,
-
-     3773, 3773, 3773, 3333, 3333, 3333, 3773, 3773, 3773, 3333,
-     3333, 3774, 3333, 3333, 3775, 3775, 3775, 3776, 3777, 3778,
-     3333, 3333, 3333, 3778, 3778, 3778, 3779, 3780, 3781, 3782,
-     3783, 3783, 3783, 3333, 3333, 3333, 3333, 3784, 3333, 3333,
-     3333, 3785, 3785, 3785, 3786, 3333, 3787, 3333, 3333, 3333,
-     3787, 3333, 3333, 3788, 3789, 3333, 3333, 3333, 3333, 3333,
-     3790, 3791, 3333, 3333, 3333, 3792, 3793, 3333, 3794, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3795, 3796, 3797, 3797, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3798, 3333, 3333, 3333, 3799, 3333, 3333,
-     3800, 3801, 3802, 3333, 3333, 3803, 3803, 3803, 3803, 3333,
-     3333, 3803, 3803, 3333, 3333, 3333, 3333, 3333, 3804, 3804,
-     3804, 3805, 3333, 3333, 3333, 3333, 3806, 3806, 3806, 3806,
-     3333, 3333, 3780, 3781, 3333, 3333, 3783, 3783, 3783, 3333,
-     3784, 3333, 3333, 3333, 3333, 3333, 3785, 3785, 3333, 3333,
-     3333, 3333, 3333, 3787, 3788, 3789, 3790, 3333, 3333, 3792,
-     3793, 3333, 3794, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3795, 3796, 3797, 3797, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3798, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3801, 3802,
-     3803, 3803, 3803, 3803, 3333, 3333, 3333, 3803, 3803, 3333,
-     3333, 3333, 3333, 3333, 3333, 3804, 3804, 3333, 3333, 3805,
-     3333, 3333, 3333, 3806, 3806, 3806, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3781, 3333, 3333, 3333, 3783, 3783, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3787, 3788, 3789, 3790, 3792, 3793, 3333,
-     3794, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3795, 3796, 3797, 3797, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3801, 3802,
-     3803, 3803, 3333, 3333, 3803, 3803, 3803, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3804, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3806, 3806, 3806, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3781, 3783, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3787, 3333, 3333, 3333, 3333, 3790,
-     3792, 3793, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3795, 3796, 3797, 3797, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3801, 3802, 3803, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3803, 3803, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3804, 3333, 3333, 3333, 3806, 3333, 3333, 3806,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3783, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3787, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3793, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3795, 3796, 3797,
-     3797, 3797, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3801, 3333, 3333, 3803, 3333, 3333,
-     3333, 3333, 3333, 3333, 3803, 3803, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3804, 3806, 3333, 3333, 3333, 3806,
-     3333, 3333, 3333, 3333, 3333, 3333, 3783, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3793, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3795, 3796, 3797, 3797, 3797, 3807, 3808, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3801, 3803, 3333, 3333, 3803, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3804, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3783, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3795, 3796, 3797, 3809, 3810, 3807, 3808,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3803, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3804, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3783, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3796, 3809, 3797, 3811, 3810, 3812, 3797, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3803, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3804, 3333, 3333, 3333, 3333, 3783, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3796, 3811, 3333, 3812, 3797, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3796, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3796, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3796, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3796, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3796,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3796, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3796,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3796, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3796, 3796, 3333, 3333, 3333, 3333, 3333, 3333, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3796, 3333,    0, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333
+     3906, 3906, 3907, 3907, 3907, 3907, 3908, 3908, 3909, 3909,
+     3910, 3910, 3911, 3911, 3911, 3911, 3912, 3912, 3913, 3913,
+     3914, 3914, 3914, 3914, 3906, 3906, 3914, 3914, 3914, 3914,
+     3906, 3906, 3914, 3914, 3906, 3906, 3914, 3914, 3914, 3914,
+     3915, 3915, 3916, 3916, 3906, 3906, 3916, 3916, 3916, 3916,
+     3917, 3917, 3918, 3918, 3906, 3906, 3918, 3918, 3918, 3918,
+     3919, 3919, 3920, 3920, 3921, 3921, 3922, 3922, 3923, 3923,
+     3924, 3924, 3906, 3906, 3924, 3924, 3924, 3924, 3925, 3925,
+     3926, 3926, 3906, 3906, 3926, 3926, 3926, 3926, 3927, 3927,
+     3928, 3928, 3906, 3906, 3928, 3928, 3928, 3928, 3929, 3929,
+
+     3930, 3930, 3931, 3931, 3932, 3932, 3906, 3906, 3932, 3932,
+     3932, 3932, 3933, 3933, 3934, 3934, 3906, 3906, 3934, 3934,
+     3934, 3934, 3935, 3935, 3936, 3936, 3906, 3906, 3936, 3936,
+     3936, 3936, 3937, 3937, 3938, 3938, 3939, 3939, 3940, 3940,
+     3906, 3906, 3940, 3940, 3940, 3940, 3941, 3941, 3942, 3942,
+     3906, 3906, 3942, 3942, 3942, 3942, 3943, 3943, 3944, 3944,
+     3945, 3945, 3946, 3946, 3947, 3947, 3948, 3948, 3949, 3949,
+     3950, 3950, 3906, 3906, 3951, 3951, 3952, 3952, 3952, 3952,
+     3906, 3906, 3952, 3952, 3952, 3952, 3906, 3906, 3952, 3952,
+     3906, 3906, 3952, 3952, 3952, 3952, 3953, 3953, 3954, 3954,
+
+     3906, 3906, 3954, 3954, 3954, 3954, 3955, 3955, 3956, 3956,
+     3957, 3957, 3958, 3958, 3959, 3959, 3960, 3960, 3906, 3906,
+     3960, 3960, 3960, 3960, 3961, 3961, 3962, 3962, 3963, 3963,
+     3964, 3964, 3906, 3906, 3964, 3964, 3964, 3964, 3965, 3965,
+     3966, 3966, 3906, 3906, 3966, 3966, 3966, 3966, 3967, 3967,
+     3968, 3968, 3969, 3969, 3970, 3970, 3971, 3971, 3972, 3972,
+     3972, 3972, 3906, 3906, 3972, 3972, 3972, 3972, 3906, 3906,
+     3972, 3972, 3906, 3906, 3972, 3972, 3972, 3972, 3973, 3973,
+     3974, 3974, 3906, 3906, 3974, 3974, 3974, 3974, 3906, 3906,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3975, 3905, 3905, 3975, 3975, 3905, 3905, 3905,  328, 3905,
+      330,  328,  331,  330, 3905, 3905, 3905, 3976, 3905, 3905,
+     3976, 3976, 3976, 3905, 3905,  330,  330,  330, 3905, 3905,
+     3905, 3977, 3905, 3905, 3977, 3977, 3977, 3977, 3977, 3905,
+     3905,  330,  330,  330, 3905, 3905, 3905, 3978, 3905, 3905,
+     3978, 3905, 3905, 3905, 3905, 3905, 3905, 3979, 3905, 3905,
+     3979, 3979, 3979, 3905, 3905, 3905, 3905, 3905, 3905, 3980,
+     3905, 3905, 3980, 3980, 3980, 3905, 3905,  330,  330, 3905,
+
+     3905, 3905, 3981, 3905, 3905, 3981, 3981, 3905, 3905,  330,
+      330, 3905, 3905, 3905, 3982, 3905, 3905, 3982, 3982, 3982,
+     3905, 3905,  330,  330, 3905, 3905, 3905, 3983, 3905, 3905,
+     3983, 3983, 3983, 3983, 3983, 3983, 3905, 3905, 3905, 3905,
+     3905, 3905, 3984, 3905, 3905, 3984, 3984, 3984, 3984, 3984,
+     3984, 3984, 3984, 3905, 3905,  330,  330, 3905, 3905, 3905,
+     3985, 3905, 3905, 3985, 3905, 3905,  330,  330, 3905, 3905,
+     3905, 3986, 3905, 3905, 3986, 3986, 3986, 3986, 3986, 3905,
+     3905,  330,  330,  330, 3905, 3905, 3905, 3987, 3905, 3905,
+     3987, 3987, 3987, 3905, 3905, 3905, 3905, 3905, 3905, 3988,
+
+     3905, 3905, 3988, 3905, 3905,  330,  506,  330, 3905, 3905,
+     3905, 3989, 3905, 3905, 3989, 3989, 3989, 3989, 3905, 3905,
+      330,  330, 3905, 3905, 3905, 3990, 3905, 3905, 3990, 3990,
+     3905, 3905, 3905, 3905, 3905, 3905, 3991, 3905, 3905, 3991,
+     3991, 3905, 3905, 3905, 3905, 3905, 3905, 3992, 3905, 3905,
+     3992, 3992, 3905, 3905, 3905, 3905, 3905, 3905, 3993, 3905,
+     3905, 3993, 3993, 3993, 3993, 3993, 3993, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3994, 3905, 3905, 3994, 3905, 3905,
+      506,  581,  330,  330,  330,  330, 3905, 3905, 3905, 3995,
+     3905, 3905, 3995, 3995, 3995, 3995, 3995, 3905, 3905,  330,
+
+      330, 3905, 3905, 3905, 3996, 3905, 3905, 3996, 3996, 3905,
+     3905, 3905, 3905, 3905, 3905, 3997, 3905, 3905, 3997, 3997,
+     3997, 3997, 3997, 3905, 3905, 3905, 3905, 3905, 3905, 3998,
+     3905, 3905, 3998, 3998, 3905, 3905,  330,  330, 3905, 3905,
+     3905, 3999, 3905, 3905, 3999, 3999, 3905, 3905, 3905, 3905,
+     3905, 3905, 4000, 3905, 3905, 4000, 4000, 4000, 4000, 3905,
+     3905,  330,  330, 3905, 3905, 3905, 4001, 3905, 3905, 4001,
+     4001, 4001, 4001, 3905, 3905,  330,  330,  330, 3905, 3905,
+     3905, 4002, 3905, 3905, 4002, 4002, 4002, 3905, 3905, 3905,
+     3905, 3905, 4003, 3905, 3905, 4003, 4003, 4003, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 4004, 3905, 3905, 4004, 4004, 3905,
+     3905, 3905,  712,  330,  330, 3905, 3905, 3905, 4005, 3905,
+     3905, 4005, 4005, 4005, 3905, 3905,  330,  330, 3905, 4006,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 4007, 4007, 4007, 4008, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 4009, 4009, 4009, 4009, 4009, 4010, 3905, 3905, 4011,
+     4011, 4011, 4011, 4011, 4011, 4012, 3905, 3905, 4013, 4013,
+
+     4014, 3905, 4015, 4015, 4015, 4015, 4016, 3905, 4017, 4017,
+     4017, 4017, 4018, 3905, 4019, 4019, 4019, 4020, 3905, 4021,
+     4021, 4021, 4021, 4022, 3905, 4023, 4023, 4023, 4023, 4023,
+     4023, 4023, 4023, 4024, 3905, 4025, 4025, 4025, 4025, 4025,
+     4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025,
+     4026, 3905, 4027, 4027, 4028, 3905, 4029, 4029, 4029, 4029,
+     4029, 4029, 4029, 4030, 3905, 3905, 4031, 4031, 4031, 4031,
+     4032, 3905, 4033, 4033, 4034, 3905, 3905, 3905, 4035, 4035,
+     4035, 4035, 4035, 4035, 4036, 3905, 4037, 4037, 4037, 4038,
+     3905, 4039, 4039, 4039, 4040, 3905, 4041, 4041, 4041, 4042,
+
+     3905, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4044,
+     3905, 3905, 4045, 4045, 4046, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 4047, 4047, 4047, 4047, 4047, 4047, 4048, 3905,
+     4049, 4049, 4049, 4050, 3905, 4051, 4051, 4051, 4051, 4051,
+     4051, 4051, 4051, 4051, 4052, 3905, 4053, 4053, 4053, 4053,
+     4054, 3905, 4055, 4055, 4055, 4056, 3905, 4057, 4057, 4057,
+     4057, 4057, 4058, 3905, 4059, 4059, 4059, 4059, 4059, 4060,
+     3905, 3905, 4061, 4061, 4061, 4061, 3905, 4062, 3905, 3905,
+     4063, 4063, 4063, 4063, 4064, 3905, 4065, 4065, 4065, 4066,
+     3905, 4067, 4067, 4067, 4067, 4067, 4068, 4069, 3905, 4069,
+
+     3905, 3905, 3905, 4070, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 4071, 4072, 4072, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 4073, 4073, 4073, 4073, 4074, 4074, 3905,
+     4075, 4075, 4075, 4075, 4075, 4076, 4076, 3905, 4077, 4078,
+     4078, 4079, 3905, 3905, 4079, 4080, 4080, 4081, 4081, 4081,
+     4082, 4082, 4083, 4083, 4084, 4084, 4085, 4085, 4085, 4086,
+     4086, 3905, 3905, 3905, 3905, 4087, 4087, 4087, 4087, 4087,
+
+     4088, 4088, 4089, 3905, 3905, 4089, 3905, 3905, 4089, 4089,
+     4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4090, 4090,
+     3905, 3905, 4091, 4091, 4092, 4092, 4092, 3905, 3905, 4092,
+     4092, 4092, 4093, 4093, 3905, 4094, 3905, 3905, 3905, 3905,
+     4095, 4095, 4096, 4097, 4097, 3905, 3905, 4098, 3905, 3905,
+     4098, 4098, 4098, 4099, 4099, 4100, 3905, 3905, 4101, 4101,
+     3905, 3905, 4102, 4103, 4103, 4104, 4104, 4105, 4105, 4106,
+     4106, 4106, 3905, 3905, 4106, 4106, 4106, 4107, 4107, 3905,
+     4108, 4109, 4109, 3905, 3905, 3905, 3905, 4110, 4110, 4110,
+     4110, 4110, 4111, 4111, 3905, 3905, 4112, 4113, 4113, 4114,
+
+     3905, 3905, 4114, 4114, 4114, 4114, 4114, 4114, 4115, 4115,
+     4116, 4116, 4116, 4117, 4117, 4118, 3905, 3905, 4119, 4119,
+     4120, 4120, 3905, 3905, 4120, 4121, 4121, 4122, 3905, 3905,
+     4122, 4122, 4123, 4123, 3905, 4124, 3905, 3905, 4124, 3905,
+     4125, 4125, 3905, 4126, 4126, 4126, 4127, 4127, 3905, 3905,
+     4128, 4129, 4129, 4130, 4130, 4130, 4130, 4131, 4131, 4132,
+     3905, 3905, 4132, 3905, 3905, 4133, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 4134, 3905, 4135, 3905, 4135, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 4136, 4136, 3905, 3905, 4136, 3905, 4137, 3905, 4137,
+     3905, 4138, 4138, 4138, 4138, 4138, 3905, 4139, 3905, 4139,
+     3905, 4140, 3905, 4141, 3905, 4141, 4142, 3905, 3905, 3905,
+     4142, 3905, 4143, 3905, 4143, 3905, 3905, 4144, 4144, 3905,
+     3905, 3905, 4145, 3905, 4145, 3905, 3905, 3905, 3905, 3905,
+     4146, 3905, 4146, 3905, 3905, 4147, 4147, 3905, 3905, 3905,
+     4148, 3905, 4148, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 4149, 4149, 4149, 4149, 3905, 4150, 3905, 4150, 4151,
+
+     4151, 4151, 3905, 3905, 3905, 4151, 3905, 3905, 3905, 3905,
+     3905, 4151, 4151, 4151, 4151, 4151, 4151, 4151, 4151, 4151,
+     3905, 4152, 3905, 4152, 3905, 3905, 3905, 3905, 4153, 3905,
+     4153, 4154, 4154, 4154, 3905, 3905, 3905, 4154, 4154, 4154,
+     3905, 4155, 3905, 4155, 3905, 4156, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 4157, 3905, 4157, 4158, 3905, 4159, 3905,
+     4159, 3905, 4160, 3905, 3905, 3905, 4160, 4160, 4160, 3905,
+     4161, 3905, 4161, 4162, 3905, 3905, 3905, 3905, 4163, 3905,
+     4163, 3905, 3905, 3905, 4164, 3905, 4165, 3905, 4165, 4166,
+     4166, 3905, 4167, 3905, 4167, 4168, 4168, 4168, 4168, 3905,
+
+     3905, 3905, 3905, 3905, 4168, 4168, 3905, 4169, 3905, 4169,
+     3905, 4170, 3905, 4171, 3905, 4171, 3905, 3905, 3905, 3905,
+     4172, 4172, 4172, 4172, 4172, 3905, 4173, 3905, 4173, 3905,
+     3905, 3905, 4174, 3905, 4175, 3905, 4175, 4176, 3905, 3905,
+     3905, 3905, 3905, 4176, 3905, 3905, 4176, 4176, 4176, 3905,
+     4177, 3905, 4177, 3905, 3905, 3905, 3905, 4178, 3905, 4179,
+     3905, 4179, 4180, 3905, 3905, 3905, 3905, 4181, 3905, 4181,
+     4182, 4182, 3905, 3905, 3905, 4182, 3905, 4183, 3905, 4183,
+     4184, 3905, 3905, 3905, 4184, 4184, 3905, 4185, 3905, 4185,
+     3905, 4186, 3905, 3905, 3905, 4186, 3905, 3905, 4187, 3905,
+
+     4187, 4188, 4188, 4188, 3905, 4189, 3905, 4189, 3905, 3905,
+     3905, 4190, 3905, 4191, 3905, 4191, 3905, 3905, 4192, 4192,
+     3905, 3905, 4192, 3905, 4193, 3905, 4193, 4194, 4195, 3905,
+     3905, 3905, 3905, 4196, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4197, 4197,
+     3905, 3905, 3905, 4197, 4198, 3905, 4199, 3905, 3905, 4199,
+     4199, 4199, 4200, 3905, 4201, 4202, 4203, 4203, 4204, 3905,
+
+     3905, 3905, 4205, 4205, 3905, 3905, 3905, 4206, 3905, 3905,
+     3905, 3905, 3905, 3905, 4207, 3905, 3905, 3905, 4208, 4208,
+     3905, 3905, 3905, 4209, 3905, 3905, 3905, 4210, 4210, 4210,
+     4210, 4211, 4212, 4212, 4212, 3905, 3905, 3905, 3905, 3905,
+     4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212,
+     4213, 4214, 4215, 4215, 3905, 3905, 4215, 4215, 4215, 4216,
+     3905, 3905, 3905, 4217, 3905, 3905, 4218, 3905, 4219, 4219,
+     4219, 4219, 4220, 4221, 4222, 4223, 4224, 3905, 3905, 4225,
+     4226, 4227, 4227, 4227, 4227, 3905, 3905, 3905, 4227, 4227,
+     4228, 3905, 4229, 4230, 3905, 3905, 3905, 3905, 4231, 3905,
+
+     3905, 4231, 4231, 4231, 4232, 4233, 4234, 4235, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 4235, 3905, 3905, 4235,
+     4236, 3905, 3905, 3905, 3905, 3905, 3905, 4237, 4238, 4239,
+     4240, 4241, 4241, 4241, 4242, 4243, 4243, 3905, 3905, 4244,
+     3905, 3905, 3905, 4245, 3905, 4246, 4247, 3905, 3905, 4247,
+     4248, 4249, 4250, 3905, 3905, 3905, 4251, 4251, 3905, 3905,
+     3905, 4251, 4252, 4253, 4254, 4254, 3905, 4254, 3905, 3905,
+     4255, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 4256, 4256, 4256, 4257, 3905, 4258,
+     3905, 3905, 3905, 4258, 4258, 4258, 4259, 3905, 3905, 3905,
+     4260, 4261, 4261, 4262, 4263, 4263, 4264, 4265, 4266, 4266,
+     4267, 4268, 4268, 3905, 3905, 4268, 4269, 3905, 3905, 4270,
+     4270, 3905, 3905, 3905, 4270, 4270, 4270, 4270, 4270, 4270,
+     3905, 3905, 4270, 4270, 4270, 4271, 4272, 4273, 4273, 3905,
+     3905, 3905, 4273, 3905, 3905, 4273, 4274, 3905, 3905, 3905,
+     3905, 4275, 3905, 3905, 3905, 4276, 4277, 4277, 4277, 4277,
+     4278, 4279, 4280, 3905, 3905, 4281, 3905, 3905, 3905, 4282,
+
+     4283, 4284, 3905, 3905, 4284, 4284, 3905, 3905, 4284, 4285,
+     3905, 4286, 4287, 3905, 3905, 3905, 3905, 4288, 3905, 3905,
+     3905, 4288, 4288, 4288, 4289, 3905, 3905, 4290, 4291, 3905,
+     3905, 3905, 4291, 3905, 3905, 3905, 4291, 4292, 4293, 4294,
+     4295, 4296, 4297, 4297, 4297, 4298, 4299, 3905, 3905, 3905,
+     3905, 3905, 4300, 3905, 3905, 3905, 3905, 4301, 3905, 4302,
+     4303, 3905, 3905, 3905, 3905, 3905, 4304, 4305, 4306, 4307,
+     4307, 4307, 4308, 4309, 4310, 4310, 3905, 4311, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4312, 4313, 3905,
+     4314, 4314, 4314, 4314, 4315, 3905, 3905, 3905, 3905, 4316,
+     4317, 4317, 4318, 3905, 3905, 3905, 3905, 4319, 4320, 3905,
+     3905, 3905, 3905, 4321, 3905, 3905, 4322, 3905, 3905, 3905,
+     3905, 3905, 4323, 3905, 3905, 3905, 3905, 3905, 4324, 4324,
+     4324, 3905, 3905, 4324, 4324, 4324, 3905, 3905, 3905, 3905,
+     3905, 4324, 4324, 4325, 4326, 4327, 4327, 3905, 3905, 3905,
+     3905, 3905, 4327, 3905, 3905, 3905, 4328, 4329, 4330, 4330,
+     4330, 4330, 3905, 3905, 4331, 4332, 3905, 3905, 3905, 4333,
+
+     4334, 4335, 4336, 3905, 3905, 3905, 3905, 3905, 4336, 3905,
+     3905, 3905, 4336, 3905, 3905, 3905, 4337, 4338, 3905, 3905,
+     3905, 3905, 4339, 4339, 4339, 4339, 4340, 3905, 3905, 3905,
+     3905, 3905, 4341, 4341, 4341, 4342, 4343, 4344, 4345, 4346,
+     3905, 3905, 4347, 3905, 3905, 4348, 4349, 3905, 3905, 3905,
+     4350, 3905, 4351, 3905, 4352, 4353, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4354, 4355, 3905,
+     3905, 3905, 3905, 3905, 3905, 4356, 4357, 4358, 4359, 4359,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 4360, 4361, 3905, 4362, 4362, 4362, 4362, 3905, 3905,
+     3905, 4363, 4364, 3905, 3905, 4365, 3905, 3905, 3905, 3905,
+     3905, 3905, 4366, 4367, 3905, 3905, 3905, 3905, 3905, 3905,
+     4368, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4369,
+     3905, 3905, 3905, 4370, 4370, 4370, 3905, 3905, 3905, 3905,
+     3905, 4370, 4370, 3905, 3905, 3905, 4370, 4370, 4371, 4372,
+     4373, 4373, 3905, 3905, 3905, 4373, 4374, 4375, 4376, 3905,
+     3905, 4376, 4376, 4376, 4377, 4378, 4379, 4380, 3905, 3905,
+
+     4381, 3905, 3905, 3905, 4381, 4381, 3905, 3905, 3905, 4382,
+     3905, 3905, 3905, 4383, 4383, 4383, 4383, 4384, 4385, 3905,
+     3905, 4385, 4386, 4387, 3905, 3905, 4388, 4389, 3905, 3905,
+     3905, 3905, 3905, 4390, 3905, 3905, 3905, 4391, 3905, 3905,
+     4392, 4393, 3905, 4394, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4395,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4396, 4397,
+     4398, 4399, 4399, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4400, 4401, 3905,
+     3905, 3905, 4402, 4402, 4402, 3905, 4403, 4404, 3905, 3905,
+     3905, 4405, 4406, 4407, 4408, 3905, 3905, 3905, 4409, 4410,
+     4410, 4410, 3905, 3905, 3905, 4410, 4410, 4410, 3905, 3905,
+     4411, 3905, 3905, 4412, 4412, 4412, 4413, 4414, 4415, 3905,
+     3905, 3905, 4415, 4415, 4415, 4416, 4417, 4418, 4419, 4420,
+     4420, 4420, 3905, 3905, 3905, 3905, 4421, 3905, 3905, 3905,
+     4422, 4422, 4422, 4423, 4424, 3905, 3905, 3905, 4424, 3905,
+     3905, 4425, 4426, 3905, 3905, 3905, 3905, 3905, 4427, 4428,
+     3905, 3905, 3905, 4429, 4430, 3905, 4431, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 4432, 3905, 3905, 3905, 4433, 4434, 4435, 4436, 4436,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     4437, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4438,
+     4438, 3905, 4439, 3905, 3905, 4440, 4441, 4442, 4443, 3905,
+     3905, 4444, 4444, 4444, 4444, 3905, 3905, 4444, 4444, 3905,
+     3905, 3905, 3905, 3905, 4445, 4445, 4445, 4446, 3905, 3905,
+     3905, 3905, 4447, 4447, 4447, 4447, 3905, 3905, 4448, 4449,
+
+     3905, 3905, 4450, 4450, 4450, 3905, 4451, 3905, 3905, 3905,
+     3905, 3905, 4452, 4452, 3905, 3905, 3905, 3905, 4453, 4454,
+     4455, 4456, 3905, 3905, 4457, 4458, 3905, 4459, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4460, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4461,
+     4462, 4463, 4464, 4464, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 4465, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 4441, 4442, 4443, 4444,
+
+     4444, 4444, 4444, 3905, 3905, 3905, 4444, 4444, 3905, 3905,
+     3905, 3905, 3905, 3905, 4445, 4445, 3905, 3905, 4446, 3905,
+     3905, 3905, 4447, 4447, 4447, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 4449, 3905, 3905, 3905, 4450, 4450, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 4453, 4454, 4455, 4456, 4457, 4458, 3905, 4459,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     4460, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 4461, 4462, 4463, 4464, 4464, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4441,
+     4442, 4443, 4444, 4444, 3905, 3905, 4444, 4444, 4444, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4445, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 4447, 4447, 4447, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4449, 4450, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 4453, 3905, 3905, 3905,
+     3905, 4456, 4457, 4458, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4460, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 4463, 4464, 4464, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 4441, 4442, 4443, 4444,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4444, 4444, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4445, 3905, 3905,
+     3905, 4447, 3905, 3905, 4447, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 4450, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4453,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     4458, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 4460, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, 4464,
+     4464, 4464, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     4441, 3905, 3905, 4443, 4444, 3905, 3905, 3905, 3905, 3905,
+     3905, 4444, 4444, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 4445, 4447, 3905, 3905, 3905, 4447, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 4450, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4458, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4460, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 4463, 4464, 4464, 4464, 4466, 4467,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 4441, 4443, 4444, 3905, 3905, 4444, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 4445, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 4450, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 4460, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 4463, 4464, 4468, 4469,
+     4466, 4467, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     4443, 4444, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 4445, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 4450, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463,
+     4468, 4464, 4470, 4469, 4471, 4464, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 4443, 4444, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4445, 3905, 3905,
+     3905, 3905, 4450, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463,
+
+     4470, 3905, 4471, 4464, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 4463, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     4463, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 4463, 4463, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463,
+
+     4463, 4463, 4463, 3905,    0, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905
     } ;
 
-static yyconst flex_uint16_t yy_nxt[11977] =
+static yyconst flex_uint16_t yy_nxt[14073] =
     {   0,
-     3333,  242,  243,  242,  242,  243,  242,  242,  243,  242,
-      242,  243,  242,  247,  243,  247,  253,  244,  250,  253,
-      244,  250,  694,  245, 3333,  251,  245, 3333,  251,  248,
-      247,  243,  247,  623,  254,  256,  257,  254,  256,  257,
-      258,  259,  641,  258,  259,  623,  248,  263,  264,  624,
-      260,  256,  257,  260,  261,  626,  258,  256,  257, 1305,
-      261,  625,  258,  263,  264, 1306,  260,  275,  243,  275,
-      660,  625,  260,  275,  243,  275,  275,  243,  275,  275,
-      243,  275,  707,  276,  243,  243,  243,  708, 1666,  276,
-      699,  265,  277, 1667,  667,  277,  622,  622,  622, 1673,
-
-      278,  622,  622,  622,  622,  622,  622,  265,  266,  267,
-      243,  267,  266,  266,  266,  266,  266,  266,  266,  268,
-      266,  266,  266,  739,  266,  270,  266,  271,  266,  243,
-      243,  243,  275,  243,  275,  275,  243,  275,  660,  275,
-      243,  275,  275,  243,  275,  278,  626,  626,  276,  675,
-      712,  276,  626,  266,  266,  279,  676,  757,  279,  622,
-      622,  622,  625,  625,  272,  622,  622,  622,  625,  758,
-      631,  713,  740,  273,  266,  267,  243,  267,  266,  266,
-      266,  266,  266,  266,  266,  268,  266,  266,  266,  817,
-      266,  270,  266,  271,  266,  243,  243,  243,  243,  243,
-
-      243,  275,  243,  275,  818,  275,  243,  275,  243,  243,
-      243,  280,  632,  867,  280,  825,  868,  277,  633,  266,
-      266,  277,  626,  634,  281,  243,  243,  243,  635,  682,
-      272,  275,  243,  275,  275,  243,  275,  971,  625,  273,
-      972,  281,  275,  243,  275, 1674,  626,  279, 1676,  626,
-      279,  275,  243,  275,  622,  622,  622,  726,  282,  622,
-      622,  622,  625,  660,  677,  625, 1677,  282,  283,  284,
-      243,  284,  283,  283,  283,  283,  283,  283,  283,  285,
-      283,  283,  283,  844,  283,  287,  283,  288,  283,  293,
-      243,  293,  293,  243,  293,  243,  243,  243,  730,  243,
-
-      243,  243,  293,  243,  293,  294,  720,  892,  294,  667,
-     1680,  295,  678,  283,  283,  295,  667,  626,  294,  289,
-      721,  893,  290,  622,  622,  622,  622,  622,  622,  622,
-      622,  622,  845,  625,  291,  283,  284,  243,  284,  283,
-      283,  283,  283,  283,  283,  283,  285,  283,  283,  283,
-      667,  283,  287,  283,  288,  283,  293,  243,  293,  293,
-      243,  293,  293,  243,  293,  716,  305,  243,  305,  305,
-      243,  305,  294,  717, 1681,  296,  880,  626,  296,  718,
-      283,  283,  306,  737,  688,  306,  289,  738,  739,  290,
-      622,  622,  622,  625,  622,  622,  622,  622,  622,  622,
-
-      881,  291,  297,  298,  243,  298,  297,  297,  297,  297,
-      297,  297,  297,  299,  297,  297,  297,  861,  297,  301,
-      297,  302,  297,  317,  243,  317,  317,  243,  317,  329,
-      243,  329,  862,  329,  243,  329,  243,  243,  243,  318,
-      667, 1684,  318, 1706,  898,  330,  898,  297,  297,  330,
-      626,  626,  295,  243,  243,  243,  622,  622,  622,  622,
-      622,  622,  622,  622,  622,  802,  625,  625,  899,  295,
-      881,  303,  297,  298,  243,  298,  297,  297,  297,  297,
-      297,  297,  297,  299,  297,  297,  297,  880,  297,  301,
-      297,  302,  297,  329,  243,  329,  329,  243,  329,  329,
-
-      243,  329,  803,  329,  243,  329,  341,  243,  341,  330,
-      782,  899,  330,  626,  783,  331, 1707,  297,  297,  331,
-      709,  861,  342,  341,  243,  341,  622,  622,  622,  625,
-      622,  622,  622,  622,  622,  622,  622,  622,  622,  342,
-     1711,  303,  307,  308,  243,  308,  307,  307,  307,  307,
-      307,  307,  307,  309,  307,  307,  307, 1084,  307,  311,
-      307,  312,  307,  243,  243,  243,  243,  243,  243,  341,
-      243,  341, 1714,  341,  243,  341,  341,  243,  341,  295,
-      626,  626,  295,  823,  626,  342,  722,  307,  307,  342,
-      824,  313,  343, 1716,  723, 1725,  625,  625,  314,  724,
-
-      625,  315,  307,  308,  243,  308,  307,  307,  307,  307,
-      307,  307,  307,  309,  307,  307,  307, 1726,  307,  311,
-      307,  312,  307,  341,  243,  341,  357,  243,  357,  357,
-      243,  357,  892,  374,  243,  374,  374,  243,  374,  343,
-      626,  626,  358,  626,  626,  358,  906,  307,  307,  375,
-      746,  313,  375,  622,  622,  622,  625,  625,  314,  625,
-      625,  315,  319,  320,  243,  320,  319,  319,  319,  319,
-      319,  319,  319,  321,  319,  319,  319, 1727,  319,  323,
-      319,  324,  319,  243,  243,  243,  243,  243,  243,  374,
-      243,  374,  750,  374,  243,  374,  374,  243,  374,  278,
-
-      892, 1728,  278, 1730, 1738,  375, 1740,  319,  319,  375,
-      626,  626,  376,  325,  910,  759,  326,  622,  622,  622,
-      622,  622,  622,  622,  622,  622,  625,  625,  327,  319,
-      320,  243,  320,  319,  319,  319,  319,  319,  319,  319,
-      321,  319,  319,  319,  667,  319,  323,  319,  324,  319,
-      374,  243,  374,  385,  243,  385,  385,  243,  385,  789,
-      243,  243,  243,  243,  243,  243,  376,  667, 1440,  386,
-     1743, 1744,  386, 1747,  319,  319,  278,  626,  626,  278,
-      325, 1441,  789,  326,  622,  622,  622,  622,  622,  622,
-      622,  622,  622,  625,  625,  327,  332,  333,  243,  333,
-
-      332,  332,  332,  332,  332,  332,  332,  334,  332,  332,
-      332,  791,  332,  336,  332,  337,  332,  385,  243,  385,
-      385,  243,  385,  385,  243,  385,  789,  385,  243,  385,
-      400,  243,  400,  386,  794, 1749,  386,  785, 1750,  387,
-     1752,  332,  332,  387,  626,  626,  401,  338,  622,  622,
-      622,  622,  622,  622,  622,  622,  622,  622,  622,  622,
-      625,  625,  339,  332,  333,  243,  333,  332,  332,  332,
-      332,  332,  332,  332,  334,  332,  332,  332,  667,  332,
-      336,  332,  337,  332,  400,  243,  400,  243,  243,  243,
-      243,  243,  243,  802,  400,  243,  400,  400,  243,  400,
-
-      401, 1094,  626,  402,  626, 1417,  402, 1094,  332,  332,
-      401,  764,  626,  401,  338,  622,  622,  622,  625,  769,
-      625,  622,  622,  622,  622,  622,  622, 1619,  625,  339,
-      344,  345,  243,  345,  344,  344,  344,  344,  344,  344,
-      344,  346,  344,  344,  344,  667,  344,  348,  344,  349,
-      344,  400,  243,  400,  400,  243,  400,  414,  243,  414,
-      837,  414,  243,  414,  424,  243,  424,  403,  626,  626,
-      403,  626,  626,  415, 1753,  344,  344,  415,  774,  350,
-      425,  622,  622,  622,  625,  625,  351,  625,  625,  352,
-      622,  622,  622,  353, 1754,  354,  355,  344,  345,  243,
-
-      345,  344,  344,  344,  344,  344,  344,  344,  346,  344,
-      344,  344,  667,  344,  348,  344,  349,  344,  424,  243,
-      424,  243,  243,  243,  243,  243,  243,  892,  424,  243,
-      424,  424,  243,  424,  425,  626,  626,  426,  626,  626,
-      426,  911,  344,  344,  425,  784,  350,  425,  622,  622,
-      622,  625,  625,  351,  625,  625,  352,  622,  622,  622,
-      353, 1755,  354,  355,  359,  360,  243,  360,  359,  359,
-      359,  359,  359,  359,  359,  361,  359,  359,  359,  362,
-      359,  363,  359,  364,  359,  362,  362,  362,  362,  362,
-      362,  362,  362,  362,  362,  362,  362,  362,  362,  362,
-
-      362,  362,  362,  362,  362,  362,  362,  362,  362,  359,
-      359,  362,  362,  365,  366,  362,  362,  362,  362,  362,
-      367,  362,  362,  368,  362,  362,  362,  369,  362,  370,
-      371,  372,  362,  362,  362,  362,  362,  362,  377,  378,
-      243,  378,  377,  377,  377,  377,  377,  377,  377,  379,
-      377,  377,  377, 1759,  377,  381,  377,  382,  377,  424,
-      243,  424,  424,  243,  424,  439,  243,  439, 1760,  439,
-      243,  439,  243,  243,  243,  427,  626, 1761,  427, 1763,
-      889,  440,  844,  377,  377,  440, 1767,  890,  278,  622,
-      622,  622,  625,  891,  383,  377,  378,  243,  378,  377,
-
-      377,  377,  377,  377,  377,  377,  379,  377,  377,  377,
-     1771,  377,  381,  377,  382,  377,  243,  243,  243,  439,
-      243,  439,  439,  243,  439, 1775,  439,  243,  439,  439,
-      243,  439,  278,  793,  667,  440, 1777,  889,  440,  813,
-      377,  377,  441,  814,  890,  441,  667,  815,  792, 3333,
-      896,  383,  388,  389,  243,  389,  388,  388,  388,  388,
-      388,  388,  388,  390,  388,  388,  388, 1779,  388,  392,
-      388,  393,  388,  451,  243,  451,  451,  243,  451,  462,
-      243,  462,  882,  462,  243,  462, 1781,  669, 1782,  452,
-     1030, 1094,  452,  883, 1517,  463,  884,  388,  388,  463,
-
-      394,  654,  395,  670,  906,  664, 1518, 1096,  396,  622,
-      622,  622,  622,  622,  622,  397,  789, 1124,  398,  388,
-      389,  243,  389,  388,  388,  388,  388,  388,  388,  388,
-      390,  388,  388,  388, 1125,  388,  392,  388,  393,  388,
-      473,  243,  473,  473,  243,  473,  488,  243,  488,  900,
-      488,  243,  488, 1783, 1785,  790,  474, 1124, 1792,  474,
-      901, 1796,  489,  884,  388,  388,  489,  394,  791,  395,
-      792,  622,  622,  622, 1254,  396,  622,  622,  622,  622,
-      622,  622,  397, 1797, 1399,  398,  404,  405,  243,  405,
-      404,  404,  404,  404,  404,  404,  404,  406,  404,  404,
-
-      404, 1125,  404,  408,  404,  409,  404,  243,  243,  243,
-      243,  243,  243,  499,  243,  499, 1799,  499,  243,  499,
-      499,  243,  499,  490, 1622, 1809,  490,  626,  626,  500,
-     1810,  404,  404,  500,  808,  819,  501,  410,  622,  622,
-      622, 1811,  411,  625,  625,  622,  622,  622,  622,  622,
-      622,  622,  622,  622,  412,  404,  405,  243,  405,  404,
-      404,  404,  404,  404,  404,  404,  406,  404,  404,  404,
-     1812,  404,  408,  404,  409,  404,  499,  243,  499,  243,
-      243,  243,  243,  243,  243, 1813,  499,  243,  499,  499,
-      243,  499,  501, 1814, 1815,  502,  626,  905,  502, 1816,
-
-      404,  404,  500,  830,  890,  500,  410,  622,  622,  622,
-      891,  411,  625,  622,  622,  622,  622,  622,  622,  622,
-      622,  622, 1817,  412,  416,  417,  243,  417,  416,  416,
-      416,  416,  416,  416,  416,  418,  416,  416,  416, 1818,
-      416,  420,  416,  421,  416,  499,  243,  499,  499,  243,
-      499,  243,  243,  243,  882,  243,  243,  243,  499,  243,
-      499,  503,  900, 1819,  503,  883, 1820,  426, 1028,  416,
-      416,  426, 1821,  901,  501, 1823, 1028,  422,  416,  417,
-      243,  417,  416,  416,  416,  416,  416,  416,  416,  418,
-      416,  416,  416, 1824,  416,  420,  416,  421,  416,  499,
-
-      243,  499,  243,  243,  243,  243,  243,  243, 1825,  499,
-      243,  499,  499,  243,  499,  501, 1440, 1563,  504, 1828,
-     1831,  504, 1094,  416,  416,  503, 1832, 1833,  503, 1446,
-     1446,  422,  428,  429,  243,  429,  428,  428,  428,  428,
-      428,  428,  428,  430,  428,  428,  428, 1806,  428,  432,
-      428,  433,  428,  499,  243,  499,  499,  243,  499,  518,
-      243,  518, 1834,  518,  243,  518,  243,  243,  243,  505,
-     1835, 1836,  505,  851, 1837,  519, 1840,  428,  428,  519,
-      852,  434,  520,  622,  622,  622, 1849, 1854,  435,  625,
-     1855,  436,  622,  622,  622,  622,  622,  622,  437,  428,
-
-      429,  243,  429,  428,  428,  428,  428,  428,  428,  428,
-      430,  428,  428,  428, 1894,  428,  432,  428,  433,  428,
-      243,  243,  243,  518,  243,  518,  518,  243,  518, 1895,
-      518,  243,  518,  518,  243,  518,  520, 1901, 1907,  519,
-      626, 1908,  519, 1909,  428,  428,  521,  859,  434,  521,
-      622,  622,  622, 1910, 1913,  435,  625, 1919,  436,  622,
-      622,  622,  865,  865,  865,  437,  442,  443,  243,  443,
-      442,  442,  442,  442,  442,  442,  442,  444,  442,  442,
-      442, 1921,  442,  446,  442,  447,  442,  531,  243,  531,
-      531,  243,  531,  545,  243,  545, 1927,  545,  243,  545,
-
-      556,  243,  556,  532, 1931, 1934,  532,  905, 1935,  546,
-     1937,  442,  442,  546,  890, 1938,  557,  448, 1939, 1940,
-      896,  866,  449,  442,  443,  243,  443,  442,  442,  442,
-      442,  442,  442,  442,  444,  442,  442,  442, 1941,  442,
-      446,  442,  447,  442,  556,  243,  556,  243,  243,  243,
-      243,  243,  243, 1942,  556,  243,  556,  556,  243,  556,
-      557, 1943, 1945,  295,  889,  905,  295, 1951,  442,  442,
-      557,  890,  890,  557,  448, 1952, 1953, 1029, 1029,  449,
-      453,  454,  243,  454,  453,  453,  453,  453,  453,  453,
-      453,  455,  453,  453,  453, 1955,  453,  457,  453,  458,
-
-      453,  556,  243,  556,  556,  243,  556,  568,  243,  568,
-     1957,  568,  243,  568,  581,  243,  581,  558, 1209, 1965,
-      558, 1970, 1971,  569, 1972,  453,  453,  569, 1210, 1974,
-      582,  581,  243,  581, 1992, 1211,  459,  865,  865,  865,
-     1993, 1098, 1113, 1113, 1113, 1994, 1997,  582, 1094,  460,
-      453,  454,  243,  454,  453,  453,  453,  453,  453,  453,
-      453,  455,  453,  453,  453, 1987,  453,  457,  453,  458,
-      453,  243,  243,  243,  243,  243,  243,  581,  243,  581,
-     1622,  581,  243,  581,  581,  243,  581,  278, 1975, 1995,
-      278, 1998, 2000,  582, 1976,  453,  453,  582, 1977, 2001,
-
-      583,  581,  243,  581, 1978, 1996,  459, 1105, 1105, 1105,
-     2002, 1106, 2003, 1989, 1107, 2004, 1622,  583, 2005,  460,
-      464,  465,  243,  465,  464,  464,  464,  464,  464,  464,
-      464,  466,  464,  464,  464, 2008,  464,  468,  464,  469,
-      464,  595,  243,  595,  595,  243,  595,  243,  243,  243,
-     2009,  243,  243,  243,  595,  243,  595,  596, 1988, 2010,
-      596, 2011, 2014,  597, 2015,  464,  464,  597, 2016, 2012,
-      596, 1134, 1134, 1134, 1634, 1634, 1634, 2017, 1113, 1113,
-     1113,  470, 1134, 1134, 1134, 2013,  471,  464,  465,  243,
-      465,  464,  464,  464,  464,  464,  464,  464,  466,  464,
-
-      464,  464, 2019,  464,  468,  464,  469,  464,  595,  243,
-      595,  595,  243,  595,  595,  243,  595, 1641, 1641, 1641,
-     1635,  873,  873,  873,  596, 2020, 2027,  598, 2029, 2031,
-      598, 2055,  464,  464,  256,  257,  256,  257,  874,  258,
-      750,  258, 1114, 1134, 1134, 1134, 1135, 2056,  470,  608,
-      751,  608, 2057,  471,  475,  476,  243,  476,  475,  475,
-      475,  475,  475,  475,  475,  477,  475,  475,  475, 2063,
-      475,  479,  475,  480,  475,  620,  243,  620,  609,  645,
-      609,  620,  243,  620, 2064,  647, 2068, 2069,  923,  923,
-      923,  621,  654, 1109, 1109, 1109,  653,  621,  641,  475,
-
-      475, 2072,  481,  482,  483,  924, 2073, 1114,  665, 2077,
-      484, 1111, 2080,  485, 1113, 1113, 1113, 1644, 1644, 1644,
-      486,  475,  476,  243,  476,  475,  475,  475,  475,  475,
-      475,  475,  477,  475,  475,  475,  666,  475,  479,  475,
-      480,  475,  937,  937,  937,  939,  939,  939, 2084, 2085,
-      667, 2086,  668, 2089,  653,  949,  949,  949, 2092,  938,
-     2096, 2097,  940, 1156, 1156, 1156,  475,  475, 2098,  481,
-      482,  483,  950, 1649, 1649, 1649, 2103,  484, 1135, 2105,
-      485, 1158, 1637, 1637, 1637, 2106, 2107,  486,  491,  492,
-      243,  492,  491,  491,  491,  491,  491,  491,  491,  493,
-
-      491,  491,  491, 2108,  491,  495,  491,  496,  491,  952,
-      952,  952,  966,  966,  966,  973,  973,  973,  982,  982,
-      982,  984,  984,  984, 2110, 2111,  953, 2114, 1638,  967,
-     2116, 2119,  974,  491,  491,  983, 2135, 2136,  985,  993,
-      993,  993, 1167, 1167, 1167, 2137, 1168, 2142, 2143, 1169,
-     2146, 1655, 1655, 1655, 2147, 2148,  994,  497,  491,  492,
-      243,  492,  491,  491,  491,  491,  491,  491,  491,  493,
-      491,  491,  491, 2151,  491,  495,  491,  496,  491, 1001,
-     1001, 1001, 1005, 1005, 1005, 1017, 1017, 1017, 1039, 1039,
-     1039, 1045, 1045, 1045, 1094, 2160, 1002, 1656, 2144, 1006,
-
-     2153, 2161, 1018,  491,  491, 1040, 2145, 2149, 1046, 1061,
-     1061, 1061, 1193, 1193, 1193, 2150, 1194, 2162, 1622, 1195,
-     2163, 1658, 1658, 1658, 2166, 2168, 1062,  497,  506,  507,
-      243,  507,  506,  506,  506,  506,  506,  506,  506,  508,
-      506,  506,  506, 2169,  506,  510,  506,  511,  506, 1067,
-     1067, 1067, 1073, 1073, 1073, 1081, 1081, 1081,  873,  873,
-      873, 1149, 1149, 1149, 2155, 2170, 1068, 1638, 2174, 1074,
-     2176, 2177, 1082,  506,  506,  874, 2178, 2181, 1150, 1622,
-     2185,  512, 2186,  513, 2188, 2190,  514, 1659, 1659, 1659,
-      515, 1634, 1634, 1634,  516,  506,  507,  243,  507,  506,
-
-      506,  506,  506,  506,  506,  506,  508,  506,  506,  506,
-     2154,  506,  510,  506,  511,  506, 2201, 1109, 1109, 1109,
-     1153, 1153, 1153, 2202, 1162, 1162, 1162, 3333, 3333, 3333,
-     3333, 3333, 3333, 1979, 2203, 1111, 2207, 1154, 2208, 1980,
-      506,  506, 1164, 1981, 3333, 2209, 2215, 3333,  512, 1982,
-      513, 2216, 2217,  514, 1112, 2220, 2224,  515, 1637, 1637,
-     1637,  516,  522,  523,  243,  523,  522,  522,  522,  522,
-      522,  522,  522,  524,  522,  522,  522, 1151,  522,  526,
-      522,  527,  522, 1156, 1156, 1156,  923,  923,  923, 1155,
-     2225, 2226, 1152, 1162, 1162, 1162, 1171, 1171, 1171, 2227,
-
-     2230, 1158, 2231,  924, 1175, 1175, 1175,  522,  522, 2232,
-     2233, 1164, 2234, 2246, 1173, 1196, 1196, 1196,  528, 1197,
-     1159, 1176, 1198, 1212, 1212, 1212, 2247, 1213, 2251, 2254,
-     1214,  529,  522,  523,  243,  523,  522,  522,  522,  522,
-      522,  522,  522,  524,  522,  522,  522, 2255,  522,  526,
-      522,  527,  522, 1171, 1171, 1171, 2261, 1165, 1179, 1179,
-     1179, 1181, 1181, 1181, 1181, 1181, 1181, 3333, 3333, 3333,
-     2266, 1173, 1185, 1185, 1185, 1180, 2268,  522,  522, 1183,
-     2269, 2270, 1183, 2274, 3333, 1822, 1822, 1822,  528, 1186,
-     1216, 1216, 1216, 2275, 1217, 2276, 2277, 1218, 2278, 2279,
-
-     1174,  529,  533,  534,  243,  534,  533,  533,  533,  533,
-      533,  533,  533,  535,  533,  533,  533, 1177,  533,  537,
-      533,  538,  533, 1187, 1187, 1187, 1189, 1189, 1189,  937,
-      937,  937, 1178, 2280, 2281, 1184, 1189, 1189, 1189, 2282,
-     1188, 1205, 1205, 1205, 1191, 2283,  938,  533,  533,  939,
-      939,  939, 2300, 2301, 1191, 1622,  539, 2302,  540, 1207,
-     2304, 2306,  541, 1641, 1641, 1641,  940,  542,  543,  533,
-      534,  243,  534,  533,  533,  533,  533,  533,  533,  533,
-      535,  533,  533,  533, 2307,  533,  537,  533,  538,  533,
-     2309, 1199, 1199, 1199, 2310,  949,  949,  949, 2286, 3333,
-
-     3333, 3333, 3333, 3333, 3333, 2311, 2312, 1192, 1200, 3333,
-     3333, 3333,  950, 2313,  533,  533, 3333, 2314, 2326, 3333,
-     1234, 1234, 1234,  539, 1235,  540, 3333, 1236, 1622,  541,
-     1658, 1658, 1658, 2327,  542,  543,  547,  548,  243,  548,
-      547,  547,  547,  547,  547,  547,  547,  549,  547,  547,
-      547, 1201,  547,  551,  547,  552,  547, 1202, 2332, 2333,
-     1203, 2339, 2340,  952,  952,  952, 3333, 3333, 3333, 1219,
-     1219, 1219, 1230, 1230, 1230, 2287, 1669, 1205, 1205, 1205,
-      953,  547,  547, 3333, 2341, 2357, 1220,  553, 2328, 2358,
-     1232, 2359, 1244, 1244, 1244, 1207, 1245, 2375, 2329, 1246,
-
-     2376, 2377,  554,  547,  548,  243,  548,  547,  547,  547,
-      547,  547,  547,  547,  549,  547,  547,  547, 1204,  547,
-      551,  547,  552,  547, 1208, 2380, 2382, 1230, 1230, 1230,
-      966,  966,  966, 1237, 1237, 1237, 2383, 1237, 1237, 1237,
-      973,  973,  973, 2384, 2385, 1232, 2386,  967,  547,  547,
-     2387, 1239, 2388, 2389,  553, 1239, 2390,  974, 1256, 1256,
-     1256, 2391, 1257, 2392, 2393, 1258, 1644, 1644, 1644,  554,
-      559,  560,  243,  560,  559,  559,  559,  559,  559,  559,
-      559,  561,  559,  559,  559, 1233,  559,  563,  559,  564,
-      559, 1250, 1250, 1250, 1250, 1250, 1250, 2398, 1240, 2399,
-
-      982,  982,  982, 2402,  984,  984,  984, 2288, 2289, 1252,
-     2290, 2403, 1252, 2404, 2405,  559,  559,  983, 2291, 2408,
-      565,  985, 1649, 1649, 1649, 2292,  566,  559,  560,  243,
-      560,  559,  559,  559,  559,  559,  559,  559,  561,  559,
-      559,  559, 1622,  559,  563,  559,  564,  559, 1622, 1259,
-     1259, 1259, 2409, 1260, 2410, 1253, 1261, 1262, 1262, 1262,
-     1262, 1262, 1262, 1267, 1267, 1267, 2411, 1272, 1272, 1272,
-     2413, 1273,  559,  559, 1274, 1264, 2414,  565, 1264, 2397,
-     2396, 1269, 2415,  566,  570,  571,  243,  571,  570,  570,
-      570,  570,  570,  570,  570,  572,  570,  570,  570, 2416,
-
-      570,  574,  570,  575,  570, 2417, 2419, 1267, 1267, 1267,
-      993,  993,  993, 1278, 1278, 1278, 2420, 2400, 1278, 1278,
-     1278, 1265, 1001, 1001, 1001, 1269, 2401,  994, 2406,  570,
-      570, 1280,  576, 2421,  577, 2431, 1280, 2407, 2432, 1002,
-      578, 1283, 1283, 1283, 2433, 1284, 2434, 2438, 1285, 2439,
-     2446,  579,  570,  571,  243,  571,  570,  570,  570,  570,
-      570,  570,  570,  572,  570,  570,  570, 1270,  570,  574,
-      570,  575,  570, 1281, 1286, 1286, 1286, 1005, 1005, 1005,
-     2447, 1294, 1294, 1294, 2454, 2455, 1286, 1286, 1286, 1290,
-     1290, 1290, 1288, 1291, 1006, 2456, 1292,  570,  570, 1296,
-
-      576, 2468,  577, 2469, 1288, 1308, 1308, 1308,  578, 1309,
-     2485, 2486, 1310, 1829, 1829, 1829, 1655, 1655, 1655,  579,
-      584,  585,  243,  585,  584,  584,  584,  584,  584,  584,
-      584,  586,  584,  584,  584, 2487,  584,  588,  584,  589,
-      584, 1289, 1300, 1300, 1300, 1017, 1017, 1017, 2488, 1294,
-     1294, 1294, 2490, 1300, 1300, 1300, 1311, 1311, 1311, 1830,
-     1302, 2491, 1018, 2492, 2493,  584,  584, 1296, 2494, 2495,
-      590, 1302, 2496, 1312, 2497, 2498,  591, 1338, 1338, 1338,
-      592, 1339, 2499, 2500, 1340, 2501,  593,  584,  585,  243,
-      585,  584,  584,  584,  584,  584,  584,  584,  586,  584,
-
-      584,  584, 2506,  584,  588,  584,  589,  584, 2507, 1094,
-     1297, 1315, 1315, 1315, 1303, 1658, 1658, 1658, 1315, 1315,
-     1315, 1321, 1321, 1321, 1321, 1321, 1321, 2508, 2509, 1317,
-     2510, 2511,  584,  584, 2512, 2513, 1317,  590, 1622, 1323,
-     2514, 2515, 1323,  591, 1347, 1347, 1347,  592, 1348, 2503,
-     2516, 1349, 2517,  593,  599,  600,  243,  600,  599,  599,
-      599,  599,  599,  599,  599,  601,  599,  599,  599, 1318,
-      599,  603,  599,  604,  599, 1333, 1333, 1333, 1333, 1333,
-     1333, 2505, 1324, 2518, 1039, 1039, 1039, 1342, 1342, 1342,
-     1342, 1342, 1342, 1335, 2519, 2521, 1335, 2522, 2523,  599,
-
-      599, 1040, 1372, 1372, 1372, 1344, 1373,  605, 1344, 1374,
-      606, 2524, 1826, 1826, 1826, 2525, 2526,  607,  599,  600,
-      243,  600,  599,  599,  599,  599,  599,  599,  599,  601,
-      599,  599,  599, 2531,  599,  603,  599,  604,  599, 1045,
-     1045, 1045, 1336, 1350, 1350, 1350, 2532, 2535, 1353, 1353,
-     1353, 1358, 1358, 1358, 1345, 2536, 1046, 1358, 1358, 1358,
-     1351, 2537, 2538,  599,  599, 1354, 1381, 1381, 1381, 1360,
-     1382,  605, 2541, 1383,  606, 1360, 1827, 1659, 1659, 1659,
-     2542,  607,  610,  611,  243,  611,  610,  610,  610,  610,
-      610,  610,  610,  612,  610,  610,  610, 2545,  610,  614,
-
-      610,  615,  610, 2546, 1361, 1362, 1362, 1362, 1364, 1364,
-     1364, 1622, 3333, 3333, 3333, 1367, 1367, 1367, 1367, 1367,
-     1367, 2554, 1363, 2555, 2539, 1365, 2556,  610,  610, 3333,
-     1061, 1061, 1061, 1369,  616, 2540, 1369, 1390, 1390, 1390,
-      617, 1391, 2567, 2590, 1392, 2591, 2596, 1062, 2504,  618,
-      610,  611,  243,  611,  610,  610,  610,  610,  610,  610,
-      610,  612,  610,  610,  610, 2597,  610,  614,  610,  615,
-      610, 1366, 1375, 1375, 1375, 1375, 1375, 1375, 2543, 1370,
-     1067, 1067, 1067, 1385, 1385, 1385, 1385, 1385, 1385, 2544,
-     1377, 2598, 2599, 1377, 2600,  610,  610, 1068, 1073, 1073,
-
-     1073, 1387,  616, 2601, 1387, 1395, 1395, 1395,  617, 1395,
-     1395, 1395, 1081, 1081, 1081, 1074, 2602,  618,  626, 1841,
-     1841, 1841, 2603, 1397, 2604,  641, 2605, 1397, 1094, 1082,
-     1406, 1406, 1406, 2610,  625,  642, 1378, 1401, 1401, 1401,
-     2611, 1402, 2612, 2613, 1403, 1904, 1904, 1904, 1408, 1406,
-     1406, 1406, 1388, 1413, 1413, 1413, 2560, 2607, 1413, 1413,
-     1413, 2614,  643,  644,  645, 1842, 2561, 1408, 1622,  646,
-      647, 1415, 2562,  648,  649, 1398, 1415,  650, 2615,  651,
-      652,  653,  626, 1105, 1105, 1105, 2616, 1106, 2617, 2618,
-     1107, 1109, 1109, 1109, 1109, 1109, 1109, 2619,  625,  655,
-
-     1424, 1424, 1424, 1149, 1149, 1149, 1153, 1153, 1153, 1111,
-     2608, 2579, 1111, 1409, 1156, 1156, 1156, 1622, 1425, 2620,
-     1150, 2580, 1416, 1154, 2581, 2621,  643,  656,  657, 1999,
-     1999, 1999, 1158,  658,  659, 2622, 2624,  660,  649, 2582,
-     2625,  661, 2626,  662,  663,  664, 1461, 1461, 1461, 2583,
-     1462, 2628, 2584, 1463, 1466, 1466, 1466, 2629, 1467, 2609,
-     2635, 1468, 1156, 1156, 1156, 1156, 1156, 1156, 1162, 1162,
-     1162, 1162, 1162, 1162, 1162, 1162, 1162, 1167, 1167, 1167,
-     1158, 1168, 2643, 1158, 1169, 2644, 1164, 2645, 2646, 1164,
-     2647, 2648, 1164, 1171, 1171, 1171, 1171, 1171, 1171, 1171,
-
-     1171, 1171, 1175, 1175, 1175, 1477, 1477, 1477, 2440, 1478,
-     2441, 1173, 1479, 2649, 1173, 2650, 2651, 1173, 2652, 1176,
-     1179, 1179, 1179, 2442, 1482, 1482, 1482, 1473, 1483, 1470,
-     2653, 1484, 1181, 1181, 1181, 2657, 2660, 1180, 1181, 1181,
-     1181, 1181, 1181, 1181, 1185, 1185, 1185, 2661, 1476, 2662,
-     1183, 1486, 1486, 1486, 2663, 1487, 1183, 2664, 1488, 1183,
-     2665, 1186, 1187, 1187, 1187, 1489, 1489, 1489, 2666, 1490,
-     2669, 2677, 1491, 1189, 1189, 1189, 1189, 1189, 1189, 1188,
-     1189, 1189, 1189, 1193, 1193, 1193, 2443, 1194, 2444, 2678,
-     1195, 1191, 2681, 2682, 1191, 1196, 1196, 1196, 1191, 1197,
-
-     2673, 2445, 1198, 1485, 1199, 1199, 1199, 1493, 1493, 1493,
-     2700, 1494, 2701, 2674, 1495, 1205, 1205, 1205, 1205, 1205,
-     1205, 1200, 1205, 1205, 1205, 1212, 1212, 1212, 2675, 1213,
-     2702, 2703, 1214, 1207, 2704, 2679, 1207, 1504, 1504, 1504,
-     1207, 2676, 1492, 1216, 1216, 1216, 2705, 1217, 2680, 2706,
-     1218, 1219, 1219, 1219, 1505, 1506, 1506, 1506, 2707, 1507,
-     1094, 2713, 1508, 1230, 1230, 1230, 2293, 2294, 1220, 2295,
-     1500, 1230, 1230, 1230, 1230, 1230, 1230, 2296, 1234, 1234,
-     1234, 1232, 1235, 2714, 2297, 1236, 1237, 1237, 1237, 1232,
-     2683, 2715, 1232, 1237, 1237, 1237, 1237, 1237, 1237, 1523,
-
-     1523, 1523, 2716, 2684, 1239, 1244, 1244, 1244, 2709, 1245,
-     2717, 1239, 1246, 1622, 1239, 2718, 1524, 1250, 1250, 1250,
-     1250, 1250, 1250, 2563, 1250, 1250, 1250, 1530, 1530, 1530,
-     1256, 1256, 1256, 2564, 1257, 1252, 2719, 1258, 1252, 2565,
-     2720, 1519, 1252, 2721, 1531, 1259, 1259, 1259, 2710, 1260,
-     2722, 2723, 1261, 1262, 1262, 1262, 1520, 1262, 1262, 1262,
-     1262, 1262, 1262, 1533, 1533, 1533, 1267, 1267, 1267, 2724,
-     2725, 1264, 1267, 1267, 1267, 1264, 2727, 2728, 1264, 2730,
-     1534, 1267, 1267, 1267, 1269, 1278, 1278, 1278, 2738, 1528,
-     1269, 1272, 1272, 1272, 2745, 1273, 2746, 2747, 1274, 1269,
-
-     1278, 1278, 1278, 1280, 1278, 1278, 1278, 1283, 1283, 1283,
-     2748, 1284, 2749, 2731, 1285, 1286, 1286, 1286, 1280, 1286,
-     1286, 1286, 1280, 2732, 2750, 1532, 1286, 1286, 1286, 2733,
-     1535, 2751, 2752, 1288, 1290, 1290, 1290, 1288, 1291, 2734,
-     2753, 1292, 2754, 2755, 1288, 1294, 1294, 1294, 1294, 1294,
-     1294, 1294, 1294, 1294, 1545, 1545, 1545, 3333, 3333, 3333,
-     1300, 1300, 1300, 1296, 1540, 2756, 1296, 2760, 2761, 1296,
-     2762, 1546, 2763, 2764, 3333, 1300, 1300, 1300, 1302, 1300,
-     1300, 1300, 2765, 1308, 1308, 1308, 1542, 1309, 2766, 2767,
-     1310, 2768, 2769, 1302, 1311, 1311, 1311, 1302, 1553, 1553,
-
-     1553, 1544, 1554, 2770, 1547, 1555, 1315, 1315, 1315, 2771,
-     2772, 1312, 1315, 1315, 1315, 1315, 1315, 1315, 1321, 1321,
-     1321, 1321, 1321, 1321, 1317, 1321, 1321, 1321, 2773, 2774,
-     1317, 2775, 2776, 1317, 2777, 2778, 1323, 2779, 2793, 1323,
-     1566, 1566, 1566, 1323, 2794, 2795, 1548, 1333, 1333, 1333,
-     1333, 1333, 1333, 1333, 1333, 1333, 2796, 1567, 2797, 2782,
-     1338, 1338, 1338, 2798, 1339, 1335, 1558, 1340, 1335, 2783,
-     2799, 1335, 1561, 1342, 1342, 1342, 1342, 1342, 1342, 1342,
-     1342, 1342, 1347, 1347, 1347, 2784, 1348, 2800, 2808, 1349,
-     2809, 1344, 2810, 2811, 1344, 2785, 2812, 1344, 1350, 1350,
-
-     1350, 1576, 1576, 1576, 2813, 1577, 2814, 2815, 1578, 1579,
-     1579, 1579, 2820, 2821, 1571, 1351, 1353, 1353, 1353, 2822,
-     1581, 1581, 1581, 1094, 1582, 2823, 1580, 1583, 1585, 1585,
-     1585, 2825, 2828, 1354, 1358, 1358, 1358, 1358, 1358, 1358,
-     1574, 1358, 1358, 1358, 2829, 1586, 1362, 1362, 1362, 1589,
-     1589, 1589, 1360, 1590, 2830, 1360, 1591, 2802, 2831, 1360,
-     1364, 1364, 1364, 1363, 1592, 1592, 1592, 2832, 1593, 2833,
-     2834, 1594, 1367, 1367, 1367, 2835, 2836, 1365, 1367, 1367,
-     1367, 1367, 1367, 1367, 1372, 1372, 1372, 2837, 1373, 2842,
-     1369, 1374, 1375, 1375, 1375, 2843, 1369, 2844, 2845, 1369,
-
-     2846, 1588, 1375, 1375, 1375, 1375, 1375, 1375, 2847, 2848,
-     1377, 1381, 1381, 1381, 2849, 1382, 2850, 2851, 1383, 2852,
-     1377, 2853, 2854, 1377, 1385, 1385, 1385, 1385, 1385, 1385,
-     2855, 1385, 1385, 1385, 1390, 1390, 1390, 2856, 1391, 2857,
-     2858, 1392, 1387, 2862, 2863, 1387, 2864, 2865, 1596, 1387,
-     1605, 1605, 1605, 1395, 1395, 1395, 1395, 1395, 1395, 1395,
-     1395, 1395, 1609, 1609, 1609, 2868, 2869, 1606, 3333, 3333,
-     3333, 1397, 1598, 2870, 1397, 2871, 2872, 1397, 2873, 1610,
-     1401, 1401, 1401, 2881, 1402, 3333, 2882, 1403, 1406, 1406,
-     1406, 2883, 1602, 1406, 1406, 1406, 1406, 1406, 1406, 1615,
-
-     1615, 1615, 2884, 1413, 1413, 1413, 1408, 1413, 1413, 1413,
-     2885, 1408, 2886, 2887, 1408, 2888, 1616, 1413, 1413, 1413,
-     1607, 1415, 1621, 1621, 1621, 1415, 1424, 1424, 1424, 1611,
-     1461, 1461, 1461, 1094, 1462, 1415, 2889, 1463, 2890, 2893,
-     1622, 1623, 2899, 1613, 1425, 1466, 1466, 1466, 2900, 1467,
-     2901, 2902, 1468, 1156, 1156, 1156, 1670, 1670, 1670, 1162,
-     1162, 1162, 2903, 2904, 1618, 1171, 1171, 1171, 1477, 1477,
-     1477, 1158, 1478, 1671, 2905, 1479, 2875, 1164, 1482, 1482,
-     1482, 2912, 1483, 1173, 2913, 1484, 1181, 1181, 1181, 1486,
-     1486, 1486, 2914, 1487, 2915, 2916, 1488, 2917, 1489, 1489,
-
-     1489, 2918, 1490, 2919, 1183, 1491, 1189, 1189, 1189, 1493,
-     1493, 1493, 2920, 1494, 1668, 2921, 1495, 1682, 1682, 1682,
-     2922, 2923, 1675, 2924, 1191, 2925, 1672, 1205, 1205, 1205,
-     1686, 1686, 1686, 1678, 1683, 3333, 3333, 3333, 3333, 3333,
-     3333, 1504, 1504, 1504, 2926, 1207, 2927, 1687, 3333, 3333,
-     3333, 2928, 3333, 1679, 2929, 3333, 2930, 2931, 1505, 1690,
-     1690, 1690, 2932, 1691, 2933, 3333, 1692, 1506, 1506, 1506,
-     2934, 1507, 2935, 2936, 1508, 3333, 3333, 3333, 3333, 3333,
-     3333, 2937, 1685, 2938, 2952, 1689, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 1094, 2943, 3333, 3333, 3333, 3333, 1693,
-
-     2953, 1688, 2958, 3333, 2959, 2946, 3333, 1699, 1699, 1699,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     2960, 2943, 1694, 2961, 1700, 2962, 2970, 3333, 1230, 1230,
-     1230, 3333, 2971, 1696, 3333, 2944, 1237, 1237, 1237, 2941,
-     1523, 1523, 1523, 1708, 1708, 1708, 1232, 1709, 1695, 2972,
-     1710, 2973, 2974, 1697, 1239, 2979, 1698, 1524, 1712, 1712,
-     1712, 1250, 1250, 1250, 1530, 1530, 1530, 1717, 1717, 1717,
-     2980, 1718, 2981, 2982, 1719, 1713, 1702, 2963, 1703, 1252,
-     1701, 1531, 1262, 1262, 1262, 1533, 1533, 1533, 1705, 2964,
-     1721, 1721, 1721, 1704, 1722, 2983, 2984, 1723, 2985, 2986,
-
-     1264, 2987, 1534, 1267, 1267, 1267, 1278, 1278, 1278, 2988,
-     1286, 1286, 1286, 1732, 1732, 1732, 2989, 1294, 1294, 1294,
-     2990, 1269, 2991, 2994, 1280, 1622, 1623, 1715, 1288, 2965,
-     1733, 2943, 1545, 1545, 1545, 1296, 1735, 1735, 1735, 2975,
-     1736, 2966, 2946, 1737, 1300, 1300, 1300, 2977, 1720, 1546,
-     1094, 2976, 1741, 1741, 1741, 2994, 1745, 1745, 1745, 2978,
-     2997, 1724, 1302, 1729, 1315, 1315, 1315, 1731, 1734, 1742,
-     1553, 1553, 1553, 1746, 1554, 2943, 2998, 1555, 1321, 1321,
-     1321, 2999, 1317, 1566, 1566, 1566, 1756, 1756, 1756, 2944,
-     1757, 2992, 3002, 1758, 3000, 3003, 1323, 1333, 1333, 1333,
-
-     1567, 1764, 1764, 1764, 1739, 1342, 1342, 1342, 3004, 1576,
-     1576, 1576, 3001, 1577, 3011, 1335, 1578, 3014, 1765, 1579,
-     1579, 1579, 3015, 1344, 3005, 1768, 1768, 1768, 1748, 1769,
-     3016, 2948, 1770, 1581, 1581, 1581, 1580, 1582, 3017, 3006,
-     1583, 1585, 1585, 1585, 1751, 3009, 1762, 1772, 1772, 1772,
-     2949, 1773, 2950, 3018, 1774, 1358, 1358, 1358, 1586, 1589,
-     1589, 1589, 3023, 1590, 3010, 2951, 1591, 1766, 1592, 1592,
-     1592, 3026, 1593, 1360, 3012, 1594, 1367, 1367, 1367, 1375,
-     1375, 1375, 1385, 1385, 1385, 1786, 1786, 1786, 3029, 1605,
-     1605, 1605, 3030, 3013, 1369, 3031, 3032, 1377, 3033, 3034,
-
-     1387, 2994, 1787, 3036, 2994, 1776, 1606, 1788, 1788, 1788,
-     3037, 1789, 3038, 3021, 1790, 1395, 1395, 1395, 1609, 1609,
-     1609, 1793, 1793, 1793, 3024, 1794, 3039, 3040, 1795, 1406,
-     1406, 1406, 3022, 1397, 3041, 1610, 1615, 1615, 1615, 1803,
-     1803, 1803, 1778, 3025, 3042, 1780, 1784, 1408, 1800, 1800,
-     1800, 3043, 1801, 1616, 3044, 1802, 1804, 1413, 1413, 1413,
-     3048, 3049, 1621, 1621, 1621, 1838, 1838, 1838, 1826, 1826,
-     1826, 1838, 1838, 1838, 3050, 1415, 3051, 3052, 1798, 1791,
-     1622, 1843, 1843, 1843, 1845, 1845, 1845, 3333, 3333, 3333,
-     1156, 1156, 1156, 1670, 1670, 1670, 3053, 3054, 1844, 3055,
-
-     3056, 1846, 3057, 3061, 3333, 3062, 1805, 3063, 1158, 3064,
-     1671, 3065, 3066, 1807, 1850, 1850, 1850, 3070, 1851, 3071,
-     3072, 1852, 1162, 1162, 1162, 1171, 1171, 1171, 3073, 1839,
-     1808, 3074, 1839, 3075, 3077, 1827, 1857, 1857, 1857, 3078,
-     1164, 3079, 3080, 1173, 1859, 1859, 1859, 1181, 1181, 1181,
-     3081, 1847, 3082, 1858, 1189, 1189, 1189, 1848, 1863, 1863,
-     1863, 1860, 3333, 3333, 3333, 1183, 1682, 1682, 1682, 1205,
-     1205, 1205, 1191, 1856, 3083, 1864, 1869, 1869, 1869, 3333,
-     3084, 1853, 3085, 1683, 1866, 1866, 1866, 1207, 1867, 3090,
-     3086, 1868, 3091, 1870, 1686, 1686, 1686, 1872, 1872, 1872,
-
-     3092, 1873, 3087, 3093, 1874, 1875, 1875, 1875, 3333, 3333,
-     3333, 1687, 1861, 3094, 1690, 1690, 1690, 3095, 1691, 1862,
-     1865, 1692, 1876, 3096, 3097, 3333, 3333, 3333, 3333, 1871,
-     3333, 3333, 3333, 1880, 1880, 1880, 3333, 3333, 3333, 3333,
-     3333, 3333, 3088, 3333, 3333, 3333, 3333, 3333, 3098, 2954,
-     1881, 3099, 3100, 3333, 3089, 3101, 3333, 1699, 1699, 1699,
-     3102, 3333, 1885, 1885, 1885, 2955, 1886, 2956, 3103, 1887,
-     3104, 3105, 1877, 3106, 1700, 1888, 1888, 1888, 3107, 1879,
-     2957, 3333, 3333, 3333, 3109, 1883, 3333, 3333, 3333, 3110,
-     1878, 1094, 1889, 3111, 1882, 3112, 3113, 1884, 3333, 1230,
-
-     1230, 1230, 3114, 3333, 1237, 1237, 1237, 1708, 1708, 1708,
-     3115, 1709, 3116, 3117, 1710, 3118, 3108, 1232, 1896, 1896,
-     1896, 3119, 1239, 1712, 1712, 1712, 3120, 3121, 1890, 1898,
-     1898, 1898, 3122, 1899, 3123, 1897, 1900, 3124, 3125, 1891,
-     1713, 3126, 1902, 1902, 1902, 1717, 1717, 1717, 3127, 1718,
-     3128, 3129, 1719, 1262, 1262, 1262, 1267, 1267, 1267, 1893,
-     1903, 3130, 1721, 1721, 1721, 1892, 1722, 3131, 3132, 1723,
-     3133, 1264, 3134, 1094, 1269, 1911, 1911, 1911, 1286, 1286,
-     1286, 1732, 1732, 1732, 1915, 1915, 1915, 3136, 1916, 3137,
-     3138, 1917, 3135, 1912, 3139, 3140, 1288, 3141, 1733, 1905,
-
-     1294, 1294, 1294, 1735, 1735, 1735, 3142, 1736, 3143, 3144,
-     1737, 1300, 1300, 1300, 1741, 1741, 1741, 3145, 1296, 1925,
-     1925, 1925, 3146, 1906, 1914, 3147, 1922, 1922, 1922, 1302,
-     1923, 1742, 3148, 1924, 3149, 3150, 1926, 1745, 1745, 1745,
-     1928, 1928, 1928, 3151, 1929, 3152, 3153, 1930, 1932, 1932,
-     1932, 1321, 1321, 1321, 1746, 1756, 1756, 1756, 1918, 1757,
-     3154, 3155, 1758, 1333, 1333, 1333, 1933, 3156, 3157, 1323,
-     1764, 1764, 1764, 1949, 1949, 1949, 3158, 1920, 1946, 1946,
-     1946, 1335, 1947, 3159, 3161, 1948, 3162, 1765, 1768, 1768,
-     1768, 1950, 1769, 3163, 3164, 1770, 3165, 1772, 1772, 1772,
-
-     3166, 1773, 1094, 1936, 1774, 1358, 1358, 1358, 1367, 1367,
-     1367, 1375, 1375, 1375, 1944, 1959, 1959, 1959, 3333, 3333,
-     3333, 3167, 3160, 1360, 3168, 3169, 1369, 3170, 3171, 1377,
-     3172, 3173, 1960, 3174, 3175, 3333, 1962, 1962, 1962, 1385,
-     1385, 1385, 3176, 1786, 1786, 1786, 3177, 1966, 1966, 1966,
-     3178, 1967, 3179, 1963, 1968, 3180, 3181, 1387, 3182, 1956,
-     1787, 3184, 1958, 1788, 1788, 1788, 1954, 1789, 3185, 3186,
-     1790, 1395, 1395, 1395, 1793, 1793, 1793, 1094, 1794, 3187,
-     3188, 1795, 3189, 3183, 1961, 3190, 1964, 3191, 3192, 1397,
-     1406, 1406, 1406, 1800, 1800, 1800, 3193, 1801, 3194, 3195,
-
-     1802, 3196, 1803, 1803, 1803, 1983, 1983, 1983, 1408, 1984,
-     3197, 3198, 1985, 1413, 1413, 1413, 3199, 3201, 1969, 1804,
-     1990, 1990, 1990, 1822, 1822, 1822, 2006, 2006, 2006, 3202,
-     3203, 1415, 1826, 1826, 1826, 3204, 3205, 1991, 2007, 2007,
-     2007, 1973, 1829, 1829, 1829, 1838, 1838, 1838, 2018, 2018,
-     2018, 1841, 1841, 1841, 1843, 1843, 1843, 3206, 2021, 2021,
-     2021, 1094, 2022, 3207, 1986, 2023, 1845, 1845, 1845, 3208,
-     3209, 1844, 2024, 2024, 2024, 3200, 2025, 3210, 3212, 2026,
-     1156, 1156, 1156, 1846, 1850, 1850, 1850, 3213, 1851, 3214,
-     3215, 1852, 1162, 1162, 1162, 2032, 2032, 2032, 1158, 1171,
-
-     1171, 1171, 1857, 1857, 1857, 3216, 3217, 2035, 2035, 2035,
-     1164, 2036, 2033, 3218, 2037, 3219, 3220, 1173, 3221, 1858,
-     1859, 1859, 1859, 2038, 2038, 2038, 3224, 2039, 3225, 3226,
-     2040, 1181, 1181, 1181, 1189, 1189, 1189, 1860, 1863, 1863,
-     1863, 3227, 3228, 2030, 3229, 3240, 2028, 1094, 1094, 1183,
-     3238, 1665, 1191, 1094, 1094, 1864, 1094, 2043, 2043, 2043,
-     2034, 2044, 1094, 1094, 2045, 2046, 2046, 2046, 1866, 1866,
-     1866, 1664, 1867, 1094, 1663, 1868, 1869, 1869, 1869, 2048,
-     2048, 2048, 2047, 2049, 3230, 1094, 2050, 1205, 1205, 1205,
-     1872, 1872, 1872, 1870, 1873, 3232, 2041, 1874, 3231, 2042,
-
-     1875, 1875, 1875, 1094, 3233, 1207, 2052, 2052, 2052, 1094,
-     2053, 3234, 1094, 2054, 1880, 1880, 1880, 1876, 2058, 2058,
-     2058, 3235, 2059, 1094, 3330, 2060, 2061, 2061, 2061, 3236,
-     1094, 1881, 1885, 1885, 1885, 1094, 1886, 1094, 2051, 1887,
-     1888, 1888, 1888, 2062, 2065, 2065, 2065, 3237, 2066, 3246,
-     1662, 2067, 1230, 1230, 1230, 1661, 3244, 1889, 1237, 1237,
-     1237, 1896, 1896, 1896, 2074, 2074, 2074, 3247, 2075, 3252,
-     1232, 2076, 3250, 1898, 1898, 1898, 1239, 1899, 1897, 1094,
-     1900, 1902, 1902, 1902, 1904, 1904, 1904, 1262, 1262, 1262,
-     1267, 1267, 1267, 2081, 2081, 2081, 1911, 1911, 1911, 1903,
-
-     1286, 1286, 1286, 2070, 3241, 1264, 1094, 1660, 1269, 3239,
-     2082, 2071, 1094, 1094, 1912, 1915, 1915, 1915, 1288, 1916,
-     3248, 1094, 1917, 1294, 1294, 1294, 2090, 2090, 2090, 1922,
-     1922, 1922, 1094, 1923, 3242, 3243, 1924, 1094, 1657, 2083,
-     2079, 1296, 1094, 1094, 2091, 2078, 1925, 1925, 1925, 2087,
-     2093, 2093, 2093, 3245, 2094, 3262, 1094, 2095, 1928, 1928,
-     1928, 1094, 1929, 1926, 3256, 1930, 1932, 1932, 1932, 2088,
-     2099, 2099, 2099, 1321, 1321, 1321, 2102, 2102, 2102, 2104,
-     2104, 2104, 1094, 3253, 1933, 1094, 1094, 2100, 1333, 1333,
-     1333, 1323, 1946, 1946, 1946, 1094, 1947, 3249, 3254, 1948,
-
-     1949, 1949, 1949, 2112, 2112, 2112, 1335, 1358, 1358, 1358,
-     2117, 2117, 2117, 1375, 1375, 1375, 1094, 3251, 1950, 3263,
-     2113, 1959, 1959, 1959, 1094, 1360, 1094, 1094, 2118, 3264,
-     1094, 1377, 3255, 1094, 2101, 2121, 2121, 2121, 1960, 2122,
-     3258, 1654, 2123, 2124, 2124, 2124, 1962, 1962, 1962, 1094,
-     2127, 2127, 2127, 2109, 2128, 3259, 3257, 2129, 1653, 3265,
-     2125, 3260, 3261, 1963, 1094, 3268, 2115, 1385, 1385, 1385,
-     2131, 2131, 2131, 1094, 1966, 1966, 1966, 2120, 1967, 3266,
-     1094, 1968, 1395, 1395, 1395, 1387, 1652, 2132, 1094, 2126,
-     2138, 2138, 2138, 2140, 2140, 2140, 1651, 1983, 1983, 1983,
-
-     1397, 1984, 3282, 1650, 1985, 1413, 1413, 1413, 2139, 1648,
-     2141, 1990, 1990, 1990, 1647, 3269, 2133, 2156, 2156, 2156,
-     2130, 2157, 3286, 1415, 2158, 2159, 2159, 2159, 1991, 2164,
-     2164, 2164, 2165, 2165, 2165, 2134, 1999, 1999, 1999, 2167,
-     2167, 2167, 2171, 2171, 2171, 2006, 2006, 2006, 2007, 2007,
-     2007, 2152, 2172, 2172, 2172, 2175, 2175, 2175, 2179, 2179,
-     2179, 2180, 2180, 2180, 2182, 2182, 2182, 2018, 2018, 2018,
-     2183, 2183, 2183, 2021, 2021, 2021, 1094, 2022, 1094, 1094,
-     2023, 2024, 2024, 2024, 1646, 2025, 1094, 1094, 2026, 1156,
-     1156, 1156, 1162, 1162, 1162, 2032, 2032, 2032, 2173, 2191,
-
-     2191, 2191, 1094, 2192, 1094, 1094, 2193, 1158, 3283, 1094,
-     1164, 3270, 2033, 1171, 1171, 1171, 2184, 2035, 2035, 2035,
-     3271, 2036, 3267, 3274, 2037, 2038, 2038, 2038, 1094, 2039,
-     3272, 1173, 2040, 1181, 1181, 1181, 1189, 1189, 1189, 1094,
-     2187, 2043, 2043, 2043, 3276, 2044, 3273, 3277, 2045, 1094,
-     3278, 1183, 2189, 2195, 1191, 1094, 3292, 2046, 2046, 2046,
-     2197, 2197, 2197, 1645, 2198, 3275, 1094, 2199, 1205, 1205,
-     1205, 1094, 2196, 2194, 2047, 2048, 2048, 2048, 1094, 2049,
-     3284, 1094, 2050, 2052, 2052, 2052, 1207, 2053, 3285, 1094,
-     2054, 2058, 2058, 2058, 1094, 2059, 3293, 1094, 2060, 2061,
-
-     2061, 2061, 2204, 2204, 2204, 3290, 2205, 3296, 3280, 2206,
-     2065, 2065, 2065, 1094, 2066, 3281, 2062, 2067, 2210, 2210,
-     2210, 1230, 1230, 1230, 2213, 2213, 2213, 3279, 3287, 2074,
-     2074, 2074, 3291, 2075, 2200, 2211, 2076, 1094, 1643, 1232,
-     1094, 1094, 2214, 1262, 1262, 1262, 1267, 1267, 1267, 2081,
-     2081, 2081, 2221, 2221, 2221, 1094, 2222, 1642, 1640, 2223,
-     1639, 1264, 1636, 1633, 1269, 1094, 2082, 1094, 1286, 1286,
-     1286, 1294, 1294, 1294, 2090, 2090, 2090, 2093, 2093, 2093,
-     1632, 2094, 3322, 3288, 2095, 2212, 1288, 3289, 1094, 1296,
-     1094, 1094, 2091, 2099, 2099, 2099, 3297, 2219, 2218, 2235,
-
-     2235, 2235, 3294, 2236, 3295, 1094, 2237, 1321, 1321, 1321,
-     2100, 2102, 2102, 2102, 2239, 2239, 2239, 2104, 2104, 2104,
-     2240, 2240, 2240, 3298, 1094, 1323, 3333, 3333, 3333, 3333,
-     3333, 3333, 1094, 2229, 2228, 1631, 3300, 2241, 3333, 3333,
-     3333, 1094, 3302, 3333, 1094, 3306, 3333, 1333, 1333, 1333,
-     2112, 2112, 2112, 1094, 1094, 3333, 2248, 2248, 2248, 3299,
-     2249, 3330, 1630, 2250, 3304, 1335, 1094, 2113, 2252, 2252,
-     2252, 2238, 2117, 2117, 2117, 1094, 3305, 2242, 2256, 2256,
-     2256, 2121, 2121, 2121, 3307, 2122, 2253, 3301, 2123, 1094,
-     2118, 3303, 1094, 2243, 1094, 1629, 2257, 2244, 2124, 2124,
-
-     2124, 2258, 2258, 2258, 1094, 2259, 1094, 3312, 2260, 2127,
-     2127, 2127, 2245, 2128, 1628, 2125, 2129, 1385, 1385, 1385,
-     2131, 2131, 2131, 2263, 2263, 2263, 1627, 2264, 1094, 3314,
-     2265, 1395, 1395, 1395, 1094, 1387, 3308, 2132, 2138, 2138,
-     2138, 2140, 2140, 2140, 2271, 2271, 2271, 3313, 2272, 1397,
-     3316, 2273, 1413, 1413, 1413, 1626, 2139, 1625, 2141, 2285,
-     2285, 2285, 2156, 2156, 2156, 3310, 2157, 1624, 2262, 2158,
-     1415, 2159, 2159, 2159, 2298, 2298, 2298, 1094, 2299, 2299,
-     2299, 3309, 2267, 2164, 2164, 2164, 2165, 2165, 2165, 2167,
-     2167, 2167, 2303, 2303, 2303, 2305, 2305, 2305, 2171, 2171,
-
-     2171, 2284, 2172, 2172, 2172, 2175, 2175, 2175, 2308, 2308,
-     2308, 2179, 2179, 2179, 2180, 2180, 2180, 2182, 2182, 2182,
-     2183, 2183, 2183, 2315, 2315, 2315, 2317, 2317, 2317, 1162,
-     1162, 1162, 2319, 2319, 2319, 2191, 2191, 2191, 1094, 2192,
-     1094, 2316, 2193, 1171, 1171, 1171, 1094, 1164, 1094, 2320,
-     1181, 1181, 1181, 1189, 1189, 1189, 2197, 2197, 2197, 1094,
-     2198, 1173, 1617, 2199, 2324, 2324, 2324, 1614, 1183, 3323,
-     1094, 1191, 2204, 2204, 2204, 3311, 2205, 1612, 1094, 2206,
-     3320, 3315, 2325, 2330, 2330, 2330, 3317, 2322, 2210, 2210,
-     2210, 2337, 2337, 2337, 2321, 2318, 3318, 2334, 2334, 2334,
-
-     2331, 2335, 3321, 1608, 2336, 2211, 2213, 2213, 2213, 2338,
-     1262, 1262, 1262, 1094, 2323, 2343, 2343, 2343, 2345, 2345,
-     2345, 3333, 3333, 3333, 2214, 2221, 2221, 2221, 1264, 2222,
-     1094, 1094, 2223, 2344, 1604, 2346, 1094, 1094, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 2351, 2351, 2351, 1286, 1286,
-     1286, 1294, 1294, 1294, 1094, 1603, 3333, 1601, 1600, 3333,
-     1094, 3326, 2352, 3324, 2347, 1599, 1288, 3319, 3325, 1296,
-     2342, 2355, 2355, 2355, 1597, 1595, 2348, 2360, 2360, 2360,
-     2235, 2235, 2235, 1587, 2236, 3327, 3328, 2237, 2356, 1321,
-     1321, 1321, 3329, 2350, 2239, 2239, 2239, 2240, 2240, 2240,
-
-     2349, 1584, 2362, 2362, 2362, 1575, 2363, 1323, 2353, 2364,
-     2365, 2365, 2365, 1573, 2241, 2354, 3333, 3333, 3333, 3333,
-     3333, 3333, 2369, 2369, 2369, 1572, 1570, 2366, 2371, 2371,
-     2371, 1569, 1568, 3333, 1565, 1564, 3333, 2372, 2372, 2372,
-     2370, 1562, 2248, 2248, 2248, 1560, 2249, 1559, 2361, 2250,
-     1557, 3333, 3333, 3333, 2373, 2252, 2252, 2252, 2256, 2256,
-     2256, 1556, 2258, 2258, 2258, 1552, 2259, 2367, 3333, 2260,
-     2368, 1551, 1550, 2253, 1549, 1543, 2257, 2378, 2378, 2378,
-     2263, 2263, 2263, 1541, 2264, 1539, 1538, 2265, 1395, 1395,
-     1395, 1537, 2271, 2271, 2271, 2379, 2272, 1536, 1529, 2273,
-
-     1413, 1413, 1413, 2285, 2285, 2285, 1397, 2298, 2298, 2298,
-     2299, 2299, 2299, 2412, 2412, 2412, 1527, 2374, 1415, 1526,
-     1525, 1094, 2303, 2303, 2303, 2305, 2305, 2305, 2308, 2308,
-     2308, 2418, 2418, 2418, 2381, 2315, 2315, 2315, 2317, 2317,
-     2317, 2422, 2422, 2422, 1522, 2319, 2319, 2319, 2424, 2424,
-     2424, 1521, 2425, 2316, 1516, 2426, 2427, 2427, 2427, 2423,
-     1515, 2394, 2320, 1514, 1513, 2395, 1181, 1181, 1181, 1189,
-     1189, 1189, 1512, 1511, 2428, 2324, 2324, 2324, 2330, 2330,
-     2330, 2435, 2435, 2435, 1183, 2436, 1510, 1191, 2437, 1509,
-     2334, 2334, 2334, 2325, 2335, 2331, 1503, 2336, 2337, 2337,
-
-     2337, 2448, 2448, 2448, 1262, 1262, 1262, 2343, 2343, 2343,
-     2345, 2345, 2345, 2451, 2451, 2451, 2338, 2452, 2449, 1502,
-     2453, 1501, 1264, 1499, 1498, 2344, 1497, 2346, 1496, 1481,
-     2429, 2457, 2457, 2457, 1480, 1475, 2430, 2351, 2351, 2351,
-     2459, 2459, 2459, 1474, 2460, 1472, 1471, 2461, 2458, 2462,
-     2462, 2462, 1469, 1465, 2352, 1294, 1294, 1294, 2355, 2355,
-     2355, 2450, 2465, 2465, 2465, 1464, 2466, 2463, 1460, 2467,
-     2470, 2470, 2470, 1296, 1459, 2356, 2360, 2360, 2360, 2472,
-     2472, 2472, 2362, 2362, 2362, 1458, 2363, 2471, 1457, 2364,
-     2365, 2365, 2365, 1456, 2474, 2474, 2474, 2473, 2475, 1455,
-
-     1454, 2476, 2477, 2477, 2477, 1453, 1452, 2366, 2479, 2479,
-     2479, 2369, 2369, 2369, 1451, 1450, 2464, 1449, 1448, 2478,
-     2371, 2371, 2371, 1447, 1445, 2480, 2372, 2372, 2372, 2370,
-     2481, 2481, 2481, 1444, 2482, 1443, 1442, 2483, 3333, 3333,
-     3333, 1439, 1438, 2373, 2378, 2378, 2378, 1395, 1395, 1395,
-     1413, 1413, 1413, 1437, 1436, 3333, 2412, 2412, 2412, 2520,
-     2520, 2520, 2379, 1435, 1434, 1397, 1433, 1432, 1415, 2418,
-     2418, 2418, 2527, 2527, 2527, 1431, 2422, 2422, 2422, 2424,
-     2424, 2424, 1430, 2425, 1429, 1428, 2426, 1427, 1426, 2528,
-     2427, 2427, 2427, 2484, 2423, 1423, 1181, 1181, 1181, 1189,
-
-     1189, 1189, 2533, 2533, 2533, 2435, 2435, 2435, 2428, 2436,
-     2502, 1422, 2437, 2489, 1183, 1421, 1420, 1191, 1419, 2534,
-     2547, 2547, 2547, 2448, 2448, 2448, 2549, 2549, 2549, 1418,
-     2550, 1094, 1412, 2551, 2552, 2552, 2552, 2548, 1411, 1410,
-     2449, 2451, 2451, 2451, 1405, 2452, 1404, 1400, 2453, 2457,
-     2457, 2457, 2553, 1394, 2557, 2557, 2557, 2529, 2558, 1393,
-     1389, 2559, 2462, 2462, 2462, 2530, 2458, 2459, 2459, 2459,
-     1384, 2460, 1380, 1379, 2461, 1294, 1294, 1294, 1371, 1357,
-     2463, 2465, 2465, 2465, 1356, 2466, 1355, 1352, 2467, 2568,
-     2568, 2568, 1346, 1296, 2470, 2470, 2470, 2570, 2570, 2570,
-
-     1341, 2571, 1337, 1332, 2572, 1331, 2569, 2472, 2472, 2472,
-     1330, 2471, 2474, 2474, 2474, 1329, 2475, 1328, 1327, 2476,
-     1326, 2477, 2477, 2477, 1325, 2473, 2573, 2573, 2573, 1320,
-     2574, 1319, 1314, 2575, 2479, 2479, 2479, 2566, 2478, 2576,
-     2576, 2576, 1313, 2577, 1307, 1304, 2578, 1299, 2481, 2481,
-     2481, 2480, 2482, 1298, 1293, 2483, 3333, 3333, 3333, 2586,
-     2586, 2586, 2588, 2588, 2588, 1395, 1395, 1395, 2593, 2593,
-     2593, 1282, 1277, 3333, 1276, 1275, 2587, 1271, 1266, 2589,
-     2594, 2594, 2594, 1397, 1413, 1413, 1413, 2623, 2623, 2623,
-     2520, 2520, 2520, 2627, 2627, 2627, 1255, 2595, 2527, 2527,
-
-     2527, 1249, 1415, 2630, 2630, 2630, 1248, 2631, 1247, 1243,
-     2632, 1181, 1181, 1181, 1242, 2528, 1241, 2585, 1229, 1189,
-     1189, 1189, 2636, 2636, 2636, 2533, 2533, 2533, 1228, 1183,
-     1227, 2638, 2638, 2638, 1226, 2639, 2592, 1191, 2640, 2637,
-     1225, 1224, 2534, 1223, 2606, 2641, 2641, 2641, 2547, 2547,
-     2547, 2654, 2654, 2654, 1222, 2655, 1221, 1215, 2656, 2549,
-     2549, 2549, 2642, 2550, 1170, 2548, 2551, 2552, 2552, 2552,
-     2634, 2658, 2658, 2658, 1166, 2557, 2557, 2557, 2633, 2558,
-     1161, 1160, 2559, 1148, 1147, 2553, 1146, 1145, 2659, 2667,
-     2667, 2667, 2568, 2568, 2568, 2670, 2670, 2670, 1144, 2671,
-
-     1143, 1142, 2672, 1141, 2570, 2570, 2570, 2668, 2571, 2569,
-     1140, 2572, 2573, 2573, 2573, 1139, 2574, 1138, 1137, 2575,
-     2576, 2576, 2576, 1136, 2577, 1133, 1132, 2578, 3333, 3333,
-     3333, 2586, 2586, 2586, 2686, 2686, 2686, 1131, 2687, 1130,
-     1129, 2688, 2588, 2588, 2588, 3333, 1128, 1127, 2587, 2689,
-     2689, 2689, 1126, 2690, 1123, 1122, 2691, 1121, 1120, 2589,
-     2692, 2692, 2692, 2694, 2694, 2694, 1395, 1395, 1395, 2593,
-     2593, 2593, 2594, 2594, 2594, 1119, 1118, 2693, 1117, 1116,
-     2695, 1413, 1413, 1413, 1397, 2711, 2711, 2711, 2685, 2595,
-     2697, 2697, 2697, 1115, 2698, 1108, 1104, 2699, 1103, 1415,
-
-     1102, 1101, 2712, 1622, 2623, 2623, 2623, 2726, 2726, 2726,
-     2627, 2627, 2627, 2729, 2729, 2729, 2630, 2630, 2630, 1100,
-     2631, 1097, 1095, 2632, 1181, 1181, 1181, 1094, 2696, 2736,
-     2736, 2736, 2708, 2636, 2636, 2636, 2739, 2739, 2739, 1092,
-     2740, 1090, 1183, 2741, 2638, 2638, 2638, 2737, 2639, 1089,
-     2637, 2640, 2641, 2641, 2641, 2742, 2742, 2742, 1088, 2743,
-     1087, 1086, 2744, 2654, 2654, 2654, 1083, 2655, 1080, 2642,
-     2656, 2658, 2658, 2658, 2757, 2757, 2757, 1079, 2758, 1078,
-     1076, 2759, 2667, 2667, 2667, 2670, 2670, 2670, 2659, 2671,
-     2735, 1075, 2672, 2780, 2780, 2780, 1072, 2686, 2686, 2686,
-
-     2668, 2687, 1071, 1069, 2688, 2689, 2689, 2689, 1066, 2690,
-     2781, 1065, 2691, 2692, 2692, 2692, 2786, 2786, 2786, 1064,
-     2787, 1060, 1059, 2788, 2694, 2694, 2694, 2789, 2789, 2789,
-     2693, 2790, 1057, 1056, 2791, 1395, 1395, 1395, 2697, 2697,
-     2697, 2695, 2698, 1055, 1054, 2699, 1413, 1413, 1413, 2803,
-     2803, 2803, 1052, 1397, 2711, 2711, 2711, 1051, 2805, 2805,
-     2805, 1050, 2806, 1049, 1415, 2807, 2804, 1622, 2816, 2816,
-     2816, 2712, 1622, 2726, 2726, 2726, 1622, 2817, 2817, 2817,
-     2818, 2818, 2818, 2729, 2729, 2729, 2792, 2819, 2819, 2819,
-     1181, 1181, 1181, 1048, 1047, 2801, 2736, 2736, 2736, 2739,
-
-     2739, 2739, 1044, 2740, 1043, 1041, 2741, 1038, 1183, 2742,
-     2742, 2742, 1037, 2743, 2737, 1035, 2744, 2826, 2826, 2826,
-     2838, 2838, 2838, 2757, 2757, 2757, 1034, 2758, 1033, 1032,
-     2759, 2840, 2840, 2840, 2827, 1031, 1027, 2839, 2780, 2780,
-     2780, 2824, 2859, 2859, 2859, 1025, 2860, 1024, 2841, 2861,
-     2786, 2786, 2786, 1023, 2787, 2781, 1021, 2788, 2789, 2789,
-     2789, 1020, 2790, 1019, 1016, 2791, 2866, 2866, 2866, 1413,
-     1413, 1413, 2803, 2803, 2803, 2876, 2876, 2876, 1015, 2877,
-     1014, 1013, 2878, 1011, 2867, 1010, 1009, 1415, 1007, 2804,
-     1622, 1004, 1000, 1622, 2805, 2805, 2805,  999, 2806,  997,
-
-      996, 2807, 2816, 2816, 2816, 2817, 2817, 2817, 2818, 2818,
-     2818,  995, 1622, 2819, 2819, 2819, 2891, 2891, 2891, 2894,
-     2894, 2894,  992, 2895,  991,  990, 2896,  988, 2826, 2826,
-     2826, 2897, 2897, 2897, 2892, 2874, 1620, 1620, 1620, 1620,
-     1620, 1620, 1620, 1620, 1620, 2827,  987, 1620, 2898, 2838,
-     2838, 2838, 1620, 1620, 1620, 1622, 1620, 2906, 2906, 2906,
-      981, 2907,  980,  979, 2908,  977, 2839, 2909, 2909, 2909,
-      976, 2910,  975,  970, 2911, 2840, 2840, 2840, 2866, 2866,
-     2866, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
-     1620, 1620, 2841,  969, 1620,  965, 2867,  963,  962, 1620,
-
-     1620, 1620, 1622, 1620, 2859, 2859, 2859,  961, 2860,  960,
-      959, 2861, 2939, 2939, 2939, 2876, 2876, 2876,  958, 2877,
-      957,  956, 2878,  955,  954, 2891, 2891, 2891, 1620, 1620,
-     2940,  951,  948, 1622, 1620, 1620, 1620, 1620, 1620, 2947,
-     1620, 1620, 1620, 2892,  947, 1620, 2897, 2897, 2897,  945,
-     1620, 1620, 1620, 1622, 1620, 2894, 2894, 2894,  944, 2895,
-      943,  942, 2896, 2898, 2967, 2967, 2967,  941, 2968,  936,
-      934, 2969, 2939, 2939, 2939, 2996, 2996, 2996,  933, 1620,
-     1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 2947,
-     2940,  932, 1620, 1622, 1623,  930,  929, 1620, 1620, 1620,
-
-     1622, 1620, 2906, 2906, 2906,  928, 2907,  927,  925, 2908,
-     2909, 2909, 2909,  922, 2910,  921,  919, 2911, 3007, 3007,
-     3007, 2967, 2967, 2967,  918, 2968, 1620, 1620, 2969, 3019,
-     3019, 3019, 3027, 3027, 3027, 3008, 3035, 3035, 3035, 2996,
-     2996, 2996, 3007, 3007, 3007,  917, 3020,  915,  914, 3028,
-      913, 3045, 3045, 3045, 1094, 3046,  912, 1622, 3047, 3008,
-     3019, 3019, 3019, 3058, 3058, 3058,  909, 3059,  908,  907,
-     3060, 3027, 3027, 3027, 3067, 3067, 3067, 3020, 3068,  904,
-      903, 3069, 3035, 3035, 3035, 3045, 3045, 3045, 3028, 3046,
-     1807,  902, 3047,  897, 3058, 3058, 3058,  895, 3059,  894,
-
-     1094, 3060, 3067, 3067, 3067,  888, 3068,  887,  886, 3069,
-     3211, 3211, 3211, 3211, 3211, 3211,  885, 3222,  879, 3076,
-     3223, 3331, 3331, 3331, 3331, 3331, 3331,  878, 1094,  877,
-      875, 1094,  872,  871,  870,  869,  864,  861,  863, 3332,
-      858,  857, 3332,  240,  240,  240,  240,  240,  240,  240,
-      240,  240,  241,  241,  241,  241,  241,  241,  241,  241,
-      241,  246,  246,  246,  246,  246,  246,  246,  246,  246,
-      249,  249,  249,  249,  249,  249,  249,  249,  249,  252,
-      252,  252,  252,  252,  252,  252,  252,  252,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  262,  262,  262,
-
-      262,  262,  262,  262,  262,  262,  269,  269,  269,  269,
-      269,  269,  269,  269,  269,  274,  274,  274,  274,  274,
-      274,  274,  274,  274,  286,  286,  286,  286,  286,  286,
-      286,  286,  286,  292,  292,  292,  292,  292,  292,  292,
-      292,  292,  300,  300,  300,  300,  300,  300,  300,  300,
-      300,  304,  304,  304,  304,  304,  304,  304,  304,  304,
-      310,  310,  310,  310,  310,  310,  310,  310,  310,  316,
-      316,  316,  316,  316,  316,  316,  316,  316,  322,  322,
-      322,  322,  322,  322,  322,  322,  322,  328,  328,  328,
-      328,  328,  328,  328,  328,  328,  335,  335,  335,  335,
-
-      335,  335,  335,  335,  335,  340,  340,  340,  340,  340,
-      340,  340,  340,  340,  347,  347,  347,  347,  347,  347,
-      347,  347,  347,  356,  356,  356,  356,  356,  356,  356,
-      356,  356,  373,  373,  373,  373,  373,  373,  373,  373,
-      373,  380,  380,  380,  380,  380,  380,  380,  380,  380,
-      384,  384,  384,  384,  384,  384,  384,  384,  384,  391,
-      391,  391,  391,  391,  391,  391,  391,  391,  399,  399,
-      399,  399,  399,  399,  399,  399,  399,  407,  407,  407,
-      407,  407,  407,  407,  407,  407,  413,  413,  413,  413,
-      413,  413,  413,  413,  413,  419,  419,  419,  419,  419,
-
-      419,  419,  419,  419,  423,  423,  423,  423,  423,  423,
-      423,  423,  423,  431,  431,  431,  431,  431,  431,  431,
-      431,  431,  438,  438,  438,  438,  438,  438,  438,  438,
-      438,  445,  445,  445,  445,  445,  445,  445,  445,  445,
-      450,  450,  450,  450,  450,  450,  450,  450,  450,  456,
-      456,  456,  456,  456,  456,  456,  456,  456,  461,  461,
-      461,  461,  461,  461,  461,  461,  461,  467,  467,  467,
-      467,  467,  467,  467,  467,  467,  472,  472,  472,  472,
-      472,  472,  472,  472,  472,  478,  478,  478,  478,  478,
-      478,  478,  478,  478,  487,  487,  487,  487,  487,  487,
-
-      487,  487,  487,  494,  494,  494,  494,  494,  494,  494,
-      494,  494,  498,  498,  498,  498,  498,  498,  498,  498,
-      498,  509,  509,  509,  509,  509,  509,  509,  509,  509,
-      517,  517,  517,  517,  517,  517,  517,  517,  517,  525,
-      525,  525,  525,  525,  525,  525,  525,  525,  530,  530,
-      530,  530,  530,  530,  530,  530,  530,  536,  536,  536,
-      536,  536,  536,  536,  536,  536,  544,  544,  544,  544,
-      544,  544,  544,  544,  544,  550,  550,  550,  550,  550,
-      550,  550,  550,  550,  555,  555,  555,  555,  555,  555,
-      555,  555,  555,  562,  562,  562,  562,  562,  562,  562,
-
-      562,  562,  567,  567,  567,  567,  567,  567,  567,  567,
-      567,  573,  573,  573,  573,  573,  573,  573,  573,  573,
-      580,  580,  580,  580,  580,  580,  580,  580,  580,  587,
-      587,  587,  587,  587,  587,  587,  587,  587,  594,  594,
-      594,  594,  594,  594,  594,  594,  594,  602,  602,  602,
-      602,  602,  602,  602,  602,  602,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  613,  613,  613,  613,  613,
-      613,  613,  613,  613,  619,  619,  619,  619,  619,  619,
-      619,  619,  619,  638,  638,  638,  856,  854,  853,  638,
-      672,  672,  672,  850,  849,  848,  672,  680,  680,  680,
-
-      846,  845,  843,  680,  684,  684,  684,  842,  841,  840,
-      684,  690,  690,  690,  838,  837,  836,  690,  696,  696,
-      696,  835,  834,  833,  696,  701,  701,  701,  831,  829,
-      828,  701,  711,  711,  711,  826,  825,  822,  711,  728,
-      728,  728,  820,  816,  812,  728,  732,  732,  732,  811,
-      809,  807,  732,  742,  742,  742,  806,  804,  803,  742,
-      748,  748,  748,  801,  800,  799,  748,  753,  753,  753,
-      798,  797,  795,  753,  761,  761,  761,  794,  788,  786,
-      761,  766,  766,  766,  781,  780,  779,  766,  771,  771,
-      771,  778,  777,  775,  771,  776,  776,  776,  773,  772,
-
-      770,  776,  787,  787,  787,  768,  767,  765,  787,  796,
-      796,  796,  763,  762,  760,  796,  805,  805,  805,  759,
-      756,  755,  805,  810,  810,  810,  754,  752, 3333,  810,
-      821,  821,  821,  749,  747,  745,  821,  827,  827,  827,
-      744,  743,  741,  827,  832,  832,  832,  740,  736,  735,
-      832,  839,  839,  839,  734,  733,  731,  839,  847,  847,
-      847,  730,  729,  727,  847,  855,  855,  855,  726,  725,
-      719,  855,  860,  860,  860,  860,  860,  860,  860,  715,
-      860,  638,  638,  638,  714,  710,  706,  638,  876,  705,
-      704,  703,  876,  672,  672,  672,  702,  700,  699,  672,
-
-      916,  698,  697,  695,  916,  680,  680,  680,  694,  693,
-      692,  680,  920,  691,  689,  687,  920,  684,  684,  684,
-      686,  685,  683,  684,  926,  681,  679,  660,  926,  690,
-      690,  690, 3333,  674,  673,  690,  931,  671, 3333,  654,
-      931,  696,  696,  696,  640,  639,  637,  696,  935,  636,
-      630,  629,  935,  701,  701,  701,  630,  629,  628,  701,
-      946,  627, 3333, 3333,  946,  711,  711,  711, 3333, 3333,
-     3333,  711,  964, 3333, 3333, 3333,  964,  728,  728,  728,
-     3333, 3333, 3333,  728,  968, 3333, 3333, 3333,  968,  732,
-      732,  732, 3333, 3333, 3333,  732,  978, 3333, 3333, 3333,
-
-      978,  742,  742,  742, 3333, 3333, 3333,  742,  986, 3333,
-     3333, 3333,  986,  748,  748,  748, 3333, 3333, 3333,  748,
-      989, 3333, 3333, 3333,  989,  753,  753,  753, 3333, 3333,
-     3333,  753,  998, 3333, 3333, 3333,  998,  761,  761,  761,
-     3333, 3333, 3333,  761, 1003, 3333, 3333, 3333, 1003,  766,
-      766,  766, 3333, 3333, 3333,  766, 1008, 3333, 3333, 3333,
-     1008,  771,  771,  771, 3333, 3333, 3333,  771, 1012, 3333,
-     3333, 3333, 1012,  776,  776,  776, 3333, 3333, 3333,  776,
-     1022, 3333, 3333, 3333, 1022,  787,  787,  787, 3333, 3333,
-     3333,  787, 1026, 3333, 3333, 3333, 1026,  796,  796,  796,
-
-     3333, 3333, 3333,  796, 1036, 3333, 3333, 3333, 1036,  805,
-      805,  805, 3333, 3333, 3333,  805, 1042, 3333, 3333, 3333,
-     1042,  810,  810,  810, 3333, 3333, 3333,  810, 1053, 3333,
-     3333, 3333, 1053,  821,  821,  821, 3333, 3333, 3333,  821,
-     1058, 3333, 3333, 3333, 1058,  827,  827,  827, 3333, 3333,
-     3333,  827, 1063, 3333, 3333, 3333, 1063,  832,  832,  832,
-     3333, 3333, 3333,  832, 1070, 3333, 3333, 3333, 1070,  839,
-      839,  839, 3333, 3333, 3333,  839, 1077, 3333, 3333, 3333,
-     1077,  847,  847,  847, 3333, 3333, 3333,  847, 1085, 3333,
-     3333, 3333, 1085,  855,  855,  855, 3333, 3333, 3333,  855,
-
-     1091, 3333, 3333, 3333, 1091, 1093, 1093, 1093, 1093, 1093,
-     1093, 1093, 1093, 1093, 1099, 3333, 3333, 3333, 3333, 1099,
-      638,  638,  638, 3333, 3333, 3333,  638, 1110, 1110, 1110,
-     1110, 3333, 3333, 1110, 1110,  672,  672,  672,  672, 3333,
-      672, 3333,  672, 1157, 1157, 1157, 1157, 3333, 3333, 1157,
-     1157,  680,  680,  680, 3333, 3333, 3333,  680, 1163, 1163,
-     1163, 1163, 3333, 3333, 1163, 1163,  684,  684,  684, 3333,
-     3333, 3333,  684, 1172, 1172, 1172, 1172, 3333, 3333, 1172,
-     1172,  690,  690,  690,  690, 3333,  690, 3333,  690, 1182,
-     1182, 1182, 1182, 3333, 3333, 1182, 1182,  696,  696,  696,
-
-      696, 3333,  696, 3333,  696, 1190, 1190, 1190, 1190, 3333,
-     3333, 1190, 1190,  701,  701,  701,  701, 3333,  701, 3333,
-      701, 1206, 1206, 1206, 1206, 3333, 3333, 1206, 1206,  711,
-      711,  711, 3333, 3333, 3333,  711, 1231, 1231, 1231, 1231,
-     3333, 3333, 1231, 1231, 1238, 1238, 1238, 1238, 3333, 3333,
-     1238, 1238,  732,  732,  732, 3333, 3333, 3333,  732, 1251,
-     1251, 1251, 1251, 3333, 3333, 1251, 1251,  742,  742,  742,
-     3333, 3333, 3333,  742, 1263, 1263, 1263, 1263, 3333, 3333,
-     1263, 1263,  748,  748,  748, 3333, 3333, 3333,  748, 1268,
-     1268, 1268, 1268, 3333, 3333, 1268, 1268,  753,  753,  753,
-
-     3333, 3333, 3333,  753, 1279, 1279, 1279, 1279, 3333, 3333,
-     1279, 1279,  761,  761,  761, 3333, 3333, 3333,  761, 1287,
-     1287, 1287, 1287, 3333, 3333, 1287, 1287,  766,  766,  766,
-     3333, 3333, 3333,  766, 1295, 1295, 1295, 1295, 3333, 3333,
-     1295, 1295,  771,  771,  771, 3333, 3333, 3333,  771, 1301,
-     1301, 1301, 1301, 3333, 3333, 1301, 1301,  776,  776,  776,
-     3333, 3333, 3333,  776, 1316, 1316, 1316, 1316, 3333, 3333,
-     1316, 1316,  787,  787,  787, 3333, 3333, 3333,  787, 1322,
-     1322, 1322, 1322, 3333, 3333, 1322, 1322,  796,  796,  796,
-     3333, 3333, 3333,  796, 1334, 1334, 1334, 1334, 3333, 3333,
-
-     1334, 1334,  805,  805,  805, 3333, 3333, 3333,  805, 1343,
-     1343, 1343, 1343, 3333, 3333, 1343, 1343,  810,  810,  810,
-     3333, 3333, 3333,  810, 1359, 1359, 1359, 1359, 3333, 3333,
-     1359, 1359,  821,  821,  821,  821, 3333,  821, 3333,  821,
-     1368, 1368, 1368, 1368, 3333, 3333, 1368, 1368,  827,  827,
-      827, 3333, 3333, 3333,  827, 1376, 1376, 1376, 1376, 3333,
-     3333, 1376, 1376,  832,  832,  832, 3333, 3333, 3333,  832,
-     1386, 1386, 1386, 1386, 3333, 3333, 1386, 1386,  839,  839,
-      839, 3333, 3333, 3333,  839, 1396, 1396, 1396, 1396, 3333,
-     3333, 1396, 1396,  847,  847,  847, 3333, 3333, 3333,  847,
-
-     1407, 1407, 1407, 1407, 3333, 3333, 1407, 1407,  855,  855,
-      855, 3333, 3333, 3333,  855, 1414, 1414, 1414, 1414, 3333,
-     3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
-     1093, 1093, 1099, 3333, 1099, 3333, 3333, 1099,  638,  638,
-      638, 3333, 3333, 3333,  638, 1110, 1110, 1110, 1110, 3333,
-     3333, 1110, 1110,  672,  672,  672, 3333, 3333, 3333,  672,
-     1157, 1157, 1157, 1157, 3333, 3333, 1157, 1157,  680,  680,
-      680, 3333, 3333, 3333,  680, 1163, 1163, 1163, 1163, 3333,
-     3333, 1163, 1163,  684,  684,  684, 3333, 3333, 3333,  684,
-     1172, 1172, 1172, 1172, 3333, 3333, 1172, 1172,  690,  690,
-
-      690, 3333, 3333, 3333,  690, 1182, 1182, 1182, 1182, 3333,
-     3333, 1182, 1182, 1190, 1190, 1190, 1190, 3333, 3333, 1190,
-     1190,  701,  701,  701, 3333, 3333, 3333,  701, 1206, 1206,
-     1206, 1206, 3333, 3333, 1206, 1206,  711,  711,  711, 3333,
-     3333, 3333,  711, 1231, 1231, 1231, 1231, 3333, 3333, 1231,
-     1231, 1238, 1238, 1238, 1238, 3333, 3333, 1238, 1238,  732,
-      732,  732, 3333, 3333, 3333,  732, 1251, 1251, 1251, 1251,
-     3333, 3333, 1251, 1251,  742,  742,  742,  742, 3333,  742,
-     3333,  742, 1263, 1263, 1263, 1263, 3333, 3333, 1263, 1263,
-      748,  748,  748,  748, 3333,  748, 3333,  748, 1268, 1268,
-
-     1268, 1268, 3333, 3333, 1268, 1268,  753,  753,  753, 3333,
-     3333, 3333,  753, 1279, 1279, 1279, 1279, 3333, 3333, 1279,
-     1279,  761,  761,  761, 3333, 3333, 3333,  761, 1287, 1287,
-     1287, 1287, 3333, 3333, 1287, 1287,  766,  766,  766, 3333,
-     3333, 3333,  766, 1295, 1295, 1295, 1295, 3333, 3333, 1295,
-     1295,  771,  771,  771,  771, 3333,  771, 3333,  771, 1301,
-     1301, 1301, 1301, 3333, 3333, 1301, 1301,  776,  776,  776,
-     3333, 3333, 3333,  776, 1316, 1316, 1316, 1316, 3333, 3333,
-     1316, 1316,  787,  787,  787, 3333, 3333, 3333,  787, 1322,
-     1322, 1322, 1322, 3333, 3333, 1322, 1322,  796,  796,  796,
-
-     3333, 3333, 3333,  796, 1334, 1334, 1334, 1334, 3333, 3333,
-     1334, 1334,  805,  805,  805, 3333, 3333, 3333,  805, 1343,
-     1343, 1343, 1343, 3333, 3333, 1343, 1343,  810,  810,  810,
-     3333, 3333, 3333,  810, 1359, 1359, 1359, 1359, 3333, 3333,
-     1359, 1359,  821,  821,  821, 3333, 3333, 3333,  821, 1368,
-     1368, 1368, 1368, 3333, 3333, 1368, 1368,  827,  827,  827,
-     3333, 3333, 3333,  827, 1376, 1376, 1376, 1376, 3333, 3333,
-     1376, 1376,  832,  832,  832, 3333, 3333, 3333,  832, 1386,
-     1386, 1386, 1386, 3333, 3333, 1386, 1386,  839,  839,  839,
-     3333, 3333, 3333,  839, 1396, 1396, 1396, 1396, 3333, 3333,
-
-     1396, 1396,  847,  847,  847,  847, 3333,  847, 3333,  847,
-     1407, 1407, 1407, 1407, 3333, 3333, 1407, 1407,  855,  855,
-      855, 3333, 3333, 3333,  855, 1414, 1414, 1414, 1414, 3333,
-     3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
-     1093, 1093, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
-     1620,  638,  638,  638, 3333, 3333, 3333,  638,  672,  672,
-      672, 3333, 3333, 3333,  672, 1157, 1157, 1157, 1157, 3333,
-     3333, 1157, 1157,  680,  680,  680,  680, 3333,  680, 3333,
-      680, 1163, 1163, 1163, 1163, 3333, 3333, 1163, 1163,  684,
-      684,  684, 3333, 3333, 3333,  684, 1172, 1172, 1172, 1172,
-
-     3333, 3333, 1172, 1172,  690,  690,  690, 3333, 3333, 3333,
-      690, 1182, 1182, 1182, 1182, 3333, 3333, 1182, 1182, 1190,
-     1190, 1190, 1190, 3333, 3333, 1190, 1190,  701,  701,  701,
-     3333, 3333, 3333,  701, 1206, 1206, 1206, 1206, 3333, 3333,
-     1206, 1206,  711,  711,  711,  711, 3333,  711, 3333,  711,
-     1231, 1231, 1231, 1231, 3333, 3333, 1231, 1231, 1238, 1238,
-     1238, 1238, 3333, 3333, 1238, 1238,  732,  732,  732, 3333,
-     3333, 3333,  732, 1251, 1251, 1251, 1251, 3333, 3333, 1251,
-     1251, 1263, 1263, 1263, 1263, 3333, 3333, 1263, 1263, 1268,
-     1268, 1268, 1268, 3333, 3333, 1268, 1268,  753,  753,  753,
-
-     3333, 3333, 3333,  753, 1279, 1279, 1279, 1279, 3333, 3333,
-     1279, 1279,  761,  761,  761, 3333, 3333, 3333,  761, 1287,
-     1287, 1287, 1287, 3333, 3333, 1287, 1287,  766,  766,  766,
-      766, 3333,  766, 3333,  766, 1295, 1295, 1295, 1295, 3333,
-     3333, 1295, 1295,  771,  771,  771, 3333, 3333, 3333,  771,
-     1301, 1301, 1301, 1301, 3333, 3333, 1301, 1301,  776,  776,
-      776, 3333, 3333, 3333,  776, 1316, 1316, 1316, 1316, 3333,
-     3333, 1316, 1316,  787,  787,  787, 3333, 3333, 3333,  787,
-     1322, 1322, 1322, 1322, 3333, 3333, 1322, 1322,  796,  796,
-      796, 3333, 3333, 3333,  796, 1334, 1334, 1334, 1334, 3333,
-
-     3333, 1334, 1334,  805,  805,  805,  805, 3333,  805, 3333,
-      805, 1343, 1343, 1343, 1343, 3333, 3333, 1343, 1343,  810,
-      810,  810, 3333, 3333, 3333,  810, 1359, 1359, 1359, 1359,
-     3333, 3333, 1359, 1359,  821,  821,  821, 3333, 3333, 3333,
-      821, 1368, 1368, 1368, 1368, 3333, 3333, 1368, 1368,  827,
-      827,  827, 3333, 3333, 3333,  827, 1376, 1376, 1376, 1376,
-     3333, 3333, 1376, 1376,  832,  832,  832, 3333, 3333, 3333,
-      832, 1386, 1386, 1386, 1386, 3333, 3333, 1386, 1386,  839,
-      839,  839, 3333, 3333, 3333,  839, 1396, 1396, 1396, 1396,
-     3333, 3333, 1396, 1396,  847,  847,  847, 3333, 3333, 3333,
-
-      847, 1407, 1407, 1407, 1407, 3333, 3333, 1407, 1407,  855,
-      855,  855, 3333, 3333, 3333,  855, 1414, 1414, 1414, 1414,
-     3333, 3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, 1093,
-     1093, 1093, 1093, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
-     1620, 1620,  638,  638,  638, 3333, 3333, 3333,  638,  672,
-      672,  672,  672, 3333,  672, 3333,  672, 1157, 1157, 1157,
-     1157, 3333, 3333, 1157, 1157, 1163, 1163, 1163, 1163, 3333,
-     3333, 1163, 1163,  684,  684,  684, 3333, 3333, 3333,  684,
-     1172, 1172, 1172, 1172, 3333, 3333, 1172, 1172,  690,  690,
-      690,  690, 3333,  690, 3333,  690, 1182, 1182, 1182, 1182,
-
-     3333, 3333, 1182, 1182, 1190, 1190, 1190, 1190, 3333, 3333,
-     1190, 1190,  701,  701,  701,  701, 3333,  701, 3333,  701,
-     1206, 1206, 1206, 1206, 3333, 3333, 1206, 1206,  711,  711,
-      711,  711, 3333,  711, 3333,  711, 1231, 1231, 1231, 1231,
-     3333, 3333, 1231, 1231, 1238, 1238, 1238, 1238, 3333, 3333,
-     1238, 1238,  732,  732,  732, 3333, 3333, 3333,  732, 1251,
-     1251, 1251, 1251, 3333, 3333, 1251, 1251, 1263, 1263, 1263,
-     1263, 3333, 3333, 1263, 1263, 1268, 1268, 1268, 1268, 3333,
-     3333, 1268, 1268,  753,  753,  753, 3333, 3333, 3333,  753,
-     1279, 1279, 1279, 1279, 3333, 3333, 1279, 1279,  761,  761,
-
-      761, 3333, 3333, 3333,  761, 1287, 1287, 1287, 1287, 3333,
-     3333, 1287, 1287, 1295, 1295, 1295, 1295, 3333, 3333, 1295,
-     1295,  771,  771,  771, 3333, 3333, 3333,  771, 1301, 1301,
-     1301, 1301, 3333, 3333, 1301, 1301,  776,  776,  776, 3333,
-     3333, 3333,  776, 1316, 1316, 1316, 1316, 3333, 3333, 1316,
-     1316,  787,  787,  787, 3333, 3333, 3333,  787, 1322, 1322,
-     1322, 1322, 3333, 3333, 1322, 1322,  796,  796,  796, 3333,
-     3333, 3333,  796, 1334, 1334, 1334, 1334, 3333, 3333, 1334,
-     1334, 1343, 1343, 1343, 1343, 3333, 3333, 1343, 1343,  810,
-      810,  810, 3333, 3333, 3333,  810, 1359, 1359, 1359, 1359,
-
-     3333, 3333, 1359, 1359,  821,  821,  821, 3333, 3333, 3333,
-      821, 1368, 1368, 1368, 1368, 3333, 3333, 1368, 1368,  827,
-      827,  827, 3333, 3333, 3333,  827, 1376, 1376, 1376, 1376,
-     3333, 3333, 1376, 1376,  832,  832,  832,  832, 3333,  832,
-     3333,  832, 1386, 1386, 1386, 1386, 3333, 3333, 1386, 1386,
-      839,  839,  839, 3333, 3333, 3333,  839, 1396, 1396, 1396,
-     1396, 3333, 3333, 1396, 1396,  847,  847,  847, 3333, 3333,
-     3333,  847, 1407, 1407, 1407, 1407, 3333, 3333, 1407, 1407,
-      855,  855,  855, 3333, 3333, 3333,  855, 1414, 1414, 1414,
-     1414, 3333, 3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093,
-
-     1093, 1093, 1093, 1093, 1620, 1620, 1620, 1620, 1620, 1620,
-     1620, 1620, 1620,  638,  638,  638,  638, 3333,  638, 3333,
-      638,  672,  672,  672, 3333, 3333, 3333,  672, 1157, 1157,
-     1157, 1157, 3333, 3333, 1157, 1157, 1163, 1163, 1163, 1163,
-     3333, 3333, 1163, 1163,  684,  684,  684, 3333, 3333, 3333,
-      684, 1172, 1172, 1172, 1172, 3333, 3333, 1172, 1172, 1182,
-     1182, 1182, 1182, 3333, 3333, 1182, 1182, 1190, 1190, 1190,
-     1190, 3333, 3333, 1190, 1190,  701,  701,  701,  701, 3333,
-      701, 3333,  701, 1206, 1206, 1206, 1206, 3333, 3333, 1206,
-     1206,  711,  711,  711, 3333, 3333, 3333,  711, 1231, 1231,
-
-     1231, 1231, 3333, 3333, 1231, 1231, 1238, 1238, 1238, 1238,
-     3333, 3333, 1238, 1238,  732,  732,  732, 3333, 3333, 3333,
-      732, 1263, 1263, 1263, 1263, 3333, 3333, 1263, 1263, 1268,
-     1268, 1268, 1268, 3333, 3333, 1268, 1268,  753,  753,  753,
-     3333, 3333, 3333,  753,  761,  761,  761, 3333, 3333, 3333,
-      761, 1287, 1287, 1287, 1287, 3333, 3333, 1287, 1287, 1295,
-     1295, 1295, 1295, 3333, 3333, 1295, 1295,  771,  771,  771,
-     3333, 3333, 3333,  771, 1301, 1301, 1301, 1301, 3333, 3333,
-     1301, 1301,  776,  776,  776, 3333, 3333, 3333,  776,  787,
-      787,  787,  787, 3333,  787, 3333,  787, 1322, 1322, 1322,
-
-     1322, 3333, 3333, 1322, 1322,  796,  796,  796, 3333, 3333,
-     3333,  796, 1334, 1334, 1334, 1334, 3333, 3333, 1334, 1334,
-      810,  810,  810, 3333, 3333, 3333,  810, 1359, 1359, 1359,
-     1359, 3333, 3333, 1359, 1359,  821,  821,  821, 3333, 3333,
-     3333,  821, 1368, 1368, 1368, 1368, 3333, 3333, 1368, 1368,
-      827,  827,  827, 3333, 3333, 3333,  827, 1376, 1376, 1376,
-     1376, 3333, 3333, 1376, 1376,  832,  832,  832,  832, 3333,
-      832, 3333,  832, 1386, 1386, 1386, 1386, 3333, 3333, 1386,
-     1386,  839,  839,  839,  839, 3333,  839, 3333,  839, 1396,
-     1396, 1396, 1396, 3333, 3333, 1396, 1396,  847,  847,  847,
-
-     3333, 3333, 3333,  847, 1407, 1407, 1407, 1407, 3333, 3333,
-     1407, 1407,  855,  855,  855,  855, 3333,  855, 3333,  855,
-     1414, 1414, 1414, 1414, 3333, 3333, 1414, 1414, 1093, 1093,
-     1093, 1093, 1093, 1093, 1093, 1093, 1093, 1620, 1620, 1620,
-     1620, 1620, 1620, 1620, 1620, 1620,  672,  672,  672, 3333,
-     3333, 3333,  672, 1157, 1157, 1157, 1157, 3333, 3333, 1157,
-     1157, 1163, 1163, 1163, 1163, 3333, 3333, 1163, 1163,  684,
-      684,  684, 3333, 3333, 3333,  684, 1172, 1172, 1172, 1172,
-     3333, 3333, 1172, 1172, 1182, 1182, 1182, 1182, 3333, 3333,
-     1182, 1182, 1190, 1190, 1190, 1190, 3333, 3333, 1190, 1190,
-
-     1206, 1206, 1206, 1206, 3333, 3333, 1206, 1206,  711,  711,
-      711, 3333, 3333, 3333,  711, 1231, 1231, 1231, 1231, 3333,
-     3333, 1231, 1231, 1238, 1238, 1238, 1238, 3333, 3333, 1238,
-     1238,  732,  732,  732, 3333, 3333, 3333,  732, 1263, 1263,
-     1263, 1263, 3333, 3333, 1263, 1263, 1268, 1268, 1268, 1268,
-     3333, 3333, 1268, 1268,  753,  753,  753, 3333, 3333, 3333,
-      753,  761,  761,  761, 3333, 3333, 3333,  761, 1287, 1287,
-     1287, 1287, 3333, 3333, 1287, 1287, 1295, 1295, 1295, 1295,
-     3333, 3333, 1295, 1295,  771,  771,  771, 3333, 3333, 3333,
-      771,  776,  776,  776, 3333, 3333, 3333,  776, 1322, 1322,
-
-     1322, 1322, 3333, 3333, 1322, 1322,  796,  796,  796,  796,
-     3333,  796, 3333,  796, 1334, 1334, 1334, 1334, 3333, 3333,
-     1334, 1334,  810,  810,  810, 3333, 3333, 3333,  810, 1359,
-     1359, 1359, 1359, 3333, 3333, 1359, 1359,  821,  821,  821,
-     3333, 3333, 3333,  821,  827,  827,  827, 3333, 3333, 3333,
-      827, 1376, 1376, 1376, 1376, 3333, 3333, 1376, 1376,  832,
-      832,  832, 3333, 3333, 3333,  832, 1386, 1386, 1386, 1386,
-     3333, 3333, 1386, 1386,  839,  839,  839, 3333, 3333, 3333,
-      839, 1396, 1396, 1396, 1396, 3333, 3333, 1396, 1396,  847,
-      847,  847, 3333, 3333, 3333,  847, 1414, 1414, 1414, 1414,
-
-     3333, 3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, 1093,
-     1093, 1093, 1093, 1620, 1620, 1620, 1620, 1620, 1620, 1620,
-     1620, 1620,  672,  672,  672, 3333, 3333, 3333,  672, 1157,
-     1157, 1157, 1157, 3333, 3333, 1157, 1157, 1163, 1163, 1163,
-     1163, 3333, 3333, 1163, 1163,  684,  684,  684,  684, 3333,
-      684, 3333,  684, 1172, 1172, 1172, 1172, 3333, 3333, 1172,
-     1172, 1182, 1182, 1182, 1182, 3333, 3333, 1182, 1182, 1190,
-     1190, 1190, 1190, 3333, 3333, 1190, 1190, 1206, 1206, 1206,
-     1206, 3333, 3333, 1206, 1206,  711,  711,  711, 3333, 3333,
-     3333,  711, 1231, 1231, 1231, 1231, 3333, 3333, 1231, 1231,
-
-      732,  732,  732, 3333, 3333, 3333,  732, 1263, 1263, 1263,
-     1263, 3333, 3333, 1263, 1263, 1268, 1268, 1268, 1268, 3333,
-     3333, 1268, 1268,  753,  753,  753,  753, 3333,  753, 3333,
-      753,  761,  761,  761,  761, 3333,  761, 3333,  761, 1287,
-     1287, 1287, 1287, 3333, 3333, 1287, 1287, 1295, 1295, 1295,
-     1295, 3333, 3333, 1295, 1295,  771,  771,  771,  771, 3333,
-      771, 3333,  771,  776,  776,  776, 3333, 3333, 3333,  776,
-     1322, 1322, 1322, 1322, 3333, 3333, 1322, 1322,  796,  796,
-      796,  796, 3333,  796, 3333,  796, 1334, 1334, 1334, 1334,
-     3333, 3333, 1334, 1334,  810,  810,  810,  810, 3333,  810,
-
-     3333,  810,  821,  821,  821, 3333, 3333, 3333,  821,  827,
-      827,  827, 3333, 3333, 3333,  827,  832,  832,  832, 3333,
-     3333, 3333,  832, 1386, 1386, 1386, 1386, 3333, 3333, 1386,
-     1386,  839,  839,  839, 3333, 3333, 3333,  839, 1396, 1396,
-     1396, 1396, 3333, 3333, 1396, 1396,  847,  847,  847, 3333,
-     3333, 3333,  847, 1414, 1414, 1414, 1414, 3333, 3333, 1414,
-     1414, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
-     1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620,  672,
-      672,  672, 3333, 3333, 3333,  672, 1163, 1163, 1163, 1163,
-     3333, 3333, 1163, 1163, 1172, 1172, 1172, 1172, 3333, 3333,
-
-     1172, 1172, 1182, 1182, 1182, 1182, 3333, 3333, 1182, 1182,
-     1190, 1190, 1190, 1190, 3333, 3333, 1190, 1190,  711,  711,
-      711, 3333, 3333, 3333,  711,  732,  732,  732, 3333, 3333,
-     3333,  732, 1263, 1263, 1263, 1263, 3333, 3333, 1263, 1263,
-      753,  753,  753, 3333, 3333, 3333,  753, 2879, 2879, 2879,
-     2879, 2879, 2879, 2879, 2879, 2879, 2880, 2880, 2880, 2880,
-     2880, 2880, 2880, 2880, 2880, 2942, 2942, 2942, 2942, 2942,
-     2942, 2942, 2942, 2942, 2945, 2945, 2945, 2945, 2945, 2945,
-     2945, 2945, 2945, 2993, 2993, 2993, 2993, 2993, 2993, 2993,
-     2993, 2993, 2995, 2995, 2995, 2995, 2995, 2995, 2995, 2995,
-
-     2995,  239, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333
+     3905,  294,  295,  294,  294,  295,  294,  294,  295,  294,
+      294,  295,  294,  299,  295,  299,  305,  296,  302,  305,
+      296,  302,  999,  297, 3905,  303,  297,  796,  303,  300,
+      299,  295,  299,  730,  306,  308,  309,  306,  308,  309,
+      310,  311,  748,  310,  311,  730,  300,  315,  316,  731,
+      312,  308,  309,  312,  313,  733,  310,  308,  309, 1240,
+      313,  732,  310,  315,  316,  797,  312,  327,  295,  327,
+     1793,  732,  312,  327,  295,  327,  845,  327,  295,  327,
+      327,  295,  327,  328,  295,  295,  295,  785, 1795,  328,
+      846,  733,  317,  329,  786,  776,  329,  729,  729,  729,
+
+      330,  729,  729,  729,  729,  729,  729,  732,  317,  318,
+      319,  295,  319,  318,  318,  318,  318,  318,  318,  318,
+      320,  318,  318,  318,  733,  318,  322,  318,  323,  318,
+      295,  295,  295,  327,  295,  327,  327,  295,  327,  841,
+      732,  327,  295,  327,  788,  832,  330,  842,  776,  328,
+      833, 1005,  328,  843, 1006,  318,  318,  331,  327,  295,
+      327,  729,  729,  729,  787,  787,  324,  729,  729,  729,
+      729,  729,  729, 1796,  331,  325,  318,  319,  295,  319,
+      318,  318,  318,  318,  318,  318,  318,  320,  318,  318,
+      318,  837,  318,  322,  318,  323,  318,  295,  295,  295,
+
+      295,  295,  295,  327,  295,  327,  308,  309,  327,  295,
+      327,  310,  838,  332,  788,  733,  332,  776,  776,  329,
+      883,  688,  318,  318,  329,  295,  295,  295,  295,  295,
+      295,  732,  884,  324,  327,  295,  327,  327,  295,  327,
+     1126,  333,  325, 1127,  333,  327,  295,  327,  796, 1798,
+      331,  689,  733,  331,  327,  295,  327,  729,  729,  729,
+      813,  334,  729,  729,  729,  729,  729,  729,  732,  929,
+      334,  335,  336,  295,  336,  335,  335,  335,  335,  335,
+      335,  335,  337,  335,  335,  335,  733,  335,  339,  335,
+      340,  335,  345,  295,  345,  345,  295,  345,  295,  295,
+
+      295,  776,  732,  295,  295,  295,  862,  797,  346,  733,
+      863,  346, 1799,  776,  347, 1802,  801,  335,  335,  347,
+      345,  295,  345,  341,  864,  732,  342,  729,  729,  729,
+      729,  729,  729,  729,  729,  729,  346, 1803,  343,  335,
+      336,  295,  336,  335,  335,  335,  335,  335,  335,  335,
+      337,  335,  335,  335,  733,  335,  339,  335,  340,  335,
+      345,  295,  345,  345,  295,  345,  345,  295,  345, 1021,
+      732,  361,  295,  361,  865, 1804,  346,  733, 1806,  348,
+     1022, 1019,  348, 1023,  807,  335,  335,  362,  361,  295,
+      361,  341,  818,  732,  342,  729,  729,  729,  729,  729,
+
+      729,  729,  729,  729,  362, 1020,  343,  349,  350,  295,
+      350,  349,  349,  349,  349,  349,  349,  349,  351,  349,
+      349,  349,  733,  349,  353,  349,  354,  349,  295,  295,
+      295,  295,  295,  295,  361,  295,  361,  824,  732,  361,
+      295,  361, 1497,  733,  363,  776,  733,  363, 1498,  733,
+      362, 1808,  851,  349,  349,  362,  361,  295,  361,  732,
+      970,  355,  732,  356,  813,  732,  357,  729,  729,  729,
+      358, 1817,  364, 1820,  359,  349,  350,  295,  350,  349,
+      349,  349,  349,  349,  349,  349,  351,  349,  349,  349,
+      776,  349,  353,  349,  354,  349,  361,  295,  361,  373,
+
+      295,  373,  373,  295,  373,  776,  847,  385,  295,  385,
+      971,  733,  364,  788,  848,  374, 1031,  776,  374,  849,
+      855,  349,  349,  386,  385,  295,  385,  732, 1652,  355,
+     1032,  356,  818, 1828,  357,  729,  729,  729,  358, 1830,
+      386, 1653,  359,  365,  366,  295,  366,  365,  365,  365,
+      365,  365,  365,  365,  367,  365,  365,  365,  733,  365,
+      369,  365,  370,  365,  397,  295,  397,  397,  295,  397,
+      295,  295,  295,  776,  732,  295,  295,  295,  908, 1832,
+      398,  788,  909,  398, 1833,  776,  347, 1834,  733,  365,
+      365,  347,  397,  295,  397,  397,  295,  397,  729,  729,
+
+      729,  729,  729,  729,  732,  864,  824, 1836,  398, 1837,
+     1841,  398, 1845,  371,  365,  366,  295,  366,  365,  365,
+      365,  365,  365,  365,  365,  367,  365,  365,  365,  733,
+      365,  369,  365,  370,  365,  397,  295,  397,  397,  295,
+      397,  409,  295,  409, 1847,  732,  409,  295,  409,  949,
+     1850,  399, 1852, 1857,  399,  788,  950,  410,  776,  776,
+      365,  365,  410,  295,  295,  295,  295,  295,  295,  729,
+      729,  729,  729,  729,  729,  729,  729,  729, 1858,  347,
+      738, 1862,  347, 1869,  371,  375,  376,  295,  376,  375,
+      375,  375,  375,  375,  375,  375,  377,  375,  375,  375,
+
+      733,  375,  379,  375,  380,  375,  409,  295,  409,  409,
+      295,  409,  409,  295,  409,  752,  732,  409,  295,  409,
+      733, 1870,  410,  739,  875,  410,  916,  834,  411,  740,
+      770,  375,  375,  411,  741,  381,  732,  885,  915,  742,
+     1261,  921,  382, 1871, 1628,  383,  375,  376,  295,  376,
+      375,  375,  375,  375,  375,  375,  375,  377,  375,  375,
+      375, 1038,  375,  379,  375,  380,  375,  422,  295,  422,
+      422,  295,  422,  295,  295,  295,  916,  776,  295,  295,
+      295, 1038, 1872,  423,  915, 1039,  423, 1873,  733,  347,
+      776,  921,  375,  375,  347,  871,  381,  729,  729,  729,
+
+      729,  729,  729,  382,  732, 1020,  383,  387,  388,  295,
+      388,  387,  387,  387,  387,  387,  387,  387,  389,  387,
+      387,  387,  733,  387,  391,  387,  392,  387,  422,  295,
+      422,  422,  295,  422,  422,  295,  422,  776,  732,  422,
+      295,  422,  995, 1874,  423,  733, 1031,  423, 1875,  996,
+      424, 1876,  890,  387,  387,  424,  438,  295,  438,  393,
+     1046,  732,  394,  729,  729,  729,  729,  729,  729,  729,
+      729,  729,  439, 1877,  395,  387,  388,  295,  388,  387,
+      387,  387,  387,  387,  387,  387,  389,  387,  387,  387,
+      733,  387,  391,  387,  392,  387,  438,  295,  438,  455,
+
+      295,  455,  455,  295,  455, 1040,  732,  295,  295,  295,
+     1878, 1879,  439,  733, 1882,  456, 1041, 1019,  456, 1023,
+      895,  387,  387,  330,  295,  295,  295,  393,  929,  732,
+      394,  729,  729,  729,  729,  729,  729,  729,  729,  729,
+      330, 1039,  395,  400,  401,  295,  401,  400,  400,  400,
+      400,  400,  400,  400,  402,  400,  400,  400,  733,  400,
+      404,  400,  405,  400,  455,  295,  455,  455,  295,  455,
+      455,  295,  455,  943,  732,  455,  295,  455, 1885, 1886,
+      456,  776, 1888,  456, 1889, 1891,  457, 1892,  944,  400,
+      400,  457,  466,  295,  466,  406,  729,  729,  729,  729,
+
+      729,  729,  729,  729,  729,  729,  729,  729,  467, 1893,
+      407,  400,  401,  295,  401,  400,  400,  400,  400,  400,
+      400,  400,  402,  400,  400,  400,  733,  400,  404,  400,
+      405,  400,  466,  295,  466,  295,  295,  295,  295,  295,
+      295, 1031,  732,  466,  295,  466, 1894, 1898,  467, 1899,
+     1900,  330, 1901, 1902,  330, 1051,  951,  400,  400,  467,
+      466,  295,  466,  406,  729,  729,  729,  729,  729,  729,
+      729,  729,  729,  729,  729,  729,  467, 1905,  407,  412,
+      413,  295,  413,  412,  412,  412,  412,  412,  412,  412,
+      414,  412,  412,  412,  733,  412,  416,  412,  417,  412,
+
+      466,  295,  466,  466,  295,  466,  481,  295,  481,  776,
+      732,  481,  295,  481, 1908, 1909,  468,  733, 1031,  468,
+     1910, 1913,  482, 1914,  900,  412,  412,  482,  295,  295,
+      295,  418, 1053,  732,  419,  729,  729,  729,  729,  729,
+      729,  729,  729,  729,  483, 1915,  420,  412,  413,  295,
+      413,  412,  412,  412,  412,  412,  412,  412,  414,  412,
+      412,  412,  733,  412,  416,  412,  417,  412,  295,  295,
+      295,  481,  295,  481,  481,  295,  481, 1749,  732,  481,
+      295,  481, 1916, 1917,  483,  733, 1920,  482, 1924, 1750,
+      482,  733,  910,  412,  412,  484,  481,  295,  481,  418,
+
+      963,  732,  419,  729,  729,  729,  970,  732,  729,  729,
+      729, 3905,  484, 1925,  420,  425,  426,  295,  426,  425,
+      425,  425,  425,  425,  425,  425,  427,  425,  425,  425,
+      733,  425,  429,  425,  430,  425,  495,  295,  495,  495,
+      295,  495,  505,  295,  505,  990,  732,  505,  295,  505,
+      779,  911,  496,  776,  920,  496,  999,  733,  506,  776,
+      997,  425,  425,  506,  762,  431,  780,  776,  772,  919,
+     1926, 1000,  432,  732, 1928,  433,  729,  729,  729,  434,
+     1932,  435,  436,  425,  426,  295,  426,  425,  425,  425,
+      425,  425,  425,  425,  427,  425,  425,  425,  776,  425,
+
+      429,  425,  430,  425,  295,  295,  295,  295,  295,  295,
+      505,  295,  505,  776,  939,  505,  295,  505,  940, 1933,
+      507, 1935,  941,  507, 1936,  733,  506, 1017, 1261,  425,
+      425,  506,  934,  431,  729,  729,  729,  729,  729,  729,
+      432,  732, 1018,  433,  729,  729,  729,  434, 1864,  435,
+      436,  440,  441,  295,  441,  440,  440,  440,  440,  440,
+      440,  440,  442,  440,  440,  440,  733,  440,  444,  440,
+      445,  440,  505,  295,  505,  505,  295,  505,  520,  295,
+      520, 1017,  732,  520,  295,  520, 1939, 1940,  508, 1942,
+     1943,  508, 1184,  733,  521, 1946, 1068,  440,  440,  521,
+
+      945,  446,  447,  729,  729,  729,  951, 1018,  448,  732,
+     1968,  449,  729,  729,  729,  450, 1969,  451,  452,  453,
+      440,  441,  295,  441,  440,  440,  440,  440,  440,  440,
+      440,  442,  440,  440,  440,  733,  440,  444,  440,  445,
+      440,  295,  295,  295,  295,  295,  295,  520,  295,  520,
+     1021,  732,  520,  295,  520,  788, 1973,  330, 1292,  776,
+      330, 1022,  733,  521, 1185, 1187,  440,  440,  521,  956,
+      446,  447,  729,  729,  729, 1293, 1976,  448,  732, 1046,
+      449,  729,  729,  729,  450, 1978,  451,  452,  453,  458,
+      459,  295,  459,  458,  458,  458,  458,  458,  458,  458,
+
+      460,  458,  458,  458,  733,  458,  462,  458,  463,  458,
+      520,  295,  520,  520,  295,  520,  532,  295,  532, 1987,
+      732,  532,  295,  532, 1988, 1989,  522, 1990,  733,  522,
+     1992, 2000,  533,  997, 2002,  458,  458,  533,  729,  729,
+      729,  729,  729,  729,  732,  915,  464,  458,  459,  295,
+      459,  458,  458,  458,  458,  458,  458,  458,  460,  458,
+      458,  458,  733,  458,  462,  458,  463,  458,  543,  295,
+      543,  543,  295,  543,  554,  295,  554, 1040,  732,  554,
+      295,  554,  788,  916,  544,  917,  776,  544, 1041, 2005,
+      555, 1185, 2006,  458,  458,  555, 2009, 2011,  918, 2012,
+
+      919,  729,  729,  729,  464,  469,  470,  295,  470,  469,
+      469,  469,  469,  469,  469,  469,  471,  469,  469,  469,
+      733,  469,  473,  469,  474,  469,  569,  295,  569,  569,
+      295,  569,  295,  295,  295, 2014,  732,  295,  295,  295,
+     2015, 2016,  570, 2017,  733,  570, 2018, 2022,  571, 2023,
+     2024,  469,  469,  571,  475,  733,  476,  729,  729,  729,
+      732, 2029,  477,  729,  729,  729,  729,  729,  729,  478,
+     2033,  732,  479,  469,  470,  295,  470,  469,  469,  469,
+      469,  469,  469,  469,  471,  469,  469,  469, 2037,  469,
+      473,  469,  474,  469,  580,  295,  580,  580,  295,  580,
+
+      580,  295,  580, 2039, 1028,  580,  295,  580, 2041, 2043,
+      581, 1029, 1261,  581, 2044, 2045,  582, 1030, 2047,  469,
+      469,  582,  475, 2054,  476,  729,  729,  729, 1263, 2058,
+      477,  729,  729,  729,  729,  729,  729,  478, 2059, 1292,
+      479,  485,  486,  295,  486,  485,  485,  485,  485,  485,
+      485,  485,  487,  485,  485,  485, 1445,  485,  489,  485,
+      490,  485,  295,  295,  295,  295,  295,  295,  580,  295,
+      580, 2061, 1652,  580,  295,  580, 2068, 1591,  583,  977,
+     2070,  583, 2071, 1797,  581, 1659,  978,  485,  485,  581,
+      580,  295,  580,  491, 1293,  732, 1659, 2072,  492,  729,
+
+      729,  729,  729,  729,  729, 1867,  584,  729,  729,  729,
+      493,  485,  486,  295,  486,  485,  485,  485,  485,  485,
+      485,  485,  487,  485,  485,  485, 2077,  485,  489,  485,
+      490,  485,  580,  295,  580,  295,  295,  295,  295,  295,
+      295, 1261, 2078,  580,  295,  580, 2079, 2081,  584,  733,
+     2082,  507, 2083, 2084,  507, 2085,  985,  485,  485,  582,
+      580,  295,  580,  491, 2086,  732, 2074, 2087,  492,  729,
+      729,  729,  729,  729,  729, 2088,  582, 1280, 1280, 1280,
+      493,  497,  498,  295,  498,  497,  497,  497,  497,  497,
+      497,  497,  499,  497,  497,  497, 2089,  497,  501,  497,
+
+      502,  497,  295,  295,  295,  295,  295,  295,  580,  295,
+      580, 2090, 1028,  580,  295,  580, 1400, 2092,  585, 1029,
+     2093,  585, 2094, 2097,  584, 1036, 1401,  497,  497,  584,
+     1003, 1003, 1003, 1402, 1265,  503,  497,  498,  295,  498,
+      497,  497,  497,  497,  497,  497,  497,  499,  497,  497,
+      497, 2100,  497,  501,  497,  502,  497,  580,  295,  580,
+      580,  295,  580,  599,  295,  599, 2101, 1045,  599,  295,
+      599, 2102, 2103,  586, 1029, 2104,  586, 2105, 2106,  600,
+     1030, 2107,  497,  497,  600, 1003, 1003, 1003, 2110, 2113,
+      503,  509,  510,  295,  510,  509,  509,  509,  509,  509,
+
+      509,  509,  511,  509,  509,  509, 2120,  509,  513,  509,
+      514,  509,  295,  295,  295,  295,  295,  295,  599,  295,
+      599, 2121, 1045,  599,  295,  599, 2122, 2123,  363, 1029,
+     2124,  363, 2126, 1028,  600, 1036, 1045,  509,  509,  600,
+     1029,  515, 2131, 1029, 2132, 1004, 1186, 2176,  516, 1186,
+     2177,  517, 2183, 1280, 1280, 1280, 2189, 2190,  518,  509,
+      510,  295,  510,  509,  509,  509,  509,  509,  509,  509,
+      511,  509,  509,  509, 2191,  509,  513,  509,  514,  509,
+      599,  295,  599,  599,  295,  599,  611,  295,  611, 2192,
+     2195,  611,  295,  611, 2201, 2203,  601, 2209, 2213,  601,
+
+     2216, 2217,  612, 2220, 2221,  509,  509,  612, 2222,  515,
+     1272, 1272, 1272, 2223, 1273, 2224,  516, 1274, 1281,  517,
+     1303, 1303, 1303, 1887, 1887, 1887,  518,  523,  524,  295,
+      524,  523,  523,  523,  523,  523,  523,  523,  525,  523,
+      523,  523, 2225,  523,  527,  523,  528,  523,  625,  295,
+      625,  625,  295,  625,  636,  295,  636, 2226, 2233,  636,
+      295,  636, 2234, 2235,  626, 2237, 2239,  626, 2247, 2252,
+      637, 2253, 2254,  523,  523,  637, 1303, 1303, 1303,  529,
+     1880, 1880, 1880, 2256,  530,  523,  524,  295,  524,  523,
+      523,  523,  523,  523,  523,  523,  525,  523,  523,  523,
+
+     2269,  523,  527,  523,  528,  523,  295,  295,  295,  295,
+      295,  295,  636,  295,  636, 1867, 2283,  636,  295,  636,
+     2284, 2285,  347, 2289, 2290,  347, 2292, 1881,  637, 2293,
+     2294,  523,  523,  637, 1303, 1303, 1303,  529, 1883, 1883,
+     1883, 1304,  530,  534,  535,  295,  535,  534,  534,  534,
+      534,  534,  534,  534,  536,  534,  534,  534, 2279,  534,
+      538,  534,  539,  534,  636,  295,  636,  636,  295,  636,
+      648,  295,  648, 1867, 2295,  648,  295,  648, 2296, 2297,
+      638, 1261, 2300,  638, 2301, 1884,  649, 2302, 2303,  534,
+      534,  649,  661,  295,  661,  661,  295,  661, 2278, 1281,
+
+      540, 2304, 1348, 1348, 1348, 2308, 1349, 2280,  662, 1350,
+     2309,  662, 2310,  541,  534,  535,  295,  535,  534,  534,
+      534,  534,  534,  534,  534,  536,  534,  534,  534, 2286,
+      534,  538,  534,  539,  534,  295,  295,  295,  295,  295,
+      295,  661,  295,  661, 2311, 2287,  661,  295,  661, 2313,
+     2314,  330, 2315, 2288,  330, 2322, 2324,  662, 2325, 2326,
+      534,  534,  662,  661,  295,  661,  661,  295,  661, 2327,
+     2328,  540, 2331, 1384, 1384, 1384, 2333, 1385, 2364,  663,
+     1386, 2365,  663, 2366,  541,  545,  546,  295,  546,  545,
+      545,  545,  545,  545,  545,  545,  547,  545,  545,  545,
+
+     2305,  545,  549,  545,  550,  545,  675,  295,  675,  675,
+      295,  675,  295,  295,  295, 2372, 2306,  295,  295,  295,
+     2373, 2377,  676, 2378, 2307,  676, 2381, 2382,  677, 2386,
+     2389,  545,  545,  677,  675,  295,  675, 1387, 1387, 1387,
+     2393, 1388, 2394, 2395, 1389, 2398, 2401,  551, 2405, 2406,
+      676, 2407,  552,  545,  546,  295,  546,  545,  545,  545,
+      545,  545,  545,  545,  547,  545,  545,  545, 2412,  545,
+      549,  545,  550,  545,  675,  295,  675,  675,  295,  675,
+      675,  295,  675, 2414, 2415,  700,  295,  700, 2416, 2417,
+      676, 2419, 2422,  678, 2424, 2427,  678,  308,  309,  545,
+
+      545,  701,  310,  700,  295,  700, 1403, 1403, 1403, 2443,
+     1404, 2444,  688, 1405, 2445,  551, 1890, 1890, 1890,  701,
+      552,  556,  557,  295,  557,  556,  556,  556,  556,  556,
+      556,  556,  558,  556,  556,  556, 2450,  556,  560,  556,
+      561,  556,  689,  711,  295,  711,  711,  295,  711,  711,
+      295,  711, 2451,  711,  295,  711, 1011, 1011, 1011,  712,
+     2454, 2455,  712, 2456, 2459,  713, 2452,  556,  556,  713,
+      562,  563,  564, 1012, 2453, 1407, 1407, 1407,  565, 1408,
+     2469,  566, 1409, 2478, 1867, 1280, 1280, 1280,  567,  556,
+      557,  295,  557,  556,  556,  556,  556,  556,  556,  556,
+
+      558,  556,  556,  556, 2479,  556,  560,  556,  561,  556,
+      295,  295,  295,  295,  295,  295,  711,  295,  711, 2457,
+     2480,  711,  295,  711, 1261, 2481,  330, 2458, 2482,  330,
+     2471, 2473,  712, 2485, 2487,  556,  556,  712,  562,  563,
+      564, 1425, 1425, 1425, 2488, 1426,  565, 2489, 1427,  566,
+     1304, 1895, 1895, 1895, 2493, 2494,  567,  572,  573,  295,
+      573,  572,  572,  572,  572,  572,  572,  572,  574,  572,
+      572,  572, 2496,  572,  576,  572,  577,  572,  711,  295,
+      711,  711,  295,  711,  295,  295,  295, 1896, 1867,  295,
+      295,  295, 2497, 2498,  714, 2499, 2502,  714, 2506, 2507,
+
+      332, 2508, 2510,  572,  572,  332,  711,  295,  711,  711,
+      295,  711, 1435, 1435, 1435, 2516, 1436, 2518, 2530, 1437,
+     2472, 2531,  713, 2532, 2536,  713, 2537,  578,  572,  573,
+      295,  573,  572,  572,  572,  572,  572,  572,  572,  574,
+      572,  572,  572, 2538,  572,  576,  572,  577,  572,  295,
+      295,  295,  295,  295,  295,  711,  295,  711, 2544, 2545,
+      711,  295,  711, 2546, 2549,  333, 2553, 2554,  333, 2555,
+     2556,  714, 2559, 2560,  572,  572,  714,  711,  295,  711,
+      711,  295,  711, 1447, 1447, 1447, 2561, 1448, 2562, 2563,
+     1449, 2575, 2579,  715, 2582, 2583,  715, 2589,  578,  587,
+
+      588,  295,  588,  587,  587,  587,  587,  587,  587,  587,
+      589,  587,  587,  587, 2594,  587,  591,  587,  592,  587,
+      726,  295,  726,  726,  295,  726,  295,  295,  295, 2596,
+     2597,  295,  295,  295, 2598, 2602,  727, 2603, 2604,  727,
+     2605, 2606,  347, 2607, 2608,  587,  587,  347,  726,  295,
+      726, 2609, 2610,  593, 2611,  594, 2616, 1867,  595, 1897,
+     1897, 1897,  596, 2633,  727, 1867,  597,  587,  588,  295,
+      588,  587,  587,  587,  587,  587,  587,  587,  589,  587,
+      587,  587, 2634,  587,  591,  587,  592,  587,  726,  295,
+      726,  726,  295,  726,  726,  295,  726, 2635, 1073, 1073,
+
+     1073, 1092, 1092, 1092,  727, 2620, 2636,  728, 2638, 2619,
+      728, 2640, 2641,  587,  587, 1074, 2642,  748, 1093, 2644,
+     2645,  593,  875,  594, 2646, 2647,  595,  774, 2648, 2649,
+      596, 2650,  876, 2651,  597,  602,  603,  295,  603,  602,
+      602,  602,  602,  602,  602,  602,  604,  602,  602,  602,
+     2672,  602,  606,  602,  607,  602,  775, 2673, 2678, 1094,
+     1094, 1094,  752, 2674, 2679, 1276, 1276, 1276,  754, 2685,
+      776, 2686,  777, 2675,  760,  762, 1095, 2687, 2703,  760,
+      778,  602,  602, 1278, 2704,  877, 2705, 2720,  990, 1450,
+     1450, 1450,  608, 1451, 2721, 2722, 1452, 2725,  774, 2727,
+
+     1903, 1903, 1903, 2728, 2729,  609,  602,  603,  295,  603,
+      602,  602,  602,  602,  602,  602,  602,  604,  602,  602,
+      602, 2730,  602,  606,  602,  607,  602,  775, 2731, 1104,
+     1104, 1104, 1107, 1107, 1107, 2732, 2733, 1121, 1121, 1121,
+     2734,  776, 2735,  777, 2736,  760, 1105, 1904, 2737, 1108,
+     2738,  778,  602,  602, 1122, 1128, 1128, 1128, 1137, 1137,
+     1137, 2750, 2755,  608, 1464, 1464, 1464, 2756, 1465, 2759,
+     2760, 1466, 1129, 2761, 1867, 1138,  609,  613,  614,  295,
+      614,  613,  613,  613,  613,  613,  613,  613,  615,  613,
+      613,  613, 2762,  613,  617,  613,  618,  613, 1139, 1139,
+
+     1139, 1149, 1149, 1149, 1157, 1157, 1157, 2753, 1161, 1161,
+     1161, 1173, 1173, 1173, 2765, 1140, 2766, 2757, 1150, 2767,
+     2768, 1158, 1867,  613,  613, 1162, 2758, 2769, 1174, 1475,
+     1475, 1475,  619, 1476,  620, 2771, 1477, 2772,  621, 2773,
+     1906, 1906, 1906,  622,  623,  613,  614,  295,  614,  613,
+      613,  613,  613,  613,  613,  613,  615,  613,  613,  613,
+     2754,  613,  617,  613,  618,  613, 1195, 1195, 1195, 1201,
+     1201, 1201, 1217, 1217, 1217, 2763, 1223, 1223, 1223, 1229,
+     1229, 1229, 2775, 1196, 2764, 2776, 1202, 1884, 2777, 1218,
+     2779,  613,  613, 1224, 2780, 2782, 1230, 1482, 1482, 1482,
+
+      619, 1483,  620, 2800, 1484, 2801,  621, 1907, 1907, 1907,
+     2802,  622,  623,  627,  628,  295,  628,  627,  627,  627,
+      627,  627,  627,  627,  629,  627,  627,  627, 2803,  627,
+      631,  627,  632,  627, 1237, 1237, 1237, 1249, 1249, 1249,
+     1011, 1011, 1011, 2807, 1320, 1320, 1320, 1324, 1324, 1324,
+     2808, 1238, 2815, 2816, 1250, 2823, 2809, 1012, 2810,  627,
+      627, 1321, 2824, 2825, 1325,  633, 1500, 1500, 1500, 2837,
+     1501, 2811, 2838, 1502, 2853, 1911, 1911, 1911, 2854, 2855,
+      634,  627,  628,  295,  628,  627,  627,  627,  627,  627,
+      627,  627,  629,  627,  627,  627, 2856,  627,  631,  627,
+
+      632,  627, 1276, 1276, 1276, 1327, 1327, 1327, 1327, 1327,
+     1327, 1912, 2857, 3905, 3905, 3905, 2859, 3905, 3905, 3905,
+     1278, 2860, 2861, 1329, 2862, 2257, 1329,  627,  627, 2863,
+     3905, 2258, 2864,  633, 3905, 2259, 1530, 1530, 1530, 1279,
+     1531, 2260, 2865, 1532, 2866, 1330, 2867, 2868,  634,  639,
+      640,  295,  640,  639,  639,  639,  639,  639,  639,  639,
+      641,  639,  639,  639, 1322,  639,  643,  639,  644,  639,
+     1337, 1337, 1337, 1343, 1343, 1343, 2869, 1326, 2870, 1323,
+     1337, 1337, 1337, 1343, 1343, 1343, 2872, 2812, 1339, 2813,
+     2873, 1345, 1911, 1911, 1911,  639,  639, 2876, 1339, 2877,
+
+      645, 1345, 2814, 1906, 1906, 1906,  646,  639,  640,  295,
+      640,  639,  639,  639,  639,  639,  639,  639,  641,  639,
+      639,  639, 2874,  639,  643,  639,  644,  639, 1896, 2878,
+     1340, 2875, 1073, 1073, 1073, 2879, 2882, 1352, 1352, 1352,
+     2883, 1352, 1352, 1352, 1356, 1356, 1356, 2880, 1346, 1074,
+     1919, 2884, 1261,  639,  639, 1354, 2881, 2889,  645, 1354,
+     2890, 1357, 2891, 1867,  646,  650,  651,  295,  651,  650,
+      650,  650,  650,  650,  650,  650,  652,  650,  650,  650,
+     2892,  650,  654,  650,  655,  650, 1360, 1360, 1360, 1355,
+     1362, 1362, 1362, 2886, 2893, 1362, 1362, 1362, 3905, 3905,
+
+     3905, 2887, 2894, 1361, 1366, 1366, 1366, 2895, 1364, 2896,
+     2897,  650,  650, 1364,  656, 3905,  657, 2080, 2080, 2080,
+     2898, 1367,  658, 1539, 1539, 1539, 2899, 1540, 2900, 2901,
+     1541, 2902, 2903,  659,  650,  651,  295,  651,  650,  650,
+      650,  650,  650,  650,  650,  652,  650,  650,  650, 1358,
+      650,  654,  650,  655,  650, 1368, 1368, 1368, 1370, 1370,
+     1370, 1370, 1370, 1370, 1359, 2905, 2906, 1365, 2907, 1374,
+     1374, 1374, 1369, 3905, 3905, 3905, 1372, 2908, 2909, 1372,
+      650,  650, 2910,  656, 2911,  657, 1375, 1880, 1880, 1880,
+     3905,  658, 1564, 1564, 1564, 2923, 1565, 2924, 2927, 1566,
+
+     2928, 2929,  659,  664,  665,  295,  665,  664,  664,  664,
+      664,  664,  664,  664,  666,  664,  664,  664, 2930,  664,
+      668,  664,  669,  664, 1376, 1378, 1378, 1378, 1380, 1380,
+     1380, 2261, 2933, 1373, 1380, 1380, 1380, 2262, 2934, 1377,
+     2931, 2263, 1379, 1396, 1396, 1396, 1382, 2264, 2937,  664,
+      664, 2932, 1382, 2938,  670, 1573, 1573, 1573, 2935, 1574,
+      671, 1398, 1575, 1867,  672, 1883, 1883, 1883, 2946, 2936,
+      673,  664,  665,  295,  665,  664,  664,  664,  664,  664,
+      664,  664,  666,  664,  664,  664, 2947,  664,  668,  664,
+      669,  664, 1092, 1092, 1092, 1094, 1094, 1094, 1390, 1390,
+
+     1390, 1582, 1582, 1582, 2948, 1583, 1383, 2888, 1584, 1093,
+     2959, 2977, 1095, 2982, 2983, 1391, 2971,  664,  664, 3905,
+     3905, 3905,  670, 1593, 1593, 1593, 2972, 1594,  671, 2973,
+     1595, 2988,  672, 2091, 2091, 2091, 3905, 2989,  673,  679,
+      680,  295,  680,  679,  679,  679,  679,  679,  679,  679,
+      681,  679,  679,  679, 2990,  679,  683,  679,  684,  679,
+     1887, 1887, 1887, 3905, 3905, 3905, 2991, 1104, 1104, 1104,
+     2992, 2993, 1392, 3905, 3905, 3905, 2994, 3905, 3905, 3905,
+     3905, 1396, 1396, 1396, 1105,  679,  679, 1890, 1890, 1890,
+     3905, 2995, 2996,  685, 3905, 2997,  686, 2999, 3000, 1398,
+
+     2095, 2095, 2095,  687,  679,  680,  295,  680,  679,  679,
+      679,  679,  679,  679,  679,  681,  679,  679,  679, 1393,
+      679,  683,  679,  684,  679, 1394, 1107, 1107, 1107, 1399,
+     1395, 1410, 1410, 1410, 1421, 1421, 1421, 1421, 1421, 1421,
+     1121, 1121, 1121, 1108, 1428, 1428, 1428, 3001, 1411, 3002,
+      679,  679, 1423, 2974, 3003, 1423, 3004, 1122,  685, 3005,
+     3006,  686, 1430, 2975, 3007, 2096, 2976, 3008,  687,  690,
+      691,  295,  691,  690,  690,  690,  690,  690,  690,  690,
+      692,  690,  690,  690, 3009,  690,  694,  690,  695,  690,
+     3010, 1428, 1428, 1428, 3018, 3019, 1424, 1128, 1128, 1128,
+
+     1441, 1441, 1441, 1441, 1441, 1441, 1137, 1137, 1137, 1430,
+     1139, 1139, 1139, 3020, 1129,  690,  690, 3021, 1443, 3022,
+     3023, 1443,  696, 1138, 1895, 1895, 1895, 1140,  697, 1609,
+     1609, 1609, 3024, 1610, 3025, 1867, 1611,  698,  690,  691,
+      295,  691,  690,  690,  690,  690,  690,  690,  690,  692,
+      690,  690,  690, 1431,  690,  694,  690,  695,  690, 1453,
+     1453, 1453, 1458, 1458, 1458, 1444, 1261, 3026, 1453, 1453,
+     1453, 1458, 1458, 1458, 1470, 1470, 1470, 1455, 3016, 1867,
+     1460, 1149, 1149, 1149,  690,  690, 1455, 3027, 3028, 1460,
+     3029,  696, 1472, 1895, 1895, 1895, 3015,  697, 1150, 3030,
+
+     2098, 2098, 2098, 1897, 1897, 1897,  698,  702,  703,  295,
+      703,  702,  702,  702,  702,  702,  702,  702,  704,  702,
+      702,  702, 3017,  702,  706,  702,  707,  702, 3032, 1912,
+     1456, 3033, 1461, 1470, 1470, 1470, 3034, 3035, 1157, 1157,
+     1157, 1478, 1478, 1478, 1478, 1478, 1478, 2099, 1161, 1161,
+     1161, 1472, 3037,  702,  702, 1158, 1272, 1272, 1272, 1480,
+     1273, 3038, 1480, 1274,  708, 1162, 1903, 1903, 1903, 1906,
+     1906, 1906, 3039,  709,  702,  703,  295,  703,  702,  702,
+      702,  702,  702,  702,  702,  704,  702,  702,  702, 1473,
+      702,  706,  702,  707,  702, 1486, 1486, 1486, 3050, 3058,
+
+     1481, 1486, 1486, 1486, 1492, 1492, 1492, 1492, 1492, 1492,
+     1173, 1173, 1173, 1488, 3059, 1503, 1503, 1503, 3060, 1488,
+      702,  702, 1494, 3061, 3062, 1494, 3043, 1174, 1907, 1907,
+     1907,  708, 1504, 1911, 1911, 1911, 2186, 2186, 2186, 3044,
+      709,  716,  717,  295,  717,  716,  716,  716,  716,  716,
+      716,  716,  718,  716,  716,  716, 3063,  716,  720,  716,
+      721,  716, 3045, 1489, 1507, 1507, 1507, 3064, 3065, 1495,
+     3066, 3067, 1507, 1507, 1507, 3046, 1513, 1513, 1513, 1513,
+     1513, 1513, 1509, 1526, 1526, 1526, 3068,  716,  716, 3072,
+     1509, 3075, 3076,  722, 1515, 3077,  723, 1515, 1676, 1676,
+
+     1676, 1528, 1677, 3078, 3079, 1678, 3080, 3081,  724,  716,
+      717,  295,  717,  716,  716,  716,  716,  716,  716,  716,
+      718,  716,  716,  716, 1510,  716,  720,  716,  721,  716,
+     1526, 1526, 1526, 1195, 1195, 1195, 3084, 3092, 1516, 1534,
+     1534, 1534, 1534, 1534, 1534, 1201, 1201, 1201, 1528, 3093,
+     1196, 1542, 1542, 1542, 3096,  716,  716, 1536, 3097, 3100,
+     1536,  722, 1202, 3115,  723, 1545, 1545, 1545, 1543, 1550,
+     1550, 1550, 1550, 1550, 1550, 2952,  724,  733, 3116, 1554,
+     1554, 1554, 1546, 3117,  748, 2953, 3118, 1552, 3119, 3120,
+     1552, 2954, 3121,  732,  749, 1529, 1555, 1556, 1556, 1556,
+
+     3905, 3905, 3905, 1559, 1559, 1559, 3088, 1537, 1559, 1559,
+     1559, 1217, 1217, 1217, 1557, 2955, 3122, 3905, 3124, 3089,
+     1553, 1561,  750,  751,  752, 2956, 1561, 3125, 1218,  753,
+      754, 2957, 3126,  755,  756, 3127, 3090,  757, 3128,  758,
+      759,  760, 3129, 1567, 1567, 1567, 3130,  761,  733, 3091,
+     3094, 1567, 1567, 1567, 1223, 1223, 1223, 1577, 1577, 1577,
+     1558, 1569, 3131, 3095,  732,  763, 1577, 1577, 1577, 1569,
+     1562, 1224, 1229, 1229, 1229, 1579, 3132, 3133, 1587, 1587,
+     1587, 1587, 1587, 1587, 1579, 1237, 1237, 1237, 3134, 1230,
+     1249, 1249, 1249,  750,  764,  765, 1589, 3135, 1261, 1589,
+
+      766,  767, 1238, 1867,  768,  756, 3143, 1250,  769, 3144,
+      770,  771,  772, 1570, 1598, 1598, 1598, 3098,  773,  733,
+     1598, 1598, 1598, 1605, 1605, 1605,  990, 1605, 1605, 1605,
+     3099, 3145, 1600, 1580, 3146,  732,  749, 3147, 1600, 3140,
+     3148, 1607, 1613, 1613, 1613, 1607, 3149, 3139, 1590, 1613,
+     1613, 1613, 1617, 1617, 1617, 3150, 3905, 3905, 3905, 3151,
+     1615, 1621, 1621, 1621,  750,  751,  752, 1615, 3152, 1618,
+     3153,  753,  754, 3905, 3154,  755,  756, 3155, 1622,  757,
+     3156,  758,  759,  760, 3158, 1601, 3905, 3905, 3905,  761,
+     3159, 3160, 1608, 3162, 1624, 1624, 1624, 1624, 1624, 1624,
+
+     1276, 1276, 1276, 3905, 2108, 2108, 2108, 1619, 1276, 1276,
+     1276, 1616, 1626, 3167, 3168, 1626, 3169, 3170, 1278, 1635,
+     1635, 1635, 1620, 1320, 1320, 1320, 1278, 1324, 1324, 1324,
+     3175, 1681, 1681, 1681, 3182, 1682, 3183, 1636, 1683, 3184,
+     1321, 1688, 1688, 1688, 1325, 3185, 1623, 1327, 1327, 1327,
+     1327, 1327, 1327, 1327, 1327, 1327, 3163, 3165, 1689, 1627,
+     1337, 1337, 1337, 3186, 3187, 1329, 3164, 3166, 1329, 2109,
+     3188, 1329, 1337, 1337, 1337, 1337, 1337, 1337, 1339, 1343,
+     1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 3189, 3190,
+     1339, 3191, 3192, 1339, 1348, 1348, 1348, 1345, 1349, 3193,
+
+     1345, 1350, 3197, 1345, 1352, 1352, 1352, 1352, 1352, 1352,
+     1352, 1352, 1352, 1356, 1356, 1356, 3198, 3199, 1685, 1700,
+     1700, 1700, 1354, 1701, 3200, 1354, 1702, 3201, 1354, 3202,
+     1357, 1360, 1360, 1360, 1705, 1705, 1705, 3203, 1706, 1696,
+     3204, 1707, 1693, 1362, 1362, 1362, 3205, 3206, 1361, 1362,
+     1362, 1362, 1362, 1362, 1362, 1366, 1366, 1366, 3207, 3208,
+     1699, 1364, 1709, 1709, 1709, 3209, 1710, 1364, 3210, 1711,
+     1364, 3211, 1367, 1368, 1368, 1368, 1712, 1712, 1712, 3212,
+     1713, 3213, 3214, 1714, 1370, 1370, 1370, 1370, 1370, 1370,
+     1369, 1370, 1370, 1370, 1374, 1374, 1374, 1716, 1716, 1716,
+
+     3215, 1717, 1372, 3216, 1718, 1372, 1378, 1378, 1378, 1372,
+     3230, 1375, 1721, 1721, 1721, 1708, 1722, 3231, 3232, 1723,
+     1380, 1380, 1380, 1379, 1380, 1380, 1380, 1380, 1380, 1380,
+     1384, 1384, 1384, 3233, 1385, 3234, 3235, 1386, 1382, 1387,
+     1387, 1387, 1382, 1388, 3236, 1382, 1389, 1390, 1390, 1390,
+     3237, 1725, 1725, 1725, 1715, 1726, 3239, 3240, 1727, 1396,
+     1396, 1396, 3241, 3242, 1391, 1396, 1396, 1396, 1396, 1396,
+     1396, 1403, 1403, 1403, 3219, 1404, 3243, 1398, 1405, 1736,
+     1736, 1736, 3221, 1398, 3220, 3244, 1398, 1407, 1407, 1407,
+     1724, 1408, 3222, 3245, 1409, 3246, 1737, 1410, 1410, 1410,
+
+     1738, 1738, 1738, 3247, 1739, 3248, 3249, 1740, 1421, 1421,
+     1421, 1421, 1421, 1421, 1411, 3250, 3261, 1732, 1421, 1421,
+     1421, 1425, 1425, 1425, 3262, 1426, 1423, 3263, 1427, 1423,
+     1428, 1428, 1428, 1428, 1428, 1428, 1423, 1428, 1428, 1428,
+     1755, 1755, 1755, 1435, 1435, 1435, 3251, 1436, 1430, 3264,
+     1437, 1430, 1441, 1441, 1441, 1430, 3252, 1756, 1441, 1441,
+     1441, 1441, 1441, 1441, 1762, 1762, 1762, 1447, 1447, 1447,
+     1443, 1448, 3253, 1261, 1449, 3265, 1443, 3266, 3267, 1443,
+     3268, 1763, 3254, 1450, 1450, 1450, 1751, 1451, 3270, 3273,
+     1452, 1453, 1453, 1453, 1453, 1453, 1453, 3275, 1752, 1453,
+
+     1453, 1453, 1765, 1765, 1765, 1458, 1458, 1458, 3255, 1455,
+     3276, 3277, 1455, 1458, 1458, 1458, 3278, 1455, 3279, 1766,
+     1458, 1458, 1458, 1460, 1470, 1470, 1470, 1760, 1464, 1464,
+     1464, 1460, 1465, 3280, 3281, 1466, 3282, 3285, 1460, 1470,
+     1470, 1470, 1472, 1470, 1470, 1470, 1475, 1475, 1475, 3288,
+     1476, 3289, 3290, 1477, 1478, 1478, 1478, 1472, 1478, 1478,
+     1478, 1472, 1478, 1478, 1478, 1764, 3291, 1482, 1482, 1482,
+     1767, 1483, 1480, 3292, 1484, 3293, 1480, 1486, 1486, 1486,
+     1480, 1486, 1486, 1486, 1486, 1486, 1486, 3294, 1778, 1778,
+     1778, 3905, 3905, 3905, 3295, 1488, 1492, 1492, 1492, 1488,
+
+     3296, 3297, 1488, 3302, 1773, 1779, 3303, 3304, 3905, 1492,
+     1492, 1492, 3305, 3306, 1494, 1492, 1492, 1492, 1500, 1500,
+     1500, 3307, 1501, 1775, 3308, 1502, 3309, 1494, 1503, 1503,
+     1503, 3310, 3311, 1494, 3312, 1777, 1786, 1786, 1786, 1780,
+     1787, 3313, 3314, 1788, 3315, 1504, 1507, 1507, 1507, 1507,
+     1507, 1507, 1507, 1507, 1507, 1513, 1513, 1513, 1513, 1513,
+     1513, 1513, 1513, 1513, 1509, 3316, 3317, 1509, 3318, 3322,
+     1509, 3323, 3324, 1515, 3325, 3328, 1515, 3329, 3330, 1515,
+     1800, 1800, 1800, 1781, 1526, 1526, 1526, 1526, 1526, 1526,
+     1526, 1526, 1526, 3331, 1530, 1530, 1530, 1801, 1531, 3332,
+
+     3333, 1532, 1528, 3335, 1791, 1528, 3336, 3337, 1528, 1794,
+     1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1539,
+     1539, 1539, 3338, 1540, 2621, 2622, 1541, 2623, 1536, 3339,
+     3340, 1536, 3341, 3342, 1536, 2624, 1542, 1542, 1542, 1809,
+     1809, 1809, 2625, 1810, 3343, 3344, 1811, 1812, 1812, 1812,
+     3345, 3346, 1805, 1543, 1545, 1545, 1545, 3353, 1814, 1814,
+     1814, 1261, 1815, 3354, 1813, 1816, 1818, 1818, 1818, 3355,
+     3356, 1546, 1550, 1550, 1550, 1550, 1550, 1550, 1807, 1550,
+     1550, 1550, 3357, 1819, 1554, 1554, 1554, 1822, 1822, 1822,
+     1552, 1823, 3358, 1552, 1824, 3359, 3360, 1552, 1556, 1556,
+
+     1556, 1555, 1825, 1825, 1825, 3347, 1826, 3361, 3362, 1827,
+     1559, 1559, 1559, 3363, 3364, 1557, 1559, 1559, 1559, 1559,
+     1559, 1559, 1564, 1564, 1564, 3365, 1565, 3366, 1561, 1566,
+     1567, 1567, 1567, 3367, 1561, 3368, 3372, 1561, 3378, 3379,
+     1821, 1567, 1567, 1567, 1567, 1567, 1567, 3380, 1569, 1573,
+     1573, 1573, 3381, 1574, 3382, 3383, 1575, 3384, 3391, 1569,
+     3392, 3393, 1569, 1577, 1577, 1577, 1577, 1577, 1577, 3394,
+     1577, 1577, 1577, 1582, 1582, 1582, 3395, 1583, 3396, 3397,
+     1584, 1579, 3398, 3399, 1579, 3400, 3401, 1829, 1579, 1838,
+     1838, 1838, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587,
+
+     1587, 1842, 1842, 1842, 3402, 3403, 1839, 1593, 1593, 1593,
+     1589, 1594, 1831, 1589, 1595, 3404, 1589, 3405, 1843, 3905,
+     3905, 3905, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598,
+     1598, 3406, 1835, 1848, 1848, 1848, 3905, 1605, 1605, 1605,
+     1600, 3407, 3408, 1600, 3409, 3410, 1600, 1605, 1605, 1605,
+     1849, 1605, 1605, 1605, 3411, 1607, 3412, 1609, 1609, 1609,
+     1840, 1610, 3413, 3414, 1611, 1607, 1613, 1613, 1613, 1607,
+     1613, 1613, 1613, 1613, 1613, 1613, 1846, 1617, 1617, 1617,
+     3415, 1844, 3416, 3417, 1615, 1854, 1854, 1854, 1615, 1855,
+     3420, 1615, 1856, 3421, 1618, 1621, 1621, 1621, 3422, 1851,
+
+     1859, 1859, 1859, 3423, 1860, 3424, 3425, 1861, 1624, 1624,
+     1624, 3426, 1622, 1624, 1624, 1624, 3427, 1624, 1624, 1624,
+     1866, 1866, 1866, 1635, 1635, 1635, 1626, 1327, 1327, 1327,
+     3428, 1626, 3429, 3441, 1853, 1626, 3442, 3432, 1867, 1868,
+     3447, 1636, 1676, 1676, 1676, 1329, 1677, 1261, 3435, 1678,
+     1681, 1681, 1681, 3432, 1682, 3448, 3451, 1683, 1688, 1688,
+     1688, 1921, 1921, 1921, 3452, 1922, 3453, 3433, 1923, 1337,
+     1337, 1337, 1343, 1343, 1343, 1689, 3454, 3456, 1863, 1929,
+     1929, 1929, 3464, 1352, 1352, 1352, 3465, 1339, 3457, 1918,
+     1345, 1700, 1700, 1700, 3430, 1701, 1930, 3466, 1702, 3467,
+
+     3458, 1354, 1705, 1705, 1705, 3468, 1706, 3459, 3473, 1707,
+     1362, 1362, 1362, 1709, 1709, 1709, 3474, 1710, 3469, 3460,
+     1711, 3475, 1712, 1712, 1712, 3476, 1713, 3477, 1364, 1714,
+     3470, 1927, 1370, 1370, 1370, 1716, 1716, 1716, 3478, 1717,
+     1931, 1934, 1718, 3479, 1721, 1721, 1721, 3480, 1722, 3471,
+     1372, 1723, 1380, 1380, 1380, 1725, 1725, 1725, 1937, 1726,
+     3481, 3472, 1727, 3482, 1944, 1944, 1944, 1396, 1396, 1396,
+     1382, 1948, 1948, 1948, 3905, 3905, 3905, 3905, 3905, 3905,
+     1938, 1945, 1736, 1736, 1736, 1398, 3483, 3484, 1949, 3485,
+     3490, 3905, 3491, 3496, 3905, 3905, 3905, 3905, 3497, 1737,
+
+     1941, 1952, 1952, 1952, 3498, 1953, 3499, 3502, 1954, 1738,
+     1738, 1738, 3905, 1739, 3437, 3502, 1740, 3905, 3905, 3905,
+     3905, 3905, 3905, 1947, 3505, 1951, 3905, 3905, 3905, 3905,
+     3905, 3905, 3506, 3438, 3905, 3439, 3507, 3905, 3905, 3905,
+     3905, 1950, 1261, 3905, 1867, 1868, 3905, 1955, 3440, 1961,
+     1961, 1961, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 1421, 1421, 1421, 1956, 1962, 3510, 3508, 3905,
+     1755, 1755, 1755, 3905, 1958, 3432, 3905, 1428, 1428, 1428,
+     1423, 1970, 1970, 1970, 3500, 1971, 3509, 1756, 1972, 3433,
+     3511, 1957, 3512, 3515, 1959, 1430, 1974, 1974, 1974, 1960,
+
+     1441, 1441, 1441, 1762, 1762, 1762, 3516, 1979, 1979, 1979,
+     3521, 1980, 3523, 1975, 1981, 1453, 1453, 1453, 1443, 1964,
+     1763, 1965, 3526, 1963, 1765, 1765, 1765, 3432, 1966, 3522,
+     1967, 3527, 3528, 1455, 3513, 1983, 1983, 1983, 3435, 1984,
+     3529, 1766, 1985, 1458, 1458, 1458, 1470, 1470, 1470, 3514,
+     1478, 1478, 1478, 1994, 1994, 1994, 3530, 1486, 1486, 1486,
+     3524, 1460, 3533, 3535, 1472, 3536, 3538, 1977, 1480, 3541,
+     1995, 1778, 1778, 1778, 3542, 1488, 1997, 1997, 1997, 3525,
+     1998, 3534, 1982, 1999, 3537, 1492, 1492, 1492, 1779, 2003,
+     2003, 2003, 1786, 1786, 1786, 3543, 1787, 3544, 3545, 1788,
+
+     3546, 3547, 1986, 1494, 1991, 3548, 2004, 3549, 1993, 1996,
+     2007, 2007, 2007, 1507, 1507, 1507, 1513, 1513, 1513, 1800,
+     1800, 1800, 2019, 2019, 2019, 3552, 2020, 2008, 3553, 2021,
+     3554, 1509, 3550, 3502, 1515, 3558, 1801, 1526, 1526, 1526,
+     2026, 2026, 2026, 1534, 1534, 1534, 2001, 1809, 1809, 1809,
+     3551, 1810, 3555, 3502, 1811, 1528, 3559, 2027, 1812, 1812,
+     1812, 1536, 2030, 2030, 2030, 3560, 2031, 3556, 3561, 2032,
+     1814, 1814, 1814, 3562, 1815, 1813, 3563, 1816, 2010, 1818,
+     1818, 1818, 3564, 2013, 2034, 2034, 2034, 2025, 2035, 3565,
+     3566, 2036, 1550, 1550, 1550, 3567, 1819, 1822, 1822, 1822,
+
+     3568, 1823, 3572, 3573, 1824, 3574, 2028, 1825, 1825, 1825,
+     1552, 1826, 3575, 3576, 1827, 1559, 1559, 1559, 1567, 1567,
+     1567, 1577, 1577, 1577, 2048, 2048, 2048, 1838, 1838, 1838,
+     2050, 2050, 2050, 1561, 2051, 3577, 1569, 2052, 3578, 1579,
+     3579, 2049, 3580, 2038, 1839, 1587, 1587, 1587, 1842, 1842,
+     1842, 2055, 2055, 2055, 3581, 2056, 3585, 3586, 2057, 1598,
+     1598, 1598, 3587, 1589, 3588, 1843, 1848, 1848, 1848, 2062,
+     2062, 2062, 3589, 2063, 3590, 3594, 2064, 1600, 2065, 2065,
+     2065, 3595, 2040, 1849, 3596, 2042, 2046, 1605, 1605, 1605,
+     1613, 1613, 1613, 3597, 3598, 2066, 1854, 1854, 1854, 3599,
+
+     1855, 3600, 3601, 1856, 3602, 1607, 3603, 3604, 1615, 2060,
+     2053, 1859, 1859, 1859, 3605, 1860, 3606, 3607, 1861, 3609,
+     1624, 1624, 1624, 1866, 1866, 1866, 2111, 2111, 2111, 2095,
+     2095, 2095, 2108, 2108, 2108, 3610, 3611, 2067, 1626, 3612,
+     3613, 1867, 2069, 2114, 2114, 2114, 2116, 2116, 2116, 3905,
+     3905, 3905, 1327, 1327, 1327, 1921, 1921, 1921, 3614, 1922,
+     2115, 3615, 1923, 2117, 3616, 3617, 3905, 1337, 1337, 1337,
+     1329, 3618, 2073, 2112, 3619, 2075, 1929, 1929, 1929, 2127,
+     2127, 2127, 3624, 2128, 3620, 1339, 2129, 1343, 1343, 1343,
+     3625, 3626, 2076, 1930, 2109, 3627, 3621, 2096, 3628, 1352,
+
+     1352, 1352, 2134, 2134, 2134, 1345, 2136, 2136, 2136, 1362,
+     1362, 1362, 3629, 3630, 2118, 3631, 3632, 1354, 3633, 2135,
+     2119, 3634, 3635, 2137, 1370, 1370, 1370, 1364, 2140, 2140,
+     2140, 3622, 2125, 2142, 2142, 2142, 1380, 1380, 1380, 2145,
+     2145, 2145, 1372, 3623, 3636, 2141, 3637, 2130, 2133, 3638,
+     2143, 3905, 3905, 3905, 1382, 3639, 2146, 1944, 1944, 1944,
+     2148, 2148, 2148, 3640, 2149, 3641, 3642, 2150, 3905, 2151,
+     2151, 2151, 3643, 3644, 1945, 2138, 1396, 1396, 1396, 1948,
+     1948, 1948, 2157, 2157, 2157, 3645, 2152, 3905, 3905, 3905,
+     2139, 2154, 2154, 2154, 1398, 2155, 1949, 3646, 2156, 2158,
+
+     3647, 3648, 2144, 3649, 3905, 1952, 1952, 1952, 3651, 1953,
+     2147, 3652, 1954, 3905, 3905, 3905, 3905, 3905, 3905, 2162,
+     2162, 2162, 3905, 3905, 3905, 3905, 3905, 3905, 3653, 1261,
+     3905, 3654, 3655, 3905, 3656, 3657, 2163, 2153, 3658, 3905,
+     3659, 3660, 3905, 3905, 3905, 3905, 1961, 1961, 1961, 2167,
+     2167, 2167, 2159, 2168, 3650, 3661, 2169, 2170, 2170, 2170,
+     3905, 3662, 3663, 1962, 3664, 3665, 2161, 3905, 3905, 3905,
+     3666, 3667, 2165, 3668, 2171, 3905, 3905, 3905, 2160, 3669,
+     3670, 2164, 3671, 3672, 3905, 1421, 1421, 1421, 1428, 1428,
+     1428, 3673, 3905, 3674, 1970, 1970, 1970, 2166, 1971, 3675,
+
+     3676, 1972, 3677, 1423, 3678, 3679, 1430, 2178, 2178, 2178,
+     1974, 1974, 1974, 3680, 3681, 2172, 2180, 2180, 2180, 3682,
+     2181, 3683, 3684, 2182, 2179, 3686, 3687, 1975, 3688, 2173,
+     2184, 2184, 2184, 1979, 1979, 1979, 1261, 1980, 3689, 3690,
+     1981, 1453, 1453, 1453, 2175, 1458, 1458, 1458, 2185, 1983,
+     1983, 1983, 2174, 1984, 3691, 3685, 1985, 3692, 3693, 1455,
+     2193, 2193, 2193, 1460, 1478, 1478, 1478, 1994, 1994, 1994,
+     2197, 2197, 2197, 3694, 2198, 3443, 3695, 2199, 2194, 1486,
+     1486, 1486, 1480, 3696, 1995, 1997, 1997, 1997, 2187, 1998,
+     3697, 3444, 1999, 3445, 1492, 1492, 1492, 1488, 2003, 2003,
+
+     2003, 2204, 2204, 2204, 3698, 2205, 3446, 3699, 2206, 3700,
+     3701, 2196, 1494, 2188, 3702, 2004, 2207, 2207, 2207, 2007,
+     2007, 2007, 2210, 2210, 2210, 3703, 2211, 3704, 3705, 2212,
+     2214, 2214, 2214, 2208, 3706, 3707, 2008, 3708, 2200, 1513,
+     1513, 1513, 2219, 2219, 2219, 2019, 2019, 2019, 2215, 2020,
+     3709, 3710, 2021, 1526, 1526, 1526, 3711, 1515, 2026, 2026,
+     2026, 2202, 2228, 2228, 2228, 3712, 2229, 3713, 3714, 2230,
+     3715, 1528, 2231, 2231, 2231, 2027, 2030, 2030, 2030, 3716,
+     2031, 3717, 3719, 2032, 2034, 2034, 2034, 3720, 2035, 1261,
+     2232, 2036, 2218, 1550, 1550, 1550, 1559, 1559, 1559, 1567,
+
+     1567, 1567, 2241, 2241, 2241, 2227, 3905, 3905, 3905, 3718,
+     3721, 1552, 3722, 3723, 1561, 3486, 3724, 1569, 3725, 2242,
+     2244, 2244, 2244, 3905, 1577, 1577, 1577, 2048, 2048, 2048,
+     3726, 2248, 2248, 2248, 3487, 2249, 3488, 2245, 2250, 2050,
+     2050, 2050, 1579, 2051, 2049, 3727, 2052, 3728, 2238, 3489,
+     3729, 2240, 1587, 1587, 1587, 2236, 2055, 2055, 2055, 3730,
+     2056, 3731, 3732, 2057, 1598, 1598, 1598, 2062, 2062, 2062,
+     1589, 2063, 2246, 2243, 2064, 2065, 2065, 2065, 3733, 2265,
+     2265, 2265, 1600, 2266, 3734, 3735, 2267, 1605, 1605, 1605,
+     3736, 3737, 2066, 2270, 2270, 2270, 2272, 2272, 2272, 3738,
+
+     2251, 2274, 2274, 2274, 3739, 1607, 3905, 3905, 3905, 3740,
+     3741, 2271, 3742, 2273, 3743, 3744, 2255, 3745, 2275, 1624,
+     1624, 1624, 3746, 3905, 2281, 2281, 2281, 2080, 2080, 2080,
+     2291, 2291, 2291, 2091, 2091, 2091, 3748, 1626, 3749, 2268,
+     3750, 2282, 2298, 2298, 2298, 2095, 2095, 2095, 2299, 2299,
+     2299, 2098, 2098, 2098, 3751, 2277, 2108, 2108, 2108, 2312,
+     2312, 2312, 2111, 2111, 2111, 2114, 2114, 2114, 2316, 2316,
+     2316, 2276, 2317, 3752, 3753, 2318, 2116, 2116, 2116, 2319,
+     2319, 2319, 2115, 2320, 3754, 3755, 2321, 1327, 1327, 1327,
+     2329, 2329, 2329, 2117, 2127, 2127, 2127, 3756, 2128, 3757,
+
+     1261, 2129, 2334, 2334, 2334, 1329, 3747, 3758, 2330, 1343,
+     1343, 1343, 1352, 1352, 1352, 2134, 2134, 2134, 3759, 2335,
+     3760, 2337, 2337, 2337, 3761, 2338, 3762, 1345, 2339, 3763,
+     1354, 3764, 2135, 2136, 2136, 2136, 2340, 2340, 2340, 3765,
+     2341, 3766, 3767, 2342, 1362, 1362, 1362, 1370, 1370, 1370,
+     2137, 2140, 2140, 2140, 2323, 3769, 2345, 2345, 2345, 1261,
+     2346, 2332, 1364, 2347, 3770, 1372, 3771, 3772, 2141, 2142,
+     2142, 2142, 3773, 3768, 2336, 2348, 2348, 2348, 3774, 2349,
+     3775, 3776, 2350, 1380, 1380, 1380, 2143, 2145, 2145, 2145,
+     2352, 2352, 2352, 3777, 2353, 3778, 3779, 2354, 2355, 2355,
+
+     2355, 1382, 3780, 3782, 2146, 2148, 2148, 2148, 3783, 2149,
+     2343, 3784, 2150, 2344, 3785, 2356, 2151, 2151, 2151, 2357,
+     2357, 2357, 3786, 2358, 3787, 3788, 2359, 1396, 1396, 1396,
+     2154, 2154, 2154, 2152, 2155, 3789, 3790, 2156, 2157, 2157,
+     2157, 2162, 2162, 2162, 3791, 1398, 2361, 2361, 2361, 2351,
+     2362, 3792, 3793, 2363, 3796, 2158, 3797, 3492, 2163, 2367,
+     2367, 2367, 3798, 2368, 3799, 3800, 2369, 2370, 2370, 2370,
+     2167, 2167, 2167, 3493, 2168, 3494, 3801, 2169, 1792, 2360,
+     2170, 2170, 2170, 3812, 2371, 2374, 2374, 2374, 3495, 2375,
+     1261, 1261, 2376, 1421, 1421, 1421, 3813, 2171, 1428, 1428,
+
+     1428, 2178, 2178, 2178, 1261, 2383, 2383, 2383, 1261, 2384,
+     1261, 1423, 2385, 2180, 2180, 2180, 1430, 2181, 2179, 1261,
+     2182, 2184, 2184, 2184, 2186, 2186, 2186, 3802, 1453, 1453,
+     1453, 1458, 1458, 1458, 2390, 2390, 2390, 1261, 1790, 2185,
+     2193, 2193, 2193, 1261, 1789, 2379, 1455, 3803, 1261, 1460,
+     1261, 2391, 2380, 1478, 1478, 1478, 1261, 3804, 2194, 2197,
+     2197, 2197, 3814, 2198, 3808, 1261, 2199, 1486, 1486, 1486,
+     1261, 1480, 2399, 2399, 2399, 3810, 2204, 2204, 2204, 1261,
+     2205, 2392, 2388, 2206, 1785, 1488, 3805, 2387, 3809, 3828,
+     2400, 2207, 2207, 2207, 2402, 2402, 2402, 3806, 2403, 3807,
+
+     3811, 2404, 3815, 2396, 1261, 2210, 2210, 2210, 2208, 2211,
+     1261, 1261, 2212, 3816, 2397, 2214, 2214, 2214, 2408, 2408,
+     2408, 1513, 1513, 1513, 2219, 2219, 2219, 2411, 2411, 2411,
+     2413, 2413, 2413, 2215, 1261, 2409, 1526, 1526, 1526, 1515,
+     2228, 2228, 2228, 1261, 2229, 1261, 3834, 2230, 2231, 2231,
+     2231, 2420, 2420, 2420, 1528, 1550, 1550, 1550, 2425, 2425,
+     2425, 1567, 1567, 1567, 1261, 1261, 2232, 1261, 2421, 2241,
+     2241, 2241, 3818, 1552, 1261, 3854, 2426, 1261, 1261, 1569,
+     2429, 2429, 2429, 2410, 2430, 3820, 2242, 2431, 2432, 2432,
+     2432, 2244, 2244, 2244, 2435, 2435, 2435, 1261, 2436, 1261,
+
+     3829, 2437, 2418, 3819, 1784, 2433, 3821, 1261, 2245, 1577,
+     1577, 1577, 2439, 2439, 2439, 2423, 2248, 2248, 2248, 1261,
+     2249, 1261, 3817, 2250, 3824, 3825, 2428, 1579, 1783, 2440,
+     1587, 1587, 1587, 3822, 3835, 2434, 2446, 2446, 2446, 2448,
+     2448, 2448, 2265, 2265, 2265, 3826, 2266, 1261, 1589, 2267,
+     1605, 1605, 1605, 1261, 2447, 3823, 2449, 3832, 3830, 2441,
+     2461, 2461, 2461, 2438, 2270, 2270, 2270, 1261, 1607, 2272,
+     2272, 2272, 2463, 2463, 2463, 1261, 2464, 2462, 1261, 2465,
+     1261, 3831, 2271, 1261, 2442, 3827, 2273, 2274, 2274, 2274,
+     1261, 2466, 2466, 2466, 3844, 2467, 3848, 2460, 2468, 1624,
+
+     1624, 1624, 1782, 1261, 2275, 2281, 2281, 2281, 2474, 2474,
+     2474, 3833, 2475, 3876, 3840, 2476, 1261, 1626, 2477, 2477,
+     2477, 3846, 2282, 2483, 2483, 2483, 2484, 2484, 2484, 2291,
+     2291, 2291, 2486, 2486, 2486, 2490, 2490, 2490, 2298, 2298,
+     2298, 2299, 2299, 2299, 2491, 2491, 2491, 2495, 2495, 2495,
+     2500, 2500, 2500, 2501, 2501, 2501, 2503, 2503, 2503, 1261,
+     3836, 2470, 2312, 2312, 2312, 2504, 2504, 2504, 2316, 2316,
+     2316, 1261, 2317, 1776, 1261, 2318, 2319, 2319, 2319, 3902,
+     2320, 1261, 1261, 2321, 1327, 1327, 1327, 2511, 2511, 2511,
+     1261, 2492, 3905, 3905, 3905, 1261, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 1329, 3837, 2512, 2329, 2329, 2329, 1261, 3905,
+     3841, 1261, 2505, 3905, 3849, 3842, 3905, 1343, 1343, 1343,
+     2334, 2334, 2334, 2330, 2519, 2519, 2519, 1261, 2520, 3838,
+     1261, 2521, 1352, 1352, 1352, 1345, 2509, 2335, 2337, 2337,
+     2337, 1261, 2338, 3864, 2513, 2339, 3847, 2340, 2340, 2340,
+     1354, 2341, 1261, 1261, 2342, 1362, 1362, 1362, 3839, 2515,
+     1774, 2514, 1370, 1370, 1370, 2345, 2345, 2345, 3852, 2346,
+     1772, 3855, 2347, 1364, 3850, 2523, 2626, 2627, 2517, 2628,
+     1372, 2348, 2348, 2348, 1261, 2349, 3843, 2629, 2350, 1380,
+     1380, 1380, 3845, 2522, 2630, 2352, 2352, 2352, 2524, 2353,
+
+     3851, 1261, 2354, 2355, 2355, 2355, 1261, 1382, 2526, 2526,
+     2526, 1771, 2527, 1770, 3856, 2528, 1261, 2357, 2357, 2357,
+     2356, 2358, 3853, 1261, 2359, 1396, 1396, 1396, 2361, 2361,
+     2361, 3857, 2362, 2525, 3862, 2363, 1769, 2367, 2367, 2367,
+     1261, 2368, 1261, 1398, 2369, 2370, 2370, 2370, 2533, 2533,
+     2533, 3858, 2534, 3860, 1261, 2535, 2374, 2374, 2374, 1261,
+     2375, 1261, 2371, 2376, 2539, 2539, 2539, 1421, 1421, 1421,
+     2542, 2542, 2542, 2383, 2383, 2383, 1261, 2384, 3863, 1261,
+     2385, 2540, 1453, 1453, 1453, 1423, 1261, 1261, 2543, 1458,
+     1458, 1458, 2529, 2390, 2390, 2390, 3859, 2550, 2550, 2550,
+
+     1455, 2551, 3865, 1261, 2552, 1768, 3861, 1460, 1261, 1261,
+     2391, 1478, 1478, 1478, 3866, 3870, 1486, 1486, 1486, 2399,
+     2399, 2399, 1761, 2402, 2402, 2402, 1759, 2403, 3878, 1480,
+     2404, 1261, 2541, 1758, 1488, 3880, 1261, 2400, 2547, 3871,
+     1261, 2548, 2408, 2408, 2408, 2564, 2564, 2564, 1261, 2565,
+     3868, 3869, 2566, 1513, 1513, 1513, 2411, 2411, 2411, 2409,
+     2568, 2568, 2568, 2413, 2413, 2413, 2569, 2569, 2569, 3867,
+     1261, 1515, 3905, 3905, 3905, 3905, 3905, 3905, 2557, 2558,
+     1526, 1526, 1526, 2570, 3905, 3905, 3905, 3872, 3879, 3905,
+     1261, 1261, 3905, 2420, 2420, 2420, 1261, 3898, 1528, 3894,
+
+     1261, 3905, 2576, 2576, 2576, 1261, 2577, 1261, 1261, 2578,
+     2421, 2580, 2580, 2580, 2425, 2425, 2425, 3873, 2567, 2584,
+     2584, 2584, 1261, 3877, 2571, 1757, 2429, 2429, 2429, 2581,
+     2430, 1261, 2426, 2431, 2432, 2432, 2432, 2585, 3874, 3881,
+     2572, 2586, 2586, 2586, 2573, 2587, 2574, 3884, 2588, 3885,
+     1754, 2433, 2435, 2435, 2435, 1261, 2436, 1261, 3886, 2437,
+     1577, 1577, 1577, 2439, 2439, 2439, 2591, 2591, 2591, 3875,
+     2592, 1753, 1261, 2593, 1587, 1587, 1587, 1261, 1579, 1261,
+     2440, 2446, 2446, 2446, 2448, 2448, 2448, 2599, 2599, 2599,
+     3892, 2600, 1589, 3882, 2601, 1605, 1605, 1605, 1748, 2447,
+
+     1261, 2449, 2461, 2461, 2461, 1747, 1746, 2613, 2613, 2613,
+     3883, 2614, 2590, 1607, 2615, 3887, 2463, 2463, 2463, 2462,
+     2464, 1261, 1261, 2465, 3888, 1745, 2595, 2466, 2466, 2466,
+     1744, 2467, 3895, 1743, 2468, 1624, 1624, 1624, 2618, 2618,
+     2618, 1261, 2474, 2474, 2474, 2612, 2475, 3889, 1742, 2476,
+     2477, 2477, 2477, 1626, 3893, 3896, 1261, 2631, 2631, 2631,
+     2632, 2632, 2632, 2483, 2483, 2483, 2484, 2484, 2484, 2486,
+     2486, 2486, 2637, 2637, 2637, 2639, 2639, 2639, 2490, 2490,
+     2490, 2491, 2491, 2491, 2495, 2495, 2495, 2643, 2643, 2643,
+     2500, 2500, 2500, 2501, 2501, 2501, 2503, 2503, 2503, 2504,
+
+     2504, 2504, 1741, 2617, 2652, 2652, 2652, 2654, 2654, 2654,
+     2511, 2511, 2511, 2655, 2655, 2655, 1261, 2656, 1735, 1261,
+     2657, 1734, 2653, 2658, 2658, 2658, 1261, 2512, 3905, 3905,
+     3905, 3905, 3905, 3905, 2662, 2662, 2662, 1343, 1343, 1343,
+     2659, 2664, 2664, 2664, 1733, 3905, 1731, 1730, 3905, 2519,
+     2519, 2519, 1261, 2520, 3890, 1345, 2521, 3891, 2665, 1352,
+     1352, 1352, 1729, 1362, 1362, 1362, 1370, 1370, 1370, 1380,
+     1380, 1380, 2526, 2526, 2526, 3899, 2527, 1354, 1728, 2528,
+     2660, 1364, 1261, 2661, 1372, 3897, 1720, 1382, 2670, 2670,
+     2670, 2533, 2533, 2533, 1719, 2534, 1261, 1704, 2535, 1703,
+
+     2667, 2676, 2676, 2676, 2663, 1698, 2671, 2539, 2539, 2539,
+     1697, 2666, 2680, 2680, 2680, 3900, 2681, 1695, 2677, 2682,
+     2683, 2683, 2683, 1694, 2540, 2542, 2542, 2542, 2668, 3901,
+     1692, 2669, 1453, 1453, 1453, 2689, 2689, 2689, 2684, 2691,
+     2691, 2691, 1691, 2543, 2550, 2550, 2550, 1690, 2551, 1687,
+     1455, 2552, 1686, 2690, 1684, 1680, 2692, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 2697, 2697, 2697, 1478,
+     1478, 1478, 1679, 1675, 3905, 1674, 1673, 3905, 3902, 1672,
+     3905, 1671, 1670, 2698, 1669, 1668, 2693, 1480, 1486, 1486,
+     1486, 1667, 1261, 2688, 2701, 2701, 2701, 2706, 2706, 2706,
+
+     2564, 2564, 2564, 1666, 2565, 1665, 1488, 2566, 1513, 1513,
+     1513, 2702, 1664, 2694, 1663, 2696, 2568, 2568, 2568, 2569,
+     2569, 2569, 2695, 2711, 2711, 2711, 1515, 2708, 2708, 2708,
+     2699, 2709, 1662, 1661, 2710, 1660, 2570, 3905, 3905, 3905,
+     2712, 3905, 3905, 3905, 2715, 2715, 2715, 2717, 2717, 2717,
+     3905, 3905, 3905, 2700, 3905, 2580, 2580, 2580, 3905, 2576,
+     2576, 2576, 2716, 2577, 2718, 1658, 2578, 3905, 2707, 2584,
+     2584, 2584, 1657, 2581, 2586, 2586, 2586, 1656, 2587, 1655,
+     1654, 2588, 2723, 2723, 2723, 1651, 1650, 2585, 1649, 2713,
+     2591, 2591, 2591, 2714, 2592, 1648, 1647, 2593, 1646, 1645,
+
+     2724, 1587, 1587, 1587, 2599, 2599, 2599, 1644, 2600, 1643,
+     1642, 2601, 1605, 1605, 1605, 2740, 2741, 2719, 2742, 1589,
+     2613, 2613, 2613, 1641, 2614, 1640, 2743, 2615, 2745, 2746,
+     1607, 2747, 1639, 2744, 1624, 1624, 1624, 1638, 1637, 2748,
+     2618, 2618, 2618, 2631, 2631, 2631, 2749, 1634, 2726, 2632,
+     2632, 2632, 1626, 2770, 2770, 2770, 1633, 1632, 1261, 2637,
+     2637, 2637, 2639, 2639, 2639, 2774, 2774, 2774, 2643, 2643,
+     2643, 2778, 2778, 2778, 2739, 2781, 2781, 2781, 2652, 2652,
+     2652, 2654, 2654, 2654, 2655, 2655, 2655, 1631, 2656, 1630,
+     1629, 2657, 2658, 2658, 2658, 1261, 2653, 1612, 2783, 2783,
+
+     2783, 2751, 2784, 2752, 1604, 2785, 2786, 2786, 2786, 2659,
+     2788, 2788, 2788, 2662, 2662, 2662, 2790, 2790, 2790, 2664,
+     2664, 2664, 1603, 2787, 2792, 2792, 2792, 2789, 2793, 1602,
+     1597, 2794, 1596, 1592, 2791, 1586, 2665, 2795, 2795, 2795,
+     1362, 1362, 1362, 1370, 1370, 1370, 1380, 1380, 1380, 2670,
+     2670, 2670, 2676, 2676, 2676, 2796, 1585, 1581, 1364, 1576,
+     1572, 1372, 1571, 1563, 1382, 1549, 1548, 2671, 1547, 2677,
+     2804, 2804, 2804, 1544, 2805, 1538, 1533, 2806, 2680, 2680,
+     2680, 1525, 2681, 1524, 1523, 2682, 2683, 2683, 2683, 2817,
+     2817, 2817, 1453, 1453, 1453, 2689, 2689, 2689, 2691, 2691,
+
+     2691, 2831, 2831, 2831, 2684, 2797, 2818, 2799, 1522, 1521,
+     1455, 2798, 1520, 2690, 1519, 2692, 2820, 2820, 2820, 2832,
+     2821, 1518, 1517, 2822, 2826, 2826, 2826, 2697, 2697, 2697,
+     2828, 2828, 2828, 1512, 2829, 1511, 1506, 2830, 1486, 1486,
+     1486, 2827, 1505, 1499, 2698, 2701, 2701, 2701, 1496, 1491,
+     2819, 2834, 2834, 2834, 1490, 2835, 1488, 1485, 2836, 2839,
+     2839, 2839, 2702, 2706, 2706, 2706, 2841, 2841, 2841, 1474,
+     2708, 2708, 2708, 1469, 2709, 1468, 2840, 2710, 2711, 2711,
+     2711, 2843, 2843, 2843, 2842, 2844, 1467, 1463, 2845, 2846,
+     2846, 2846, 2848, 2848, 2848, 2712, 2715, 2715, 2715, 1462,
+
+     2833, 2717, 2717, 2717, 1457, 1446, 2847, 1440, 1439, 2849,
+     2723, 2723, 2723, 1438, 2716, 2850, 2850, 2850, 2718, 2851,
+     1434, 1433, 2852, 1587, 1587, 1587, 1432, 1420, 2724, 1419,
+     1605, 1605, 1605, 1624, 1624, 1624, 2770, 2770, 2770, 1418,
+     1417, 1589, 2904, 2904, 2904, 2774, 2774, 2774, 1607, 1416,
+     1415, 1626, 2778, 2778, 2778, 2781, 2781, 2781, 2912, 2912,
+     2912, 2783, 2783, 2783, 1414, 2784, 1413, 1412, 2785, 2786,
+     2786, 2786, 2914, 2914, 2914, 2913, 2915, 1406, 1351, 2916,
+     2788, 2788, 2788, 1347, 1342, 2885, 2787, 2790, 2790, 2790,
+     2858, 2871, 2917, 2917, 2917, 1341, 2918, 2789, 1336, 2919,
+
+     2792, 2792, 2792, 1335, 2793, 2791, 1334, 2794, 2795, 2795,
+     2795, 1362, 1362, 1362, 1370, 1370, 1370, 1380, 1380, 1380,
+     2925, 2925, 2925, 2804, 2804, 2804, 2796, 2805, 1333, 1364,
+     2806, 1332, 1372, 1331, 1319, 1382, 1318, 2926, 2939, 2939,
+     2939, 2817, 2817, 2817, 2941, 2941, 2941, 1317, 2942, 1316,
+     1315, 2943, 2944, 2944, 2944, 2940, 1314, 1313, 2818, 2820,
+     2820, 2820, 1312, 2821, 1311, 1310, 2822, 1309, 1308, 2922,
+     2945, 1307, 1306, 2920, 2826, 2826, 2826, 1305, 2949, 2949,
+     2949, 2921, 2950, 1302, 1301, 2951, 2828, 2828, 2828, 1300,
+     2829, 2827, 1299, 2830, 2831, 2831, 2831, 1486, 1486, 1486,
+
+     2834, 2834, 2834, 1298, 2835, 1297, 1296, 2836, 2960, 2960,
+     2960, 1295, 2832, 1294, 1291, 1488, 2839, 2839, 2839, 2962,
+     2962, 2962, 1290, 2963, 1289, 2961, 2964, 2841, 2841, 2841,
+     2843, 2843, 2843, 2840, 2844, 1288, 1287, 2845, 2846, 2846,
+     2846, 1286, 2965, 2965, 2965, 2842, 2966, 1285, 1284, 2967,
+     2848, 2848, 2848, 1283, 1282, 2847, 1275, 2968, 2968, 2968,
+     2958, 2969, 1271, 1270, 2970, 1269, 1268, 2849, 2850, 2850,
+     2850, 1267, 2851, 1264, 1262, 2852, 2978, 2978, 2978, 2980,
+     2980, 2980, 1587, 1587, 1587, 2985, 2985, 2985, 2986, 2986,
+     2986, 1261, 1259, 2979, 1257, 1256, 2981, 1605, 1605, 1605,
+
+     1589, 3011, 3011, 3011, 1255, 2987, 3013, 3013, 3013, 3031,
+     3031, 3031, 2904, 2904, 2904, 1607, 1254, 1253, 3012, 3036,
+     3036, 3036, 1251, 1248, 3014, 2912, 2912, 2912, 3040, 3040,
+     3040, 1246, 3041, 1245, 1244, 3042, 2914, 2914, 2914, 1243,
+     2915, 1242, 2913, 2916, 2917, 2917, 2917, 1239, 2918, 1236,
+     1235, 2919, 1234, 1232, 2984, 1362, 1362, 1362, 2998, 1370,
+     1370, 1370, 1380, 1380, 1380, 3051, 3051, 3051, 2925, 2925,
+     2925, 1231, 1228, 1364, 3053, 3053, 3053, 1372, 3054, 1227,
+     1382, 3055, 3052, 1225, 1222, 2926, 3056, 3056, 3056, 2939,
+     2939, 2939, 3069, 3069, 3069, 1221, 3070, 1220, 3049, 3071,
+
+     2941, 2941, 2941, 3057, 2942, 1216, 2940, 2943, 2944, 2944,
+     2944, 3048, 3073, 3073, 3073, 2949, 2949, 2949, 1215, 2950,
+     1213, 1212, 2951, 3047, 1211, 1210, 2945, 1208, 1207, 3074,
+     3082, 3082, 3082, 2960, 2960, 2960, 3085, 3085, 3085, 1206,
+     3086, 1205, 1204, 3087, 1203, 2962, 2962, 2962, 3083, 2963,
+     2961, 1200, 2964, 2965, 2965, 2965, 1199, 2966, 1197, 1194,
+     2967, 2968, 2968, 2968, 1192, 2969, 1191, 1190, 2970, 2978,
+     2978, 2978, 3101, 3101, 3101, 1189, 3102, 1188, 1183, 3103,
+     2980, 2980, 2980, 3104, 3104, 3104, 2979, 3105, 1181, 1180,
+     3106, 3107, 3107, 3107, 3109, 3109, 3109, 2981, 1587, 1587,
+
+     1587, 2985, 2985, 2985, 2986, 2986, 2986, 1179, 3108, 1177,
+     1176, 3110, 1175, 3112, 3112, 3112, 1589, 3113, 1172, 1171,
+     3114, 2987, 1605, 1605, 1605, 3011, 3011, 3011, 3136, 3136,
+     3136, 1170, 3137, 1169, 1167, 3138, 3013, 3013, 3013, 1166,
+     1607, 1165, 3012, 1163, 1160, 3141, 3141, 3141, 3031, 3031,
+     3031, 3157, 3157, 3157, 3014, 3036, 3036, 3036, 3161, 3161,
+     3161, 3111, 3142, 1867, 3040, 3040, 3040, 1156, 3041, 1155,
+     1153, 3042, 1152, 1151, 3123, 1362, 1362, 1362, 3172, 3172,
+     3172, 1380, 1380, 1380, 3051, 3051, 3051, 3176, 3176, 3176,
+     1148, 3177, 1147, 1364, 3178, 1146, 3173, 1145, 1143, 1382,
+
+     1142, 3052, 3053, 3053, 3053, 1136, 3054, 1135, 1134, 3055,
+     3056, 3056, 3056, 3179, 3179, 3179, 1132, 3180, 1131, 1130,
+     3181, 3069, 3069, 3069, 1125, 3070, 1124, 3057, 3071, 3073,
+     3073, 3073, 3194, 3194, 3194, 1120, 3195, 1118, 1117, 3196,
+     1116, 1115, 3171, 3174, 1114, 1113, 3074, 3082, 3082, 3082,
+     3085, 3085, 3085, 1112, 3086, 1111, 1110, 3087, 3217, 3217,
+     3217, 1109, 3101, 3101, 3101, 3083, 3102, 1106, 1103, 3103,
+     3104, 3104, 3104, 1102, 3105, 3218, 1100, 3106, 3107, 3107,
+     3107, 3223, 3223, 3223, 1099, 3224, 1098, 1097, 3225, 3109,
+     3109, 3109, 3226, 3226, 3226, 3108, 3227, 1096, 1091, 3228,
+
+     1587, 1587, 1587, 3112, 3112, 3112, 3110, 3113, 1089, 1088,
+     3114, 1605, 1605, 1605, 1087, 3136, 3136, 3136, 1589, 3137,
+     1086, 1084, 3138, 3256, 3256, 3256, 3141, 3141, 3141, 1607,
+     3258, 3258, 3258, 1083, 3259, 1082, 1080, 3260, 1079, 1078,
+     3257, 1867, 1077, 3142, 1867, 3269, 3269, 3269, 1867, 3157,
+     3157, 3157, 3229, 3271, 3271, 3271, 3272, 3272, 3272, 1075,
+     1072, 3238, 3161, 3161, 3161, 3274, 3274, 3274, 1362, 1362,
+     1362, 3172, 3172, 3172, 1380, 1380, 1380, 3176, 3176, 3176,
+     1071, 3177, 1069, 1067, 3178, 1065, 1364, 1064, 1063, 3173,
+     1062, 1061, 1382, 3179, 3179, 3179, 1060, 3180, 1059, 1057,
+
+     3181, 3286, 3286, 3286, 3298, 3298, 3298, 3194, 3194, 3194,
+     1056, 3195, 1055, 1054, 3196, 3300, 3300, 3300, 3287, 1052,
+     3283, 3299, 3217, 3217, 3217, 1050, 3319, 3319, 3319, 1049,
+     3320, 1048, 3301, 3321, 3223, 3223, 3223, 1047, 3224, 3218,
+     1044, 3225, 3284, 3226, 3226, 3226, 1043, 3227, 1042, 1037,
+     3228, 3326, 3326, 3326, 1605, 1605, 1605, 3256, 3256, 3256,
+     3348, 3348, 3348, 1035, 3349, 1034, 1033, 3350, 1027, 3327,
+     1026, 1025, 1607, 1024, 3257, 1867, 1016, 1015, 1867, 3258,
+     3258, 3258, 1013, 3259, 1010, 1009, 3260, 3269, 3269, 3269,
+     3271, 3271, 3271, 3272, 3272, 3272, 1008, 1867, 3274, 3274,
+
+     3274, 3369, 3369, 3369, 3373, 3373, 3373, 1007, 3374, 1002,
+      999, 3375, 1001, 1380, 1380, 1380, 3449, 3449, 3449, 3370,
+      994, 3334, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
+     1865, 1382,  993, 1865, 3286, 3286, 3286,  991, 1865, 1865,
+     1865, 1867, 1865, 3376, 3376, 3376, 3298, 3298, 3298,  762,
+      989, 3287, 3385, 3385, 3385,  988, 3386,  986,  984, 3387,
+     3377,  983,  982, 3299,  980, 3300, 3300, 3300, 1865, 1865,
+     1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,  979,
+     3371, 1865, 3301, 3450, 3450, 3450, 1865, 1865, 1865, 1867,
+     1865, 3388, 3388, 3388,  976, 3389,  975,  974, 3390, 3319,
+
+     3319, 3319,  972, 3320,  971,  969, 3321, 3326, 3326, 3326,
+     3418, 3418, 3418, 3369, 3369, 3369, 1865, 1865,  968, 3348,
+     3348, 3348,  967, 3349,  966, 3327, 3350,  964, 3419,  963,
+      962, 3370,  961, 3376, 3376, 3376,  960, 1867, 1865, 1865,
+     1865, 1865, 1865, 3436, 1865, 1865, 1865,  959,  957, 1865,
+     3377, 3449, 3449, 3449, 1865, 1865, 1865, 1867, 1865, 1380,
+     1380, 1380, 3373, 3373, 3373,  955, 3374,  954,  952, 3375,
+      948, 3461, 3461, 3461,  946, 3462,  942, 1382, 3463,  938,
+     3418, 3418, 3418,  937, 1865, 1865, 1865, 1865, 1865, 1865,
+     1865, 1865, 1865, 1865, 3436,  935,  933, 1865, 3419, 3450,
+
+     3450, 3450, 1865, 1865, 1865, 1867, 1865,  932, 3385, 3385,
+     3385, 3455, 3386,  930,  928, 3387, 3388, 3388, 3388,  927,
+     3389,  926,  925, 3390, 3504, 3504, 3504, 3517, 3517, 3517,
+      924,  922, 1865, 1865, 3519, 3519, 3519, 3461, 3461, 3461,
+      914, 3462, 1867, 1868, 3463, 3518, 3531, 3531, 3531,  912,
+      907, 3520, 3539, 3539, 3539, 3557, 3557, 3557, 3504, 3504,
+     3504,  906,  905, 3532, 3517, 3517, 3517,  904,  903, 3540,
+     3519, 3519, 3519, 1261,  901,  899, 1867, 3569, 3569, 3569,
+      898, 3570, 3518,  896, 3571,  894,  893, 3520, 3531, 3531,
+     3531, 3582, 3582, 3582,  891, 3583,  889,  888, 3584, 3539,
+
+     3539, 3539, 3591, 3591, 3591, 3532, 3592,  886,  885, 3593,
+     2075, 3557, 3557, 3557,  882,  881, 3540, 3569, 3569, 3569,
+      880, 3570,  878, 3905, 3571,  874, 3582, 3582, 3582, 1261,
+     3583,  872,  870, 3584, 3591, 3591, 3591,  869, 3592,  868,
+      866, 3593, 3781, 3781, 3781, 3781, 3781, 3781, 3608, 3794,
+      865,  861, 3795, 3903, 3903, 3903, 3903, 3903, 3903,  860,
+     1261,  859,  858, 1261,  856,  855,  854,  852,  851,  850,
+      844, 3904,  840,  839, 3904,  292,  292,  292,  292,  292,
+      292,  292,  292,  292,  293,  293,  293,  293,  293,  293,
+      293,  293,  293,  298,  298,  298,  298,  298,  298,  298,
+
+      298,  298,  301,  301,  301,  301,  301,  301,  301,  301,
+      301,  304,  304,  304,  304,  304,  304,  304,  304,  304,
+      307,  307,  307,  307,  307,  307,  307,  307,  307,  314,
+      314,  314,  314,  314,  314,  314,  314,  314,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  326,  326,  326,
+      326,  326,  326,  326,  326,  326,  338,  338,  338,  338,
+      338,  338,  338,  338,  338,  344,  344,  344,  344,  344,
+      344,  344,  344,  344,  352,  352,  352,  352,  352,  352,
+      352,  352,  352,  360,  360,  360,  360,  360,  360,  360,
+      360,  360,  368,  368,  368,  368,  368,  368,  368,  368,
+
+      368,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+      378,  378,  378,  378,  378,  378,  378,  378,  378,  384,
+      384,  384,  384,  384,  384,  384,  384,  384,  390,  390,
+      390,  390,  390,  390,  390,  390,  390,  396,  396,  396,
+      396,  396,  396,  396,  396,  396,  403,  403,  403,  403,
+      403,  403,  403,  403,  403,  408,  408,  408,  408,  408,
+      408,  408,  408,  408,  415,  415,  415,  415,  415,  415,
+      415,  415,  415,  421,  421,  421,  421,  421,  421,  421,
+      421,  421,  428,  428,  428,  428,  428,  428,  428,  428,
+      428,  437,  437,  437,  437,  437,  437,  437,  437,  437,
+
+      443,  443,  443,  443,  443,  443,  443,  443,  443,  454,
+      454,  454,  454,  454,  454,  454,  454,  454,  461,  461,
+      461,  461,  461,  461,  461,  461,  461,  465,  465,  465,
+      465,  465,  465,  465,  465,  465,  472,  472,  472,  472,
+      472,  472,  472,  472,  472,  480,  480,  480,  480,  480,
+      480,  480,  480,  480,  488,  488,  488,  488,  488,  488,
+      488,  488,  488,  494,  494,  494,  494,  494,  494,  494,
+      494,  494,  500,  500,  500,  500,  500,  500,  500,  500,
+      500,  504,  504,  504,  504,  504,  504,  504,  504,  504,
+      512,  512,  512,  512,  512,  512,  512,  512,  512,  519,
+
+      519,  519,  519,  519,  519,  519,  519,  519,  526,  526,
+      526,  526,  526,  526,  526,  526,  526,  531,  531,  531,
+      531,  531,  531,  531,  531,  531,  537,  537,  537,  537,
+      537,  537,  537,  537,  537,  542,  542,  542,  542,  542,
+      542,  542,  542,  542,  548,  548,  548,  548,  548,  548,
+      548,  548,  548,  553,  553,  553,  553,  553,  553,  553,
+      553,  553,  559,  559,  559,  559,  559,  559,  559,  559,
+      559,  568,  568,  568,  568,  568,  568,  568,  568,  568,
+      575,  575,  575,  575,  575,  575,  575,  575,  575,  579,
+      579,  579,  579,  579,  579,  579,  579,  579,  590,  590,
+
+      590,  590,  590,  590,  590,  590,  590,  598,  598,  598,
+      598,  598,  598,  598,  598,  598,  605,  605,  605,  605,
+      605,  605,  605,  605,  605,  610,  610,  610,  610,  610,
+      610,  610,  610,  610,  616,  616,  616,  616,  616,  616,
+      616,  616,  616,  624,  624,  624,  624,  624,  624,  624,
+      624,  624,  630,  630,  630,  630,  630,  630,  630,  630,
+      630,  635,  635,  635,  635,  635,  635,  635,  635,  635,
+      642,  642,  642,  642,  642,  642,  642,  642,  642,  647,
+      647,  647,  647,  647,  647,  647,  647,  647,  653,  653,
+      653,  653,  653,  653,  653,  653,  653,  660,  660,  660,
+
+      660,  660,  660,  660,  660,  660,  667,  667,  667,  667,
+      667,  667,  667,  667,  667,  674,  674,  674,  674,  674,
+      674,  674,  674,  674,  682,  682,  682,  682,  682,  682,
+      682,  682,  682,  307,  307,  307,  307,  307,  307,  307,
+      307,  307,  693,  693,  693,  693,  693,  693,  693,  693,
+      693,  699,  699,  699,  699,  699,  699,  699,  699,  699,
+      705,  705,  705,  705,  705,  705,  705,  705,  705,  710,
+      710,  710,  710,  710,  710,  710,  710,  710,  719,  719,
+      719,  719,  719,  719,  719,  719,  719,  725,  725,  725,
+      725,  725,  725,  725,  725,  725,  745,  745,  745,  835,
+
+      831,  830,  745,  782,  782,  782,  829,  828,  827,  782,
+      790,  790,  790,  825,  823,  822,  790,  799,  799,  799,
+      821,  819,  817,  799,  803,  803,  803,  816,  814,  812,
+      803,  809,  809,  809,  811,  810,  808,  809,  815,  815,
+      815,  806,  805,  804,  815,  820,  820,  820,  802,  800,
+      798,  820,  826,  826,  826,  797,  795,  794,  826,  836,
+      836,  836,  793,  792,  791,  836,  853,  853,  853,  789,
+      784,  783,  853,  857,  857,  857,  781, 3905,  762,  857,
+      867,  867,  867,  747,  746,  744,  867,  873,  873,  873,
+      743,  737,  736,  873,  879,  879,  879,  737,  736,  735,
+
+      879,  887,  887,  887,  734, 3905, 3905,  887,  892,  892,
+      892, 3905, 3905, 3905,  892,  897,  897,  897, 3905, 3905,
+     3905,  897,  902,  902,  902, 3905, 3905, 3905,  902,  913,
+      913,  913, 3905, 3905, 3905,  913,  923,  923,  923, 3905,
+     3905, 3905,  923,  931,  931,  931, 3905, 3905, 3905,  931,
+      936,  936,  936, 3905, 3905, 3905,  936,  947,  947,  947,
+     3905, 3905, 3905,  947,  953,  953,  953, 3905, 3905, 3905,
+      953,  958,  958,  958, 3905, 3905, 3905,  958,  965,  965,
+      965, 3905, 3905, 3905,  965,  973,  973,  973, 3905, 3905,
+     3905,  973,  981,  981,  981, 3905, 3905, 3905,  981,  987,
+
+      987,  987, 3905, 3905, 3905,  987,  992,  992,  992, 3905,
+     3905, 3905,  992,  998,  998,  998,  998,  998,  998,  998,
+     3905,  998,  745,  745,  745, 3905, 3905, 3905,  745, 1014,
+     3905, 3905, 3905, 1014,  782,  782,  782, 3905, 3905, 3905,
+      782, 1058, 3905, 3905, 3905, 1058,  790,  790,  790, 3905,
+     3905, 3905,  790, 1066, 3905, 3905, 3905, 1066,  799,  799,
+      799, 3905, 3905, 3905,  799, 1070, 3905, 3905, 3905, 1070,
+      803,  803,  803, 3905, 3905, 3905,  803, 1076, 3905, 3905,
+     3905, 1076,  809,  809,  809, 3905, 3905, 3905,  809, 1081,
+     3905, 3905, 3905, 1081,  815,  815,  815, 3905, 3905, 3905,
+
+      815, 1085, 3905, 3905, 3905, 1085,  820,  820,  820, 3905,
+     3905, 3905,  820, 1090, 3905, 3905, 3905, 1090,  826,  826,
+      826, 3905, 3905, 3905,  826, 1101, 3905, 3905, 3905, 1101,
+      836,  836,  836, 3905, 3905, 3905,  836, 1119, 3905, 3905,
+     3905, 1119,  853,  853,  853, 3905, 3905, 3905,  853, 1123,
+     3905, 3905, 3905, 1123,  857,  857,  857, 3905, 3905, 3905,
+      857, 1133, 3905, 3905, 3905, 1133,  867,  867,  867, 3905,
+     3905, 3905,  867, 1141, 3905, 3905, 3905, 1141,  873,  873,
+      873, 3905, 3905, 3905,  873, 1144, 3905, 3905, 3905, 1144,
+      879,  879,  879, 3905, 3905, 3905,  879, 1154, 3905, 3905,
+
+     3905, 1154,  887,  887,  887, 3905, 3905, 3905,  887, 1159,
+     3905, 3905, 3905, 1159,  892,  892,  892, 3905, 3905, 3905,
+      892, 1164, 3905, 3905, 3905, 1164,  897,  897,  897, 3905,
+     3905, 3905,  897, 1168, 3905, 3905, 3905, 1168,  902,  902,
+      902, 3905, 3905, 3905,  902, 1178, 3905, 3905, 3905, 1178,
+      913,  913,  913, 3905, 3905, 3905,  913, 1182, 3905, 3905,
+     3905, 1182,  923,  923,  923, 3905, 3905, 3905,  923, 1193,
+     3905, 3905, 3905, 1193,  931,  931,  931, 3905, 3905, 3905,
+      931, 1198, 3905, 3905, 3905, 1198,  936,  936,  936, 3905,
+     3905, 3905,  936, 1209, 3905, 3905, 3905, 1209,  947,  947,
+
+      947, 3905, 3905, 3905,  947, 1214, 3905, 3905, 3905, 1214,
+      953,  953,  953, 3905, 3905, 3905,  953, 1219, 3905, 3905,
+     3905, 1219,  958,  958,  958, 3905, 3905, 3905,  958, 1226,
+     3905, 3905, 3905, 1226,  965,  965,  965, 3905, 3905, 3905,
+      965, 1233, 3905, 3905, 3905, 1233,  973,  973,  973, 3905,
+     3905, 3905,  973, 1241, 3905, 3905, 3905, 1241,  981,  981,
+      981, 3905, 3905, 3905,  981, 1247, 3905, 3905, 3905, 1247,
+      987,  987,  987, 3905, 3905, 3905,  987, 1252, 3905, 3905,
+     3905, 1252,  992,  992,  992, 3905, 3905, 3905,  992, 1258,
+     3905, 3905, 3905, 1258, 1260, 1260, 1260, 1260, 1260, 1260,
+
+     1260, 1260, 1260, 1266, 3905, 3905, 3905, 3905, 1266,  745,
+      745,  745, 3905, 3905, 3905,  745, 1277, 1277, 1277, 1277,
+     3905, 3905, 1277, 1277,  782,  782,  782,  782, 3905,  782,
+     3905,  782, 1328, 1328, 1328, 1328, 3905, 3905, 1328, 1328,
+      790,  790,  790, 3905, 3905, 3905,  790, 1338, 1338, 1338,
+     1338, 3905, 3905, 1338, 1338,  799,  799,  799, 3905, 3905,
+     3905,  799, 1344, 1344, 1344, 1344, 3905, 3905, 1344, 1344,
+      803,  803,  803, 3905, 3905, 3905,  803, 1353, 1353, 1353,
+     1353, 3905, 3905, 1353, 1353,  809,  809,  809,  809, 3905,
+      809, 3905,  809, 1363, 1363, 1363, 1363, 3905, 3905, 1363,
+
+     1363,  815,  815,  815,  815, 3905,  815, 3905,  815, 1371,
+     1371, 1371, 1371, 3905, 3905, 1371, 1371,  820,  820,  820,
+      820, 3905,  820, 3905,  820, 1381, 1381, 1381, 1381, 3905,
+     3905, 1381, 1381,  826,  826,  826,  826, 3905,  826, 3905,
+      826, 1397, 1397, 1397, 1397, 3905, 3905, 1397, 1397,  836,
+      836,  836, 3905, 3905, 3905,  836, 1422, 1422, 1422, 1422,
+     3905, 3905, 1422, 1422, 1429, 1429, 1429, 1429, 3905, 3905,
+     1429, 1429,  857,  857,  857, 3905, 3905, 3905,  857, 1442,
+     1442, 1442, 1442, 3905, 3905, 1442, 1442,  867,  867,  867,
+     3905, 3905, 3905,  867, 1454, 1454, 1454, 1454, 3905, 3905,
+
+     1454, 1454,  873,  873,  873, 3905, 3905, 3905,  873, 1459,
+     1459, 1459, 1459, 3905, 3905, 1459, 1459,  879,  879,  879,
+     3905, 3905, 3905,  879, 1471, 1471, 1471, 1471, 3905, 3905,
+     1471, 1471,  887,  887,  887, 3905, 3905, 3905,  887, 1479,
+     1479, 1479, 1479, 3905, 3905, 1479, 1479,  892,  892,  892,
+     3905, 3905, 3905,  892, 1487, 1487, 1487, 1487, 3905, 3905,
+     1487, 1487,  897,  897,  897, 3905, 3905, 3905,  897, 1493,
+     1493, 1493, 1493, 3905, 3905, 1493, 1493,  902,  902,  902,
+     3905, 3905, 3905,  902, 1508, 1508, 1508, 1508, 3905, 3905,
+     1508, 1508,  913,  913,  913, 3905, 3905, 3905,  913, 1514,
+
+     1514, 1514, 1514, 3905, 3905, 1514, 1514,  923,  923,  923,
+     3905, 3905, 3905,  923, 1527, 1527, 1527, 1527, 3905, 3905,
+     1527, 1527,  931,  931,  931, 3905, 3905, 3905,  931, 1535,
+     1535, 1535, 1535, 3905, 3905, 1535, 1535,  936,  936,  936,
+     3905, 3905, 3905,  936, 1551, 1551, 1551, 1551, 3905, 3905,
+     1551, 1551,  947,  947,  947,  947, 3905,  947, 3905,  947,
+     1560, 1560, 1560, 1560, 3905, 3905, 1560, 1560,  953,  953,
+      953, 3905, 3905, 3905,  953, 1568, 1568, 1568, 1568, 3905,
+     3905, 1568, 1568,  958,  958,  958, 3905, 3905, 3905,  958,
+     1578, 1578, 1578, 1578, 3905, 3905, 1578, 1578,  965,  965,
+
+      965, 3905, 3905, 3905,  965, 1588, 1588, 1588, 1588, 3905,
+     3905, 1588, 1588,  973,  973,  973, 3905, 3905, 3905,  973,
+     1599, 1599, 1599, 1599, 3905, 3905, 1599, 1599,  981,  981,
+      981, 3905, 3905, 3905,  981, 1606, 1606, 1606, 1606, 3905,
+     3905, 1606, 1606,  987,  987,  987, 3905, 3905, 3905,  987,
+     1614, 1614, 1614, 1614, 3905, 3905, 1614, 1614,  992,  992,
+      992,  992, 3905,  992, 3905,  992, 1625, 1625, 1625, 1625,
+     3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, 1260, 1260,
+     1260, 1260, 1260, 1266, 3905, 1266, 3905, 3905, 1266,  745,
+      745,  745, 3905, 3905, 3905,  745, 1277, 1277, 1277, 1277,
+
+     3905, 3905, 1277, 1277,  782,  782,  782, 3905, 3905, 3905,
+      782, 1328, 1328, 1328, 1328, 3905, 3905, 1328, 1328,  790,
+      790,  790, 3905, 3905, 3905,  790, 1338, 1338, 1338, 1338,
+     3905, 3905, 1338, 1338,  799,  799,  799, 3905, 3905, 3905,
+      799, 1344, 1344, 1344, 1344, 3905, 3905, 1344, 1344,  803,
+      803,  803, 3905, 3905, 3905,  803, 1353, 1353, 1353, 1353,
+     3905, 3905, 1353, 1353,  809,  809,  809, 3905, 3905, 3905,
+      809, 1363, 1363, 1363, 1363, 3905, 3905, 1363, 1363, 1371,
+     1371, 1371, 1371, 3905, 3905, 1371, 1371,  820,  820,  820,
+     3905, 3905, 3905,  820, 1381, 1381, 1381, 1381, 3905, 3905,
+
+     1381, 1381,  826,  826,  826, 3905, 3905, 3905,  826, 1397,
+     1397, 1397, 1397, 3905, 3905, 1397, 1397,  836,  836,  836,
+     3905, 3905, 3905,  836, 1422, 1422, 1422, 1422, 3905, 3905,
+     1422, 1422, 1429, 1429, 1429, 1429, 3905, 3905, 1429, 1429,
+      857,  857,  857, 3905, 3905, 3905,  857, 1442, 1442, 1442,
+     1442, 3905, 3905, 1442, 1442,  867,  867,  867,  867, 3905,
+      867, 3905,  867, 1454, 1454, 1454, 1454, 3905, 3905, 1454,
+     1454,  873,  873,  873,  873, 3905,  873, 3905,  873, 1459,
+     1459, 1459, 1459, 3905, 3905, 1459, 1459,  879,  879,  879,
+     3905, 3905, 3905,  879, 1471, 1471, 1471, 1471, 3905, 3905,
+
+     1471, 1471,  887,  887,  887, 3905, 3905, 3905,  887, 1479,
+     1479, 1479, 1479, 3905, 3905, 1479, 1479,  892,  892,  892,
+     3905, 3905, 3905,  892, 1487, 1487, 1487, 1487, 3905, 3905,
+     1487, 1487,  897,  897,  897,  897, 3905,  897, 3905,  897,
+     1493, 1493, 1493, 1493, 3905, 3905, 1493, 1493,  902,  902,
+      902, 3905, 3905, 3905,  902, 1508, 1508, 1508, 1508, 3905,
+     3905, 1508, 1508,  913,  913,  913, 3905, 3905, 3905,  913,
+     1514, 1514, 1514, 1514, 3905, 3905, 1514, 1514,  923,  923,
+      923, 3905, 3905, 3905,  923, 1527, 1527, 1527, 1527, 3905,
+     3905, 1527, 1527,  931,  931,  931, 3905, 3905, 3905,  931,
+
+     1535, 1535, 1535, 1535, 3905, 3905, 1535, 1535,  936,  936,
+      936, 3905, 3905, 3905,  936, 1551, 1551, 1551, 1551, 3905,
+     3905, 1551, 1551,  947,  947,  947, 3905, 3905, 3905,  947,
+     1560, 1560, 1560, 1560, 3905, 3905, 1560, 1560,  953,  953,
+      953, 3905, 3905, 3905,  953, 1568, 1568, 1568, 1568, 3905,
+     3905, 1568, 1568,  958,  958,  958, 3905, 3905, 3905,  958,
+     1578, 1578, 1578, 1578, 3905, 3905, 1578, 1578,  965,  965,
+      965, 3905, 3905, 3905,  965, 1588, 1588, 1588, 1588, 3905,
+     3905, 1588, 1588,  973,  973,  973,  973, 3905,  973, 3905,
+      973, 1599, 1599, 1599, 1599, 3905, 3905, 1599, 1599,  981,
+
+      981,  981, 3905, 3905, 3905,  981, 1606, 1606, 1606, 1606,
+     3905, 3905, 1606, 1606,  987,  987,  987, 3905, 3905, 3905,
+      987, 1614, 1614, 1614, 1614, 3905, 3905, 1614, 1614,  992,
+      992,  992, 3905, 3905, 3905,  992, 1625, 1625, 1625, 1625,
+     3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, 1260, 1260,
+     1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
+     1865, 1865,  745,  745,  745, 3905, 3905, 3905,  745,  782,
+      782,  782, 3905, 3905, 3905,  782, 1328, 1328, 1328, 1328,
+     3905, 3905, 1328, 1328,  790,  790,  790, 3905, 3905, 3905,
+      790, 1338, 1338, 1338, 1338, 3905, 3905, 1338, 1338,  799,
+
+      799,  799,  799, 3905,  799, 3905,  799, 1344, 1344, 1344,
+     1344, 3905, 3905, 1344, 1344,  803,  803,  803, 3905, 3905,
+     3905,  803, 1353, 1353, 1353, 1353, 3905, 3905, 1353, 1353,
+      809,  809,  809, 3905, 3905, 3905,  809, 1363, 1363, 1363,
+     1363, 3905, 3905, 1363, 1363, 1371, 1371, 1371, 1371, 3905,
+     3905, 1371, 1371,  820,  820,  820, 3905, 3905, 3905,  820,
+     1381, 1381, 1381, 1381, 3905, 3905, 1381, 1381,  826,  826,
+      826, 3905, 3905, 3905,  826, 1397, 1397, 1397, 1397, 3905,
+     3905, 1397, 1397,  836,  836,  836,  836, 3905,  836, 3905,
+      836, 1422, 1422, 1422, 1422, 3905, 3905, 1422, 1422, 1429,
+
+     1429, 1429, 1429, 3905, 3905, 1429, 1429,  857,  857,  857,
+     3905, 3905, 3905,  857, 1442, 1442, 1442, 1442, 3905, 3905,
+     1442, 1442, 1454, 1454, 1454, 1454, 3905, 3905, 1454, 1454,
+     1459, 1459, 1459, 1459, 3905, 3905, 1459, 1459,  879,  879,
+      879, 3905, 3905, 3905,  879, 1471, 1471, 1471, 1471, 3905,
+     3905, 1471, 1471,  887,  887,  887, 3905, 3905, 3905,  887,
+     1479, 1479, 1479, 1479, 3905, 3905, 1479, 1479,  892,  892,
+      892,  892, 3905,  892, 3905,  892, 1487, 1487, 1487, 1487,
+     3905, 3905, 1487, 1487,  897,  897,  897, 3905, 3905, 3905,
+      897, 1493, 1493, 1493, 1493, 3905, 3905, 1493, 1493,  902,
+
+      902,  902, 3905, 3905, 3905,  902, 1508, 1508, 1508, 1508,
+     3905, 3905, 1508, 1508,  913,  913,  913, 3905, 3905, 3905,
+      913, 1514, 1514, 1514, 1514, 3905, 3905, 1514, 1514,  923,
+      923,  923, 3905, 3905, 3905,  923, 1527, 1527, 1527, 1527,
+     3905, 3905, 1527, 1527,  931,  931,  931,  931, 3905,  931,
+     3905,  931, 1535, 1535, 1535, 1535, 3905, 3905, 1535, 1535,
+      936,  936,  936, 3905, 3905, 3905,  936, 1551, 1551, 1551,
+     1551, 3905, 3905, 1551, 1551,  947,  947,  947, 3905, 3905,
+     3905,  947, 1560, 1560, 1560, 1560, 3905, 3905, 1560, 1560,
+      953,  953,  953, 3905, 3905, 3905,  953, 1568, 1568, 1568,
+
+     1568, 3905, 3905, 1568, 1568,  958,  958,  958, 3905, 3905,
+     3905,  958, 1578, 1578, 1578, 1578, 3905, 3905, 1578, 1578,
+      965,  965,  965, 3905, 3905, 3905,  965, 1588, 1588, 1588,
+     1588, 3905, 3905, 1588, 1588,  973,  973,  973, 3905, 3905,
+     3905,  973, 1599, 1599, 1599, 1599, 3905, 3905, 1599, 1599,
+      981,  981,  981, 3905, 3905, 3905,  981, 1606, 1606, 1606,
+     1606, 3905, 3905, 1606, 1606,  987,  987,  987, 3905, 3905,
+     3905,  987, 1614, 1614, 1614, 1614, 3905, 3905, 1614, 1614,
+      992,  992,  992, 3905, 3905, 3905,  992, 1625, 1625, 1625,
+     1625, 3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, 1260,
+
+     1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, 1865,
+     1865, 1865, 1865,  745,  745,  745, 3905, 3905, 3905,  745,
+      782,  782,  782,  782, 3905,  782, 3905,  782, 1328, 1328,
+     1328, 1328, 3905, 3905, 1328, 1328,  790,  790,  790, 3905,
+     3905, 3905,  790, 1338, 1338, 1338, 1338, 3905, 3905, 1338,
+     1338, 1344, 1344, 1344, 1344, 3905, 3905, 1344, 1344,  803,
+      803,  803, 3905, 3905, 3905,  803, 1353, 1353, 1353, 1353,
+     3905, 3905, 1353, 1353,  809,  809,  809,  809, 3905,  809,
+     3905,  809, 1363, 1363, 1363, 1363, 3905, 3905, 1363, 1363,
+     1371, 1371, 1371, 1371, 3905, 3905, 1371, 1371,  820,  820,
+
+      820,  820, 3905,  820, 3905,  820, 1381, 1381, 1381, 1381,
+     3905, 3905, 1381, 1381,  826,  826,  826,  826, 3905,  826,
+     3905,  826, 1397, 1397, 1397, 1397, 3905, 3905, 1397, 1397,
+      836,  836,  836,  836, 3905,  836, 3905,  836, 1422, 1422,
+     1422, 1422, 3905, 3905, 1422, 1422, 1429, 1429, 1429, 1429,
+     3905, 3905, 1429, 1429,  857,  857,  857, 3905, 3905, 3905,
+      857, 1442, 1442, 1442, 1442, 3905, 3905, 1442, 1442, 1454,
+     1454, 1454, 1454, 3905, 3905, 1454, 1454, 1459, 1459, 1459,
+     1459, 3905, 3905, 1459, 1459,  879,  879,  879, 3905, 3905,
+     3905,  879, 1471, 1471, 1471, 1471, 3905, 3905, 1471, 1471,
+
+      887,  887,  887, 3905, 3905, 3905,  887, 1479, 1479, 1479,
+     1479, 3905, 3905, 1479, 1479, 1487, 1487, 1487, 1487, 3905,
+     3905, 1487, 1487,  897,  897,  897, 3905, 3905, 3905,  897,
+     1493, 1493, 1493, 1493, 3905, 3905, 1493, 1493,  902,  902,
+      902, 3905, 3905, 3905,  902, 1508, 1508, 1508, 1508, 3905,
+     3905, 1508, 1508,  913,  913,  913, 3905, 3905, 3905,  913,
+     1514, 1514, 1514, 1514, 3905, 3905, 1514, 1514,  923,  923,
+      923, 3905, 3905, 3905,  923, 1527, 1527, 1527, 1527, 3905,
+     3905, 1527, 1527, 1535, 1535, 1535, 1535, 3905, 3905, 1535,
+     1535,  936,  936,  936, 3905, 3905, 3905,  936, 1551, 1551,
+
+     1551, 1551, 3905, 3905, 1551, 1551,  947,  947,  947, 3905,
+     3905, 3905,  947, 1560, 1560, 1560, 1560, 3905, 3905, 1560,
+     1560,  953,  953,  953, 3905, 3905, 3905,  953, 1568, 1568,
+     1568, 1568, 3905, 3905, 1568, 1568,  958,  958,  958,  958,
+     3905,  958, 3905,  958, 1578, 1578, 1578, 1578, 3905, 3905,
+     1578, 1578,  965,  965,  965, 3905, 3905, 3905,  965, 1588,
+     1588, 1588, 1588, 3905, 3905, 1588, 1588,  973,  973,  973,
+     3905, 3905, 3905,  973, 1599, 1599, 1599, 1599, 3905, 3905,
+     1599, 1599,  981,  981,  981, 3905, 3905, 3905,  981, 1606,
+     1606, 1606, 1606, 3905, 3905, 1606, 1606,  987,  987,  987,
+
+     3905, 3905, 3905,  987, 1614, 1614, 1614, 1614, 3905, 3905,
+     1614, 1614,  992,  992,  992,  992, 3905,  992, 3905,  992,
+     1625, 1625, 1625, 1625, 3905, 3905, 1625, 1625, 1260, 1260,
+     1260, 1260, 1260, 1260, 1260, 1260, 1260, 1865, 1865, 1865,
+     1865, 1865, 1865, 1865, 1865, 1865,  745,  745,  745,  745,
+     3905,  745, 3905,  745,  782,  782,  782, 3905, 3905, 3905,
+      782, 1328, 1328, 1328, 1328, 3905, 3905, 1328, 1328,  790,
+      790,  790, 3905, 3905, 3905,  790, 1338, 1338, 1338, 1338,
+     3905, 3905, 1338, 1338, 1344, 1344, 1344, 1344, 3905, 3905,
+     1344, 1344,  803,  803,  803, 3905, 3905, 3905,  803, 1353,
+
+     1353, 1353, 1353, 3905, 3905, 1353, 1353, 1363, 1363, 1363,
+     1363, 3905, 3905, 1363, 1363, 1371, 1371, 1371, 1371, 3905,
+     3905, 1371, 1371, 1381, 1381, 1381, 1381, 3905, 3905, 1381,
+     1381,  826,  826,  826,  826, 3905,  826, 3905,  826, 1397,
+     1397, 1397, 1397, 3905, 3905, 1397, 1397,  836,  836,  836,
+     3905, 3905, 3905,  836, 1422, 1422, 1422, 1422, 3905, 3905,
+     1422, 1422, 1429, 1429, 1429, 1429, 3905, 3905, 1429, 1429,
+      857,  857,  857, 3905, 3905, 3905,  857, 1454, 1454, 1454,
+     1454, 3905, 3905, 1454, 1454, 1459, 1459, 1459, 1459, 3905,
+     3905, 1459, 1459,  879,  879,  879, 3905, 3905, 3905,  879,
+
+      887,  887,  887, 3905, 3905, 3905,  887, 1479, 1479, 1479,
+     1479, 3905, 3905, 1479, 1479, 1487, 1487, 1487, 1487, 3905,
+     3905, 1487, 1487,  897,  897,  897, 3905, 3905, 3905,  897,
+     1493, 1493, 1493, 1493, 3905, 3905, 1493, 1493,  902,  902,
+      902, 3905, 3905, 3905,  902,  913,  913,  913,  913, 3905,
+      913, 3905,  913, 1514, 1514, 1514, 1514, 3905, 3905, 1514,
+     1514,  923,  923,  923, 3905, 3905, 3905,  923, 1527, 1527,
+     1527, 1527, 3905, 3905, 1527, 1527,  936,  936,  936, 3905,
+     3905, 3905,  936, 1551, 1551, 1551, 1551, 3905, 3905, 1551,
+     1551,  947,  947,  947, 3905, 3905, 3905,  947, 1560, 1560,
+
+     1560, 1560, 3905, 3905, 1560, 1560,  953,  953,  953, 3905,
+     3905, 3905,  953, 1568, 1568, 1568, 1568, 3905, 3905, 1568,
+     1568,  958,  958,  958,  958, 3905,  958, 3905,  958, 1578,
+     1578, 1578, 1578, 3905, 3905, 1578, 1578,  965,  965,  965,
+      965, 3905,  965, 3905,  965, 1588, 1588, 1588, 1588, 3905,
+     3905, 1588, 1588,  973,  973,  973, 3905, 3905, 3905,  973,
+     1599, 1599, 1599, 1599, 3905, 3905, 1599, 1599,  981,  981,
+      981,  981, 3905,  981, 3905,  981, 1606, 1606, 1606, 1606,
+     3905, 3905, 1606, 1606,  987,  987,  987,  987, 3905,  987,
+     3905,  987,  992,  992,  992, 3905, 3905, 3905,  992, 1625,
+
+     1625, 1625, 1625, 3905, 3905, 1625, 1625, 1260, 1260, 1260,
+     1260, 1260, 1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865,
+     1865, 1865, 1865, 1865, 1865,  782,  782,  782, 3905, 3905,
+     3905,  782, 1328, 1328, 1328, 1328, 3905, 3905, 1328, 1328,
+      790,  790,  790,  790, 3905,  790, 3905,  790, 1344, 1344,
+     1344, 1344, 3905, 3905, 1344, 1344,  803,  803,  803, 3905,
+     3905, 3905,  803, 1353, 1353, 1353, 1353, 3905, 3905, 1353,
+     1353, 1363, 1363, 1363, 1363, 3905, 3905, 1363, 1363, 1371,
+     1371, 1371, 1371, 3905, 3905, 1371, 1371, 1381, 1381, 1381,
+     1381, 3905, 3905, 1381, 1381, 1397, 1397, 1397, 1397, 3905,
+
+     3905, 1397, 1397,  836,  836,  836, 3905, 3905, 3905,  836,
+     1422, 1422, 1422, 1422, 3905, 3905, 1422, 1422, 1429, 1429,
+     1429, 1429, 3905, 3905, 1429, 1429,  857,  857,  857, 3905,
+     3905, 3905,  857, 1454, 1454, 1454, 1454, 3905, 3905, 1454,
+     1454, 1459, 1459, 1459, 1459, 3905, 3905, 1459, 1459,  879,
+      879,  879, 3905, 3905, 3905,  879,  887,  887,  887, 3905,
+     3905, 3905,  887, 1479, 1479, 1479, 1479, 3905, 3905, 1479,
+     1479, 1487, 1487, 1487, 1487, 3905, 3905, 1487, 1487,  897,
+      897,  897, 3905, 3905, 3905,  897,  902,  902,  902, 3905,
+     3905, 3905,  902, 1514, 1514, 1514, 1514, 3905, 3905, 1514,
+
+     1514,  923,  923,  923,  923, 3905,  923, 3905,  923, 1527,
+     1527, 1527, 1527, 3905, 3905, 1527, 1527,  936,  936,  936,
+     3905, 3905, 3905,  936, 1551, 1551, 1551, 1551, 3905, 3905,
+     1551, 1551,  947,  947,  947, 3905, 3905, 3905,  947,  953,
+      953,  953, 3905, 3905, 3905,  953, 1568, 1568, 1568, 1568,
+     3905, 3905, 1568, 1568,  958,  958,  958, 3905, 3905, 3905,
+      958, 1578, 1578, 1578, 1578, 3905, 3905, 1578, 1578,  965,
+      965,  965, 3905, 3905, 3905,  965, 1588, 1588, 1588, 1588,
+     3905, 3905, 1588, 1588,  973,  973,  973, 3905, 3905, 3905,
+      973, 1606, 1606, 1606, 1606, 3905, 3905, 1606, 1606,  992,
+
+      992,  992, 3905, 3905, 3905,  992, 1625, 1625, 1625, 1625,
+     3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, 1260, 1260,
+     1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
+     1865, 1865,  782,  782,  782, 3905, 3905, 3905,  782, 1328,
+     1328, 1328, 1328, 3905, 3905, 1328, 1328,  790,  790,  790,
+      790, 3905,  790, 3905,  790, 1344, 1344, 1344, 1344, 3905,
+     3905, 1344, 1344,  803,  803,  803,  803, 3905,  803, 3905,
+      803, 1353, 1353, 1353, 1353, 3905, 3905, 1353, 1353, 1363,
+     1363, 1363, 1363, 3905, 3905, 1363, 1363, 1371, 1371, 1371,
+     1371, 3905, 3905, 1371, 1371, 1381, 1381, 1381, 1381, 3905,
+
+     3905, 1381, 1381, 1397, 1397, 1397, 1397, 3905, 3905, 1397,
+     1397,  836,  836,  836, 3905, 3905, 3905,  836, 1422, 1422,
+     1422, 1422, 3905, 3905, 1422, 1422,  857,  857,  857, 3905,
+     3905, 3905,  857, 1454, 1454, 1454, 1454, 3905, 3905, 1454,
+     1454, 1459, 1459, 1459, 1459, 3905, 3905, 1459, 1459,  879,
+      879,  879,  879, 3905,  879, 3905,  879,  887,  887,  887,
+      887, 3905,  887, 3905,  887, 1479, 1479, 1479, 1479, 3905,
+     3905, 1479, 1479, 1487, 1487, 1487, 1487, 3905, 3905, 1487,
+     1487,  897,  897,  897,  897, 3905,  897, 3905,  897,  902,
+      902,  902, 3905, 3905, 3905,  902, 1514, 1514, 1514, 1514,
+
+     3905, 3905, 1514, 1514,  923,  923,  923,  923, 3905,  923,
+     3905,  923, 1527, 1527, 1527, 1527, 3905, 3905, 1527, 1527,
+      936,  936,  936,  936, 3905,  936, 3905,  936,  947,  947,
+      947, 3905, 3905, 3905,  947,  953,  953,  953, 3905, 3905,
+     3905,  953,  958,  958,  958, 3905, 3905, 3905,  958, 1578,
+     1578, 1578, 1578, 3905, 3905, 1578, 1578,  965,  965,  965,
+     3905, 3905, 3905,  965, 1588, 1588, 1588, 1588, 3905, 3905,
+     1588, 1588,  973,  973,  973, 3905, 3905, 3905,  973, 1606,
+     1606, 1606, 1606, 3905, 3905, 1606, 1606,  992,  992,  992,
+     3905, 3905, 3905,  992, 1625, 1625, 1625, 1625, 3905, 3905,
+
+     1625, 1625, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260,
+     1260, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,
+      782,  782,  782, 3905, 3905, 3905,  782,  790,  790,  790,
+      790, 3905,  790, 3905,  790, 1344, 1344, 1344, 1344, 3905,
+     3905, 1344, 1344, 1353, 1353, 1353, 1353, 3905, 3905, 1353,
+     1353, 1363, 1363, 1363, 1363, 3905, 3905, 1363, 1363, 1371,
+     1371, 1371, 1371, 3905, 3905, 1371, 1371, 1381, 1381, 1381,
+     1381, 3905, 3905, 1381, 1381,  836,  836,  836, 3905, 3905,
+     3905,  836,  857,  857,  857, 3905, 3905, 3905,  857, 1454,
+     1454, 1454, 1454, 3905, 3905, 1454, 1454,  879,  879,  879,
+
+     3905, 3905, 3905,  879, 1479, 1479, 1479, 1479, 3905, 3905,
+     1479, 1479, 1487, 1487, 1487, 1487, 3905, 3905, 1487, 1487,
+      902,  902,  902, 3905, 3905, 3905,  902, 1514, 1514, 1514,
+     1514, 3905, 3905, 1514, 1514,  923,  923,  923,  923, 3905,
+      923, 3905,  923,  936,  936,  936, 3905, 3905, 3905,  936,
+      947,  947,  947, 3905, 3905, 3905,  947,  953,  953,  953,
+     3905, 3905, 3905,  953,  958,  958,  958, 3905, 3905, 3905,
+      958,  965,  965,  965, 3905, 3905, 3905,  965, 1588, 1588,
+     1588, 1588, 3905, 3905, 1588, 1588,  973,  973,  973, 3905,
+     3905, 3905,  973, 1606, 1606, 1606, 1606, 3905, 3905, 1606,
+
+     1606,  992,  992,  992, 3905, 3905, 3905,  992, 1625, 1625,
+     1625, 1625, 3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260,
+     1260, 1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865,
+     1865, 1865, 1865, 1865,  782,  782,  782,  782, 3905,  782,
+     3905,  782, 3351, 3351, 3351, 3351, 3351, 3351, 3351, 3351,
+     3351, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352,
+     3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3434,
+     3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3501, 3501,
+     3501, 3501, 3501, 3501, 3501, 3501, 3501, 3503, 3503, 3503,
+     3503, 3503, 3503, 3503, 3503, 3503,  291, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905
     } ;
 
-static yyconst flex_int16_t yy_chk[11977] =
+static yyconst flex_int16_t yy_chk[14073] =
     {   0,
         0,    3,    3,    3,    4,    4,    4,    5,    5,    5,
         6,    6,    6,    7,    7,    7,   11,    3,    9,   12,
-        4,   10,  331,    5,    0,    9,    6,    0,   10,    7,
-        8,    8,    8,  244,   11,   13,   13,   12,   14,   14,
-       13,   13,  282,   14,   14,  245,    8,   17,   17,  244,
-       13,   15,   15,   14,   15,  248,   15,   16,   16, 1015,
-       16,  245,   16,   18,   18, 1015,   15,   21,   21,   21,
-      331,  248,   16,   22,   22,   22,   23,   23,   23,   24,
-       24,   24,  355,   21,   25,   25,   25,  355, 1465,   22,
-      343,   17,   23, 1469,  282,   24,  242,  242,  242, 1474,
-
-       25,  243,  243,  243,  247,  247,  247,   18,   19,   19,
+        4,   10,  977,    5,    0,    9,    6,  362,   10,    7,
+        8,    8,    8,  296,   11,   13,   13,   12,   14,   14,
+       13,   13,  334,   14,   14,  297,    8,   17,   17,  296,
+       13,   15,   15,   14,   15,  300,   15,   16,   16,  977,
+       16,  297,   16,   18,   18,  362,   15,   21,   21,   21,
+     1512,  300,   16,   22,   22,   22,  451,   23,   23,   23,
+       24,   24,   24,   21,   25,   25,   25,  343, 1517,   22,
+      451,  322,   17,   23,  343,  334,   24,  294,  294,  294,
+
+       25,  295,  295,  295,  299,  299,  299,  322,   18,   19,
        19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,  401,   19,   19,   19,   19,   19,   26,
-       26,   26,   27,   27,   27,   28,   28,   28,  343,   29,
-       29,   29,   30,   30,   30,   26,  270,  287,   27,  291,
-      365,   28,  301,   19,   19,   29,  291,  437,   30,  267,
-      267,  267,  270,  287,   19,  275,  275,  275,  301,  437,
-      258,  365,  401,   19,   20,   20,   20,   20,   20,   20,
-       20,   20,   20,   20,   20,   20,   20,   20,   20,  543,
-       20,   20,   20,   20,   20,   31,   31,   31,   32,   32,
-
-       32,   33,   33,   33,  543,   34,   34,   34,   35,   35,
-       35,   31,  258,  632,   32,  558,  632,   33,  258,   20,
-       20,   34,  306,  258,   35,   36,   36,   36,  258,  306,
-       20,   37,   37,   37,   38,   38,   38,  734,  306,   20,
-      734,   36,   39,   39,   39, 1475,  311,   37, 1480,  323,
-       38,   40,   40,   40,  284,  284,  284,  376,   39,  293,
-      293,  293,  311,  558,  294,  323, 1481,   40,   41,   41,
-       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
-       41,   41,   41,  596,   41,   41,   41,   41,   41,   43,
-       43,   43,   44,   44,   44,   45,   45,   45,  387,   46,
-
-       46,   46,   47,   47,   47,   43,  370,  651,   44,  376,
-     1496,   45,  294,   41,   41,   46,  294,  336,   47,   41,
-      370,  651,   41,  298,  298,  298,  305,  305,  305,  308,
-      308,  308,  596,  336,   41,   42,   42,   42,   42,   42,
+       19,   19,   19,   19,  339,   19,   19,   19,   19,   19,
+       26,   26,   26,   27,   27,   27,   28,   28,   28,  449,
+      339,   29,   29,   29,  347,  436,   26,  449,  347,   27,
+      436,  739,   28,  449,  739,   19,   19,   29,   30,   30,
+       30,  319,  319,  319,  348,  346,   19,  327,  327,  327,
+      336,  336,  336, 1518,   30,   19,   20,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,  446,   20,   20,   20,   20,   20,   31,   31,   31,
+
+       32,   32,   32,   33,   33,   33,  251,  251,   34,   34,
+       34,  251,  446,   31,  346,  353,   32,  348,  346,   33,
+      518,  251,   20,   20,   34,   35,   35,   35,   36,   36,
+       36,  353,  518,   20,   37,   37,   37,   38,   38,   38,
+      859,   35,   20,  859,   36,   39,   39,   39,  364, 1520,
+       37,  251,  369,   38,   40,   40,   40,  345,  345,  345,
+      399,   39,  350,  350,  350,  361,  361,  361,  369,  600,
+       40,   41,   41,   41,   41,   41,   41,   41,   41,   41,
+       41,   41,   41,   41,   41,   41,  379,   41,   41,   41,
+       41,   41,   43,   43,   43,   44,   44,   44,   45,   45,
+
+       45,  364,  379,   46,   46,   46,  479,  600,   43,  374,
+      479,   44, 1521,  399,   45, 1523,  374,   41,   41,   46,
+       47,   47,   47,   41,  482,  374,   41,  366,  366,  366,
+      373,  373,  373,  376,  376,  376,   47, 1524,   41,   42,
        42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
-      387,   42,   42,   42,   42,   42,   48,   48,   48,   49,
-       49,   49,   50,   50,   50,  368,   53,   53,   53,   54,
-       54,   54,   48,  368, 1497,   49,  644,  318,   50,  368,
-       42,   42,   53,  398,  318,   54,   42,  398,  403,   42,
-      317,  317,  317,  318,  320,  320,  320,  329,  329,  329,
-
-      644,   42,   51,   51,   51,   51,   51,   51,   51,   51,
-       51,   51,   51,   51,   51,   51,   51,  623,   51,   51,
-       51,   51,   51,   57,   57,   57,   58,   58,   58,   61,
-       61,   61,  623,   62,   62,   62,   63,   63,   63,   57,
-      403, 1499,   58, 1521,  656,   61,  666,   51,   51,   62,
-      348,  363,   63,   64,   64,   64,  333,  333,  333,  341,
-      341,  341,  345,  345,  345,  519,  348,  363,  656,   64,
-      666,   51,   52,   52,   52,   52,   52,   52,   52,   52,
-       52,   52,   52,   52,   52,   52,   52,  669,   52,   52,
-       52,   52,   52,   65,   65,   65,   66,   66,   66,   67,
-
-       67,   67,  519,   68,   68,   68,   71,   71,   71,   65,
-      486,  669,   66,  358,  486,   67, 1522,   52,   52,   68,
-      358,  851,   71,   72,   72,   72,  357,  357,  357,  358,
-      360,  360,  360,  374,  374,  374,  378,  378,  378,   72,
-     1525,   52,   55,   55,   55,   55,   55,   55,   55,   55,
-       55,   55,   55,   55,   55,   55,   55,  851,   55,   55,
-       55,   55,   55,   73,   73,   73,   74,   74,   74,   75,
-       75,   75, 1527,   76,   76,   76,   77,   77,   77,   73,
-      381,  392,   74,  554,  408,   75,  371,   55,   55,   76,
-      554,   55,   77, 1529,  371, 1536,  381,  392,   55,  371,
-
-      408,   55,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56, 1537,   56,   56,
-       56,   56,   56,   78,   78,   78,   81,   81,   81,   82,
-       82,   82,  662,   85,   85,   85,   86,   86,   86,   78,
-      420,  432,   81,  415,  446,   82,  662,   56,   56,   85,
-      415,   56,   86,  385,  385,  385,  420,  432,   56,  415,
-      446,   56,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59, 1538,   59,   59,
-       59,   59,   59,   87,   87,   87,   88,   88,   88,   89,
-       89,   89,  427,   90,   90,   90,   91,   91,   91,   87,
-
-      668, 1539,   88, 1541, 1547,   89, 1549,   59,   59,   90,
-      457,  468,   91,   59,  668,  441,   59,  389,  389,  389,
-      400,  400,  400,  405,  405,  405,  457,  468,   59,   60,
-       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
-       60,   60,   60,   60,  427,   60,   60,   60,   60,   60,
-       92,   92,   92,   95,   95,   95,   96,   96,   96,  501,
-       97,   97,   97,   98,   98,   98,   92,  441, 1128,   95,
-     1551, 1552,   96, 1557,   60,   60,   97,  479,  490,   98,
-       60, 1128,  503,   60,  414,  414,  414,  417,  417,  417,
-      424,  424,  424,  479,  490,   60,   69,   69,   69,   69,
-
+       42,   42,   42,   42,  391,   42,   42,   42,   42,   42,
+       48,   48,   48,   49,   49,   49,   50,   50,   50,  752,
+      391,   53,   53,   53,  482, 1525,   48,  386, 1533,   49,
+      752,  751,   50,  752,  386,   42,   42,   53,   54,   54,
+       54,   42,  411,  386,   42,  385,  385,  385,  388,  388,
+
+      388,  397,  397,  397,   54,  751,   42,   51,   51,   51,
+       51,   51,   51,   51,   51,   51,   51,   51,   51,   51,
+       51,   51,  404,   51,   51,   51,   51,   51,   55,   55,
+       55,   56,   56,   56,   57,   57,   57,  424,  404,   58,
+       58,   58, 1171,  416,   55,  411,  429,   56, 1171,  444,
+       57, 1538,  457,   51,   51,   58,   59,   59,   59,  416,
+      676,   51,  429,   51,  398,  444,   51,  401,  401,  401,
+       51, 1547,   59, 1549,   51,   52,   52,   52,   52,   52,
+       52,   52,   52,   52,   52,   52,   52,   52,   52,   52,
+      424,   52,   52,   52,   52,   52,   60,   60,   60,   63,
+
+       63,   63,   64,   64,   64,  457,  452,   67,   67,   67,
+      676,  462,   60,  398,  452,   63,  758,  398,   64,  452,
+      468,   52,   52,   67,   68,   68,   68,  462, 1296,   52,
+      758,   52,  410, 1558,   52,  409,  409,  409,   52, 1563,
+       68, 1296,   52,   61,   61,   61,   61,   61,   61,   61,
+       61,   61,   61,   61,   61,   61,   61,   61,  473,   61,
+       61,   61,   61,   61,   71,   71,   71,   72,   72,   72,
+       73,   73,   73,  468,  473,   74,   74,   74,  567, 1571,
+       71,  410,  567,   72, 1572,  410,   73, 1576,  489,   61,
+       61,   74,   75,   75,   75,   76,   76,   76,  413,  413,
+
+      413,  422,  422,  422,  489,  484,  423, 1581,   75, 1585,
+     1591,   76, 1597,   61,   62,   62,   62,   62,   62,   62,
+       62,   62,   62,   62,   62,   62,   62,   62,   62,  501,
+       62,   62,   62,   62,   62,   77,   77,   77,   78,   78,
+       78,   81,   81,   81, 1602,  501,   82,   82,   82,  634,
+     1604,   77, 1612, 1619,   78,  423,  634,   81,  484,  423,
+       62,   62,   82,   83,   83,   83,   84,   84,   84,  426,
+      426,  426,  438,  438,  438,  441,  441,  441, 1620,   83,
+      310, 1623,   84, 1632,   62,   65,   65,   65,   65,   65,
+       65,   65,   65,   65,   65,   65,   65,   65,   65,   65,
+
+      513,   65,   65,   65,   65,   65,   85,   85,   85,   86,
+       86,   86,   87,   87,   87,  582,  513,   88,   88,   88,
+      439, 1633,   85,  310,  508,   86,  585,  439,   87,  310,
+      582,   65,   65,   88,  310,   65,  439,  522,  584,  310,
+     1263,  585,   65, 1634, 1263,   65,   66,   66,   66,   66,
+       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
+       66,  764,   66,   66,   66,   66,   66,   91,   91,   91,
+       92,   92,   92,   93,   93,   93,  584,  508,   94,   94,
+       94,  775, 1637,   91,  586,  764,   92, 1638,  496,   93,
+      522,  584,   66,   66,   94,  496,   66,  455,  455,  455,
+
+      459,  459,  459,   66,  496,  775,   66,   69,   69,   69,
        69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
-       69,  501,   69,   69,   69,   69,   69,   99,   99,   99,
-      100,  100,  100,  101,  101,  101,  505,  102,  102,  102,
-      105,  105,  105,   99,  503, 1559,  100,  490, 1560,  101,
-     1562,   69,   69,  102,  495,  510,  105,   69,  429,  429,
-      429,  439,  439,  439,  443,  443,  443,  451,  451,  451,
-      495,  510,   69,   70,   70,   70,   70,   70,   70,   70,
-       70,   70,   70,   70,   70,   70,   70,   70,  505,   70,
-       70,   70,   70,   70,  106,  106,  106,  107,  107,  107,
-      108,  108,  108,  521,  109,  109,  109,  110,  110,  110,
-
-      106, 1096,  526,  107,  452, 1096,  108, 1417,   70,   70,
-      109,  452,  463,  110,   70,  454,  454,  454,  526,  463,
-      452,  462,  462,  462,  465,  465,  465, 1417,  463,   70,
-       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,  521,   79,   79,   79,   79,
-       79,  111,  111,  111,  112,  112,  112,  115,  115,  115,
-      583,  116,  116,  116,  119,  119,  119,  111,  537,  551,
-      112,  474,  563,  115, 1563,   79,   79,  116,  474,   79,
-      119,  473,  473,  473,  537,  551,   79,  474,  563,   79,
-      476,  476,  476,   79, 1564,   79,   79,   80,   80,   80,
-
-       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
-       80,   80,  583,   80,   80,   80,   80,   80,  120,  120,
-      120,  121,  121,  121,  122,  122,  122,  670,  123,  123,
-      123,  124,  124,  124,  120,  574,  588,  121,  489,  603,
-      122,  670,   80,   80,  123,  489,   80,  124,  488,  488,
-      488,  574,  588,   80,  489,  603,   80,  492,  492,  492,
-       80, 1565,   80,   80,   83,   83,   83,   83,   83,   83,
-       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
-       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
-       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
-
-       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
-       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
-       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
-       83,   83,   83,   83,   83,   83,   83,   83,   93,   93,
-       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,
-       93,   93,   93, 1568,   93,   93,   93,   93,   93,  125,
-      125,  125,  126,  126,  126,  129,  129,  129, 1569,  130,
-      130,  130,  131,  131,  131,  125,  614, 1570,  126, 1572,
-      650,  129,  598,   93,   93,  130, 1575,  650,  131,  499,
-      499,  499,  614,  650,   93,   94,   94,   94,   94,   94,
-
-       94,   94,   94,   94,   94,   94,   94,   94,   94,   94,
-     1584,   94,   94,   94,   94,   94,  132,  132,  132,  133,
-      133,  133,  134,  134,  134, 1587,  135,  135,  135,  136,
-      136,  136,  132,  502,  598,  133, 1595,  654,  134,  541,
-       94,   94,  135,  541,  654,  136,  502,  541,  502,  280,
-      654,   94,  103,  103,  103,  103,  103,  103,  103,  103,
-      103,  103,  103,  103,  103,  103,  103, 1597,  103,  103,
-      103,  103,  103,  139,  139,  139,  140,  140,  140,  143,
-      143,  143,  645,  144,  144,  144, 1599,  280, 1600,  139,
-      792,  862,  140,  645, 1229,  143,  645,  103,  103,  144,
-
-      103,  280,  103,  280,  792,  280, 1229,  862,  103,  507,
-      507,  507,  518,  518,  518,  103,  500,  888,  103,  104,
+       69,   69,  527,   69,   69,   69,   69,   69,   95,   95,
+       95,   96,   96,   96,   97,   97,   97,  586,  527,   98,
+       98,   98,  724, 1639,   95,  533,  770,   96, 1640,  724,
+       97, 1641,  533,   69,   69,   98,  101,  101,  101,   69,
+      770,  533,   69,  466,  466,  466,  470,  470,  470,  481,
+      481,  481,  101, 1642,   69,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+      538,   70,   70,   70,   70,   70,  102,  102,  102,  105,
+
+      105,  105,  106,  106,  106,  765,  538,  107,  107,  107,
+     1643, 1644,  102,  544, 1646,  105,  765,  779,  106,  765,
+      544,   70,   70,  107,  108,  108,  108,   70,  601,  544,
+       70,  486,  486,  486,  495,  495,  495,  498,  498,  498,
+      108,  779,   70,   79,   79,   79,   79,   79,   79,   79,
+       79,   79,   79,   79,   79,   79,   79,   79,  549,   79,
+       79,   79,   79,   79,  109,  109,  109,  110,  110,  110,
+      111,  111,  111,  623,  549,  112,  112,  112, 1648, 1649,
+      109,  601, 1651,  110, 1652, 1654,  111, 1655,  623,   79,
+       79,  112,  115,  115,  115,   79,  505,  505,  505,  510,
+
+      510,  510,  520,  520,  520,  524,  524,  524,  115, 1656,
+       79,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,  560,   80,   80,   80,
+       80,   80,  116,  116,  116,  117,  117,  117,  118,  118,
+      118,  777,  560,  119,  119,  119, 1657, 1660,  116, 1661,
+     1662,  117, 1663, 1664,  118,  777,  638,   80,   80,  119,
+      120,  120,  120,   80,  532,  532,  532,  535,  535,  535,
+      543,  543,  543,  546,  546,  546,  120, 1666,   80,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,  576,   89,   89,   89,   89,   89,
+
+      121,  121,  121,  122,  122,  122,  125,  125,  125,  638,
+      576,  126,  126,  126, 1669, 1670,  121,  555,  780,  122,
+     1671, 1673,  125, 1675,  555,   89,   89,  126,  127,  127,
+      127,   89,  780,  555,   89,  554,  554,  554,  557,  557,
+      557,  569,  569,  569,  127, 1679,   89,   90,   90,   90,
+       90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
+       90,   90,  591,   90,   90,   90,   90,   90,  128,  128,
+      128,  129,  129,  129,  130,  130,  130, 1420,  591,  131,
+      131,  131, 1680, 1684,  128,  570, 1687,  129, 1690, 1420,
+      130,  571,  570,   90,   90,  131,  132,  132,  132,   90,
+
+      663,  570,   90,  573,  573,  573,  678,  571,  580,  580,
+      580,  332,  132, 1691,   90,   99,   99,   99,   99,   99,
+       99,   99,   99,   99,   99,   99,   99,   99,   99,   99,
+      606,   99,   99,   99,   99,   99,  135,  135,  135,  136,
+      136,  136,  139,  139,  139,  715,  606,  140,  140,  140,
+      332,  571,  135,  663,  583,  136,  730,  617,  139,  678,
+      728,   99,   99,  140,  332,   99,  332,  583,  332,  583,
+     1692,  730,   99,  617, 1694,   99,  588,  588,  588,   99,
+     1697,   99,   99,  100,  100,  100,  100,  100,  100,  100,
+      100,  100,  100,  100,  100,  100,  100,  100,  715,  100,
+
+      100,  100,  100,  100,  141,  141,  141,  142,  142,  142,
+      143,  143,  143,  728,  621,  144,  144,  144,  621, 1698,
+      141, 1703,  621,  142, 1704,  612,  143,  750, 1628,  100,
+      100,  144,  612,  100,  599,  599,  599,  603,  603,  603,
+      100,  612,  750,  100,  611,  611,  611,  100, 1628,  100,
+      100,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  631,  103,  103,  103,
+      103,  103,  145,  145,  145,  146,  146,  146,  149,  149,
+      149,  797,  631,  150,  150,  150, 1719, 1720,  145, 1728,
+     1729,  146,  916,  626,  149, 1731,  797,  103,  103,  150,
+
+      626,  103,  103,  614,  614,  614,  637,  916,  103,  626,
+     1753,  103,  625,  625,  625,  103, 1754,  103,  103,  103,
       104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
-      104,  104,  104,  104,  888,  104,  104,  104,  104,  104,
-      147,  147,  147,  148,  148,  148,  151,  151,  151,  657,
-      152,  152,  152, 1601, 1603,  500,  147,  980, 1608,  148,
-      657, 1611,  151,  657,  104,  104,  152,  104,  500,  104,
-      500,  523,  523,  523,  980,  104,  531,  531,  531,  534,
-      534,  534,  104, 1612, 1079,  104,  113,  113,  113,  113,
+      104,  104,  104,  104,  104,  643,  104,  104,  104,  104,
+      104,  151,  151,  151,  152,  152,  152,  153,  153,  153,
+      917,  643,  154,  154,  154,  637, 1757,  151, 1027,  637,
+      152,  917,  649,  153,  917,  919,  104,  104,  154,  649,
+      104,  104,  628,  628,  628, 1027, 1759,  104,  649,  919,
+      104,  636,  636,  636,  104, 1761,  104,  104,  104,  113,
       113,  113,  113,  113,  113,  113,  113,  113,  113,  113,
 
-      113, 1079,  113,  113,  113,  113,  113,  153,  153,  153,
-      154,  154,  154,  157,  157,  157, 1614,  158,  158,  158,
-      159,  159,  159,  153, 1620, 1623,  154,  532,  546,  157,
-     1626,  113,  113,  158,  532,  546,  159,  113,  545,  545,
-      545, 1627,  113,  532,  546,  548,  548,  548,  556,  556,
-      556,  560,  560,  560,  113,  114,  114,  114,  114,  114,
+      113,  113,  113,  113,  654,  113,  113,  113,  113,  113,
+      155,  155,  155,  156,  156,  156,  159,  159,  159, 1769,
+      654,  160,  160,  160, 1770, 1771,  155, 1772,  668,  156,
+     1774, 1780,  159,  727, 1782,  113,  113,  160,  640,  640,
+      640,  648,  648,  648,  668,  581,  113,  114,  114,  114,
       114,  114,  114,  114,  114,  114,  114,  114,  114,  114,
-     1628,  114,  114,  114,  114,  114,  160,  160,  160,  161,
-      161,  161,  162,  162,  162, 1629,  163,  163,  163,  164,
-      164,  164,  160, 1630, 1631,  161,  569,  661,  162, 1632,
-
-      114,  114,  163,  569,  661,  164,  114,  568,  568,  568,
-      661,  114,  569,  571,  571,  571,  581,  581,  581,  585,
-      585,  585, 1633,  114,  117,  117,  117,  117,  117,  117,
-      117,  117,  117,  117,  117,  117,  117,  117,  117, 1635,
-      117,  117,  117,  117,  117,  165,  165,  165,  166,  166,
-      166,  167,  167,  167,  790,  168,  168,  168,  169,  169,
-      169,  165,  793, 1636,  166,  790, 1638,  167,  790,  117,
-      117,  168, 1639,  793,  169, 1642,  793,  117,  118,  118,
-      118,  118,  118,  118,  118,  118,  118,  118,  118,  118,
-      118,  118,  118, 1643,  118,  118,  118,  118,  118,  170,
-
-      170,  170,  171,  171,  171,  172,  172,  172, 1645,  173,
-      173,  173,  174,  174,  174,  170, 1133, 1326,  171, 1647,
-     1650,  172, 1619,  118,  118,  173, 1651, 1652,  174, 1133,
-     1326,  118,  127,  127,  127,  127,  127,  127,  127,  127,
-      127,  127,  127,  127,  127,  127,  127, 1619,  127,  127,
-      127,  127,  127,  175,  175,  175,  176,  176,  176,  179,
-      179,  179, 1653,  180,  180,  180,  181,  181,  181,  175,
-     1654, 1656,  176,  608, 1657,  179, 1661,  127,  127,  180,
-      608,  127,  181,  595,  595,  595, 1669, 1673,  127,  608,
-     1674,  127,  600,  600,  600,  611,  611,  611,  127,  128,
-
-      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
-      128,  128,  128,  128, 1706,  128,  128,  128,  128,  128,
-      182,  182,  182,  183,  183,  183,  184,  184,  184, 1707,
-      185,  185,  185,  186,  186,  186,  182, 1714, 1725,  183,
-      621, 1726,  184, 1727,  128,  128,  185,  621,  128,  186,
-      620,  620,  620, 1728, 1730,  128,  621, 1738,  128,  622,
-      622,  622,  631,  631,  631,  128,  137,  137,  137,  137,
-      137,  137,  137,  137,  137,  137,  137,  137,  137,  137,
-      137, 1740,  137,  137,  137,  137,  137,  189,  189,  189,
-      190,  190,  190,  193,  193,  193, 1744,  194,  194,  194,
-
-      197,  197,  197,  189, 1747, 1749,  190,  667, 1750,  193,
-     1752,  137,  137,  194,  667, 1753,  197,  137, 1754, 1755,
-      667,  631,  137,  138,  138,  138,  138,  138,  138,  138,
-      138,  138,  138,  138,  138,  138,  138,  138, 1759,  138,
-      138,  138,  138,  138,  198,  198,  198,  199,  199,  199,
-      200,  200,  200, 1760,  201,  201,  201,  202,  202,  202,
-      198, 1761, 1763,  199,  791,  794,  200, 1767,  138,  138,
-      201,  791,  794,  202,  138, 1771, 1775,  791,  794,  138,
-      141,  141,  141,  141,  141,  141,  141,  141,  141,  141,
-      141,  141,  141,  141,  141, 1777,  141,  141,  141,  141,
-
-      141,  203,  203,  203,  204,  204,  204,  207,  207,  207,
-     1779,  208,  208,  208,  211,  211,  211,  203,  948, 1785,
-      204, 1792, 1796,  207, 1797,  141,  141,  208,  948, 1799,
-      211,  212,  212,  212, 1811,  948,  141,  865,  865,  865,
-     1812,  865, 1113, 1113, 1113, 1813, 1815,  212, 1806,  141,
-      142,  142,  142,  142,  142,  142,  142,  142,  142,  142,
-      142,  142,  142,  142,  142, 1806,  142,  142,  142,  142,
-      142,  213,  213,  213,  214,  214,  214,  215,  215,  215,
-     1808,  216,  216,  216,  217,  217,  217,  213, 1801, 1814,
-      214, 1816, 1818,  215, 1801,  142,  142,  216, 1801, 1819,
-
-      217,  218,  218,  218, 1801, 1814,  142,  874,  874,  874,
-     1820,  874, 1821, 1808,  874, 1823, 1807,  218, 1824,  142,
-      145,  145,  145,  145,  145,  145,  145,  145,  145,  145,
-      145,  145,  145,  145,  145, 1828,  145,  145,  145,  145,
-      145,  221,  221,  221,  222,  222,  222,  223,  223,  223,
-     1830,  224,  224,  224,  225,  225,  225,  221, 1807, 1831,
-      222, 1832, 1834,  223, 1835,  145,  145,  224, 1836, 1833,
-      225, 1134, 1134, 1134, 1433, 1433, 1433, 1837,  878,  878,
-      878,  145,  897,  897,  897, 1833,  145,  146,  146,  146,
-      146,  146,  146,  146,  146,  146,  146,  146,  146,  146,
-
-      146,  146, 1840,  146,  146,  146,  146,  146,  226,  226,
-      226,  227,  227,  227,  228,  228,  228, 1438, 1438, 1438,
-     1433,  639,  639,  639,  226, 1842, 1847,  227, 1849, 1854,
-      228, 1877,  146,  146,  231,  231,  232,  232,  639,  231,
-      425,  232,  878,  909,  909,  909,  897, 1878,  146,  231,
-      425,  232, 1879,  146,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149, 1883,
-      149,  149,  149,  149,  149,  235,  235,  235,  231,  425,
-      232,  236,  236,  236, 1884,  425, 1890, 1891,  686,  686,
-      686,  235,  425,  876,  876,  876,  425,  236,  279,  149,
-
-      149, 1894,  149,  149,  149,  686, 1895,  909,  279, 1901,
-      149,  876, 1907,  149,  991,  991,  991, 1441, 1441, 1441,
-      149,  150,  150,  150,  150,  150,  150,  150,  150,  150,
-      150,  150,  150,  150,  150,  150,  279,  150,  150,  150,
-      150,  150,  702,  702,  702,  703,  703,  703, 1909, 1910,
-      279, 1913,  279, 1919,  279,  713,  713,  713, 1921,  702,
-     1927, 1931,  703,  916,  916,  916,  150,  150, 1934,  150,
-      150,  150,  713, 1446, 1446, 1446, 1938,  150,  991, 1940,
-      150,  916, 1435, 1435, 1435, 1941, 1942,  150,  155,  155,
-      155,  155,  155,  155,  155,  155,  155,  155,  155,  155,
-
-      155,  155,  155, 1943,  155,  155,  155,  155,  155,  715,
-      715,  715,  729,  729,  729,  735,  735,  735,  744,  744,
-      744,  745,  745,  745, 1945, 1951,  715, 1953, 1435,  729,
-     1955, 1957,  735,  155,  155,  744, 1970, 1971,  745,  755,
-      755,  755,  924,  924,  924, 1972,  924, 1975, 1976,  924,
-     1978, 1452, 1452, 1452, 1979, 1980,  755,  155,  156,  156,
-      156,  156,  156,  156,  156,  156,  156,  156,  156,  156,
-      156,  156,  156, 1982,  156,  156,  156,  156,  156,  763,
-      763,  763,  767,  767,  767,  780,  780,  780,  806,  806,
-      806,  812,  812,  812, 1987, 1993,  763, 1452, 1977,  767,
-
-     1987, 1994,  780,  156,  156,  806, 1977, 1981,  812,  829,
-      829,  829,  938,  938,  938, 1981,  938, 1995, 1989,  938,
-     1996, 1454, 1454, 1454, 2000, 2002,  829,  156,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177, 2003,  177,  177,  177,  177,  177,  835,
-      835,  835,  841,  841,  841,  849,  849,  849,  873,  873,
-      873,  912,  912,  912, 1989, 2004,  835, 1454, 2009,  841,
-     2011, 2012,  849,  177,  177,  873, 2013, 2016,  912, 1988,
-     2020,  177, 2027,  177, 2029, 2031,  177, 1455, 1455, 1455,
-      177, 1634, 1634, 1634,  177,  178,  178,  178,  178,  178,
-
-      178,  178,  178,  178,  178,  178,  178,  178,  178,  178,
-     1988,  178,  178,  178,  178,  178, 2055,  877,  877,  877,
-      914,  914,  914, 2056,  920,  920,  920,  913,  913,  913,
-      915,  915,  915, 1802, 2057,  877, 2063,  914, 2064, 1802,
-      178,  178,  920, 1802,  913, 2068, 2072,  915,  178, 1802,
-      178, 2073, 2077,  178,  877, 2080, 2083,  178, 1637, 1637,
-     1637,  178,  187,  187,  187,  187,  187,  187,  187,  187,
-      187,  187,  187,  187,  187,  187,  187,  913,  187,  187,
-      187,  187,  187,  917,  917,  917,  923,  923,  923,  915,
-     2084, 2085,  913,  921,  921,  921,  926,  926,  926, 2086,
-
-     2089,  917, 2092,  923,  928,  928,  928,  187,  187, 2096,
-     2097,  921, 2098, 2110,  926,  940,  940,  940,  187,  940,
-      917,  928,  940,  950,  950,  950, 2111,  950, 2114, 2116,
-      950,  187,  188,  188,  188,  188,  188,  188,  188,  188,
-      188,  188,  188,  188,  188,  188,  188, 2119,  188,  188,
-      188,  188,  188,  927,  927,  927, 2126,  921,  930,  930,
-      930,  931,  931,  931,  932,  932,  932,  929,  929,  929,
-     2133,  927,  933,  933,  933,  930, 2135,  188,  188,  931,
-     2136, 2137,  932, 2142,  929, 1640, 1640, 1640,  188,  933,
-      953,  953,  953, 2143,  953, 2144, 2145,  953, 2146, 2147,
-
-      927,  188,  191,  191,  191,  191,  191,  191,  191,  191,
-      191,  191,  191,  191,  191,  191,  191,  929,  191,  191,
-      191,  191,  191,  934,  934,  934,  935,  935,  935,  937,
-      937,  937,  929, 2148, 2149,  932,  936,  936,  936, 2150,
-      934,  946,  946,  946,  935, 2151,  937,  191,  191,  939,
-      939,  939, 2162, 2163,  936, 2154,  191, 2166,  191,  946,
-     2169, 2173,  191, 1641, 1641, 1641,  939,  191,  191,  192,
-      192,  192,  192,  192,  192,  192,  192,  192,  192,  192,
-      192,  192,  192,  192, 2174,  192,  192,  192,  192,  192,
-     2177,  941,  941,  941, 2178,  949,  949,  949, 2154,  942,
-
-      942,  942,  943,  943,  943, 2181, 2184,  936,  941,  944,
-      944,  944,  949, 2185,  192,  192,  942, 2186, 2201,  943,
-      967,  967,  967,  192,  967,  192,  944,  967, 2155,  192,
-     1471, 1471, 1471, 2202,  192,  192,  195,  195,  195,  195,
-      195,  195,  195,  195,  195,  195,  195,  195,  195,  195,
-      195,  942,  195,  195,  195,  195,  195,  943, 2208, 2209,
-      944, 2215, 2216,  952,  952,  952,  945,  945,  945,  954,
-      954,  954,  964,  964,  964, 2155, 1471,  947,  947,  947,
-      952,  195,  195,  945, 2217, 2231,  954,  195, 2203, 2232,
-      964, 2233,  974,  974,  974,  947,  974, 2254, 2203,  974,
-
-     2255, 2261,  195,  196,  196,  196,  196,  196,  196,  196,
-      196,  196,  196,  196,  196,  196,  196,  196,  945,  196,
-      196,  196,  196,  196,  947, 2266, 2268,  965,  965,  965,
-      966,  966,  966,  968,  968,  968, 2269,  969,  969,  969,
-      973,  973,  973, 2274, 2275,  965, 2276,  966,  196,  196,
-     2277,  968, 2278, 2279,  196,  969, 2280,  973,  983,  983,
-      983, 2281,  983, 2282, 2283,  983, 1644, 1644, 1644,  196,
-      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
-      205,  205,  205,  205,  205,  965,  205,  205,  205,  205,
-      205,  978,  978,  978,  979,  979,  979, 2288,  969, 2289,
-
-      982,  982,  982, 2291,  984,  984,  984, 2157, 2157,  978,
-     2157, 2292,  979, 2293, 2294,  205,  205,  982, 2157, 2296,
-      205,  984, 1649, 1649, 1649, 2157,  205,  206,  206,  206,
-      206,  206,  206,  206,  206,  206,  206,  206,  206,  206,
-      206,  206, 2287,  206,  206,  206,  206,  206, 2286,  985,
-      985,  985, 2297,  985, 2300,  979,  985,  986,  986,  986,
-      987,  987,  987,  989,  989,  989, 2301,  994,  994,  994,
-     2304,  994,  206,  206,  994,  986, 2306,  206,  987, 2287,
-     2286,  989, 2307,  206,  209,  209,  209,  209,  209,  209,
-      209,  209,  209,  209,  209,  209,  209,  209,  209, 2309,
-
-      209,  209,  209,  209,  209, 2310, 2312,  990,  990,  990,
-      993,  993,  993,  998,  998,  998, 2313, 2290,  999,  999,
-      999,  987, 1001, 1001, 1001,  990, 2290,  993, 2295,  209,
-      209,  998,  209, 2314,  209, 2326,  999, 2295, 2327, 1001,
-      209, 1002, 1002, 1002, 2328, 1002, 2329, 2332, 1002, 2333,
-     2339,  209,  210,  210,  210,  210,  210,  210,  210,  210,
-      210,  210,  210,  210,  210,  210,  210,  990,  210,  210,
-      210,  210,  210,  999, 1003, 1003, 1003, 1005, 1005, 1005,
-     2340, 1008, 1008, 1008, 2347, 2348, 1004, 1004, 1004, 1006,
-     1006, 1006, 1003, 1006, 1005, 2349, 1006,  210,  210, 1008,
-
-      210, 2357,  210, 2358, 1004, 1018, 1018, 1018,  210, 1018,
-     2375, 2376, 1018, 1648, 1648, 1648, 1655, 1655, 1655,  210,
-      219,  219,  219,  219,  219,  219,  219,  219,  219,  219,
-      219,  219,  219,  219,  219, 2377,  219,  219,  219,  219,
-      219, 1004, 1012, 1012, 1012, 1017, 1017, 1017, 2380, 1009,
-     1009, 1009, 2382, 1013, 1013, 1013, 1019, 1019, 1019, 1648,
-     1012, 2383, 1017, 2384, 2385,  219,  219, 1009, 2386, 2387,
-      219, 1013, 2388, 1019, 2389, 2390,  219, 1040, 1040, 1040,
-      219, 1040, 2391, 2392, 1040, 2393,  219,  220,  220,  220,
-      220,  220,  220,  220,  220,  220,  220,  220,  220,  220,
-
-      220,  220, 2398,  220,  220,  220,  220,  220, 2399, 2395,
-     1009, 1022, 1022, 1022, 1013, 1658, 1658, 1658, 1023, 1023,
-     1023, 1026, 1026, 1026, 1027, 1027, 1027, 2400, 2401, 1022,
-     2402, 2403,  220,  220, 2404, 2405, 1023,  220, 2397, 1026,
-     2406, 2407, 1027,  220, 1046, 1046, 1046,  220, 1046, 2395,
-     2408, 1046, 2409,  220,  229,  229,  229,  229,  229,  229,
-      229,  229,  229,  229,  229,  229,  229,  229,  229, 1023,
-      229,  229,  229,  229,  229, 1036, 1036, 1036, 1037, 1037,
-     1037, 2397, 1027, 2410, 1039, 1039, 1039, 1042, 1042, 1042,
-     1043, 1043, 1043, 1036, 2411, 2414, 1037, 2415, 2416,  229,
-
-      229, 1039, 1062, 1062, 1062, 1042, 1062,  229, 1043, 1062,
-      229, 2417, 1646, 1646, 1646, 2419, 2420,  229,  230,  230,
-      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
-      230,  230,  230, 2431,  230,  230,  230,  230,  230, 1045,
-     1045, 1045, 1037, 1047, 1047, 1047, 2432, 2434, 1049, 1049,
-     1049, 1053, 1053, 1053, 1043, 2438, 1045, 1054, 1054, 1054,
-     1047, 2439, 2440,  230,  230, 1049, 1068, 1068, 1068, 1053,
-     1068,  230, 2442, 1068,  230, 1054, 1646, 1659, 1659, 1659,
-     2443,  230,  233,  233,  233,  233,  233,  233,  233,  233,
-      233,  233,  233,  233,  233,  233,  233, 2445,  233,  233,
-
-      233,  233,  233, 2446, 1054, 1055, 1055, 1055, 1056, 1056,
-     1056, 2396, 1057, 1057, 1057, 1058, 1058, 1058, 1059, 1059,
-     1059, 2454, 1055, 2455, 2441, 1056, 2456,  233,  233, 1057,
-     1061, 1061, 1061, 1058,  233, 2441, 1059, 1074, 1074, 1074,
-      233, 1074, 2468, 2487, 1074, 2488, 2492, 1061, 2396,  233,
-      234,  234,  234,  234,  234,  234,  234,  234,  234,  234,
-      234,  234,  234,  234,  234, 2493,  234,  234,  234,  234,
-      234, 1057, 1063, 1063, 1063, 1064, 1064, 1064, 2444, 1059,
-     1067, 1067, 1067, 1070, 1070, 1070, 1071, 1071, 1071, 2444,
-     1063, 2494, 2495, 1064, 2496,  234,  234, 1067, 1073, 1073,
-
-     1073, 1070,  234, 2497, 1071, 1077, 1077, 1077,  234, 1078,
-     1078, 1078, 1081, 1081, 1081, 1073, 2498,  234,  276, 1662,
-     1662, 1662, 2499, 1077, 2500,  276, 2501, 1078, 2503, 1081,
-     1085, 1085, 1085, 2506,  276,  276, 1064, 1082, 1082, 1082,
-     2507, 1082, 2508, 2509, 1082, 1716, 1716, 1716, 1085, 1086,
-     1086, 1086, 1071, 1091, 1091, 1091, 2460, 2503, 1092, 1092,
-     1092, 2510,  276,  276,  276, 1662, 2460, 1086, 2504,  276,
-      276, 1091, 2460,  276,  276, 1078, 1092,  276, 2511,  276,
-      276,  276,  278, 1105, 1105, 1105, 2512, 1105, 2513, 2514,
-     1105, 1109, 1109, 1109, 1110, 1110, 1110, 2515,  278,  278,
-
-     1112, 1112, 1112, 1149, 1149, 1149, 1153, 1153, 1153, 1109,
-     2504, 2482, 1110, 1086, 1156, 1156, 1156, 2505, 1112, 2516,
-     1149, 2482, 1092, 1153, 2482, 2517,  278,  278,  278, 1817,
-     1817, 1817, 1156,  278,  278, 2518, 2521,  278,  278, 2483,
-     2522,  278, 2523,  278,  278,  278, 1150, 1150, 1150, 2483,
-     1150, 2525, 2483, 1150, 1154, 1154, 1154, 2526, 1154, 2505,
-     2531, 1154, 1157, 1157, 1157, 1159, 1159, 1159, 1162, 1162,
-     1162, 1163, 1163, 1163, 1165, 1165, 1165, 1167, 1167, 1167,
-     1157, 1167, 2536, 1159, 1167, 2537, 1162, 2538, 2539, 1163,
-     2540, 2541, 1165, 1171, 1171, 1171, 1172, 1172, 1172, 1174,
-
-     1174, 1174, 1175, 1175, 1175, 1176, 1176, 1176, 2335, 1176,
-     2335, 1171, 1176, 2542, 1172, 2543, 2544, 1174, 2545, 1175,
-     1179, 1179, 1179, 2335, 1180, 1180, 1180, 1165, 1180, 1159,
-     2546, 1180, 1181, 1181, 1181, 2554, 2556, 1179, 1182, 1182,
-     1182, 1184, 1184, 1184, 1185, 1185, 1185, 2560, 1174, 2561,
-     1181, 1186, 1186, 1186, 2562, 1186, 1182, 2563, 1186, 1184,
-     2564, 1185, 1187, 1187, 1187, 1188, 1188, 1188, 2565, 1188,
-     2567, 2579, 1188, 1189, 1189, 1189, 1190, 1190, 1190, 1187,
-     1192, 1192, 1192, 1193, 1193, 1193, 2336, 1193, 2336, 2580,
-     1193, 1189, 2582, 2583, 1190, 1196, 1196, 1196, 1192, 1196,
-
-     2574, 2336, 1196, 1184, 1199, 1199, 1199, 1200, 1200, 1200,
-     2596, 1200, 2597, 2574, 1200, 1205, 1205, 1205, 1206, 1206,
-     1206, 1199, 1208, 1208, 1208, 1212, 1212, 1212, 2575, 1212,
-     2598, 2599, 1212, 1205, 2601, 2581, 1206, 1215, 1215, 1215,
-     1208, 2575, 1192, 1216, 1216, 1216, 2602, 1216, 2581, 2603,
-     1216, 1219, 1219, 1219, 1215, 1220, 1220, 1220, 2604, 1220,
-     2607, 2610, 1220, 1230, 1230, 1230, 2158, 2158, 1219, 2158,
-     1208, 1231, 1231, 1231, 1233, 1233, 1233, 2158, 1234, 1234,
-     1234, 1230, 1234, 2611, 2158, 1234, 1237, 1237, 1237, 1231,
-     2584, 2612, 1233, 1238, 1238, 1238, 1240, 1240, 1240, 1243,
-
-     1243, 1243, 2613, 2584, 1237, 1244, 1244, 1244, 2607, 1244,
-     2614, 1238, 1244, 2608, 1240, 2615, 1243, 1250, 1250, 1250,
-     1251, 1251, 1251, 2461, 1253, 1253, 1253, 1255, 1255, 1255,
-     1256, 1256, 1256, 2461, 1256, 1250, 2616, 1256, 1251, 2461,
-     2617, 1233, 1253, 2618, 1255, 1259, 1259, 1259, 2608, 1259,
-     2619, 2620, 1259, 1262, 1262, 1262, 1240, 1263, 1263, 1263,
-     1265, 1265, 1265, 1266, 1266, 1266, 1267, 1267, 1267, 2621,
-     2622, 1262, 1268, 1268, 1268, 1263, 2625, 2626, 1265, 2629,
-     1266, 1270, 1270, 1270, 1267, 1278, 1278, 1278, 2635, 1253,
-     1268, 1272, 1272, 1272, 2643, 1272, 2644, 2645, 1272, 1270,
-
-     1279, 1279, 1279, 1278, 1281, 1281, 1281, 1283, 1283, 1283,
-     2646, 1283, 2647, 2631, 1283, 1286, 1286, 1286, 1279, 1287,
-     1287, 1287, 1281, 2631, 2648, 1265, 1289, 1289, 1289, 2632,
-     1270, 2649, 2650, 1286, 1290, 1290, 1290, 1287, 1290, 2632,
-     2651, 1290, 2652, 2653, 1289, 1294, 1294, 1294, 1295, 1295,
-     1295, 1297, 1297, 1297, 1298, 1298, 1298, 1299, 1299, 1299,
-     1300, 1300, 1300, 1294, 1281, 2657, 1295, 2660, 2661, 1297,
-     2662, 1298, 2663, 2664, 1299, 1301, 1301, 1301, 1300, 1303,
-     1303, 1303, 2665, 1308, 1308, 1308, 1289, 1308, 2666, 2669,
-     1308, 2673, 2674, 1301, 1311, 1311, 1311, 1303, 1312, 1312,
-
-     1312, 1297, 1312, 2675, 1299, 1312, 1315, 1315, 1315, 2676,
-     2677, 1311, 1316, 1316, 1316, 1318, 1318, 1318, 1321, 1321,
-     1321, 1322, 1322, 1322, 1315, 1324, 1324, 1324, 2678, 2679,
-     1316, 2680, 2681, 1318, 2682, 2683, 1321, 2684, 2700, 1322,
-     1329, 1329, 1329, 1324, 2701, 2702, 1303, 1333, 1333, 1333,
-     1334, 1334, 1334, 1336, 1336, 1336, 2703, 1329, 2704, 2687,
-     1338, 1338, 1338, 2705, 1338, 1333, 1318, 1338, 1334, 2687,
-     2706, 1336, 1324, 1342, 1342, 1342, 1343, 1343, 1343, 1345,
-     1345, 1345, 1347, 1347, 1347, 2688, 1347, 2707, 2713, 1347,
-     2714, 1342, 2715, 2718, 1343, 2688, 2719, 1345, 1350, 1350,
-
-     1350, 1351, 1351, 1351, 2720, 1351, 2721, 2724, 1351, 1352,
-     1352, 1352, 2731, 2732, 1336, 1350, 1353, 1353, 1353, 2733,
-     1354, 1354, 1354, 2709, 1354, 2734, 1352, 1354, 1356, 1356,
-     1356, 2738, 2746, 1353, 1358, 1358, 1358, 1359, 1359, 1359,
-     1345, 1361, 1361, 1361, 2747, 1356, 1362, 1362, 1362, 1363,
-     1363, 1363, 1358, 1363, 2748, 1359, 1363, 2709, 2749, 1361,
-     1364, 1364, 1364, 1362, 1365, 1365, 1365, 2750, 1365, 2751,
-     2752, 1365, 1367, 1367, 1367, 2753, 2754, 1364, 1368, 1368,
-     1368, 1370, 1370, 1370, 1372, 1372, 1372, 2755, 1372, 2761,
-     1367, 1372, 1375, 1375, 1375, 2762, 1368, 2764, 2765, 1370,
-
-     2767, 1361, 1376, 1376, 1376, 1378, 1378, 1378, 2768, 2769,
-     1375, 1381, 1381, 1381, 2770, 1381, 2771, 2772, 1381, 2773,
-     1376, 2774, 2775, 1378, 1385, 1385, 1385, 1386, 1386, 1386,
-     2776, 1388, 1388, 1388, 1390, 1390, 1390, 2777, 1390, 2778,
-     2779, 1390, 1385, 2782, 2783, 1386, 2784, 2785, 1370, 1388,
-     1394, 1394, 1394, 1395, 1395, 1395, 1396, 1396, 1396, 1398,
-     1398, 1398, 1400, 1400, 1400, 2793, 2794, 1394, 1404, 1404,
-     1404, 1395, 1378, 2796, 1396, 2797, 2798, 1398, 2800, 1400,
-     1401, 1401, 1401, 2808, 1401, 1404, 2809, 1401, 1406, 1406,
-     1406, 2811, 1388, 1407, 1407, 1407, 1409, 1409, 1409, 1411,
-
-     1411, 1411, 2812, 1413, 1413, 1413, 1406, 1414, 1414, 1414,
-     2813, 1407, 2815, 2820, 1409, 2821, 1411, 1416, 1416, 1416,
-     1398, 1413, 1418, 1418, 1418, 1414, 1424, 1424, 1424, 1404,
-     1461, 1461, 1461, 2802, 1461, 1416, 2822, 1461, 2823, 2825,
-     1418, 1418, 2829, 1409, 1424, 1466, 1466, 1466, 2830, 1466,
-     2832, 2833, 1466, 1470, 1470, 1470, 1472, 1472, 1472, 1473,
-     1473, 1473, 2834, 2836, 1416, 1476, 1476, 1476, 1477, 1477,
-     1477, 1470, 1477, 1472, 2837, 1477, 2802, 1473, 1482, 1482,
-     1482, 2842, 1482, 1476, 2843, 1482, 1485, 1485, 1485, 1486,
-     1486, 1486, 2844, 1486, 2845, 2846, 1486, 2847, 1489, 1489,
-
-     1489, 2848, 1489, 2849, 1485, 1489, 1492, 1492, 1492, 1493,
-     1493, 1493, 2850, 1493, 1470, 2851, 1493, 1498, 1498, 1498,
-     2852, 2853, 1476, 2854, 1492, 2855, 1473, 1500, 1500, 1500,
-     1501, 1501, 1501, 1485, 1498, 1502, 1502, 1502, 1503, 1503,
-     1503, 1504, 1504, 1504, 2856, 1500, 2857, 1501, 1509, 1509,
-     1509, 2858, 1502, 1492, 2862, 1503, 2863, 2864, 1504, 1505,
-     1505, 1505, 2865, 1505, 2868, 1509, 1505, 1506, 1506, 1506,
-     2869, 1506, 2870, 2871, 1506, 1510, 1510, 1510, 1511, 1511,
-     1511, 2872, 1500, 2873, 2882, 1503, 1512, 1512, 1512, 1513,
-     1513, 1513, 1510, 2875, 2878, 1511, 1514, 1514, 1514, 1509,
-
-     2883, 1502, 2885, 1512, 2886, 2878, 1513, 1515, 1515, 1515,
-     1516, 1516, 1516, 1514, 1517, 1517, 1517, 1518, 1518, 1518,
-     2888, 2877, 1510, 2890, 1515, 2893, 2899, 1516, 1519, 1519,
-     1519, 1517, 2900, 1512, 1518, 2877, 1520, 1520, 1520, 2875,
-     1523, 1523, 1523, 1524, 1524, 1524, 1519, 1524, 1511, 2902,
-     1524, 2903, 2905, 1513, 1520, 2916, 1514, 1523, 1526, 1526,
-     1526, 1528, 1528, 1528, 1530, 1530, 1530, 1531, 1531, 1531,
-     2918, 1531, 2920, 2921, 1531, 1526, 1517, 2895, 1518, 1528,
-     1516, 1530, 1532, 1532, 1532, 1533, 1533, 1533, 1520, 2895,
-     1534, 1534, 1534, 1519, 1534, 2924, 2925, 1534, 2928, 2930,
-
-     1532, 2932, 1533, 1535, 1535, 1535, 1540, 1540, 1540, 2934,
-     1542, 1542, 1542, 1543, 1543, 1543, 2935, 1544, 1544, 1544,
-     2937, 1535, 2938, 2944, 1540, 2943, 2943, 1528, 1542, 2896,
-     1543, 2945, 1545, 1545, 1545, 1544, 1546, 1546, 1546, 2910,
-     1546, 2896, 2945, 1546, 1548, 1548, 1548, 2911, 1532, 1545,
-     2941, 2910, 1550, 1550, 1550, 2946, 1556, 1556, 1556, 2911,
-     2949, 1535, 1548, 1540, 1558, 1558, 1558, 1542, 1544, 1550,
-     1553, 1553, 1553, 1556, 1553, 2942, 2950, 1553, 1561, 1561,
-     1561, 2951, 1558, 1566, 1566, 1566, 1567, 1567, 1567, 2942,
-     1567, 2941, 2955, 1567, 2952, 2956, 1561, 1571, 1571, 1571,
-
-     1566, 1573, 1573, 1573, 1548, 1574, 1574, 1574, 2957, 1576,
-     1576, 1576, 2952, 1576, 2964, 1571, 1576, 2966, 1573, 1579,
-     1579, 1579, 2970, 1574, 2958, 1580, 1580, 1580, 1558, 1580,
-     2971, 2881, 1580, 1581, 1581, 1581, 1579, 1581, 2972, 2958,
-     1581, 1585, 1585, 1585, 1561, 2963, 1571, 1586, 1586, 1586,
-     2881, 1586, 2881, 2973, 1586, 1588, 1588, 1588, 1585, 1589,
-     1589, 1589, 2976, 1589, 2963, 2881, 1589, 1574, 1592, 1592,
-     1592, 2978, 1592, 1588, 2965, 1592, 1596, 1596, 1596, 1598,
-     1598, 1598, 1602, 1602, 1602, 1604, 1604, 1604, 2980, 1605,
-     1605, 1605, 2981, 2965, 1596, 2982, 2983, 1598, 2984, 2985,
-
-     1602, 2993, 1604, 2994, 2995, 1588, 1605, 1606, 1606, 1606,
-     2997, 1606, 2998, 2975, 1606, 1607, 1607, 1607, 1609, 1609,
-     1609, 1610, 1610, 1610, 2977, 1610, 2999, 3001, 1610, 1613,
-     1613, 1613, 2975, 1607, 3002, 1609, 1615, 1615, 1615, 1617,
-     1617, 1617, 1596, 2977, 3003, 1598, 1602, 1613, 1616, 1616,
-     1616, 3004, 1616, 1615, 3006, 1616, 1617, 1618, 1618, 1618,
-     3009, 3010, 1621, 1621, 1621, 1660, 1660, 1660, 1663, 1663,
-     1663, 1664, 1664, 1664, 3011, 1618, 3012, 3013, 1613, 1607,
-     1621, 1665, 1665, 1665, 1666, 1666, 1666, 1667, 1667, 1667,
-     1668, 1668, 1668, 1670, 1670, 1670, 3014, 3015, 1665, 3016,
-
-     3017, 1666, 3018, 3021, 1667, 3022, 1618, 3023, 1668, 3024,
-     1670, 3025, 3026, 1621, 1671, 1671, 1671, 3029, 1671, 3030,
-     3031, 1671, 1672, 1672, 1672, 1675, 1675, 1675, 3032, 1660,
-     1621, 3033, 1663, 3034, 3036, 1664, 1676, 1676, 1676, 3037,
-     1672, 3038, 3039, 1675, 1677, 1677, 1677, 1678, 1678, 1678,
-     3040, 1667, 3041, 1676, 1679, 1679, 1679, 1668, 1680, 1680,
-     1680, 1677, 1681, 1681, 1681, 1678, 1682, 1682, 1682, 1685,
-     1685, 1685, 1679, 1675, 3042, 1680, 1684, 1684, 1684, 1681,
-     3043, 1672, 3044, 1682, 1683, 1683, 1683, 1685, 1683, 3048,
-     3046, 1683, 3049, 1684, 1686, 1686, 1686, 1687, 1687, 1687,
-
-     3050, 1687, 3046, 3051, 1687, 1688, 1688, 1688, 1689, 1689,
-     1689, 1686, 1678, 3052, 1690, 1690, 1690, 3053, 1690, 1679,
-     1681, 1690, 1688, 3054, 3056, 1689, 1693, 1693, 1693, 1685,
-     1694, 1694, 1694, 1695, 1695, 1695, 1696, 1696, 1696, 1697,
-     1697, 1697, 3047, 1693, 1698, 1698, 1698, 1694, 3061, 2884,
-     1695, 3062, 3063, 1696, 3047, 3064, 1697, 1699, 1699, 1699,
-     3065, 1698, 1700, 1700, 1700, 2884, 1700, 2884, 3066, 1700,
-     3070, 3071, 1689, 3073, 1699, 1701, 1701, 1701, 3075, 1694,
-     2884, 1702, 1702, 1702, 3078, 1697, 1703, 1703, 1703, 3079,
-     1693, 3076, 1701, 3080, 1696, 3081, 3082, 1698, 1702, 1704,
-
-     1704, 1704, 3083, 1703, 1705, 1705, 1705, 1708, 1708, 1708,
-     3084, 1708, 3085, 3086, 1708, 3087, 3076, 1704, 1711, 1711,
-     1711, 3088, 1705, 1712, 1712, 1712, 3089, 3090, 1702, 1713,
-     1713, 1713, 3091, 1713, 3092, 1711, 1713, 3093, 3094, 1703,
-     1712, 3095, 1715, 1715, 1715, 1717, 1717, 1717, 3098, 1717,
-     3099, 3100, 1717, 1720, 1720, 1720, 1724, 1724, 1724, 1705,
-     1715, 3101, 1721, 1721, 1721, 1704, 1721, 3102, 3103, 1721,
-     3106, 1720, 3107, 3108, 1724, 1729, 1729, 1729, 1731, 1731,
-     1731, 1732, 1732, 1732, 1733, 1733, 1733, 3109, 1733, 3110,
-     3111, 1733, 3108, 1729, 3112, 3113, 1731, 3114, 1732, 1720,
-
-     1734, 1734, 1734, 1735, 1735, 1735, 3115, 1735, 3116, 3117,
-     1735, 1739, 1739, 1739, 1741, 1741, 1741, 3118, 1734, 1743,
-     1743, 1743, 3119, 1724, 1731, 3120, 1742, 1742, 1742, 1739,
-     1742, 1741, 3121, 1742, 3122, 3123, 1743, 1745, 1745, 1745,
-     1746, 1746, 1746, 3124, 1746, 3125, 3126, 1746, 1748, 1748,
-     1748, 1751, 1751, 1751, 1745, 1756, 1756, 1756, 1734, 1756,
-     3127, 3128, 1756, 1762, 1762, 1762, 1748, 3129, 3130, 1751,
-     1764, 1764, 1764, 1766, 1766, 1766, 3131, 1739, 1765, 1765,
-     1765, 1762, 1765, 3132, 3136, 1765, 3137, 1764, 1768, 1768,
-     1768, 1766, 1768, 3139, 3140, 1768, 3141, 1772, 1772, 1772,
-
-     3143, 1772, 3135, 1751, 1772, 1776, 1776, 1776, 1778, 1778,
-     1778, 1780, 1780, 1780, 1762, 1781, 1781, 1781, 1782, 1782,
-     1782, 3144, 3135, 1776, 3145, 3146, 1778, 3147, 3148, 1780,
-     3149, 3150, 1781, 3151, 3152, 1782, 1783, 1783, 1783, 1784,
-     1784, 1784, 3153, 1786, 1786, 1786, 3154, 1787, 1787, 1787,
-     3155, 1787, 3156, 1783, 1787, 3157, 3158, 1784, 3159, 1778,
-     1786, 3161, 1780, 1788, 1788, 1788, 1776, 1788, 3162, 3164,
-     1788, 1791, 1791, 1791, 1793, 1793, 1793, 3160, 1793, 3165,
-     3167, 1793, 3168, 3160, 1782, 3169, 1784, 3170, 3171, 1791,
-     1798, 1798, 1798, 1800, 1800, 1800, 3172, 1800, 3174, 3175,
-
-     1800, 3177, 1803, 1803, 1803, 1804, 1804, 1804, 1798, 1804,
-     3178, 3180, 1804, 1805, 1805, 1805, 3181, 3184, 1791, 1803,
-     1810, 1810, 1810, 1822, 1822, 1822, 1825, 1825, 1825, 3186,
-     3188, 1805, 1826, 1826, 1826, 3189, 3190, 1810, 1827, 1827,
-     1827, 1798, 1829, 1829, 1829, 1838, 1838, 1838, 1839, 1839,
-     1839, 1841, 1841, 1841, 1843, 1843, 1843, 3191, 1844, 1844,
-     1844, 3183, 1844, 3193, 1805, 1844, 1845, 1845, 1845, 3195,
-     3197, 1843, 1846, 1846, 1846, 3183, 1846, 3199, 3201, 1846,
-     1848, 1848, 1848, 1845, 1850, 1850, 1850, 3202, 1850, 3203,
-     3204, 1850, 1853, 1853, 1853, 1855, 1855, 1855, 1848, 1856,
-
-     1856, 1856, 1857, 1857, 1857, 3205, 3206, 1858, 1858, 1858,
-     1853, 1858, 1855, 3207, 1858, 3208, 3209, 1856, 3210, 1857,
-     1859, 1859, 1859, 1860, 1860, 1860, 3214, 1860, 3216, 3218,
-     1860, 1861, 1861, 1861, 1862, 1862, 1862, 1859, 1863, 1863,
-     1863, 3219, 3220, 1853, 3221, 3238, 1848, 3230, 3222, 1861,
-     3236, 1464, 1862, 3238, 3236, 1863, 3231, 1864, 1864, 1864,
-     1856, 1864, 3223, 3232, 1864, 1865, 1865, 1865, 1866, 1866,
-     1866, 1460, 1866, 3233, 1459, 1866, 1869, 1869, 1869, 1870,
-     1870, 1870, 1865, 1870, 3222, 3234, 1870, 1871, 1871, 1871,
-     1872, 1872, 1872, 1869, 1872, 3230, 1861, 1872, 3223, 1862,
-
-     1875, 1875, 1875, 3235, 3231, 1871, 1876, 1876, 1876, 3242,
-     1876, 3232, 3244, 1876, 1880, 1880, 1880, 1875, 1881, 1881,
-     1881, 3233, 1881, 3250, 3329, 1881, 1882, 1882, 1882, 3234,
-     3245, 1880, 1885, 1885, 1885, 3329, 1885, 3248, 1871, 1885,
-     1888, 1888, 1888, 1882, 1889, 1889, 1889, 3235, 1889, 3244,
-     1458, 1889, 1892, 1892, 1892, 1457, 3242, 1888, 1893, 1893,
-     1893, 1896, 1896, 1896, 1897, 1897, 1897, 3245, 1897, 3250,
-     1892, 1897, 3248, 1898, 1898, 1898, 1893, 1898, 1896, 3246,
-     1898, 1902, 1902, 1902, 1904, 1904, 1904, 1905, 1905, 1905,
-     1906, 1906, 1906, 1908, 1908, 1908, 1911, 1911, 1911, 1902,
-
-     1914, 1914, 1914, 1892, 3239, 1905, 3243, 1456, 1906, 3237,
-     1908, 1893, 3239, 3237, 1911, 1915, 1915, 1915, 1914, 1915,
-     3246, 3260, 1915, 1918, 1918, 1918, 1920, 1920, 1920, 1922,
-     1922, 1922, 3254, 1922, 3240, 3241, 1922, 3251, 1453, 1908,
-     1906, 1918, 3240, 3241, 1920, 1905, 1925, 1925, 1925, 1914,
-     1926, 1926, 1926, 3243, 1926, 3260, 3247, 1926, 1928, 1928,
-     1928, 3252, 1928, 1925, 3254, 1928, 1932, 1932, 1932, 1918,
-     1935, 1935, 1935, 1936, 1936, 1936, 1937, 1937, 1937, 1939,
-     1939, 1939, 3249, 3251, 1932, 3261, 3262, 1935, 1944, 1944,
-     1944, 1936, 1946, 1946, 1946, 3253, 1946, 3247, 3252, 1946,
-
-     1949, 1949, 1949, 1952, 1952, 1952, 1944, 1954, 1954, 1954,
-     1956, 1956, 1956, 1958, 1958, 1958, 3263, 3249, 1949, 3261,
-     1952, 1959, 1959, 1959, 3255, 1954, 3258, 3259, 1956, 3262,
-     3266, 1958, 3253, 3264, 1936, 1960, 1960, 1960, 1959, 1960,
-     3256, 1451, 1960, 1961, 1961, 1961, 1962, 1962, 1962, 3256,
-     1963, 1963, 1963, 1944, 1963, 3257, 3255, 1963, 1450, 3263,
-     1961, 3258, 3259, 1962, 3257, 3266, 1954, 1964, 1964, 1964,
-     1965, 1965, 1965, 3280, 1966, 1966, 1966, 1958, 1966, 3264,
-     3267, 1966, 1969, 1969, 1969, 1964, 1449, 1965, 3284, 1961,
-     1973, 1973, 1973, 1974, 1974, 1974, 1448, 1983, 1983, 1983,
-
-     1969, 1983, 3280, 1447, 1983, 1986, 1986, 1986, 1973, 1445,
-     1974, 1990, 1990, 1990, 1444, 3267, 1965, 1991, 1991, 1991,
-     1964, 1991, 3284, 1986, 1991, 1992, 1992, 1992, 1990, 1997,
-     1997, 1997, 1998, 1998, 1998, 1969, 1999, 1999, 1999, 2001,
-     2001, 2001, 2005, 2005, 2005, 2006, 2006, 2006, 2007, 2007,
-     2007, 1986, 2008, 2008, 2008, 2010, 2010, 2010, 2014, 2014,
-     2014, 2015, 2015, 2015, 2017, 2017, 2017, 2018, 2018, 2018,
-     2019, 2019, 2019, 2021, 2021, 2021, 3265, 2021, 3268, 3281,
-     2021, 2024, 2024, 2024, 1443, 2024, 3272, 3269, 2024, 2028,
-     2028, 2028, 2030, 2030, 2030, 2032, 2032, 2032, 2008, 2033,
-
-     2033, 2033, 3274, 2033, 3276, 3275, 2033, 2028, 3281, 3290,
-     2030, 3268, 2032, 2034, 2034, 2034, 2019, 2035, 2035, 2035,
-     3269, 2035, 3265, 3272, 2035, 2038, 2038, 2038, 3273, 2038,
-     3270, 2034, 2038, 2041, 2041, 2041, 2042, 2042, 2042, 3270,
-     2028, 2043, 2043, 2043, 3274, 2043, 3271, 3275, 2043, 3291,
-     3276, 2041, 2030, 2041, 2042, 3271, 3290, 2046, 2046, 2046,
-     2047, 2047, 2047, 1442, 2047, 3273, 3294, 2047, 2051, 2051,
-     2051, 3278, 2042, 2034, 2046, 2048, 2048, 2048, 3279, 2048,
-     3282, 3277, 2048, 2052, 2052, 2052, 2051, 2052, 3283, 3282,
-     2052, 2058, 2058, 2058, 3285, 2058, 3291, 3283, 2058, 2061,
-
-     2061, 2061, 2062, 2062, 2062, 3288, 2062, 3294, 3278, 2062,
-     2065, 2065, 2065, 3288, 2065, 3279, 2061, 2065, 2069, 2069,
-     2069, 2070, 2070, 2070, 2071, 2071, 2071, 3277, 3285, 2074,
-     2074, 2074, 3289, 2074, 2051, 2069, 2074, 3286, 1440, 2070,
-     3289, 3287, 2071, 2078, 2078, 2078, 2079, 2079, 2079, 2081,
-     2081, 2081, 2082, 2082, 2082, 3295, 2082, 1439, 1437, 2082,
-     1436, 2078, 1434, 1432, 2079, 3292, 2081, 3293, 2087, 2087,
-     2087, 2088, 2088, 2088, 2090, 2090, 2090, 2093, 2093, 2093,
-     1431, 2093, 3320, 3286, 2093, 2070, 2087, 3287, 3296, 2088,
-     3298, 3320, 2090, 2099, 2099, 2099, 3295, 2079, 2078, 2100,
-
-     2100, 2100, 3292, 2100, 3293, 3300, 2100, 2101, 2101, 2101,
-     2099, 2102, 2102, 2102, 2103, 2103, 2103, 2104, 2104, 2104,
-     2105, 2105, 2105, 3296, 3297, 2101, 2106, 2106, 2106, 2107,
-     2107, 2107, 3302, 2088, 2087, 1430, 3298, 2105, 2108, 2108,
-     2108, 3299, 3300, 2106, 3303, 3304, 2107, 2109, 2109, 2109,
-     2112, 2112, 2112, 3304, 3301, 2108, 2113, 2113, 2113, 3297,
-     2113, 3328, 1429, 2113, 3302, 2109, 3310, 2112, 2115, 2115,
-     2115, 2101, 2117, 2117, 2117, 3328, 3303, 2106, 2120, 2120,
-     2120, 2121, 2121, 2121, 3305, 2121, 2115, 3299, 2121, 3306,
-     2117, 3301, 3305, 2107, 3312, 1428, 2120, 2108, 2124, 2124,
-
-     2124, 2125, 2125, 2125, 3314, 2125, 3311, 3310, 2125, 2127,
-     2127, 2127, 2109, 2127, 1427, 2124, 2127, 2130, 2130, 2130,
-     2131, 2131, 2131, 2132, 2132, 2132, 1426, 2132, 3308, 3312,
-     2132, 2134, 2134, 2134, 3307, 2130, 3306, 2131, 2138, 2138,
-     2138, 2140, 2140, 2140, 2141, 2141, 2141, 3311, 2141, 2134,
-     3314, 2141, 2152, 2152, 2152, 1423, 2138, 1422, 2140, 2153,
-     2153, 2153, 2156, 2156, 2156, 3308, 2156, 1421, 2130, 2156,
-     2152, 2159, 2159, 2159, 2160, 2160, 2160, 2153, 2161, 2161,
-     2161, 3307, 2134, 2164, 2164, 2164, 2165, 2165, 2165, 2167,
-     2167, 2167, 2168, 2168, 2168, 2170, 2170, 2170, 2171, 2171,
-
-     2171, 2152, 2172, 2172, 2172, 2175, 2175, 2175, 2176, 2176,
-     2176, 2179, 2179, 2179, 2180, 2180, 2180, 2182, 2182, 2182,
-     2183, 2183, 2183, 2187, 2187, 2187, 2188, 2188, 2188, 2189,
-     2189, 2189, 2190, 2190, 2190, 2191, 2191, 2191, 3309, 2191,
-     3315, 2187, 2191, 2194, 2194, 2194, 3313, 2189, 3318, 2190,
-     2195, 2195, 2195, 2196, 2196, 2196, 2197, 2197, 2197, 3316,
-     2197, 2194, 1412, 2197, 2200, 2200, 2200, 1410, 2195, 3321,
-     3319, 2196, 2204, 2204, 2204, 3309, 2204, 1405, 3321, 2204,
-     3318, 3313, 2200, 2207, 2207, 2207, 3315, 2195, 2210, 2210,
-     2210, 2212, 2212, 2212, 2194, 2189, 3316, 2211, 2211, 2211,
-
-     2207, 2211, 3319, 1399, 2211, 2210, 2213, 2213, 2213, 2212,
-     2218, 2218, 2218, 3324, 2196, 2219, 2219, 2219, 2220, 2220,
-     2220, 2224, 2224, 2224, 2213, 2221, 2221, 2221, 2218, 2221,
-     3317, 3322, 2221, 2219, 1393, 2220, 3323, 3325, 2224, 2225,
-     2225, 2225, 2226, 2226, 2226, 2227, 2227, 2227, 2228, 2228,
-     2228, 2229, 2229, 2229, 3326, 1389, 2225, 1384, 1380, 2226,
-     3327, 3324, 2227, 3322, 2220, 1379, 2228, 3317, 3323, 2229,
-     2218, 2230, 2230, 2230, 1371, 1366, 2224, 2234, 2234, 2234,
-     2235, 2235, 2235, 1357, 2235, 3325, 3326, 2235, 2230, 2238,
-     2238, 2238, 3327, 2226, 2239, 2239, 2239, 2240, 2240, 2240,
-
-     2225, 1355, 2241, 2241, 2241, 1346, 2241, 2238, 2228, 2241,
-     2242, 2242, 2242, 1341, 2240, 2229, 2243, 2243, 2243, 2244,
-     2244, 2244, 2245, 2245, 2245, 1337, 1332, 2242, 2246, 2246,
-     2246, 1331, 1330, 2243, 1328, 1327, 2244, 2247, 2247, 2247,
-     2245, 1325, 2248, 2248, 2248, 1320, 2248, 1319, 2238, 2248,
-     1314, 2251, 2251, 2251, 2247, 2252, 2252, 2252, 2256, 2256,
-     2256, 1313, 2258, 2258, 2258, 1307, 2258, 2243, 2251, 2258,
-     2244, 1306, 1305, 2252, 1304, 1293, 2256, 2262, 2262, 2262,
-     2263, 2263, 2263, 1282, 2263, 1277, 1276, 2263, 2267, 2267,
-     2267, 1275, 2271, 2271, 2271, 2262, 2271, 1271, 1254, 2271,
-
-     2284, 2284, 2284, 2285, 2285, 2285, 2267, 2298, 2298, 2298,
-     2299, 2299, 2299, 2302, 2302, 2302, 1249, 2251, 2284, 1248,
-     1247, 2285, 2303, 2303, 2303, 2305, 2305, 2305, 2308, 2308,
-     2308, 2311, 2311, 2311, 2267, 2315, 2315, 2315, 2317, 2317,
-     2317, 2318, 2318, 2318, 1242, 2319, 2319, 2319, 2320, 2320,
-     2320, 1241, 2320, 2315, 1228, 2320, 2321, 2321, 2321, 2318,
-     1227, 2284, 2319, 1226, 1225, 2285, 2322, 2322, 2322, 2323,
-     2323, 2323, 1224, 1223, 2321, 2324, 2324, 2324, 2330, 2330,
-     2330, 2331, 2331, 2331, 2322, 2331, 1222, 2323, 2331, 1221,
-     2334, 2334, 2334, 2324, 2334, 2330, 1211, 2334, 2337, 2337,
-
-     2337, 2341, 2341, 2341, 2342, 2342, 2342, 2343, 2343, 2343,
-     2345, 2345, 2345, 2346, 2346, 2346, 2337, 2346, 2341, 1210,
-     2346, 1209, 2342, 1204, 1203, 2343, 1202, 2345, 1201, 1178,
-     2322, 2350, 2350, 2350, 1177, 1170, 2323, 2351, 2351, 2351,
-     2352, 2352, 2352, 1166, 2352, 1161, 1160, 2352, 2350, 2353,
-     2353, 2353, 1155, 1152, 2351, 2354, 2354, 2354, 2355, 2355,
-     2355, 2342, 2356, 2356, 2356, 1151, 2356, 2353, 1148, 2356,
-     2359, 2359, 2359, 2354, 1147, 2355, 2360, 2360, 2360, 2361,
-     2361, 2361, 2362, 2362, 2362, 1146, 2362, 2359, 1145, 2362,
-     2365, 2365, 2365, 1144, 2366, 2366, 2366, 2361, 2366, 1143,
-
-     1142, 2366, 2367, 2367, 2367, 1141, 1140, 2365, 2368, 2368,
-     2368, 2369, 2369, 2369, 1139, 1138, 2354, 1137, 1136, 2367,
-     2371, 2371, 2371, 1135, 1132, 2368, 2372, 2372, 2372, 2369,
-     2373, 2373, 2373, 1131, 2373, 1130, 1129, 2373, 2374, 2374,
-     2374, 1127, 1126, 2372, 2378, 2378, 2378, 2381, 2381, 2381,
-     2394, 2394, 2394, 1125, 1124, 2374, 2412, 2412, 2412, 2413,
-     2413, 2413, 2378, 1123, 1122, 2381, 1121, 1120, 2394, 2418,
-     2418, 2418, 2421, 2421, 2421, 1119, 2422, 2422, 2422, 2424,
-     2424, 2424, 1118, 2424, 1117, 1116, 2424, 1115, 1114, 2421,
-     2427, 2427, 2427, 2374, 2422, 1108, 2429, 2429, 2429, 2430,
-
-     2430, 2430, 2433, 2433, 2433, 2435, 2435, 2435, 2427, 2435,
-     2394, 1104, 2435, 2381, 2429, 1101, 1100, 2430, 1099, 2433,
-     2447, 2447, 2447, 2448, 2448, 2448, 2449, 2449, 2449, 1097,
-     2449, 1093, 1090, 2449, 2450, 2450, 2450, 2447, 1089, 1088,
-     2448, 2451, 2451, 2451, 1084, 2451, 1083, 1080, 2451, 2457,
-     2457, 2457, 2450, 1076, 2458, 2458, 2458, 2429, 2458, 1075,
-     1072, 2458, 2462, 2462, 2462, 2430, 2457, 2459, 2459, 2459,
-     1069, 2459, 1066, 1065, 2459, 2464, 2464, 2464, 1060, 1052,
-     2462, 2465, 2465, 2465, 1051, 2465, 1050, 1048, 2465, 2469,
-     2469, 2469, 1044, 2464, 2470, 2470, 2470, 2471, 2471, 2471,
-
-     1041, 2471, 1038, 1035, 2471, 1034, 2469, 2472, 2472, 2472,
-     1033, 2470, 2474, 2474, 2474, 1032, 2474, 1031, 1030, 2474,
-     1029, 2477, 2477, 2477, 1028, 2472, 2478, 2478, 2478, 1025,
-     2478, 1024, 1021, 2478, 2479, 2479, 2479, 2464, 2477, 2480,
-     2480, 2480, 1020, 2480, 1016, 1014, 2480, 1011, 2481, 2481,
-     2481, 2479, 2481, 1010, 1007, 2481, 2484, 2484, 2484, 2485,
-     2485, 2485, 2486, 2486, 2486, 2489, 2489, 2489, 2490, 2490,
-     2490, 1000,  997, 2484,  996,  995, 2485,  992,  988, 2486,
-     2491, 2491, 2491, 2489, 2502, 2502, 2502, 2519, 2519, 2519,
-     2520, 2520, 2520, 2524, 2524, 2524,  981, 2491, 2527, 2527,
-
-     2527,  977, 2502, 2528, 2528, 2528,  976, 2528,  975,  972,
-     2528, 2529, 2529, 2529,  971, 2527,  970, 2484,  963, 2530,
-     2530, 2530, 2532, 2532, 2532, 2533, 2533, 2533,  962, 2529,
-      961, 2534, 2534, 2534,  960, 2534, 2489, 2530, 2534, 2532,
-      959,  958, 2533,  957, 2502, 2535, 2535, 2535, 2547, 2547,
-     2547, 2548, 2548, 2548,  956, 2548,  955,  951, 2548, 2549,
-     2549, 2549, 2535, 2549,  925, 2547, 2549, 2552, 2552, 2552,
-     2530, 2555, 2555, 2555,  922, 2557, 2557, 2557, 2529, 2557,
-      919,  918, 2557,  911,  910, 2552,  908,  907, 2555, 2566,
-     2566, 2566, 2568, 2568, 2568, 2569, 2569, 2569,  906, 2569,
-
-      905,  904, 2569,  903, 2570, 2570, 2570, 2566, 2570, 2568,
-      902, 2570, 2573, 2573, 2573,  901, 2573,  900,  899, 2573,
-     2576, 2576, 2576,  898, 2576,  896,  895, 2576, 2585, 2585,
-     2585, 2586, 2586, 2586, 2587, 2587, 2587,  894, 2587,  893,
-      892, 2587, 2588, 2588, 2588, 2585,  891,  890, 2586, 2589,
-     2589, 2589,  889, 2589,  887,  886, 2589,  885,  884, 2588,
-     2590, 2590, 2590, 2591, 2591, 2591, 2592, 2592, 2592, 2593,
-     2593, 2593, 2594, 2594, 2594,  883,  882, 2590,  881,  880,
-     2591, 2606, 2606, 2606, 2592, 2609, 2609, 2609, 2585, 2594,
-     2595, 2595, 2595,  879, 2595,  875,  871, 2595,  870, 2606,
-
-      869,  868, 2609, 2609, 2623, 2623, 2623, 2624, 2624, 2624,
-     2627, 2627, 2627, 2628, 2628, 2628, 2630, 2630, 2630,  867,
-     2630,  863,  861, 2630, 2633, 2633, 2633,  860, 2592, 2634,
-     2634, 2634, 2606, 2636, 2636, 2636, 2637, 2637, 2637,  859,
-     2637,  858, 2633, 2637, 2638, 2638, 2638, 2634, 2638,  857,
-     2636, 2638, 2641, 2641, 2641, 2642, 2642, 2642,  856, 2642,
-      853,  852, 2642, 2654, 2654, 2654,  850, 2654,  848, 2641,
-     2654, 2658, 2658, 2658, 2659, 2659, 2659,  845, 2659,  844,
-      843, 2659, 2667, 2667, 2667, 2670, 2670, 2670, 2658, 2670,
-     2633,  842, 2670, 2685, 2685, 2685,  840, 2686, 2686, 2686,
-
-     2667, 2686,  837,  836, 2686, 2689, 2689, 2689,  834, 2689,
-     2685,  833, 2689, 2692, 2692, 2692, 2693, 2693, 2693,  830,
-     2693,  828,  825, 2693, 2694, 2694, 2694, 2695, 2695, 2695,
-     2692, 2695,  824,  823, 2695, 2696, 2696, 2696, 2697, 2697,
-     2697, 2694, 2697,  822,  819, 2697, 2708, 2708, 2708, 2710,
-     2710, 2710,  818, 2696, 2711, 2711, 2711,  817, 2712, 2712,
-     2712,  816, 2712,  815, 2708, 2712, 2710, 2710, 2725, 2725,
-     2725, 2711, 2711, 2726, 2726, 2726, 2712, 2727, 2727, 2727,
-     2728, 2728, 2728, 2729, 2729, 2729, 2696, 2730, 2730, 2730,
-     2735, 2735, 2735,  814,  813, 2708, 2736, 2736, 2736, 2739,
-
-     2739, 2739,  811, 2739,  808,  807, 2739,  803, 2735, 2742,
-     2742, 2742,  802, 2742, 2736,  801, 2742, 2745, 2745, 2745,
-     2756, 2756, 2756, 2757, 2757, 2757,  800, 2757,  799,  798,
-     2757, 2760, 2760, 2760, 2745,  797,  789, 2756, 2780, 2780,
-     2780, 2735, 2781, 2781, 2781,  788, 2781,  785, 2760, 2781,
-     2786, 2786, 2786,  784, 2786, 2780,  783, 2786, 2789, 2789,
-     2789,  782, 2789,  781,  779, 2789, 2792, 2792, 2792, 2801,
-     2801, 2801, 2803, 2803, 2803, 2804, 2804, 2804,  778, 2804,
-      777,  774, 2804,  773, 2792,  772,  769, 2801,  768, 2803,
-     2803,  764,  762, 2804, 2805, 2805, 2805,  759, 2805,  758,
-
-      757, 2805, 2816, 2816, 2816, 2817, 2817, 2817, 2818, 2818,
-     2818,  756, 2805, 2819, 2819, 2819, 2824, 2824, 2824, 2827,
-     2827, 2827,  754, 2827,  751,  750, 2827,  749, 2826, 2826,
-     2826, 2828, 2828, 2828, 2824, 2801, 2806, 2806, 2806, 2806,
-     2806, 2806, 2806, 2806, 2806, 2826,  746, 2806, 2828, 2838,
-     2838, 2838, 2806, 2806, 2806, 2806, 2806, 2839, 2839, 2839,
-      743, 2839,  740,  739, 2839,  738, 2838, 2841, 2841, 2841,
-      737, 2841,  736,  733, 2841, 2840, 2840, 2840, 2866, 2866,
-     2866, 2806, 2806, 2807, 2807, 2807, 2807, 2807, 2807, 2807,
-     2807, 2807, 2840,  730, 2807,  726, 2866,  725,  724, 2807,
-
-     2807, 2807, 2807, 2807, 2859, 2859, 2859,  723, 2859,  722,
-      721, 2859, 2874, 2874, 2874, 2876, 2876, 2876,  720, 2876,
-      719,  718, 2876,  717,  716, 2891, 2891, 2891, 2807, 2807,
-     2874,  714,  712, 2876, 2879, 2879, 2879, 2879, 2879, 2879,
-     2879, 2879, 2879, 2891,  709, 2879, 2897, 2897, 2897,  708,
-     2879, 2879, 2879, 2879, 2879, 2894, 2894, 2894,  707, 2894,
-      706,  705, 2894, 2897, 2898, 2898, 2898,  704, 2898,  699,
-      698, 2898, 2939, 2939, 2939, 2947, 2947, 2947,  697, 2879,
-     2879, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880,
-     2939,  694, 2880, 2947, 2947,  693,  692, 2880, 2880, 2880,
-
-     2880, 2880, 2906, 2906, 2906,  691, 2906,  688,  687, 2906,
-     2909, 2909, 2909,  685, 2909,  682,  681, 2909, 2962, 2962,
-     2962, 2967, 2967, 2967,  678, 2967, 2880, 2880, 2967, 2974,
-     2974, 2974, 2979, 2979, 2979, 2962, 2992, 2992, 2992, 2996,
-     2996, 2996, 3007, 3007, 3007,  677, 2974,  676,  675, 2979,
-      674, 3008, 3008, 3008, 2992, 3008,  673, 2996, 3008, 3007,
-     3019, 3019, 3019, 3020, 3020, 3020,  665, 3020,  664,  663,
-     3020, 3027, 3027, 3027, 3028, 3028, 3028, 3019, 3028,  660,
-      659, 3028, 3035, 3035, 3035, 3045, 3045, 3045, 3027, 3045,
-     2996,  658, 3045,  655, 3058, 3058, 3058,  653, 3058,  652,
-
-     3035, 3058, 3067, 3067, 3067,  649, 3067,  648,  647, 3067,
-     3200, 3200, 3200, 3211, 3211, 3211,  646, 3211,  643, 3035,
-     3211, 3330, 3330, 3330, 3331, 3331, 3331,  642, 3200,  641,
-      640, 3211,  636,  635,  634,  633,  627,  626,  624, 3330,
-      618,  617, 3331, 3334, 3334, 3334, 3334, 3334, 3334, 3334,
-     3334, 3334, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335,
-     3335, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336,
-     3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3338,
-     3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3339, 3339,
-     3339, 3339, 3339, 3339, 3339, 3339, 3339, 3340, 3340, 3340,
-
-     3340, 3340, 3340, 3340, 3340, 3340, 3341, 3341, 3341, 3341,
-     3341, 3341, 3341, 3341, 3341, 3342, 3342, 3342, 3342, 3342,
-     3342, 3342, 3342, 3342, 3343, 3343, 3343, 3343, 3343, 3343,
-     3343, 3343, 3343, 3344, 3344, 3344, 3344, 3344, 3344, 3344,
-     3344, 3344, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345,
-     3345, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346,
-     3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3348,
-     3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3349, 3349,
-     3349, 3349, 3349, 3349, 3349, 3349, 3349, 3350, 3350, 3350,
-     3350, 3350, 3350, 3350, 3350, 3350, 3351, 3351, 3351, 3351,
-
-     3351, 3351, 3351, 3351, 3351, 3352, 3352, 3352, 3352, 3352,
-     3352, 3352, 3352, 3352, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3354, 3354, 3354, 3354, 3354, 3354, 3354,
-     3354, 3354, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355,
-     3355, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356,
-     3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3358,
-     3358, 3358, 3358, 3358, 3358, 3358, 3358, 3358, 3359, 3359,
-     3359, 3359, 3359, 3359, 3359, 3359, 3359, 3360, 3360, 3360,
-     3360, 3360, 3360, 3360, 3360, 3360, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3362, 3362, 3362, 3362, 3362,
-
-     3362, 3362, 3362, 3362, 3363, 3363, 3363, 3363, 3363, 3363,
-     3363, 3363, 3363, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
-     3364, 3364, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365,
-     3365, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366,
-     3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3368,
-     3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3369, 3369,
-     3369, 3369, 3369, 3369, 3369, 3369, 3369, 3370, 3370, 3370,
-     3370, 3370, 3370, 3370, 3370, 3370, 3371, 3371, 3371, 3371,
-     3371, 3371, 3371, 3371, 3371, 3372, 3372, 3372, 3372, 3372,
-     3372, 3372, 3372, 3372, 3373, 3373, 3373, 3373, 3373, 3373,
-
-     3373, 3373, 3373, 3374, 3374, 3374, 3374, 3374, 3374, 3374,
-     3374, 3374, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375,
-     3375, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376,
-     3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3378,
-     3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3379, 3379,
-     3379, 3379, 3379, 3379, 3379, 3379, 3379, 3380, 3380, 3380,
-     3380, 3380, 3380, 3380, 3380, 3380, 3381, 3381, 3381, 3381,
-     3381, 3381, 3381, 3381, 3381, 3382, 3382, 3382, 3382, 3382,
-     3382, 3382, 3382, 3382, 3383, 3383, 3383, 3383, 3383, 3383,
-     3383, 3383, 3383, 3384, 3384, 3384, 3384, 3384, 3384, 3384,
-
-     3384, 3384, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385,
-     3385, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386,
-     3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3388,
-     3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3389, 3389,
-     3389, 3389, 3389, 3389, 3389, 3389, 3389, 3390, 3390, 3390,
-     3390, 3390, 3390, 3390, 3390, 3390, 3391, 3391, 3391, 3391,
-     3391, 3391, 3391, 3391, 3391, 3392, 3392, 3392, 3392, 3392,
-     3392, 3392, 3392, 3392, 3393, 3393, 3393, 3393, 3393, 3393,
-     3393, 3393, 3393, 3394, 3394, 3394,  616,  612,  609, 3394,
-     3395, 3395, 3395,  607,  606,  605, 3395, 3396, 3396, 3396,
-
-      601,  597,  593, 3396, 3397, 3397, 3397,  592,  591,  590,
-     3397, 3398, 3398, 3398,  586,  582,  579, 3398, 3399, 3399,
-     3399,  578,  577,  576, 3399, 3400, 3400, 3400,  572,  566,
-      565, 3400, 3401, 3401, 3401,  561,  557,  553, 3401, 3402,
-     3402, 3402,  549,  542,  540, 3402, 3403, 3403, 3403,  539,
-      535,  529, 3403, 3404, 3404, 3404,  528,  524,  520, 3404,
-     3405, 3405, 3405,  516,  515,  514, 3405, 3406, 3406, 3406,
-      513,  512,  508, 3406, 3407, 3407, 3407,  504,  497,  493,
-     3407, 3408, 3408, 3408,  485,  484,  483, 3408, 3409, 3409,
-     3409,  482,  481,  477, 3409, 3410, 3410, 3410,  471,  470,
-
-      466, 3410, 3411, 3411, 3411,  460,  459,  455, 3411, 3412,
-     3412, 3412,  449,  448,  444, 3412, 3413, 3413, 3413,  440,
-      436,  435, 3413, 3414, 3414, 3414,  434,  430,  426, 3414,
-     3415, 3415, 3415,  422,  418,  412, 3415, 3416, 3416, 3416,
-      411,  410,  406, 3416, 3417, 3417, 3417,  402,  397,  396,
-     3417, 3418, 3418, 3418,  395,  394,  390, 3418, 3419, 3419,
-     3419,  386,  383,  379, 3419, 3420, 3420, 3420,  375,  372,
-      369, 3420, 3421, 3421, 3421, 3421, 3421, 3421, 3421,  367,
-     3421, 3422, 3422, 3422,  366,  361,  354, 3422, 3423,  353,
-      352,  351, 3423, 3424, 3424, 3424,  350,  346,  342, 3424,
-
-     3425,  339,  338,  334, 3425, 3426, 3426, 3426,  330,  327,
-      326, 3426, 3427,  325,  321,  315, 3427, 3428, 3428, 3428,
-      314,  313,  309, 3428, 3429,  303,  299,  296, 3429, 3430,
-     3430, 3430,  295,  290,  289, 3430, 3431,  285,  281,  277,
-     3431, 3432, 3432, 3432,  273,  272,  268, 3432, 3433,  265,
-      264,  263, 3433, 3434, 3434, 3434,  257,  256,  254, 3434,
-     3435,  251,  239,    0, 3435, 3436, 3436, 3436,    0,    0,
-        0, 3436, 3437,    0,    0,    0, 3437, 3438, 3438, 3438,
-        0,    0,    0, 3438, 3439,    0,    0,    0, 3439, 3440,
-     3440, 3440,    0,    0,    0, 3440, 3441,    0,    0,    0,
-
-     3441, 3442, 3442, 3442,    0,    0,    0, 3442, 3443,    0,
-        0,    0, 3443, 3444, 3444, 3444,    0,    0,    0, 3444,
-     3445,    0,    0,    0, 3445, 3446, 3446, 3446,    0,    0,
-        0, 3446, 3447,    0,    0,    0, 3447, 3448, 3448, 3448,
-        0,    0,    0, 3448, 3449,    0,    0,    0, 3449, 3450,
-     3450, 3450,    0,    0,    0, 3450, 3451,    0,    0,    0,
-     3451, 3452, 3452, 3452,    0,    0,    0, 3452, 3453,    0,
-        0,    0, 3453, 3454, 3454, 3454,    0,    0,    0, 3454,
-     3455,    0,    0,    0, 3455, 3456, 3456, 3456,    0,    0,
-        0, 3456, 3457,    0,    0,    0, 3457, 3458, 3458, 3458,
-
-        0,    0,    0, 3458, 3459,    0,    0,    0, 3459, 3460,
-     3460, 3460,    0,    0,    0, 3460, 3461,    0,    0,    0,
-     3461, 3462, 3462, 3462,    0,    0,    0, 3462, 3463,    0,
-        0,    0, 3463, 3464, 3464, 3464,    0,    0,    0, 3464,
-     3465,    0,    0,    0, 3465, 3466, 3466, 3466,    0,    0,
-        0, 3466, 3467,    0,    0,    0, 3467, 3468, 3468, 3468,
-        0,    0,    0, 3468, 3469,    0,    0,    0, 3469, 3470,
-     3470, 3470,    0,    0,    0, 3470, 3471,    0,    0,    0,
-     3471, 3472, 3472, 3472,    0,    0,    0, 3472, 3473,    0,
-        0,    0, 3473, 3474, 3474, 3474,    0,    0,    0, 3474,
-
-     3475,    0,    0,    0, 3475, 3476, 3476, 3476, 3476, 3476,
-     3476, 3476, 3476, 3476, 3477,    0,    0,    0,    0, 3477,
-     3478, 3478, 3478,    0,    0,    0, 3478, 3479, 3479, 3479,
-     3479,    0,    0, 3479, 3479, 3480, 3480, 3480, 3480,    0,
-     3480,    0, 3480, 3481, 3481, 3481, 3481,    0,    0, 3481,
-     3481, 3482, 3482, 3482,    0,    0,    0, 3482, 3483, 3483,
-     3483, 3483,    0,    0, 3483, 3483, 3484, 3484, 3484,    0,
-        0,    0, 3484, 3485, 3485, 3485, 3485,    0,    0, 3485,
-     3485, 3486, 3486, 3486, 3486,    0, 3486,    0, 3486, 3487,
-     3487, 3487, 3487,    0,    0, 3487, 3487, 3488, 3488, 3488,
-
-     3488,    0, 3488,    0, 3488, 3489, 3489, 3489, 3489,    0,
-        0, 3489, 3489, 3490, 3490, 3490, 3490,    0, 3490,    0,
-     3490, 3491, 3491, 3491, 3491,    0,    0, 3491, 3491, 3492,
-     3492, 3492,    0,    0,    0, 3492, 3493, 3493, 3493, 3493,
-        0,    0, 3493, 3493, 3494, 3494, 3494, 3494,    0,    0,
-     3494, 3494, 3495, 3495, 3495,    0,    0,    0, 3495, 3496,
-     3496, 3496, 3496,    0,    0, 3496, 3496, 3497, 3497, 3497,
-        0,    0,    0, 3497, 3498, 3498, 3498, 3498,    0,    0,
-     3498, 3498, 3499, 3499, 3499,    0,    0,    0, 3499, 3500,
-     3500, 3500, 3500,    0,    0, 3500, 3500, 3501, 3501, 3501,
-
-        0,    0,    0, 3501, 3502, 3502, 3502, 3502,    0,    0,
-     3502, 3502, 3503, 3503, 3503,    0,    0,    0, 3503, 3504,
-     3504, 3504, 3504,    0,    0, 3504, 3504, 3505, 3505, 3505,
-        0,    0,    0, 3505, 3506, 3506, 3506, 3506,    0,    0,
-     3506, 3506, 3507, 3507, 3507,    0,    0,    0, 3507, 3508,
-     3508, 3508, 3508,    0,    0, 3508, 3508, 3509, 3509, 3509,
-        0,    0,    0, 3509, 3510, 3510, 3510, 3510,    0,    0,
-     3510, 3510, 3511, 3511, 3511,    0,    0,    0, 3511, 3512,
-     3512, 3512, 3512,    0,    0, 3512, 3512, 3513, 3513, 3513,
-        0,    0,    0, 3513, 3514, 3514, 3514, 3514,    0,    0,
-
-     3514, 3514, 3515, 3515, 3515,    0,    0,    0, 3515, 3516,
-     3516, 3516, 3516,    0,    0, 3516, 3516, 3517, 3517, 3517,
-        0,    0,    0, 3517, 3518, 3518, 3518, 3518,    0,    0,
-     3518, 3518, 3519, 3519, 3519, 3519,    0, 3519,    0, 3519,
-     3520, 3520, 3520, 3520,    0,    0, 3520, 3520, 3521, 3521,
-     3521,    0,    0,    0, 3521, 3522, 3522, 3522, 3522,    0,
-        0, 3522, 3522, 3523, 3523, 3523,    0,    0,    0, 3523,
-     3524, 3524, 3524, 3524,    0,    0, 3524, 3524, 3525, 3525,
-     3525,    0,    0,    0, 3525, 3526, 3526, 3526, 3526,    0,
-        0, 3526, 3526, 3527, 3527, 3527,    0,    0,    0, 3527,
-
-     3528, 3528, 3528, 3528,    0,    0, 3528, 3528, 3529, 3529,
-     3529,    0,    0,    0, 3529, 3530, 3530, 3530, 3530,    0,
-        0, 3530, 3530, 3531, 3531, 3531, 3531, 3531, 3531, 3531,
-     3531, 3531, 3532,    0, 3532,    0,    0, 3532, 3533, 3533,
-     3533,    0,    0,    0, 3533, 3534, 3534, 3534, 3534,    0,
-        0, 3534, 3534, 3535, 3535, 3535,    0,    0,    0, 3535,
-     3536, 3536, 3536, 3536,    0,    0, 3536, 3536, 3537, 3537,
-     3537,    0,    0,    0, 3537, 3538, 3538, 3538, 3538,    0,
-        0, 3538, 3538, 3539, 3539, 3539,    0,    0,    0, 3539,
-     3540, 3540, 3540, 3540,    0,    0, 3540, 3540, 3541, 3541,
-
-     3541,    0,    0,    0, 3541, 3542, 3542, 3542, 3542,    0,
-        0, 3542, 3542, 3543, 3543, 3543, 3543,    0,    0, 3543,
-     3543, 3544, 3544, 3544,    0,    0,    0, 3544, 3545, 3545,
-     3545, 3545,    0,    0, 3545, 3545, 3546, 3546, 3546,    0,
-        0,    0, 3546, 3547, 3547, 3547, 3547,    0,    0, 3547,
-     3547, 3548, 3548, 3548, 3548,    0,    0, 3548, 3548, 3549,
-     3549, 3549,    0,    0,    0, 3549, 3550, 3550, 3550, 3550,
-        0,    0, 3550, 3550, 3551, 3551, 3551, 3551,    0, 3551,
-        0, 3551, 3552, 3552, 3552, 3552,    0,    0, 3552, 3552,
-     3553, 3553, 3553, 3553,    0, 3553,    0, 3553, 3554, 3554,
-
-     3554, 3554,    0,    0, 3554, 3554, 3555, 3555, 3555,    0,
-        0,    0, 3555, 3556, 3556, 3556, 3556,    0,    0, 3556,
-     3556, 3557, 3557, 3557,    0,    0,    0, 3557, 3558, 3558,
-     3558, 3558,    0,    0, 3558, 3558, 3559, 3559, 3559,    0,
-        0,    0, 3559, 3560, 3560, 3560, 3560,    0,    0, 3560,
-     3560, 3561, 3561, 3561, 3561,    0, 3561,    0, 3561, 3562,
-     3562, 3562, 3562,    0,    0, 3562, 3562, 3563, 3563, 3563,
-        0,    0,    0, 3563, 3564, 3564, 3564, 3564,    0,    0,
-     3564, 3564, 3565, 3565, 3565,    0,    0,    0, 3565, 3566,
-     3566, 3566, 3566,    0,    0, 3566, 3566, 3567, 3567, 3567,
-
-        0,    0,    0, 3567, 3568, 3568, 3568, 3568,    0,    0,
-     3568, 3568, 3569, 3569, 3569,    0,    0,    0, 3569, 3570,
-     3570, 3570, 3570,    0,    0, 3570, 3570, 3571, 3571, 3571,
-        0,    0,    0, 3571, 3572, 3572, 3572, 3572,    0,    0,
-     3572, 3572, 3573, 3573, 3573,    0,    0,    0, 3573, 3574,
-     3574, 3574, 3574,    0,    0, 3574, 3574, 3575, 3575, 3575,
-        0,    0,    0, 3575, 3576, 3576, 3576, 3576,    0,    0,
-     3576, 3576, 3577, 3577, 3577,    0,    0,    0, 3577, 3578,
-     3578, 3578, 3578,    0,    0, 3578, 3578, 3579, 3579, 3579,
-        0,    0,    0, 3579, 3580, 3580, 3580, 3580,    0,    0,
-
-     3580, 3580, 3581, 3581, 3581, 3581,    0, 3581,    0, 3581,
-     3582, 3582, 3582, 3582,    0,    0, 3582, 3582, 3583, 3583,
-     3583,    0,    0,    0, 3583, 3584, 3584, 3584, 3584,    0,
-        0, 3584, 3584, 3585, 3585, 3585, 3585, 3585, 3585, 3585,
-     3585, 3585, 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586,
-     3586, 3587, 3587, 3587,    0,    0,    0, 3587, 3588, 3588,
-     3588,    0,    0,    0, 3588, 3589, 3589, 3589, 3589,    0,
-        0, 3589, 3589, 3590, 3590, 3590, 3590,    0, 3590,    0,
-     3590, 3591, 3591, 3591, 3591,    0,    0, 3591, 3591, 3592,
-     3592, 3592,    0,    0,    0, 3592, 3593, 3593, 3593, 3593,
-
-        0,    0, 3593, 3593, 3594, 3594, 3594,    0,    0,    0,
-     3594, 3595, 3595, 3595, 3595,    0,    0, 3595, 3595, 3596,
-     3596, 3596, 3596,    0,    0, 3596, 3596, 3597, 3597, 3597,
-        0,    0,    0, 3597, 3598, 3598, 3598, 3598,    0,    0,
-     3598, 3598, 3599, 3599, 3599, 3599,    0, 3599,    0, 3599,
-     3600, 3600, 3600, 3600,    0,    0, 3600, 3600, 3601, 3601,
-     3601, 3601,    0,    0, 3601, 3601, 3602, 3602, 3602,    0,
-        0,    0, 3602, 3603, 3603, 3603, 3603,    0,    0, 3603,
-     3603, 3604, 3604, 3604, 3604,    0,    0, 3604, 3604, 3605,
-     3605, 3605, 3605,    0,    0, 3605, 3605, 3606, 3606, 3606,
-
-        0,    0,    0, 3606, 3607, 3607, 3607, 3607,    0,    0,
-     3607, 3607, 3608, 3608, 3608,    0,    0,    0, 3608, 3609,
-     3609, 3609, 3609,    0,    0, 3609, 3609, 3610, 3610, 3610,
-     3610,    0, 3610,    0, 3610, 3611, 3611, 3611, 3611,    0,
-        0, 3611, 3611, 3612, 3612, 3612,    0,    0,    0, 3612,
-     3613, 3613, 3613, 3613,    0,    0, 3613, 3613, 3614, 3614,
-     3614,    0,    0,    0, 3614, 3615, 3615, 3615, 3615,    0,
-        0, 3615, 3615, 3616, 3616, 3616,    0,    0,    0, 3616,
-     3617, 3617, 3617, 3617,    0,    0, 3617, 3617, 3618, 3618,
-     3618,    0,    0,    0, 3618, 3619, 3619, 3619, 3619,    0,
-
-        0, 3619, 3619, 3620, 3620, 3620, 3620,    0, 3620,    0,
-     3620, 3621, 3621, 3621, 3621,    0,    0, 3621, 3621, 3622,
-     3622, 3622,    0,    0,    0, 3622, 3623, 3623, 3623, 3623,
-        0,    0, 3623, 3623, 3624, 3624, 3624,    0,    0,    0,
-     3624, 3625, 3625, 3625, 3625,    0,    0, 3625, 3625, 3626,
-     3626, 3626,    0,    0,    0, 3626, 3627, 3627, 3627, 3627,
-        0,    0, 3627, 3627, 3628, 3628, 3628,    0,    0,    0,
-     3628, 3629, 3629, 3629, 3629,    0,    0, 3629, 3629, 3630,
-     3630, 3630,    0,    0,    0, 3630, 3631, 3631, 3631, 3631,
-        0,    0, 3631, 3631, 3632, 3632, 3632,    0,    0,    0,
-
-     3632, 3633, 3633, 3633, 3633,    0,    0, 3633, 3633, 3634,
-     3634, 3634,    0,    0,    0, 3634, 3635, 3635, 3635, 3635,
-        0,    0, 3635, 3635, 3636, 3636, 3636, 3636, 3636, 3636,
-     3636, 3636, 3636, 3637, 3637, 3637, 3637, 3637, 3637, 3637,
-     3637, 3637, 3638, 3638, 3638,    0,    0,    0, 3638, 3639,
-     3639, 3639, 3639,    0, 3639,    0, 3639, 3640, 3640, 3640,
-     3640,    0,    0, 3640, 3640, 3641, 3641, 3641, 3641,    0,
-        0, 3641, 3641, 3642, 3642, 3642,    0,    0,    0, 3642,
-     3643, 3643, 3643, 3643,    0,    0, 3643, 3643, 3644, 3644,
-     3644, 3644,    0, 3644,    0, 3644, 3645, 3645, 3645, 3645,
-
-        0,    0, 3645, 3645, 3646, 3646, 3646, 3646,    0,    0,
-     3646, 3646, 3647, 3647, 3647, 3647,    0, 3647,    0, 3647,
-     3648, 3648, 3648, 3648,    0,    0, 3648, 3648, 3649, 3649,
-     3649, 3649,    0, 3649,    0, 3649, 3650, 3650, 3650, 3650,
-        0,    0, 3650, 3650, 3651, 3651, 3651, 3651,    0,    0,
-     3651, 3651, 3652, 3652, 3652,    0,    0,    0, 3652, 3653,
-     3653, 3653, 3653,    0,    0, 3653, 3653, 3654, 3654, 3654,
-     3654,    0,    0, 3654, 3654, 3655, 3655, 3655, 3655,    0,
-        0, 3655, 3655, 3656, 3656, 3656,    0,    0,    0, 3656,
-     3657, 3657, 3657, 3657,    0,    0, 3657, 3657, 3658, 3658,
-
-     3658,    0,    0,    0, 3658, 3659, 3659, 3659, 3659,    0,
-        0, 3659, 3659, 3660, 3660, 3660, 3660,    0,    0, 3660,
-     3660, 3661, 3661, 3661,    0,    0,    0, 3661, 3662, 3662,
-     3662, 3662,    0,    0, 3662, 3662, 3663, 3663, 3663,    0,
-        0,    0, 3663, 3664, 3664, 3664, 3664,    0,    0, 3664,
-     3664, 3665, 3665, 3665,    0,    0,    0, 3665, 3666, 3666,
-     3666, 3666,    0,    0, 3666, 3666, 3667, 3667, 3667,    0,
-        0,    0, 3667, 3668, 3668, 3668, 3668,    0,    0, 3668,
-     3668, 3669, 3669, 3669, 3669,    0,    0, 3669, 3669, 3670,
-     3670, 3670,    0,    0,    0, 3670, 3671, 3671, 3671, 3671,
-
-        0,    0, 3671, 3671, 3672, 3672, 3672,    0,    0,    0,
-     3672, 3673, 3673, 3673, 3673,    0,    0, 3673, 3673, 3674,
-     3674, 3674,    0,    0,    0, 3674, 3675, 3675, 3675, 3675,
-        0,    0, 3675, 3675, 3676, 3676, 3676, 3676,    0, 3676,
-        0, 3676, 3677, 3677, 3677, 3677,    0,    0, 3677, 3677,
-     3678, 3678, 3678,    0,    0,    0, 3678, 3679, 3679, 3679,
-     3679,    0,    0, 3679, 3679, 3680, 3680, 3680,    0,    0,
-        0, 3680, 3681, 3681, 3681, 3681,    0,    0, 3681, 3681,
-     3682, 3682, 3682,    0,    0,    0, 3682, 3683, 3683, 3683,
-     3683,    0,    0, 3683, 3683, 3684, 3684, 3684, 3684, 3684,
-
-     3684, 3684, 3684, 3684, 3685, 3685, 3685, 3685, 3685, 3685,
-     3685, 3685, 3685, 3686, 3686, 3686, 3686,    0, 3686,    0,
-     3686, 3687, 3687, 3687,    0,    0,    0, 3687, 3688, 3688,
-     3688, 3688,    0,    0, 3688, 3688, 3689, 3689, 3689, 3689,
-        0,    0, 3689, 3689, 3690, 3690, 3690,    0,    0,    0,
-     3690, 3691, 3691, 3691, 3691,    0,    0, 3691, 3691, 3692,
-     3692, 3692, 3692,    0,    0, 3692, 3692, 3693, 3693, 3693,
-     3693,    0,    0, 3693, 3693, 3694, 3694, 3694, 3694,    0,
-     3694,    0, 3694, 3695, 3695, 3695, 3695,    0,    0, 3695,
-     3695, 3696, 3696, 3696,    0,    0,    0, 3696, 3697, 3697,
-
-     3697, 3697,    0,    0, 3697, 3697, 3698, 3698, 3698, 3698,
-        0,    0, 3698, 3698, 3699, 3699, 3699,    0,    0,    0,
-     3699, 3700, 3700, 3700, 3700,    0,    0, 3700, 3700, 3701,
-     3701, 3701, 3701,    0,    0, 3701, 3701, 3702, 3702, 3702,
-        0,    0,    0, 3702, 3703, 3703, 3703,    0,    0,    0,
-     3703, 3704, 3704, 3704, 3704,    0,    0, 3704, 3704, 3705,
-     3705, 3705, 3705,    0,    0, 3705, 3705, 3706, 3706, 3706,
-        0,    0,    0, 3706, 3707, 3707, 3707, 3707,    0,    0,
-     3707, 3707, 3708, 3708, 3708,    0,    0,    0, 3708, 3709,
-     3709, 3709, 3709,    0, 3709,    0, 3709, 3710, 3710, 3710,
-
-     3710,    0,    0, 3710, 3710, 3711, 3711, 3711,    0,    0,
-        0, 3711, 3712, 3712, 3712, 3712,    0,    0, 3712, 3712,
-     3713, 3713, 3713,    0,    0,    0, 3713, 3714, 3714, 3714,
-     3714,    0,    0, 3714, 3714, 3715, 3715, 3715,    0,    0,
-        0, 3715, 3716, 3716, 3716, 3716,    0,    0, 3716, 3716,
-     3717, 3717, 3717,    0,    0,    0, 3717, 3718, 3718, 3718,
-     3718,    0,    0, 3718, 3718, 3719, 3719, 3719, 3719,    0,
-     3719,    0, 3719, 3720, 3720, 3720, 3720,    0,    0, 3720,
-     3720, 3721, 3721, 3721, 3721,    0, 3721,    0, 3721, 3722,
-     3722, 3722, 3722,    0,    0, 3722, 3722, 3723, 3723, 3723,
-
-        0,    0,    0, 3723, 3724, 3724, 3724, 3724,    0,    0,
-     3724, 3724, 3725, 3725, 3725, 3725,    0, 3725,    0, 3725,
-     3726, 3726, 3726, 3726,    0,    0, 3726, 3726, 3727, 3727,
-     3727, 3727, 3727, 3727, 3727, 3727, 3727, 3728, 3728, 3728,
-     3728, 3728, 3728, 3728, 3728, 3728, 3729, 3729, 3729,    0,
-        0,    0, 3729, 3730, 3730, 3730, 3730,    0,    0, 3730,
-     3730, 3731, 3731, 3731, 3731,    0,    0, 3731, 3731, 3732,
-     3732, 3732,    0,    0,    0, 3732, 3733, 3733, 3733, 3733,
-        0,    0, 3733, 3733, 3734, 3734, 3734, 3734,    0,    0,
-     3734, 3734, 3735, 3735, 3735, 3735,    0,    0, 3735, 3735,
-
-     3736, 3736, 3736, 3736,    0,    0, 3736, 3736, 3737, 3737,
-     3737,    0,    0,    0, 3737, 3738, 3738, 3738, 3738,    0,
-        0, 3738, 3738, 3739, 3739, 3739, 3739,    0,    0, 3739,
-     3739, 3740, 3740, 3740,    0,    0,    0, 3740, 3741, 3741,
-     3741, 3741,    0,    0, 3741, 3741, 3742, 3742, 3742, 3742,
-        0,    0, 3742, 3742, 3743, 3743, 3743,    0,    0,    0,
-     3743, 3744, 3744, 3744,    0,    0,    0, 3744, 3745, 3745,
-     3745, 3745,    0,    0, 3745, 3745, 3746, 3746, 3746, 3746,
-        0,    0, 3746, 3746, 3747, 3747, 3747,    0,    0,    0,
-     3747, 3748, 3748, 3748,    0,    0,    0, 3748, 3749, 3749,
-
-     3749, 3749,    0,    0, 3749, 3749, 3750, 3750, 3750, 3750,
-        0, 3750,    0, 3750, 3751, 3751, 3751, 3751,    0,    0,
-     3751, 3751, 3752, 3752, 3752,    0,    0,    0, 3752, 3753,
-     3753, 3753, 3753,    0,    0, 3753, 3753, 3754, 3754, 3754,
-        0,    0,    0, 3754, 3755, 3755, 3755,    0,    0,    0,
-     3755, 3756, 3756, 3756, 3756,    0,    0, 3756, 3756, 3757,
-     3757, 3757,    0,    0,    0, 3757, 3758, 3758, 3758, 3758,
-        0,    0, 3758, 3758, 3759, 3759, 3759,    0,    0,    0,
-     3759, 3760, 3760, 3760, 3760,    0,    0, 3760, 3760, 3761,
-     3761, 3761,    0,    0,    0, 3761, 3762, 3762, 3762, 3762,
-
-        0,    0, 3762, 3762, 3763, 3763, 3763, 3763, 3763, 3763,
-     3763, 3763, 3763, 3764, 3764, 3764, 3764, 3764, 3764, 3764,
-     3764, 3764, 3765, 3765, 3765,    0,    0,    0, 3765, 3766,
-     3766, 3766, 3766,    0,    0, 3766, 3766, 3767, 3767, 3767,
-     3767,    0,    0, 3767, 3767, 3768, 3768, 3768, 3768,    0,
-     3768,    0, 3768, 3769, 3769, 3769, 3769,    0,    0, 3769,
-     3769, 3770, 3770, 3770, 3770,    0,    0, 3770, 3770, 3771,
-     3771, 3771, 3771,    0,    0, 3771, 3771, 3772, 3772, 3772,
-     3772,    0,    0, 3772, 3772, 3773, 3773, 3773,    0,    0,
-        0, 3773, 3774, 3774, 3774, 3774,    0,    0, 3774, 3774,
-
-     3775, 3775, 3775,    0,    0,    0, 3775, 3776, 3776, 3776,
-     3776,    0,    0, 3776, 3776, 3777, 3777, 3777, 3777,    0,
-        0, 3777, 3777, 3778, 3778, 3778, 3778,    0, 3778,    0,
-     3778, 3779, 3779, 3779, 3779,    0, 3779,    0, 3779, 3780,
-     3780, 3780, 3780,    0,    0, 3780, 3780, 3781, 3781, 3781,
-     3781,    0,    0, 3781, 3781, 3782, 3782, 3782, 3782,    0,
-     3782,    0, 3782, 3783, 3783, 3783,    0,    0,    0, 3783,
-     3784, 3784, 3784, 3784,    0,    0, 3784, 3784, 3785, 3785,
-     3785, 3785,    0, 3785,    0, 3785, 3786, 3786, 3786, 3786,
-        0,    0, 3786, 3786, 3787, 3787, 3787, 3787,    0, 3787,
-
-        0, 3787, 3788, 3788, 3788,    0,    0,    0, 3788, 3789,
-     3789, 3789,    0,    0,    0, 3789, 3790, 3790, 3790,    0,
-        0,    0, 3790, 3791, 3791, 3791, 3791,    0,    0, 3791,
-     3791, 3792, 3792, 3792,    0,    0,    0, 3792, 3793, 3793,
-     3793, 3793,    0,    0, 3793, 3793, 3794, 3794, 3794,    0,
-        0,    0, 3794, 3795, 3795, 3795, 3795,    0,    0, 3795,
-     3795, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
-     3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3798,
-     3798, 3798,    0,    0,    0, 3798, 3799, 3799, 3799, 3799,
-        0,    0, 3799, 3799, 3800, 3800, 3800, 3800,    0,    0,
-
-     3800, 3800, 3801, 3801, 3801, 3801,    0,    0, 3801, 3801,
-     3802, 3802, 3802, 3802,    0,    0, 3802, 3802, 3803, 3803,
-     3803,    0,    0,    0, 3803, 3804, 3804, 3804,    0,    0,
-        0, 3804, 3805, 3805, 3805, 3805,    0,    0, 3805, 3805,
-     3806, 3806, 3806,    0,    0,    0, 3806, 3807, 3807, 3807,
-     3807, 3807, 3807, 3807, 3807, 3807, 3808, 3808, 3808, 3808,
-     3808, 3808, 3808, 3808, 3808, 3809, 3809, 3809, 3809, 3809,
-     3809, 3809, 3809, 3809, 3810, 3810, 3810, 3810, 3810, 3810,
-     3810, 3810, 3810, 3811, 3811, 3811, 3811, 3811, 3811, 3811,
-     3811, 3811, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812,
-
-     3812, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
-     3333, 3333, 3333, 3333, 3333, 3333
+      114,  114,  683,  114,  114,  114,  114,  114,  163,  163,
+      163,  164,  164,  164,  167,  167,  167,  920,  683,  168,
+      168,  168,  727,  581,  163,  581,  727,  164,  920, 1784,
+      167,  920, 1785,  114,  114,  168, 1790, 1792,  581, 1793,
+
+      581,  651,  651,  651,  114,  123,  123,  123,  123,  123,
+      123,  123,  123,  123,  123,  123,  123,  123,  123,  123,
+      694,  123,  123,  123,  123,  123,  171,  171,  171,  172,
+      172,  172,  173,  173,  173, 1795,  694,  174,  174,  174,
+     1796, 1797,  171, 1798,  706,  172, 1799, 1802,  173, 1803,
+     1804,  123,  123,  174,  123,  720,  123,  661,  661,  661,
+      706, 1808,  123,  665,  665,  665,  675,  675,  675,  123,
+     1817,  720,  123,  124,  124,  124,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,  124,  124,  124, 1820,  124,
+      124,  124,  124,  124,  177,  177,  177,  178,  178,  178,
+
+      179,  179,  179, 1828,  757,  180,  180,  180, 1830, 1832,
+      177,  757, 1000,  178, 1833, 1834,  179,  757, 1836,  124,
+      124,  180,  124, 1841,  124,  680,  680,  680, 1000, 1844,
+      124,  691,  691,  691,  700,  700,  700,  124, 1845, 1135,
+      124,  133,  133,  133,  133,  133,  133,  133,  133,  133,
+      133,  133,  133,  133,  133,  133, 1135,  133,  133,  133,
+      133,  133,  181,  181,  181,  182,  182,  182,  183,  183,
+      183, 1847, 1302,  184,  184,  184, 1852, 1235,  181,  688,
+     1857,  182, 1858, 1519,  183, 1302,  688,  133,  133,  184,
+      185,  185,  185,  133, 1235,  688, 1519, 1862,  133,  703,
+
+      703,  703,  711,  711,  711, 1865,  185,  717,  717,  717,
+      133,  134,  134,  134,  134,  134,  134,  134,  134,  134,
+      134,  134,  134,  134,  134,  134, 1868,  134,  134,  134,
+      134,  134,  186,  186,  186,  187,  187,  187,  188,  188,
+      188, 1864, 1871,  189,  189,  189, 1872, 1874,  186,  701,
+     1875,  187, 1876, 1877,  188, 1878,  701,  134,  134,  189,
+      190,  190,  190,  134, 1879,  701, 1864, 1881,  134,  726,
+      726,  726,  729,  729,  729, 1882,  190, 1280, 1280, 1280,
+      134,  137,  137,  137,  137,  137,  137,  137,  137,  137,
+      137,  137,  137,  137,  137,  137, 1884,  137,  137,  137,
+
+      137,  137,  191,  191,  191,  192,  192,  192,  193,  193,
+      193, 1885,  762,  194,  194,  194, 1103, 1888,  191,  762,
+     1889,  192, 1891, 1893,  193,  762, 1103,  137,  137,  194,
+     1003, 1003, 1003, 1103, 1003,  137,  138,  138,  138,  138,
+      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
+      138, 1896,  138,  138,  138,  138,  138,  195,  195,  195,
+      196,  196,  196,  199,  199,  199, 1898,  769,  200,  200,
+      200, 1899, 1900,  195,  769, 1901,  196, 1902, 1904,  199,
+      769, 1905,  138,  138,  200,  738,  738,  738, 1909, 1912,
+      138,  147,  147,  147,  147,  147,  147,  147,  147,  147,
+
+      147,  147,  147,  147,  147,  147, 1919,  147,  147,  147,
+      147,  147,  201,  201,  201,  202,  202,  202,  203,  203,
+      203, 1920,  776,  204,  204,  204, 1924, 1925,  201,  776,
+     1926,  202, 1928,  918,  203,  776,  921,  147,  147,  204,
+      918,  147, 1932,  921, 1933,  738,  918, 1968,  147,  921,
+     1969,  147, 1976, 1016, 1016, 1016, 1987, 1988,  147,  148,
+      148,  148,  148,  148,  148,  148,  148,  148,  148,  148,
+      148,  148,  148,  148, 1989,  148,  148,  148,  148,  148,
+      205,  205,  205,  206,  206,  206,  209,  209,  209, 1990,
+     1992,  210,  210,  210, 2000, 2002,  205, 2006, 2009,  206,
+
+     2011, 2012,  209, 2015, 2016,  148,  148,  210, 2017,  148,
+     1012, 1012, 1012, 2018, 1012, 2022,  148, 1012, 1016,  148,
+     1303, 1303, 1303, 1650, 1650, 1650,  148,  157,  157,  157,
+      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
+      157,  157, 2023,  157,  157,  157,  157,  157,  213,  213,
+      213,  214,  214,  214,  217,  217,  217, 2024, 2029,  218,
+      218,  218, 2033, 2037,  213, 2039, 2041,  214, 2047, 2054,
+      217, 2058, 2059,  157,  157,  218, 1037, 1037, 1037,  157,
+     1645, 1645, 1645, 2061,  157,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+
+     2068,  158,  158,  158,  158,  158,  219,  219,  219,  220,
+      220,  220,  221,  221,  221, 2075, 2079,  222,  222,  222,
+     2081, 2082,  219, 2084, 2085,  220, 2087, 1645,  221, 2088,
+     2089,  158,  158,  222, 1050, 1050, 1050,  158, 1647, 1647,
+     1647, 1037,  158,  161,  161,  161,  161,  161,  161,  161,
+      161,  161,  161,  161,  161,  161,  161,  161, 2075,  161,
+      161,  161,  161,  161,  223,  223,  223,  224,  224,  224,
+      227,  227,  227, 2076, 2090,  228,  228,  228, 2092, 2093,
+      223, 2074, 2097,  224, 2099, 1647,  227, 2100, 2101,  161,
+      161,  228,  231,  231,  231,  232,  232,  232, 2074, 1050,
+
+      161, 2102, 1074, 1074, 1074, 2104, 1074, 2076,  231, 1074,
+     2105,  232, 2106,  161,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  162,  162,  162, 2083,
+      162,  162,  162,  162,  162,  233,  233,  233,  234,  234,
+      234,  235,  235,  235, 2107, 2083,  236,  236,  236, 2110,
+     2112,  233, 2113, 2083,  234, 2118, 2120,  235, 2121, 2122,
+      162,  162,  236,  237,  237,  237,  238,  238,  238, 2123,
+     2124,  162, 2126, 1093, 1093, 1093, 2131, 1093, 2159,  237,
+     1093, 2160,  238, 2161,  162,  165,  165,  165,  165,  165,
+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
+
+     2103,  165,  165,  165,  165,  165,  241,  241,  241,  242,
+      242,  242,  243,  243,  243, 2165, 2103,  244,  244,  244,
+     2166, 2172,  241, 2173, 2103,  242, 2176, 2177,  243, 2183,
+     2189,  165,  165,  244,  245,  245,  245, 1095, 1095, 1095,
+     2191, 1095, 2192, 2195, 1095, 2201, 2203,  165, 2209, 2213,
+      245, 2216,  165,  166,  166,  166,  166,  166,  166,  166,
+      166,  166,  166,  166,  166,  166,  166,  166, 2221,  166,
+      166,  166,  166,  166,  246,  246,  246,  247,  247,  247,
+      248,  248,  248, 2223, 2224,  255,  255,  255, 2225, 2226,
+      246, 2233, 2235,  247, 2237, 2239,  248,  252,  252,  166,
+
+      166,  255,  252,  256,  256,  256, 1105, 1105, 1105, 2252,
+     1105, 2253,  252, 1105, 2254,  166, 1653, 1653, 1653,  256,
+      166,  169,  169,  169,  169,  169,  169,  169,  169,  169,
+      169,  169,  169,  169,  169,  169, 2257,  169,  169,  169,
+      169,  169,  252,  259,  259,  259,  260,  260,  260,  261,
+      261,  261, 2258,  262,  262,  262,  746,  746,  746,  259,
+     2260, 2261,  260, 2262, 2264,  261, 2259,  169,  169,  262,
+      169,  169,  169,  746, 2259, 1108, 1108, 1108,  169, 1108,
+     2276,  169, 1108, 2284, 2280, 1146, 1146, 1146,  169,  170,
+      170,  170,  170,  170,  170,  170,  170,  170,  170,  170,
+
+      170,  170,  170,  170, 2285,  170,  170,  170,  170,  170,
+      263,  263,  263,  264,  264,  264,  265,  265,  265, 2263,
+     2286,  266,  266,  266, 2278, 2287,  263, 2263, 2288,  264,
+     2278, 2280,  265, 2292, 2294,  170,  170,  266,  170,  170,
+      170, 1122, 1122, 1122, 2295, 1122,  170, 2296, 1122,  170,
+     1146, 1658, 1658, 1658, 2301, 2302,  170,  175,  175,  175,
+      175,  175,  175,  175,  175,  175,  175,  175,  175,  175,
+      175,  175, 2304,  175,  175,  175,  175,  175,  267,  267,
+      267,  268,  268,  268,  269,  269,  269, 1658, 2279,  270,
+      270,  270, 2305, 2306,  267, 2307, 2310,  268, 2314, 2315,
+
+      269, 2322, 2324,  175,  175,  270,  271,  271,  271,  272,
+      272,  272, 1129, 1129, 1129, 2331, 1129, 2333, 2364, 1129,
+     2279, 2365,  271, 2366, 2372,  272, 2373,  175,  176,  176,
+      176,  176,  176,  176,  176,  176,  176,  176,  176,  176,
+      176,  176,  176, 2377,  176,  176,  176,  176,  176,  273,
+      273,  273,  274,  274,  274,  275,  275,  275, 2381, 2382,
+      276,  276,  276, 2386, 2389,  273, 2392, 2393,  274, 2394,
+     2395,  275, 2398, 2401,  176,  176,  276,  277,  277,  277,
+      278,  278,  278, 1138, 1138, 1138, 2405, 1138, 2406, 2407,
+     1138, 2419, 2422,  277, 2424, 2427,  278, 2434,  176,  197,
+
+      197,  197,  197,  197,  197,  197,  197,  197,  197,  197,
+      197,  197,  197,  197, 2441,  197,  197,  197,  197,  197,
+      281,  281,  281,  282,  282,  282,  283,  283,  283, 2443,
+     2444,  284,  284,  284, 2445, 2450,  281, 2451, 2452,  282,
+     2453, 2454,  283, 2455, 2456,  197,  197,  284,  285,  285,
+      285, 2457, 2458,  197, 2459,  197, 2469, 2473,  197, 1659,
+     1659, 1659,  197, 2480,  285, 2472,  197,  198,  198,  198,
+      198,  198,  198,  198,  198,  198,  198,  198,  198,  198,
+      198,  198, 2481,  198,  198,  198,  198,  198,  286,  286,
+      286,  287,  287,  287,  288,  288,  288, 2482,  805,  805,
+
+      805,  827,  827,  827,  286, 2473, 2485,  287, 2488, 2472,
+      288, 2492, 2493,  198,  198,  805, 2494,  331,  827, 2497,
+     2498,  198,  506,  198, 2499, 2502,  198,  331, 2505, 2506,
+      198, 2507,  506, 2508,  198,  207,  207,  207,  207,  207,
+      207,  207,  207,  207,  207,  207,  207,  207,  207,  207,
+     2530,  207,  207,  207,  207,  207,  331, 2531, 2537,  828,
+      828,  828,  506, 2532, 2538, 1014, 1014, 1014,  506, 2544,
+      331, 2545,  331, 2532,  331,  506,  828, 2546, 2560,  506,
+      331,  207,  207, 1014, 2561,  506, 2562, 2582,  714, 1140,
+     1140, 1140,  207, 1140, 2583, 2589, 1140, 2594,  714, 2596,
+
+     1665, 1665, 1665, 2597, 2602,  207,  208,  208,  208,  208,
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
+      208, 2603,  208,  208,  208,  208,  208,  714, 2604,  838,
+      838,  838,  840,  840,  840, 2605, 2606,  854,  854,  854,
+     2607,  714, 2608,  714, 2609,  714,  838, 1665, 2610,  840,
+     2611,  714,  208,  208,  854,  860,  860,  860,  869,  869,
+      869, 2616, 2621,  208, 1150, 1150, 1150, 2622, 1150, 2624,
+     2625, 1150,  860, 2626, 2619,  869,  208,  211,  211,  211,
+      211,  211,  211,  211,  211,  211,  211,  211,  211,  211,
+      211,  211, 2627,  211,  211,  211,  211,  211,  870,  870,
+
+      870,  881,  881,  881,  889,  889,  889, 2619,  893,  893,
+      893,  906,  906,  906, 2629,  870, 2630, 2623,  881, 2633,
+     2634,  889, 2620,  211,  211,  893, 2623, 2635,  906, 1158,
+     1158, 1158,  211, 1158,  211, 2638, 1158, 2640,  211, 2641,
+     1667, 1667, 1667,  211,  211,  212,  212,  212,  212,  212,
+      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
+     2620,  212,  212,  212,  212,  212,  932,  932,  932,  938,
+      938,  938,  955,  955,  955, 2628,  961,  961,  961,  967,
+      967,  967, 2644,  932, 2628, 2645,  938, 1667, 2646,  955,
+     2648,  212,  212,  961, 2649, 2651,  967, 1162, 1162, 1162,
+
+      212, 1162,  212, 2672, 1162, 2673,  212, 1668, 1668, 1668,
+     2674,  212,  212,  215,  215,  215,  215,  215,  215,  215,
+      215,  215,  215,  215,  215,  215,  215,  215, 2675,  215,
+      215,  215,  215,  215,  975,  975,  975,  988,  988,  988,
+     1011, 1011, 1011, 2678, 1054, 1054, 1054, 1056, 1056, 1056,
+     2679,  975, 2685, 2686,  988, 2693, 2681, 1011, 2681,  215,
+      215, 1054, 2694, 2695, 1056,  215, 1174, 1174, 1174, 2703,
+     1174, 2681, 2704, 1174, 2719, 1672, 1672, 1672, 2720, 2721,
+      215,  216,  216,  216,  216,  216,  216,  216,  216,  216,
+      216,  216,  216,  216,  216,  216, 2722,  216,  216,  216,
+
+      216,  216, 1015, 1015, 1015, 1058, 1058, 1058, 1059, 1059,
+     1059, 1672, 2725, 1055, 1055, 1055, 2727, 1057, 1057, 1057,
+     1015, 2728, 2729, 1058, 2730, 2063, 1059,  216,  216, 2731,
+     1055, 2063, 2732,  216, 1057, 2063, 1196, 1196, 1196, 1015,
+     1196, 2063, 2733, 1196, 2734, 1059, 2735, 2736,  216,  225,
+      225,  225,  225,  225,  225,  225,  225,  225,  225,  225,
+      225,  225,  225,  225, 1055,  225,  225,  225,  225,  225,
+     1066, 1066, 1066, 1070, 1070, 1070, 2737, 1057, 2738, 1055,
+     1067, 1067, 1067, 1071, 1071, 1071, 2740, 2682, 1066, 2682,
+     2741, 1070, 1674, 1674, 1674,  225,  225, 2743, 1067, 2744,
+
+      225, 1071, 2682, 1686, 1686, 1686,  225,  226,  226,  226,
+      226,  226,  226,  226,  226,  226,  226,  226,  226,  226,
+      226,  226, 2742,  226,  226,  226,  226,  226, 1674, 2745,
+     1067, 2742, 1073, 1073, 1073, 2746, 2748, 1076, 1076, 1076,
+     2749, 1077, 1077, 1077, 1078, 1078, 1078, 2747, 1071, 1073,
+     1686, 2750, 2752,  226,  226, 1076, 2747, 2755,  226, 1077,
+     2756, 1078, 2757, 2753,  226,  229,  229,  229,  229,  229,
+      229,  229,  229,  229,  229,  229,  229,  229,  229,  229,
+     2758,  229,  229,  229,  229,  229, 1080, 1080, 1080, 1077,
+     1081, 1081, 1081, 2752, 2759, 1082, 1082, 1082, 1079, 1079,
+
+     1079, 2753, 2760, 1080, 1083, 1083, 1083, 2761, 1081, 2762,
+     2763,  229,  229, 1082,  229, 1079,  229, 1873, 1873, 1873,
+     2764, 1083,  229, 1202, 1202, 1202, 2765, 1202, 2766, 2767,
+     1202, 2768, 2769,  229,  230,  230,  230,  230,  230,  230,
+      230,  230,  230,  230,  230,  230,  230,  230,  230, 1079,
+      230,  230,  230,  230,  230, 1084, 1084, 1084, 1085, 1085,
+     1085, 1086, 1086, 1086, 1079, 2772, 2773, 1082, 2775, 1087,
+     1087, 1087, 1084, 1088, 1088, 1088, 1085, 2776, 2777, 1086,
+      230,  230, 2779,  230, 2780,  230, 1087, 1880, 1880, 1880,
+     1088,  230, 1218, 1218, 1218, 2800, 1218, 2801, 2803, 1218,
+
+     2807, 2808,  230,  239,  239,  239,  239,  239,  239,  239,
+      239,  239,  239,  239,  239,  239,  239,  239, 2809,  239,
+      239,  239,  239,  239, 1088, 1089, 1089, 1089, 1090, 1090,
+     1090, 2064, 2811, 1086, 1091, 1091, 1091, 2064, 2812, 1088,
+     2810, 2064, 1089, 1101, 1101, 1101, 1090, 2064, 2814,  239,
+      239, 2810, 1091, 2815,  239, 1224, 1224, 1224, 2813, 1224,
+      239, 1101, 1224, 2754,  239, 1883, 1883, 1883, 2823, 2813,
+      239,  240,  240,  240,  240,  240,  240,  240,  240,  240,
+      240,  240,  240,  240,  240,  240, 2824,  240,  240,  240,
+      240,  240, 1092, 1092, 1092, 1094, 1094, 1094, 1096, 1096,
+
+     1096, 1230, 1230, 1230, 2825, 1230, 1091, 2754, 1230, 1092,
+     2837, 2853, 1094, 2856, 2857, 1096, 2851,  240,  240, 1097,
+     1097, 1097,  240, 1238, 1238, 1238, 2851, 1238,  240, 2851,
+     1238, 2861,  240, 1886, 1886, 1886, 1097, 2862,  240,  249,
+      249,  249,  249,  249,  249,  249,  249,  249,  249,  249,
+      249,  249,  249,  249, 2863,  249,  249,  249,  249,  249,
+     1887, 1887, 1887, 1098, 1098, 1098, 2864, 1104, 1104, 1104,
+     2865, 2866, 1097, 1099, 1099, 1099, 2867, 1100, 1100, 1100,
+     1098, 1102, 1102, 1102, 1104,  249,  249, 1890, 1890, 1890,
+     1099, 2868, 2869,  249, 1100, 2870,  249, 2872, 2873, 1102,
+
+     1892, 1892, 1892,  249,  250,  250,  250,  250,  250,  250,
+      250,  250,  250,  250,  250,  250,  250,  250,  250, 1098,
+      250,  250,  250,  250,  250, 1099, 1107, 1107, 1107, 1102,
+     1100, 1109, 1109, 1109, 1119, 1119, 1119, 1120, 1120, 1120,
+     1121, 1121, 1121, 1107, 1123, 1123, 1123, 2874, 1109, 2875,
+      250,  250, 1119, 2852, 2876, 1120, 2877, 1121,  250, 2878,
+     2879,  250, 1123, 2852, 2880, 1892, 2852, 2881,  250,  253,
+      253,  253,  253,  253,  253,  253,  253,  253,  253,  253,
+      253,  253,  253,  253, 2882,  253,  253,  253,  253,  253,
+     2883, 1124, 1124, 1124, 2889, 2890, 1120, 1128, 1128, 1128,
+
+     1133, 1133, 1133, 1134, 1134, 1134, 1137, 1137, 1137, 1124,
+     1139, 1139, 1139, 2891, 1128,  253,  253, 2892, 1133, 2893,
+     2894, 1134,  253, 1137, 1895, 1895, 1895, 1139,  253, 1250,
+     1250, 1250, 2895, 1250, 2896, 2887, 1250,  253,  254,  254,
+      254,  254,  254,  254,  254,  254,  254,  254,  254,  254,
+      254,  254,  254, 1124,  254,  254,  254,  254,  254, 1141,
+     1141, 1141, 1144, 1144, 1144, 1134, 2886, 2897, 1142, 1142,
+     1142, 1145, 1145, 1145, 1154, 1154, 1154, 1141, 2887, 2888,
+     1144, 1149, 1149, 1149,  254,  254, 1142, 2898, 2899, 1145,
+     2900,  254, 1154, 1768, 1768, 1768, 2886,  254, 1149, 2901,
+
+     1894, 1894, 1894, 1897, 1897, 1897,  254,  257,  257,  257,
+      257,  257,  257,  257,  257,  257,  257,  257,  257,  257,
+      257,  257, 2888,  257,  257,  257,  257,  257, 2903, 1768,
+     1142, 2905, 1145, 1155, 1155, 1155, 2906, 2907, 1157, 1157,
+     1157, 1159, 1159, 1159, 1160, 1160, 1160, 1894, 1161, 1161,
+     1161, 1155, 2909,  257,  257, 1157, 1272, 1272, 1272, 1159,
+     1272, 2910, 1160, 1272,  257, 1161, 1903, 1903, 1903, 1906,
+     1906, 1906, 2911,  257,  258,  258,  258,  258,  258,  258,
+      258,  258,  258,  258,  258,  258,  258,  258,  258, 1155,
+      258,  258,  258,  258,  258, 1164, 1164, 1164, 2923, 2928,
+
+     1160, 1165, 1165, 1165, 1168, 1168, 1168, 1169, 1169, 1169,
+     1173, 1173, 1173, 1164, 2929, 1175, 1175, 1175, 2930, 1165,
+      258,  258, 1168, 2931, 2932, 1169, 2915, 1173, 1907, 1907,
+     1907,  258, 1175, 1911, 1911, 1911, 1978, 1978, 1978, 2915,
+      258,  279,  279,  279,  279,  279,  279,  279,  279,  279,
+      279,  279,  279,  279,  279,  279, 2933,  279,  279,  279,
+      279,  279, 2916, 1165, 1178, 1178, 1178, 2934, 2935, 1169,
+     2936, 2937, 1179, 1179, 1179, 2916, 1182, 1182, 1182, 1183,
+     1183, 1183, 1178, 1193, 1193, 1193, 2938,  279,  279, 2946,
+     1179, 2948, 2952,  279, 1182, 2953,  279, 1183, 1321, 1321,
+
+     1321, 1193, 1321, 2954, 2955, 1321, 2956, 2957,  279,  280,
+      280,  280,  280,  280,  280,  280,  280,  280,  280,  280,
+      280,  280,  280,  280, 1179,  280,  280,  280,  280,  280,
+     1194, 1194, 1194, 1195, 1195, 1195, 2959, 2971, 1183, 1198,
+     1198, 1198, 1199, 1199, 1199, 1201, 1201, 1201, 1194, 2972,
+     1195, 1203, 1203, 1203, 2974,  280,  280, 1198, 2975, 2977,
+     1199,  280, 1201, 2988,  280, 1205, 1205, 1205, 1203, 1209,
+     1209, 1209, 1210, 1210, 1210, 2829,  280,  328, 2989, 1211,
+     1211, 1211, 1205, 2990,  328, 2829, 2991, 1209, 2993, 2994,
+     1210, 2829, 2995,  328,  328, 1194, 1211, 1212, 1212, 1212,
+
+     1213, 1213, 1213, 1214, 1214, 1214, 2966, 1199, 1215, 1215,
+     1215, 1217, 1217, 1217, 1212, 2830, 2996, 1213, 2999, 2966,
+     1210, 1214,  328,  328,  328, 2830, 1215, 3000, 1217,  328,
+      328, 2830, 3001,  328,  328, 3002, 2967,  328, 3003,  328,
+      328,  328, 3004, 1219, 1219, 1219, 3005,  328,  330, 2967,
+     2973, 1220, 1220, 1220, 1223, 1223, 1223, 1226, 1226, 1226,
+     1213, 1219, 3006, 2973,  330,  330, 1227, 1227, 1227, 1220,
+     1215, 1223, 1229, 1229, 1229, 1226, 3007, 3008, 1233, 1233,
+     1233, 1234, 1234, 1234, 1227, 1237, 1237, 1237, 3009, 1229,
+     1249, 1249, 1249,  330,  330,  330, 1233, 3010, 3015, 1234,
+
+      330,  330, 1237, 3016,  330,  330, 3018, 1249,  330, 3019,
+      330,  330,  330, 1220, 1241, 1241, 1241, 2976,  330,  712,
+     1242, 1242, 1242, 1247, 1247, 1247,  712, 1248, 1248, 1248,
+     2976, 3020, 1241, 1227, 3021,  712,  712, 3022, 1242, 3016,
+     3023, 1247, 1252, 1252, 1252, 1248, 3024, 3015, 1234, 1253,
+     1253, 1253, 1254, 1254, 1254, 3025, 1255, 1255, 1255, 3026,
+     1252, 1256, 1256, 1256,  712,  712,  712, 1253, 3027, 1254,
+     3028,  712,  712, 1255, 3029,  712,  712, 3030, 1256,  712,
+     3032,  712,  712,  712, 3034, 1242, 1257, 1257, 1257,  712,
+     3035, 3037, 1248, 3039, 1258, 1258, 1258, 1259, 1259, 1259,
+
+     1276, 1276, 1276, 1257, 1908, 1908, 1908, 1255, 1277, 1277,
+     1277, 1253, 1258, 3043, 3044, 1259, 3045, 3046, 1276, 1279,
+     1279, 1279, 1255, 1320, 1320, 1320, 1277, 1324, 1324, 1324,
+     3050, 1325, 1325, 1325, 3058, 1325, 3059, 1279, 1325, 3060,
+     1320, 1333, 1333, 1333, 1324, 3061, 1257, 1327, 1327, 1327,
+     1328, 1328, 1328, 1330, 1330, 1330, 3041, 3042, 1333, 1259,
+     1337, 1337, 1337, 3062, 3063, 1327, 3041, 3042, 1328, 1908,
+     3064, 1330, 1338, 1338, 1338, 1340, 1340, 1340, 1337, 1343,
+     1343, 1343, 1344, 1344, 1344, 1346, 1346, 1346, 3065, 3066,
+     1338, 3067, 3068, 1340, 1348, 1348, 1348, 1343, 1348, 3072,
+
+     1344, 1348, 3075, 1346, 1352, 1352, 1352, 1353, 1353, 1353,
+     1355, 1355, 1355, 1356, 1356, 1356, 3076, 3077, 1330, 1357,
+     1357, 1357, 1352, 1357, 3078, 1353, 1357, 3079, 1355, 3080,
+     1356, 1360, 1360, 1360, 1361, 1361, 1361, 3081, 1361, 1346,
+     3084, 1361, 1340, 1362, 1362, 1362, 3088, 3089, 1360, 1363,
+     1363, 1363, 1365, 1365, 1365, 1366, 1366, 1366, 3090, 3091,
+     1355, 1362, 1367, 1367, 1367, 3092, 1367, 1363, 3093, 1367,
+     1365, 3094, 1366, 1368, 1368, 1368, 1369, 1369, 1369, 3095,
+     1369, 3096, 3097, 1369, 1370, 1370, 1370, 1371, 1371, 1371,
+     1368, 1373, 1373, 1373, 1374, 1374, 1374, 1375, 1375, 1375,
+
+     3098, 1375, 1370, 3099, 1375, 1371, 1378, 1378, 1378, 1373,
+     3115, 1374, 1379, 1379, 1379, 1365, 1379, 3116, 3117, 1379,
+     1380, 1380, 1380, 1378, 1381, 1381, 1381, 1383, 1383, 1383,
+     1384, 1384, 1384, 3118, 1384, 3119, 3120, 1384, 1380, 1387,
+     1387, 1387, 1381, 1387, 3121, 1383, 1387, 1390, 1390, 1390,
+     3122, 1391, 1391, 1391, 1373, 1391, 3124, 3125, 1391, 1396,
+     1396, 1396, 3126, 3127, 1390, 1397, 1397, 1397, 1399, 1399,
+     1399, 1403, 1403, 1403, 3102, 1403, 3128, 1396, 1403, 1406,
+     1406, 1406, 3103, 1397, 3102, 3129, 1399, 1407, 1407, 1407,
+     1383, 1407, 3103, 3130, 1407, 3131, 1406, 1410, 1410, 1410,
+
+     1411, 1411, 1411, 3132, 1411, 3133, 3134, 1411, 1421, 1421,
+     1421, 1422, 1422, 1422, 1410, 3135, 3143, 1399, 1424, 1424,
+     1424, 1425, 1425, 1425, 3144, 1425, 1421, 3145, 1425, 1422,
+     1428, 1428, 1428, 1429, 1429, 1429, 1424, 1431, 1431, 1431,
+     1434, 1434, 1434, 1435, 1435, 1435, 3137, 1435, 1428, 3148,
+     1435, 1429, 1441, 1441, 1441, 1431, 3137, 1434, 1442, 1442,
+     1442, 1444, 1444, 1444, 1446, 1446, 1446, 1447, 1447, 1447,
+     1441, 1447, 3138, 3139, 1447, 3149, 1442, 3150, 3151, 1444,
+     3154, 1446, 3138, 1450, 1450, 1450, 1424, 1450, 3156, 3160,
+     1450, 1453, 1453, 1453, 1454, 1454, 1454, 3163, 1431, 1456,
+
+     1456, 1456, 1457, 1457, 1457, 1458, 1458, 1458, 3139, 1453,
+     3164, 3165, 1454, 1459, 1459, 1459, 3166, 1456, 3167, 1457,
+     1461, 1461, 1461, 1458, 1470, 1470, 1470, 1444, 1464, 1464,
+     1464, 1459, 1464, 3168, 3169, 1464, 3170, 3175, 1461, 1471,
+     1471, 1471, 1470, 1473, 1473, 1473, 1475, 1475, 1475, 3183,
+     1475, 3184, 3185, 1475, 1478, 1478, 1478, 1471, 1479, 1479,
+     1479, 1473, 1481, 1481, 1481, 1456, 3186, 1482, 1482, 1482,
+     1461, 1482, 1478, 3187, 1482, 3188, 1479, 1486, 1486, 1486,
+     1481, 1487, 1487, 1487, 1489, 1489, 1489, 3189, 1490, 1490,
+     1490, 1491, 1491, 1491, 3190, 1486, 1492, 1492, 1492, 1487,
+
+     3191, 3192, 1489, 3198, 1473, 1490, 3199, 3201, 1491, 1493,
+     1493, 1493, 3202, 3204, 1492, 1495, 1495, 1495, 1500, 1500,
+     1500, 3205, 1500, 1481, 3206, 1500, 3207, 1493, 1503, 1503,
+     1503, 3208, 3209, 1495, 3210, 1489, 1504, 1504, 1504, 1491,
+     1504, 3211, 3212, 1504, 3213, 1503, 1507, 1507, 1507, 1508,
+     1508, 1508, 1510, 1510, 1510, 1513, 1513, 1513, 1514, 1514,
+     1514, 1516, 1516, 1516, 1507, 3214, 3215, 1508, 3216, 3219,
+     1510, 3220, 3221, 1513, 3222, 3230, 1514, 3231, 3233, 1516,
+     1522, 1522, 1522, 1495, 1526, 1526, 1526, 1527, 1527, 1527,
+     1529, 1529, 1529, 3234, 1530, 1530, 1530, 1522, 1530, 3235,
+
+     3237, 1530, 1526, 3239, 1510, 1527, 3240, 3241, 1529, 1516,
+     1534, 1534, 1534, 1535, 1535, 1535, 1537, 1537, 1537, 1539,
+     1539, 1539, 3244, 1539, 2475, 2475, 1539, 2475, 1534, 3245,
+     3246, 1535, 3247, 3250, 1537, 2475, 1542, 1542, 1542, 1543,
+     1543, 1543, 2475, 1543, 3251, 3252, 1543, 1544, 1544, 1544,
+     3253, 3254, 1529, 1542, 1545, 1545, 1545, 3261, 1546, 1546,
+     1546, 3255, 1546, 3262, 1544, 1546, 1548, 1548, 1548, 3264,
+     3265, 1545, 1550, 1550, 1550, 1551, 1551, 1551, 1537, 1553,
+     1553, 1553, 3266, 1548, 1554, 1554, 1554, 1555, 1555, 1555,
+     1550, 1555, 3268, 1551, 1555, 3270, 3273, 1553, 1556, 1556,
+
+     1556, 1554, 1557, 1557, 1557, 3255, 1557, 3275, 3276, 1557,
+     1559, 1559, 1559, 3277, 3278, 1556, 1560, 1560, 1560, 1562,
+     1562, 1562, 1564, 1564, 1564, 3279, 1564, 3280, 1559, 1564,
+     1567, 1567, 1567, 3281, 1560, 3282, 3285, 1562, 3289, 3290,
+     1553, 1568, 1568, 1568, 1570, 1570, 1570, 3292, 1567, 1573,
+     1573, 1573, 3293, 1573, 3294, 3296, 1573, 3297, 3302, 1568,
+     3303, 3304, 1570, 1577, 1577, 1577, 1578, 1578, 1578, 3305,
+     1580, 1580, 1580, 1582, 1582, 1582, 3306, 1582, 3307, 3308,
+     1582, 1577, 3309, 3310, 1578, 3311, 3312, 1562, 1580, 1586,
+     1586, 1586, 1587, 1587, 1587, 1588, 1588, 1588, 1590, 1590,
+
+     1590, 1592, 1592, 1592, 3313, 3314, 1586, 1593, 1593, 1593,
+     1587, 1593, 1570, 1588, 1593, 3315, 1590, 3316, 1592, 1596,
+     1596, 1596, 1598, 1598, 1598, 1599, 1599, 1599, 1601, 1601,
+     1601, 3317, 1580, 1603, 1603, 1603, 1596, 1605, 1605, 1605,
+     1598, 3318, 3322, 1599, 3323, 3324, 1601, 1606, 1606, 1606,
+     1603, 1608, 1608, 1608, 3325, 1605, 3328, 1609, 1609, 1609,
+     1590, 1609, 3329, 3330, 1609, 1606, 1613, 1613, 1613, 1608,
+     1614, 1614, 1614, 1616, 1616, 1616, 1601, 1617, 1617, 1617,
+     3331, 1596, 3332, 3333, 1613, 1618, 1618, 1618, 1614, 1618,
+     3335, 1616, 1618, 3336, 1617, 1621, 1621, 1621, 3338, 1608,
+
+     1622, 1622, 1622, 3339, 1622, 3340, 3342, 1622, 1624, 1624,
+     1624, 3343, 1621, 1625, 1625, 1625, 3344, 1627, 1627, 1627,
+     1629, 1629, 1629, 1635, 1635, 1635, 1624, 1685, 1685, 1685,
+     3345, 1625, 3346, 3354, 1616, 1627, 3355, 3350, 1629, 1629,
+     3357, 1635, 1676, 1676, 1676, 1685, 1676, 3347, 3350, 1676,
+     1681, 1681, 1681, 3349, 1681, 3358, 3362, 1681, 1688, 1688,
+     1688, 1689, 1689, 1689, 3364, 1689, 3366, 3349, 1689, 1693,
+     1693, 1693, 1696, 1696, 1696, 1688, 3368, 3372, 1627, 1695,
+     1695, 1695, 3378, 1699, 1699, 1699, 3379, 1693, 3374, 1685,
+     1696, 1700, 1700, 1700, 3347, 1700, 1695, 3381, 1700, 3382,
+
+     3374, 1699, 1705, 1705, 1705, 3384, 1705, 3375, 3395, 1705,
+     1708, 1708, 1708, 1709, 1709, 1709, 3397, 1709, 3389, 3375,
+     1709, 3399, 1712, 1712, 1712, 3400, 1712, 3403, 1708, 1712,
+     3389, 1693, 1715, 1715, 1715, 1716, 1716, 1716, 3404, 1716,
+     1696, 1699, 1716, 3407, 1721, 1721, 1721, 3409, 1721, 3390,
+     1715, 1721, 1724, 1724, 1724, 1725, 1725, 1725, 1708, 1725,
+     3411, 3390, 1725, 3413, 1730, 1730, 1730, 1732, 1732, 1732,
+     1724, 1733, 1733, 1733, 1734, 1734, 1734, 1735, 1735, 1735,
+     1715, 1730, 1736, 1736, 1736, 1732, 3414, 3416, 1733, 3417,
+     3421, 1734, 3422, 3424, 1735, 1741, 1741, 1741, 3425, 1736,
+
+     1724, 1737, 1737, 1737, 3427, 1737, 3429, 3433, 1737, 1738,
+     1738, 1738, 1741, 1738, 3353, 3435, 1738, 1742, 1742, 1742,
+     1743, 1743, 1743, 1732, 3438, 1735, 1744, 1744, 1744, 1745,
+     1745, 1745, 3439, 3353, 1742, 3353, 3440, 1743, 1746, 1746,
+     1746, 1734, 3430, 1744, 3432, 3432, 1745, 1741, 3353, 1747,
+     1747, 1747, 1748, 1748, 1748, 1746, 1749, 1749, 1749, 1750,
+     1750, 1750, 1751, 1751, 1751, 1742, 1747, 3444, 3441, 1748,
+     1755, 1755, 1755, 1749, 1744, 3431, 1750, 1752, 1752, 1752,
+     1751, 1756, 1756, 1756, 3430, 1756, 3441, 1755, 1756, 3431,
+     3445, 1743, 3446, 3453, 1745, 1752, 1758, 1758, 1758, 1746,
+
+     1760, 1760, 1760, 1762, 1762, 1762, 3454, 1763, 1763, 1763,
+     3457, 1763, 3458, 1758, 1763, 1764, 1764, 1764, 1760, 1749,
+     1762, 1750, 3460, 1748, 1765, 1765, 1765, 3434, 1751, 3457,
+     1752, 3464, 3465, 1764, 3447, 1766, 1766, 1766, 3434, 1766,
+     3466, 1765, 1766, 1767, 1767, 1767, 1773, 1773, 1773, 3447,
+     1775, 1775, 1775, 1776, 1776, 1776, 3467, 1777, 1777, 1777,
+     3459, 1767, 3469, 3470, 1773, 3471, 3472, 1760, 1775, 3474,
+     1776, 1778, 1778, 1778, 3475, 1777, 1779, 1779, 1779, 3459,
+     1779, 3469, 1764, 1779, 3471, 1781, 1781, 1781, 1778, 1783,
+     1783, 1783, 1786, 1786, 1786, 3476, 1786, 3477, 3478, 1786,
+
+     3479, 3487, 1767, 1781, 1773, 3488, 1783, 3489, 1775, 1777,
+     1789, 1789, 1789, 1791, 1791, 1791, 1794, 1794, 1794, 1800,
+     1800, 1800, 1801, 1801, 1801, 3493, 1801, 1789, 3494, 1801,
+     3495, 1791, 3490, 3501, 1794, 3502, 1800, 1805, 1805, 1805,
+     1806, 1806, 1806, 1807, 1807, 1807, 1781, 1809, 1809, 1809,
+     3490, 1809, 3496, 3503, 1809, 1805, 3505, 1806, 1812, 1812,
+     1812, 1807, 1813, 1813, 1813, 3506, 1813, 3496, 3507, 1813,
+     1814, 1814, 1814, 3509, 1814, 1812, 3510, 1814, 1791, 1818,
+     1818, 1818, 3511, 1794, 1819, 1819, 1819, 1805, 1819, 3512,
+     3514, 1819, 1821, 1821, 1821, 3515, 1818, 1822, 1822, 1822,
+
+     3516, 1822, 3521, 3522, 1822, 3523, 1807, 1825, 1825, 1825,
+     1821, 1825, 3524, 3525, 1825, 1829, 1829, 1829, 1831, 1831,
+     1831, 1835, 1835, 1835, 1837, 1837, 1837, 1838, 1838, 1838,
+     1839, 1839, 1839, 1829, 1839, 3526, 1831, 1839, 3527, 1835,
+     3528, 1837, 3529, 1821, 1838, 1840, 1840, 1840, 1842, 1842,
+     1842, 1843, 1843, 1843, 3530, 1843, 3533, 3534, 1843, 1846,
+     1846, 1846, 3535, 1840, 3536, 1842, 1848, 1848, 1848, 1849,
+     1849, 1849, 3537, 1849, 3538, 3541, 1849, 1846, 1850, 1850,
+     1850, 3542, 1829, 1848, 3543, 1831, 1835, 1851, 1851, 1851,
+     1853, 1853, 1853, 3544, 3545, 1850, 1854, 1854, 1854, 3546,
+
+     1854, 3547, 3548, 1854, 3549, 1851, 3551, 3552, 1853, 1846,
+     1840, 1859, 1859, 1859, 3553, 1859, 3554, 3556, 1859, 3558,
+     1863, 1863, 1863, 1866, 1866, 1866, 1910, 1910, 1910, 1913,
+     1913, 1913, 1914, 1914, 1914, 3559, 3560, 1851, 1863, 3561,
+     3562, 1866, 1853, 1915, 1915, 1915, 1916, 1916, 1916, 1917,
+     1917, 1917, 1918, 1918, 1918, 1921, 1921, 1921, 3563, 1921,
+     1915, 3564, 1921, 1916, 3565, 3566, 1917, 1927, 1927, 1927,
+     1918, 3567, 1863, 1910, 3568, 1866, 1929, 1929, 1929, 1930,
+     1930, 1930, 3572, 1930, 3570, 1927, 1930, 1931, 1931, 1931,
+     3573, 3574, 1866, 1929, 1913, 3575, 3570, 1914, 3576, 1934,
+
+     1934, 1934, 1935, 1935, 1935, 1931, 1936, 1936, 1936, 1937,
+     1937, 1937, 3577, 3578, 1917, 3580, 3585, 1934, 3586, 1935,
+     1918, 3587, 3588, 1936, 1938, 1938, 1938, 1937, 1939, 1939,
+     1939, 3571, 1927, 1940, 1940, 1940, 1941, 1941, 1941, 1942,
+     1942, 1942, 1938, 3571, 3589, 1939, 3590, 1931, 1934, 3594,
+     1940, 1943, 1943, 1943, 1941, 3595, 1942, 1944, 1944, 1944,
+     1945, 1945, 1945, 3597, 1945, 3599, 3600, 1945, 1943, 1946,
+     1946, 1946, 3601, 3602, 1944, 1937, 1947, 1947, 1947, 1948,
+     1948, 1948, 1950, 1950, 1950, 3603, 1946, 1951, 1951, 1951,
+     1938, 1949, 1949, 1949, 1947, 1949, 1948, 3604, 1949, 1950,
+
+     3605, 3606, 1941, 3607, 1951, 1952, 1952, 1952, 3610, 1952,
+     1943, 3611, 1952, 1955, 1955, 1955, 1956, 1956, 1956, 1957,
+     1957, 1957, 1958, 1958, 1958, 1959, 1959, 1959, 3612, 3608,
+     1955, 3613, 3614, 1956, 3615, 3616, 1957, 1947, 3617, 1958,
+     3620, 3621, 1959, 1960, 1960, 1960, 1961, 1961, 1961, 1962,
+     1962, 1962, 1951, 1962, 3608, 3622, 1962, 1963, 1963, 1963,
+     1960, 3623, 3624, 1961, 3625, 3626, 1956, 1964, 1964, 1964,
+     3627, 3628, 1959, 3629, 1963, 1965, 1965, 1965, 1955, 3632,
+     3633, 1958, 3634, 3635, 1964, 1966, 1966, 1966, 1967, 1967,
+     1967, 3636, 1965, 3637, 1970, 1970, 1970, 1960, 1970, 3640,
+
+     3641, 1970, 3642, 1966, 3643, 3644, 1967, 1973, 1973, 1973,
+     1974, 1974, 1974, 3645, 3646, 1964, 1975, 1975, 1975, 3647,
+     1975, 3648, 3649, 1975, 1973, 3651, 3652, 1974, 3653, 1965,
+     1977, 1977, 1977, 1979, 1979, 1979, 3650, 1979, 3654, 3655,
+     1979, 1982, 1982, 1982, 1967, 1986, 1986, 1986, 1977, 1983,
+     1983, 1983, 1966, 1983, 3656, 3650, 1983, 3657, 3658, 1982,
+     1991, 1991, 1991, 1986, 1993, 1993, 1993, 1994, 1994, 1994,
+     1995, 1995, 1995, 3659, 1995, 3356, 3660, 1995, 1991, 1996,
+     1996, 1996, 1993, 3661, 1994, 1997, 1997, 1997, 1982, 1997,
+     3662, 3356, 1997, 3356, 2001, 2001, 2001, 1996, 2003, 2003,
+
+     2003, 2004, 2004, 2004, 3663, 2004, 3356, 3664, 2004, 3665,
+     3666, 1993, 2001, 1986, 3667, 2003, 2005, 2005, 2005, 2007,
+     2007, 2007, 2008, 2008, 2008, 3668, 2008, 3669, 3670, 2008,
+     2010, 2010, 2010, 2005, 3671, 3672, 2007, 3673, 1996, 2013,
+     2013, 2013, 2014, 2014, 2014, 2019, 2019, 2019, 2010, 2019,
+     3674, 3677, 2019, 2025, 2025, 2025, 3678, 2013, 2026, 2026,
+     2026, 2001, 2027, 2027, 2027, 3679, 2027, 3680, 3681, 2027,
+     3682, 2025, 2028, 2028, 2028, 2026, 2030, 2030, 2030, 3683,
+     2030, 3684, 3686, 2030, 2034, 2034, 2034, 3687, 2034, 3685,
+     2028, 2034, 2013, 2038, 2038, 2038, 2040, 2040, 2040, 2042,
+
+     2042, 2042, 2043, 2043, 2043, 2025, 2044, 2044, 2044, 3685,
+     3689, 2038, 3690, 3691, 2040, 3420, 3693, 2042, 3694, 2043,
+     2045, 2045, 2045, 2044, 2046, 2046, 2046, 2048, 2048, 2048,
+     3695, 2049, 2049, 2049, 3420, 2049, 3420, 2045, 2049, 2050,
+     2050, 2050, 2046, 2050, 2048, 3696, 2050, 3697, 2040, 3420,
+     3698, 2042, 2053, 2053, 2053, 2038, 2055, 2055, 2055, 3699,
+     2055, 3700, 3701, 2055, 2060, 2060, 2060, 2062, 2062, 2062,
+     2053, 2062, 2046, 2044, 2062, 2065, 2065, 2065, 3702, 2066,
+     2066, 2066, 2060, 2066, 3703, 3704, 2066, 2067, 2067, 2067,
+     3705, 3706, 2065, 2069, 2069, 2069, 2070, 2070, 2070, 3707,
+
+     2053, 2071, 2071, 2071, 3708, 2067, 2072, 2072, 2072, 3709,
+     3710, 2069, 3711, 2070, 3713, 3714, 2060, 3715, 2071, 2073,
+     2073, 2073, 3717, 2072, 2078, 2078, 2078, 2080, 2080, 2080,
+     2086, 2086, 2086, 2091, 2091, 2091, 3719, 2073, 3720, 2067,
+     3722, 2078, 2094, 2094, 2094, 2095, 2095, 2095, 2096, 2096,
+     2096, 2098, 2098, 2098, 3723, 2073, 2108, 2108, 2108, 2109,
+     2109, 2109, 2111, 2111, 2111, 2114, 2114, 2114, 2115, 2115,
+     2115, 2072, 2115, 3725, 3726, 2115, 2116, 2116, 2116, 2117,
+     2117, 2117, 2114, 2117, 3727, 3728, 2117, 2119, 2119, 2119,
+     2125, 2125, 2125, 2116, 2127, 2127, 2127, 3729, 2127, 3730,
+
+     3718, 2127, 2132, 2132, 2132, 2119, 3718, 3732, 2125, 2130,
+     2130, 2130, 2133, 2133, 2133, 2134, 2134, 2134, 3733, 2132,
+     3735, 2135, 2135, 2135, 3736, 2135, 3738, 2130, 2135, 3739,
+     2133, 3741, 2134, 2136, 2136, 2136, 2137, 2137, 2137, 3742,
+     2137, 3744, 3745, 2137, 2138, 2138, 2138, 2139, 2139, 2139,
+     2136, 2140, 2140, 2140, 2119, 3748, 2141, 2141, 2141, 3747,
+     2141, 2130, 2138, 2141, 3750, 2139, 3752, 3753, 2140, 2142,
+     2142, 2142, 3754, 3747, 2133, 2143, 2143, 2143, 3755, 2143,
+     3757, 3759, 2143, 2144, 2144, 2144, 2142, 2145, 2145, 2145,
+     2146, 2146, 2146, 3761, 2146, 3763, 3764, 2146, 2147, 2147,
+
+     2147, 2144, 3766, 3769, 2145, 2148, 2148, 2148, 3770, 2148,
+     2138, 3771, 2148, 2139, 3772, 2147, 2151, 2151, 2151, 2152,
+     2152, 2152, 3773, 2152, 3774, 3775, 2152, 2153, 2153, 2153,
+     2154, 2154, 2154, 2151, 2154, 3776, 3777, 2154, 2157, 2157,
+     2157, 2162, 2162, 2162, 3778, 2153, 2158, 2158, 2158, 2144,
+     2158, 3779, 3780, 2158, 3784, 2157, 3786, 3423, 2162, 2163,
+     2163, 2163, 3788, 2163, 3789, 3790, 2163, 2164, 2164, 2164,
+     2167, 2167, 2167, 3423, 2167, 3423, 3791, 2167, 1511, 2153,
+     2170, 2170, 2170, 3810, 2164, 2171, 2171, 2171, 3423, 2171,
+     3794, 3810, 2171, 2174, 2174, 2174, 3811, 2170, 2175, 2175,
+
+     2175, 2178, 2178, 2178, 3811, 2179, 2179, 2179, 3802, 2179,
+     3795, 2174, 2179, 2180, 2180, 2180, 2175, 2180, 2178, 3806,
+     2180, 2184, 2184, 2184, 2186, 2186, 2186, 3794, 2187, 2187,
+     2187, 2188, 2188, 2188, 2190, 2190, 2190, 3803, 1506, 2184,
+     2193, 2193, 2193, 3807, 1505, 2174, 2187, 3795, 3804, 2188,
+     3805, 2190, 2175, 2196, 2196, 2196, 3826, 3802, 2193, 2197,
+     2197, 2197, 3812, 2197, 3806, 3814, 2197, 2200, 2200, 2200,
+     3812, 2196, 2202, 2202, 2202, 3808, 2204, 2204, 2204, 3808,
+     2204, 2190, 2188, 2204, 1499, 2200, 3803, 2187, 3807, 3826,
+     2202, 2207, 2207, 2207, 2208, 2208, 2208, 3804, 2208, 3805,
+
+     3809, 2208, 3813, 2196, 3809, 2210, 2210, 2210, 2207, 2210,
+     3813, 3832, 2210, 3814, 2200, 2214, 2214, 2214, 2217, 2217,
+     2217, 2218, 2218, 2218, 2219, 2219, 2219, 2220, 2220, 2220,
+     2222, 2222, 2222, 2214, 3816, 2217, 2227, 2227, 2227, 2218,
+     2228, 2228, 2228, 3818, 2228, 3852, 3832, 2228, 2231, 2231,
+     2231, 2234, 2234, 2234, 2227, 2236, 2236, 2236, 2238, 2238,
+     2238, 2240, 2240, 2240, 3819, 3817, 2231, 3827, 2234, 2241,
+     2241, 2241, 3816, 2236, 3815, 3852, 2238, 3822, 3823, 2240,
+     2242, 2242, 2242, 2218, 2242, 3818, 2241, 2242, 2243, 2243,
+     2243, 2244, 2244, 2244, 2245, 2245, 2245, 3820, 2245, 3833,
+
+     3827, 2245, 2227, 3817, 1498, 2243, 3819, 3824, 2244, 2246,
+     2246, 2246, 2247, 2247, 2247, 2236, 2248, 2248, 2248, 3821,
+     2248, 3830, 3815, 2248, 3822, 3823, 2240, 2246, 1497, 2247,
+     2251, 2251, 2251, 3820, 3833, 2243, 2255, 2255, 2255, 2256,
+     2256, 2256, 2265, 2265, 2265, 3824, 2265, 3825, 2251, 2265,
+     2268, 2268, 2268, 3846, 2255, 3821, 2256, 3830, 3828, 2247,
+     2269, 2269, 2269, 2246, 2270, 2270, 2270, 3828, 2268, 2272,
+     2272, 2272, 2273, 2273, 2273, 3831, 2273, 2269, 3838, 2273,
+     3874, 3829, 2270, 3844, 2251, 3825, 2272, 2274, 2274, 2274,
+     3829, 2275, 2275, 2275, 3842, 2275, 3846, 2268, 2275, 2277,
+
+     2277, 2277, 1496, 3842, 2274, 2281, 2281, 2281, 2282, 2282,
+     2282, 3831, 2282, 3874, 3838, 2282, 3834, 2277, 2283, 2283,
+     2283, 3844, 2281, 2289, 2289, 2289, 2290, 2290, 2290, 2291,
+     2291, 2291, 2293, 2293, 2293, 2297, 2297, 2297, 2298, 2298,
+     2298, 2299, 2299, 2299, 2300, 2300, 2300, 2303, 2303, 2303,
+     2308, 2308, 2308, 2309, 2309, 2309, 2311, 2311, 2311, 3835,
+     3834, 2277, 2312, 2312, 2312, 2313, 2313, 2313, 2316, 2316,
+     2316, 3847, 2316, 1485, 3839, 2316, 2319, 2319, 2319, 3901,
+     2319, 3840, 3836, 2319, 2323, 2323, 2323, 2325, 2325, 2325,
+     3901, 2300, 2326, 2326, 2326, 3862, 2327, 2327, 2327, 2328,
+
+     2328, 2328, 2323, 3835, 2325, 2329, 2329, 2329, 3845, 2326,
+     3839, 3837, 2313, 2327, 3847, 3840, 2328, 2332, 2332, 2332,
+     2334, 2334, 2334, 2329, 2335, 2335, 2335, 3848, 2335, 3836,
+     3850, 2335, 2336, 2336, 2336, 2332, 2323, 2334, 2337, 2337,
+     2337, 3853, 2337, 3862, 2326, 2337, 3845, 2340, 2340, 2340,
+     2336, 2340, 3841, 3849, 2340, 2343, 2343, 2343, 3837, 2328,
+     1474, 2327, 2344, 2344, 2344, 2345, 2345, 2345, 3850, 2345,
+     1469, 3853, 2345, 2343, 3848, 2343, 2476, 2476, 2332, 2476,
+     2344, 2348, 2348, 2348, 3851, 2348, 3841, 2476, 2348, 2351,
+     2351, 2351, 3843, 2336, 2476, 2352, 2352, 2352, 2344, 2352,
+
+     3849, 3843, 2352, 2355, 2355, 2355, 3858, 2351, 2356, 2356,
+     2356, 1468, 2356, 1467, 3854, 2356, 3856, 2357, 2357, 2357,
+     2355, 2357, 3851, 3854, 2357, 2360, 2360, 2360, 2361, 2361,
+     2361, 3855, 2361, 2351, 3860, 2361, 1463, 2367, 2367, 2367,
+     3855, 2367, 3860, 2360, 2367, 2370, 2370, 2370, 2371, 2371,
+     2371, 3856, 2371, 3858, 3863, 2371, 2374, 2374, 2374, 3859,
+     2374, 3857, 2370, 2374, 2378, 2378, 2378, 2379, 2379, 2379,
+     2380, 2380, 2380, 2383, 2383, 2383, 3864, 2383, 3861, 3868,
+     2383, 2378, 2387, 2387, 2387, 2379, 3861, 3878, 2380, 2388,
+     2388, 2388, 2360, 2390, 2390, 2390, 3857, 2391, 2391, 2391,
+
+     2387, 2391, 3863, 3869, 2391, 1462, 3859, 2388, 3866, 3867,
+     2390, 2396, 2396, 2396, 3864, 3868, 2397, 2397, 2397, 2399,
+     2399, 2399, 1445, 2402, 2402, 2402, 1440, 2402, 3876, 2396,
+     2402, 3865, 2379, 1439, 2397, 3878, 3876, 2399, 2387, 3869,
+     3870, 2388, 2408, 2408, 2408, 2409, 2409, 2409, 3896, 2409,
+     3866, 3867, 2409, 2410, 2410, 2410, 2411, 2411, 2411, 2408,
+     2412, 2412, 2412, 2413, 2413, 2413, 2414, 2414, 2414, 3865,
+     3871, 2410, 2415, 2415, 2415, 2416, 2416, 2416, 2396, 2397,
+     2418, 2418, 2418, 2414, 2417, 2417, 2417, 3870, 3877, 2415,
+     3875, 3879, 2416, 2420, 2420, 2420, 3877, 3896, 2418, 3892,
+
+     3872, 2417, 2421, 2421, 2421, 3882, 2421, 3883, 3892, 2421,
+     2420, 2423, 2423, 2423, 2425, 2425, 2425, 3871, 2410, 2428,
+     2428, 2428, 3884, 3875, 2415, 1438, 2429, 2429, 2429, 2423,
+     2429, 3873, 2425, 2429, 2432, 2432, 2432, 2428, 3872, 3879,
+     2416, 2433, 2433, 2433, 2417, 2433, 2418, 3882, 2433, 3883,
+     1433, 2432, 2435, 2435, 2435, 3880, 2435, 3890, 3884, 2435,
+     2438, 2438, 2438, 2439, 2439, 2439, 2440, 2440, 2440, 3873,
+     2440, 1432, 3881, 2440, 2442, 2442, 2442, 3886, 2438, 3885,
+     2439, 2446, 2446, 2446, 2448, 2448, 2448, 2449, 2449, 2449,
+     3890, 2449, 2442, 3880, 2449, 2460, 2460, 2460, 1419, 2446,
+
+     3887, 2448, 2461, 2461, 2461, 1418, 1417, 2462, 2462, 2462,
+     3881, 2462, 2438, 2460, 2462, 3885, 2463, 2463, 2463, 2461,
+     2463, 3891, 3894, 2463, 3886, 1416, 2442, 2466, 2466, 2466,
+     1415, 2466, 3893, 1414, 2466, 2470, 2470, 2470, 2471, 2471,
+     2471, 3893, 2474, 2474, 2474, 2460, 2474, 3887, 1413, 2474,
+     2477, 2477, 2477, 2470, 3891, 3894, 2471, 2478, 2478, 2478,
+     2479, 2479, 2479, 2483, 2483, 2483, 2484, 2484, 2484, 2486,
+     2486, 2486, 2487, 2487, 2487, 2489, 2489, 2489, 2490, 2490,
+     2490, 2491, 2491, 2491, 2495, 2495, 2495, 2496, 2496, 2496,
+     2500, 2500, 2500, 2501, 2501, 2501, 2503, 2503, 2503, 2504,
+
+     2504, 2504, 1412, 2470, 2509, 2509, 2509, 2510, 2510, 2510,
+     2511, 2511, 2511, 2512, 2512, 2512, 3888, 2512, 1402, 3889,
+     2512, 1401, 2509, 2513, 2513, 2513, 3897, 2511, 2514, 2514,
+     2514, 2515, 2515, 2515, 2516, 2516, 2516, 2517, 2517, 2517,
+     2513, 2518, 2518, 2518, 1400, 2514, 1395, 1394, 2515, 2519,
+     2519, 2519, 3895, 2519, 3888, 2517, 2519, 3889, 2518, 2522,
+     2522, 2522, 1393, 2523, 2523, 2523, 2524, 2524, 2524, 2525,
+     2525, 2525, 2526, 2526, 2526, 3897, 2526, 2522, 1392, 2526,
+     2514, 2523, 3898, 2515, 2524, 3895, 1377, 2525, 2529, 2529,
+     2529, 2533, 2533, 2533, 1376, 2533, 3899, 1359, 2533, 1358,
+
+     2523, 2536, 2536, 2536, 2517, 1351, 2529, 2539, 2539, 2539,
+     1347, 2522, 2540, 2540, 2540, 3898, 2540, 1342, 2536, 2540,
+     2541, 2541, 2541, 1341, 2539, 2542, 2542, 2542, 2524, 3899,
+     1336, 2525, 2547, 2547, 2547, 2548, 2548, 2548, 2541, 2549,
+     2549, 2549, 1335, 2542, 2550, 2550, 2550, 1334, 2550, 1332,
+     2547, 2550, 1331, 2548, 1326, 1323, 2549, 2553, 2553, 2553,
+     2554, 2554, 2554, 2555, 2555, 2555, 2556, 2556, 2556, 2557,
+     2557, 2557, 1322, 1319, 2553, 1318, 1317, 2554, 3900, 1316,
+     2555, 1315, 1314, 2556, 1313, 1312, 2549, 2557, 2558, 2558,
+     2558, 1311, 3900, 2547, 2559, 2559, 2559, 2563, 2563, 2563,
+
+     2564, 2564, 2564, 1310, 2564, 1309, 2558, 2564, 2567, 2567,
+     2567, 2559, 1308, 2553, 1307, 2555, 2568, 2568, 2568, 2569,
+     2569, 2569, 2554, 2571, 2571, 2571, 2567, 2570, 2570, 2570,
+     2557, 2570, 1306, 1305, 2570, 1304, 2569, 2572, 2572, 2572,
+     2571, 2573, 2573, 2573, 2574, 2574, 2574, 2575, 2575, 2575,
+     2579, 2579, 2579, 2558, 2572, 2580, 2580, 2580, 2573, 2576,
+     2576, 2576, 2574, 2576, 2575, 1301, 2576, 2579, 2567, 2584,
+     2584, 2584, 1300, 2580, 2586, 2586, 2586, 1299, 2586, 1298,
+     1297, 2586, 2590, 2590, 2590, 1295, 1294, 2584, 1293, 2572,
+     2591, 2591, 2591, 2573, 2591, 1292, 1291, 2591, 1290, 1289,
+
+     2590, 2595, 2595, 2595, 2599, 2599, 2599, 1288, 2599, 1287,
+     1286, 2599, 2612, 2612, 2612, 2614, 2614, 2579, 2614, 2595,
+     2613, 2613, 2613, 1285, 2613, 1284, 2614, 2613, 2615, 2615,
+     2612, 2615, 1283, 2614, 2617, 2617, 2617, 1282, 1281, 2615,
+     2618, 2618, 2618, 2631, 2631, 2631, 2615, 1275, 2595, 2632,
+     2632, 2632, 2617, 2636, 2636, 2636, 1271, 1268, 2618, 2637,
+     2637, 2637, 2639, 2639, 2639, 2642, 2642, 2642, 2643, 2643,
+     2643, 2647, 2647, 2647, 2612, 2650, 2650, 2650, 2652, 2652,
+     2652, 2654, 2654, 2654, 2655, 2655, 2655, 1267, 2655, 1266,
+     1264, 2655, 2658, 2658, 2658, 1260, 2652, 1251, 2659, 2659,
+
+     2659, 2617, 2659, 2618, 1246, 2659, 2660, 2660, 2660, 2658,
+     2661, 2661, 2661, 2662, 2662, 2662, 2663, 2663, 2663, 2664,
+     2664, 2664, 1245, 2660, 2665, 2665, 2665, 2661, 2665, 1244,
+     1240, 2665, 1239, 1236, 2663, 1232, 2664, 2666, 2666, 2666,
+     2667, 2667, 2667, 2668, 2668, 2668, 2669, 2669, 2669, 2670,
+     2670, 2670, 2676, 2676, 2676, 2666, 1231, 1228, 2667, 1225,
+     1222, 2668, 1221, 1216, 2669, 1208, 1207, 2670, 1206, 2676,
+     2677, 2677, 2677, 1204, 2677, 1200, 1197, 2677, 2680, 2680,
+     2680, 1192, 2680, 1191, 1190, 2680, 2683, 2683, 2683, 2687,
+     2687, 2687, 2688, 2688, 2688, 2689, 2689, 2689, 2691, 2691,
+
+     2691, 2699, 2699, 2699, 2683, 2667, 2687, 2669, 1189, 1188,
+     2688, 2668, 1187, 2689, 1186, 2691, 2692, 2692, 2692, 2699,
+     2692, 1185, 1184, 2692, 2696, 2696, 2696, 2697, 2697, 2697,
+     2698, 2698, 2698, 1181, 2698, 1180, 1177, 2698, 2700, 2700,
+     2700, 2696, 1176, 1172, 2697, 2701, 2701, 2701, 1170, 1167,
+     2688, 2702, 2702, 2702, 1166, 2702, 2700, 1163, 2702, 2705,
+     2705, 2705, 2701, 2706, 2706, 2706, 2707, 2707, 2707, 1156,
+     2708, 2708, 2708, 1153, 2708, 1152, 2705, 2708, 2711, 2711,
+     2711, 2712, 2712, 2712, 2707, 2712, 1151, 1148, 2712, 2713,
+     2713, 2713, 2714, 2714, 2714, 2711, 2715, 2715, 2715, 1147,
+
+     2700, 2717, 2717, 2717, 1143, 1136, 2713, 1132, 1131, 2714,
+     2723, 2723, 2723, 1130, 2715, 2718, 2718, 2718, 2717, 2718,
+     1127, 1126, 2718, 2726, 2726, 2726, 1125, 1118, 2723, 1117,
+     2739, 2739, 2739, 2751, 2751, 2751, 2770, 2770, 2770, 1116,
+     1115, 2726, 2771, 2771, 2771, 2774, 2774, 2774, 2739, 1114,
+     1113, 2751, 2778, 2778, 2778, 2781, 2781, 2781, 2782, 2782,
+     2782, 2783, 2783, 2783, 1112, 2783, 1111, 1110, 2783, 2786,
+     2786, 2786, 2787, 2787, 2787, 2782, 2787, 1106, 1075, 2787,
+     2788, 2788, 2788, 1072, 1069, 2751, 2786, 2790, 2790, 2790,
+     2726, 2739, 2789, 2789, 2789, 1068, 2789, 2788, 1065, 2789,
+
+     2792, 2792, 2792, 1064, 2792, 2790, 1063, 2792, 2795, 2795,
+     2795, 2797, 2797, 2797, 2798, 2798, 2798, 2799, 2799, 2799,
+     2802, 2802, 2802, 2804, 2804, 2804, 2795, 2804, 1062, 2797,
+     2804, 1061, 2798, 1060, 1053, 2799, 1052, 2802, 2816, 2816,
+     2816, 2817, 2817, 2817, 2818, 2818, 2818, 1051, 2818, 1049,
+     1048, 2818, 2819, 2819, 2819, 2816, 1047, 1046, 2817, 2820,
+     2820, 2820, 1045, 2820, 1044, 1043, 2820, 1042, 1041, 2799,
+     2819, 1040, 1039, 2797, 2826, 2826, 2826, 1038, 2827, 2827,
+     2827, 2798, 2827, 1036, 1035, 2827, 2828, 2828, 2828, 1034,
+     2828, 2826, 1033, 2828, 2831, 2831, 2831, 2833, 2833, 2833,
+
+     2834, 2834, 2834, 1032, 2834, 1031, 1030, 2834, 2838, 2838,
+     2838, 1029, 2831, 1028, 1026, 2833, 2839, 2839, 2839, 2840,
+     2840, 2840, 1025, 2840, 1024, 2838, 2840, 2841, 2841, 2841,
+     2843, 2843, 2843, 2839, 2843, 1023, 1022, 2843, 2846, 2846,
+     2846, 1021, 2847, 2847, 2847, 2841, 2847, 1020, 1019, 2847,
+     2848, 2848, 2848, 1018, 1017, 2846, 1013, 2849, 2849, 2849,
+     2833, 2849, 1009, 1008, 2849, 1007, 1006, 2848, 2850, 2850,
+     2850, 1005, 2850, 1001,  999, 2850, 2854, 2854, 2854, 2855,
+     2855, 2855, 2858, 2858, 2858, 2859, 2859, 2859, 2860, 2860,
+     2860,  998,  997, 2854,  996,  995, 2855, 2871, 2871, 2871,
+
+     2858, 2884, 2884, 2884,  994, 2860, 2885, 2885, 2885, 2902,
+     2902, 2902, 2904, 2904, 2904, 2871,  993,  990, 2884, 2908,
+     2908, 2908,  989,  985, 2885, 2912, 2912, 2912, 2913, 2913,
+     2913,  984, 2913,  983,  982, 2913, 2914, 2914, 2914,  979,
+     2914,  978, 2912, 2914, 2917, 2917, 2917,  976, 2917,  974,
+      971, 2917,  970,  969, 2858, 2920, 2920, 2920, 2871, 2921,
+     2921, 2921, 2922, 2922, 2922, 2924, 2924, 2924, 2925, 2925,
+     2925,  968,  966, 2920, 2926, 2926, 2926, 2921, 2926,  963,
+     2922, 2926, 2924,  962,  960, 2925, 2927, 2927, 2927, 2939,
+     2939, 2939, 2940, 2940, 2940,  959, 2940,  956, 2922, 2940,
+
+     2941, 2941, 2941, 2927, 2941,  954, 2939, 2941, 2944, 2944,
+     2944, 2921, 2947, 2947, 2947, 2949, 2949, 2949,  951, 2949,
+      950,  949, 2949, 2920,  948,  945, 2944,  944,  943, 2947,
+     2958, 2958, 2958, 2960, 2960, 2960, 2961, 2961, 2961,  942,
+     2961,  941,  940, 2961,  939, 2962, 2962, 2962, 2958, 2962,
+     2960,  937, 2962, 2965, 2965, 2965,  934, 2965,  933,  929,
+     2965, 2968, 2968, 2968,  928, 2968,  927,  926, 2968, 2978,
+     2978, 2978, 2979, 2979, 2979,  925, 2979,  924,  915, 2979,
+     2980, 2980, 2980, 2981, 2981, 2981, 2978, 2981,  914,  911,
+     2981, 2982, 2982, 2982, 2983, 2983, 2983, 2980, 2984, 2984,
+
+     2984, 2985, 2985, 2985, 2986, 2986, 2986,  910, 2982,  909,
+      908, 2983,  907, 2987, 2987, 2987, 2984, 2987,  905,  904,
+     2987, 2986, 2998, 2998, 2998, 3011, 3011, 3011, 3012, 3012,
+     3012,  903, 3012,  900,  899, 3012, 3013, 3013, 3013,  898,
+     2998,  895, 3011,  894,  890, 3017, 3017, 3017, 3031, 3031,
+     3031, 3033, 3033, 3033, 3013, 3036, 3036, 3036, 3038, 3038,
+     3038, 2984, 3017, 3017, 3040, 3040, 3040,  888, 3040,  885,
+      884, 3040,  883,  882, 2998, 3047, 3047, 3047, 3048, 3048,
+     3048, 3049, 3049, 3049, 3051, 3051, 3051, 3052, 3052, 3052,
+      880, 3052,  877, 3047, 3052,  876, 3048,  875,  874, 3049,
+
+      871, 3051, 3053, 3053, 3053,  868, 3053,  865,  864, 3053,
+     3056, 3056, 3056, 3057, 3057, 3057,  863, 3057,  862,  861,
+     3057, 3069, 3069, 3069,  858, 3069,  855, 3056, 3069, 3073,
+     3073, 3073, 3074, 3074, 3074,  851, 3074,  850,  849, 3074,
+      848,  847, 3047, 3049,  846,  845, 3073, 3082, 3082, 3082,
+     3085, 3085, 3085,  844, 3085,  843,  842, 3085, 3100, 3100,
+     3100,  841, 3101, 3101, 3101, 3082, 3101,  839,  837, 3101,
+     3104, 3104, 3104,  834, 3104, 3100,  833, 3104, 3107, 3107,
+     3107, 3108, 3108, 3108,  832, 3108,  831,  830, 3108, 3109,
+     3109, 3109, 3110, 3110, 3110, 3107, 3110,  829,  824, 3110,
+
+     3111, 3111, 3111, 3112, 3112, 3112, 3109, 3112,  823,  822,
+     3112, 3123, 3123, 3123,  821, 3136, 3136, 3136, 3111, 3136,
+      818,  817, 3136, 3140, 3140, 3140, 3141, 3141, 3141, 3123,
+     3142, 3142, 3142,  816, 3142,  813,  812, 3142,  811,  810,
+     3140, 3140,  807, 3141, 3141, 3155, 3155, 3155, 3142, 3157,
+     3157, 3157, 3111, 3158, 3158, 3158, 3159, 3159, 3159,  806,
+      804, 3123, 3161, 3161, 3161, 3162, 3162, 3162, 3171, 3171,
+     3171, 3172, 3172, 3172, 3174, 3174, 3174, 3176, 3176, 3176,
+      801, 3176,  800,  796, 3176,  795, 3171,  794,  793, 3172,
+      792,  791, 3174, 3179, 3179, 3179,  788, 3179,  787,  786,
+
+     3179, 3182, 3182, 3182, 3193, 3193, 3193, 3194, 3194, 3194,
+      785, 3194,  784,  783, 3194, 3197, 3197, 3197, 3182,  778,
+     3171, 3193, 3217, 3217, 3217,  774, 3218, 3218, 3218,  773,
+     3218,  772, 3197, 3218, 3223, 3223, 3223,  771, 3223, 3217,
+      768, 3223, 3174, 3226, 3226, 3226,  767, 3226,  766,  763,
+     3226, 3229, 3229, 3229, 3238, 3238, 3238, 3256, 3256, 3256,
+     3257, 3257, 3257,  761, 3257,  760,  759, 3257,  756, 3229,
+      755,  754, 3238,  753, 3256, 3256,  749,  748, 3257, 3258,
+     3258, 3258,  747, 3258,  743,  742, 3258, 3269, 3269, 3269,
+     3271, 3271, 3271, 3272, 3272, 3272,  741, 3258, 3274, 3274,
+
+     3274, 3283, 3283, 3283, 3287, 3287, 3287,  740, 3287,  734,
+      733, 3287,  731, 3284, 3284, 3284, 3359, 3359, 3359, 3283,
+      723, 3238, 3259, 3259, 3259, 3259, 3259, 3259, 3259, 3259,
+     3259, 3284,  722, 3259, 3286, 3286, 3286,  718, 3259, 3259,
+     3259, 3259, 3259, 3288, 3288, 3288, 3298, 3298, 3298,  713,
+      709, 3286, 3299, 3299, 3299,  708, 3299,  704,  698, 3299,
+     3288,  697,  696, 3298,  692, 3300, 3300, 3300, 3259, 3259,
+     3260, 3260, 3260, 3260, 3260, 3260, 3260, 3260, 3260,  689,
+     3284, 3260, 3300, 3360, 3360, 3360, 3260, 3260, 3260, 3260,
+     3260, 3301, 3301, 3301,  687, 3301,  686,  685, 3301, 3319,
+
+     3319, 3319,  681, 3319,  677,  673, 3319, 3326, 3326, 3326,
+     3334, 3334, 3334, 3369, 3369, 3369, 3260, 3260,  672, 3348,
+     3348, 3348,  671, 3348,  670, 3326, 3348,  666, 3334,  662,
+      659, 3369,  658, 3376, 3376, 3376,  657, 3348, 3351, 3351,
+     3351, 3351, 3351, 3351, 3351, 3351, 3351,  656,  652, 3351,
+     3376, 3449, 3449, 3449, 3351, 3351, 3351, 3351, 3351, 3371,
+     3371, 3371, 3373, 3373, 3373,  646, 3373,  645,  641, 3373,
+      633, 3377, 3377, 3377,  629, 3377,  622, 3371, 3377,  620,
+     3418, 3418, 3418,  619, 3351, 3351, 3352, 3352, 3352, 3352,
+     3352, 3352, 3352, 3352, 3352,  615,  609, 3352, 3418, 3450,
+
+     3450, 3450, 3352, 3352, 3352, 3352, 3352,  608, 3385, 3385,
+     3385, 3371, 3385,  604,  597, 3385, 3388, 3388, 3388,  596,
+     3388,  595,  594, 3388, 3436, 3436, 3436, 3455, 3455, 3455,
+      593,  589, 3352, 3352, 3456, 3456, 3456, 3461, 3461, 3461,
+      578, 3461, 3436, 3436, 3461, 3455, 3468, 3468, 3468,  574,
+      566, 3456, 3473, 3473, 3473, 3500, 3500, 3500, 3504, 3504,
+     3504,  565,  564, 3468, 3517, 3517, 3517,  563,  562, 3473,
+     3519, 3519, 3519, 3500,  558,  552, 3504, 3520, 3520, 3520,
+      551, 3520, 3517,  547, 3520,  541,  540, 3519, 3531, 3531,
+     3531, 3532, 3532, 3532,  536, 3532,  530,  529, 3532, 3539,
+
+     3539, 3539, 3540, 3540, 3540, 3531, 3540,  525,  521, 3540,
+     3504, 3557, 3557, 3557,  517,  516, 3539, 3569, 3569, 3569,
+      515, 3569,  511,  507, 3569,  503, 3582, 3582, 3582, 3557,
+     3582,  499,  493, 3582, 3591, 3591, 3591,  492, 3591,  491,
+      487, 3591, 3768, 3768, 3768, 3781, 3781, 3781, 3557, 3781,
+      483,  478, 3781, 3902, 3902, 3902, 3903, 3903, 3903,  477,
+     3768,  476,  475, 3781,  471,  467,  464,  460,  456,  453,
+      450, 3902,  448,  447, 3903, 3906, 3906, 3906, 3906, 3906,
+     3906, 3906, 3906, 3906, 3907, 3907, 3907, 3907, 3907, 3907,
+     3907, 3907, 3907, 3908, 3908, 3908, 3908, 3908, 3908, 3908,
+
+     3908, 3908, 3909, 3909, 3909, 3909, 3909, 3909, 3909, 3909,
+     3909, 3910, 3910, 3910, 3910, 3910, 3910, 3910, 3910, 3910,
+     3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3912,
+     3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3913, 3913,
+     3913, 3913, 3913, 3913, 3913, 3913, 3913, 3914, 3914, 3914,
+     3914, 3914, 3914, 3914, 3914, 3914, 3915, 3915, 3915, 3915,
+     3915, 3915, 3915, 3915, 3915, 3916, 3916, 3916, 3916, 3916,
+     3916, 3916, 3916, 3916, 3917, 3917, 3917, 3917, 3917, 3917,
+     3917, 3917, 3917, 3918, 3918, 3918, 3918, 3918, 3918, 3918,
+     3918, 3918, 3919, 3919, 3919, 3919, 3919, 3919, 3919, 3919,
+
+     3919, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920,
+     3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3922,
+     3922, 3922, 3922, 3922, 3922, 3922, 3922, 3922, 3923, 3923,
+     3923, 3923, 3923, 3923, 3923, 3923, 3923, 3924, 3924, 3924,
+     3924, 3924, 3924, 3924, 3924, 3924, 3925, 3925, 3925, 3925,
+     3925, 3925, 3925, 3925, 3925, 3926, 3926, 3926, 3926, 3926,
+     3926, 3926, 3926, 3926, 3927, 3927, 3927, 3927, 3927, 3927,
+     3927, 3927, 3927, 3928, 3928, 3928, 3928, 3928, 3928, 3928,
+     3928, 3928, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929,
+     3929, 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930,
+
+     3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3932,
+     3932, 3932, 3932, 3932, 3932, 3932, 3932, 3932, 3933, 3933,
+     3933, 3933, 3933, 3933, 3933, 3933, 3933, 3934, 3934, 3934,
+     3934, 3934, 3934, 3934, 3934, 3934, 3935, 3935, 3935, 3935,
+     3935, 3935, 3935, 3935, 3935, 3936, 3936, 3936, 3936, 3936,
+     3936, 3936, 3936, 3936, 3937, 3937, 3937, 3937, 3937, 3937,
+     3937, 3937, 3937, 3938, 3938, 3938, 3938, 3938, 3938, 3938,
+     3938, 3938, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939,
+     3939, 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940,
+     3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3942,
+
+     3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3943, 3943,
+     3943, 3943, 3943, 3943, 3943, 3943, 3943, 3944, 3944, 3944,
+     3944, 3944, 3944, 3944, 3944, 3944, 3945, 3945, 3945, 3945,
+     3945, 3945, 3945, 3945, 3945, 3946, 3946, 3946, 3946, 3946,
+     3946, 3946, 3946, 3946, 3947, 3947, 3947, 3947, 3947, 3947,
+     3947, 3947, 3947, 3948, 3948, 3948, 3948, 3948, 3948, 3948,
+     3948, 3948, 3949, 3949, 3949, 3949, 3949, 3949, 3949, 3949,
+     3949, 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950,
+     3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3952,
+     3952, 3952, 3952, 3952, 3952, 3952, 3952, 3952, 3953, 3953,
+
+     3953, 3953, 3953, 3953, 3953, 3953, 3953, 3954, 3954, 3954,
+     3954, 3954, 3954, 3954, 3954, 3954, 3955, 3955, 3955, 3955,
+     3955, 3955, 3955, 3955, 3955, 3956, 3956, 3956, 3956, 3956,
+     3956, 3956, 3956, 3956, 3957, 3957, 3957, 3957, 3957, 3957,
+     3957, 3957, 3957, 3958, 3958, 3958, 3958, 3958, 3958, 3958,
+     3958, 3958, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959,
+     3959, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960,
+     3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3962,
+     3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3963, 3963,
+     3963, 3963, 3963, 3963, 3963, 3963, 3963, 3964, 3964, 3964,
+
+     3964, 3964, 3964, 3964, 3964, 3964, 3965, 3965, 3965, 3965,
+     3965, 3965, 3965, 3965, 3965, 3966, 3966, 3966, 3966, 3966,
+     3966, 3966, 3966, 3966, 3967, 3967, 3967, 3967, 3967, 3967,
+     3967, 3967, 3967, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+     3968, 3968, 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969,
+     3969, 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970,
+     3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3972,
+     3972, 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3973, 3973,
+     3973, 3973, 3973, 3973, 3973, 3973, 3973, 3974, 3974, 3974,
+     3974, 3974, 3974, 3974, 3974, 3974, 3975, 3975, 3975,  442,
+
+      435,  434, 3975, 3976, 3976, 3976,  433,  432,  431, 3976,
+     3977, 3977, 3977,  427,  420,  419, 3977, 3978, 3978, 3978,
+      418,  414,  407, 3978, 3979, 3979, 3979,  406,  402,  395,
+     3979, 3980, 3980, 3980,  394,  393,  389, 3980, 3981, 3981,
+     3981,  383,  382,  381, 3981, 3982, 3982, 3982,  377,  371,
+      367, 3982, 3983, 3983, 3983,  363,  359,  358, 3983, 3984,
+     3984, 3984,  357,  356,  355, 3984, 3985, 3985, 3985,  351,
+      342,  341, 3985, 3986, 3986, 3986,  337,  333,  329, 3986,
+     3987, 3987, 3987,  325,  324,  320, 3987, 3988, 3988, 3988,
+      317,  316,  315, 3988, 3989, 3989, 3989,  309,  308,  306,
+
+     3989, 3990, 3990, 3990,  303,  291,    0, 3990, 3991, 3991,
+     3991,    0,    0,    0, 3991, 3992, 3992, 3992,    0,    0,
+        0, 3992, 3993, 3993, 3993,    0,    0,    0, 3993, 3994,
+     3994, 3994,    0,    0,    0, 3994, 3995, 3995, 3995,    0,
+        0,    0, 3995, 3996, 3996, 3996,    0,    0,    0, 3996,
+     3997, 3997, 3997,    0,    0,    0, 3997, 3998, 3998, 3998,
+        0,    0,    0, 3998, 3999, 3999, 3999,    0,    0,    0,
+     3999, 4000, 4000, 4000,    0,    0,    0, 4000, 4001, 4001,
+     4001,    0,    0,    0, 4001, 4002, 4002, 4002,    0,    0,
+        0, 4002, 4003, 4003, 4003,    0,    0,    0, 4003, 4004,
+
+     4004, 4004,    0,    0,    0, 4004, 4005, 4005, 4005,    0,
+        0,    0, 4005, 4006, 4006, 4006, 4006, 4006, 4006, 4006,
+        0, 4006, 4007, 4007, 4007,    0,    0,    0, 4007, 4008,
+        0,    0,    0, 4008, 4009, 4009, 4009,    0,    0,    0,
+     4009, 4010,    0,    0,    0, 4010, 4011, 4011, 4011,    0,
+        0,    0, 4011, 4012,    0,    0,    0, 4012, 4013, 4013,
+     4013,    0,    0,    0, 4013, 4014,    0,    0,    0, 4014,
+     4015, 4015, 4015,    0,    0,    0, 4015, 4016,    0,    0,
+        0, 4016, 4017, 4017, 4017,    0,    0,    0, 4017, 4018,
+        0,    0,    0, 4018, 4019, 4019, 4019,    0,    0,    0,
+
+     4019, 4020,    0,    0,    0, 4020, 4021, 4021, 4021,    0,
+        0,    0, 4021, 4022,    0,    0,    0, 4022, 4023, 4023,
+     4023,    0,    0,    0, 4023, 4024,    0,    0,    0, 4024,
+     4025, 4025, 4025,    0,    0,    0, 4025, 4026,    0,    0,
+        0, 4026, 4027, 4027, 4027,    0,    0,    0, 4027, 4028,
+        0,    0,    0, 4028, 4029, 4029, 4029,    0,    0,    0,
+     4029, 4030,    0,    0,    0, 4030, 4031, 4031, 4031,    0,
+        0,    0, 4031, 4032,    0,    0,    0, 4032, 4033, 4033,
+     4033,    0,    0,    0, 4033, 4034,    0,    0,    0, 4034,
+     4035, 4035, 4035,    0,    0,    0, 4035, 4036,    0,    0,
+
+        0, 4036, 4037, 4037, 4037,    0,    0,    0, 4037, 4038,
+        0,    0,    0, 4038, 4039, 4039, 4039,    0,    0,    0,
+     4039, 4040,    0,    0,    0, 4040, 4041, 4041, 4041,    0,
+        0,    0, 4041, 4042,    0,    0,    0, 4042, 4043, 4043,
+     4043,    0,    0,    0, 4043, 4044,    0,    0,    0, 4044,
+     4045, 4045, 4045,    0,    0,    0, 4045, 4046,    0,    0,
+        0, 4046, 4047, 4047, 4047,    0,    0,    0, 4047, 4048,
+        0,    0,    0, 4048, 4049, 4049, 4049,    0,    0,    0,
+     4049, 4050,    0,    0,    0, 4050, 4051, 4051, 4051,    0,
+        0,    0, 4051, 4052,    0,    0,    0, 4052, 4053, 4053,
+
+     4053,    0,    0,    0, 4053, 4054,    0,    0,    0, 4054,
+     4055, 4055, 4055,    0,    0,    0, 4055, 4056,    0,    0,
+        0, 4056, 4057, 4057, 4057,    0,    0,    0, 4057, 4058,
+        0,    0,    0, 4058, 4059, 4059, 4059,    0,    0,    0,
+     4059, 4060,    0,    0,    0, 4060, 4061, 4061, 4061,    0,
+        0,    0, 4061, 4062,    0,    0,    0, 4062, 4063, 4063,
+     4063,    0,    0,    0, 4063, 4064,    0,    0,    0, 4064,
+     4065, 4065, 4065,    0,    0,    0, 4065, 4066,    0,    0,
+        0, 4066, 4067, 4067, 4067,    0,    0,    0, 4067, 4068,
+        0,    0,    0, 4068, 4069, 4069, 4069, 4069, 4069, 4069,
+
+     4069, 4069, 4069, 4070,    0,    0,    0,    0, 4070, 4071,
+     4071, 4071,    0,    0,    0, 4071, 4072, 4072, 4072, 4072,
+        0,    0, 4072, 4072, 4073, 4073, 4073, 4073,    0, 4073,
+        0, 4073, 4074, 4074, 4074, 4074,    0,    0, 4074, 4074,
+     4075, 4075, 4075,    0,    0,    0, 4075, 4076, 4076, 4076,
+     4076,    0,    0, 4076, 4076, 4077, 4077, 4077,    0,    0,
+        0, 4077, 4078, 4078, 4078, 4078,    0,    0, 4078, 4078,
+     4079, 4079, 4079,    0,    0,    0, 4079, 4080, 4080, 4080,
+     4080,    0,    0, 4080, 4080, 4081, 4081, 4081, 4081,    0,
+     4081,    0, 4081, 4082, 4082, 4082, 4082,    0,    0, 4082,
+
+     4082, 4083, 4083, 4083, 4083,    0, 4083,    0, 4083, 4084,
+     4084, 4084, 4084,    0,    0, 4084, 4084, 4085, 4085, 4085,
+     4085,    0, 4085,    0, 4085, 4086, 4086, 4086, 4086,    0,
+        0, 4086, 4086, 4087, 4087, 4087, 4087,    0, 4087,    0,
+     4087, 4088, 4088, 4088, 4088,    0,    0, 4088, 4088, 4089,
+     4089, 4089,    0,    0,    0, 4089, 4090, 4090, 4090, 4090,
+        0,    0, 4090, 4090, 4091, 4091, 4091, 4091,    0,    0,
+     4091, 4091, 4092, 4092, 4092,    0,    0,    0, 4092, 4093,
+     4093, 4093, 4093,    0,    0, 4093, 4093, 4094, 4094, 4094,
+        0,    0,    0, 4094, 4095, 4095, 4095, 4095,    0,    0,
+
+     4095, 4095, 4096, 4096, 4096,    0,    0,    0, 4096, 4097,
+     4097, 4097, 4097,    0,    0, 4097, 4097, 4098, 4098, 4098,
+        0,    0,    0, 4098, 4099, 4099, 4099, 4099,    0,    0,
+     4099, 4099, 4100, 4100, 4100,    0,    0,    0, 4100, 4101,
+     4101, 4101, 4101,    0,    0, 4101, 4101, 4102, 4102, 4102,
+        0,    0,    0, 4102, 4103, 4103, 4103, 4103,    0,    0,
+     4103, 4103, 4104, 4104, 4104,    0,    0,    0, 4104, 4105,
+     4105, 4105, 4105,    0,    0, 4105, 4105, 4106, 4106, 4106,
+        0,    0,    0, 4106, 4107, 4107, 4107, 4107,    0,    0,
+     4107, 4107, 4108, 4108, 4108,    0,    0,    0, 4108, 4109,
+
+     4109, 4109, 4109,    0,    0, 4109, 4109, 4110, 4110, 4110,
+        0,    0,    0, 4110, 4111, 4111, 4111, 4111,    0,    0,
+     4111, 4111, 4112, 4112, 4112,    0,    0,    0, 4112, 4113,
+     4113, 4113, 4113,    0,    0, 4113, 4113, 4114, 4114, 4114,
+        0,    0,    0, 4114, 4115, 4115, 4115, 4115,    0,    0,
+     4115, 4115, 4116, 4116, 4116, 4116,    0, 4116,    0, 4116,
+     4117, 4117, 4117, 4117,    0,    0, 4117, 4117, 4118, 4118,
+     4118,    0,    0,    0, 4118, 4119, 4119, 4119, 4119,    0,
+        0, 4119, 4119, 4120, 4120, 4120,    0,    0,    0, 4120,
+     4121, 4121, 4121, 4121,    0,    0, 4121, 4121, 4122, 4122,
+
+     4122,    0,    0,    0, 4122, 4123, 4123, 4123, 4123,    0,
+        0, 4123, 4123, 4124, 4124, 4124,    0,    0,    0, 4124,
+     4125, 4125, 4125, 4125,    0,    0, 4125, 4125, 4126, 4126,
+     4126,    0,    0,    0, 4126, 4127, 4127, 4127, 4127,    0,
+        0, 4127, 4127, 4128, 4128, 4128,    0,    0,    0, 4128,
+     4129, 4129, 4129, 4129,    0,    0, 4129, 4129, 4130, 4130,
+     4130, 4130,    0, 4130,    0, 4130, 4131, 4131, 4131, 4131,
+        0,    0, 4131, 4131, 4132, 4132, 4132, 4132, 4132, 4132,
+     4132, 4132, 4132, 4133,    0, 4133,    0,    0, 4133, 4134,
+     4134, 4134,    0,    0,    0, 4134, 4135, 4135, 4135, 4135,
+
+        0,    0, 4135, 4135, 4136, 4136, 4136,    0,    0,    0,
+     4136, 4137, 4137, 4137, 4137,    0,    0, 4137, 4137, 4138,
+     4138, 4138,    0,    0,    0, 4138, 4139, 4139, 4139, 4139,
+        0,    0, 4139, 4139, 4140, 4140, 4140,    0,    0,    0,
+     4140, 4141, 4141, 4141, 4141,    0,    0, 4141, 4141, 4142,
+     4142, 4142,    0,    0,    0, 4142, 4143, 4143, 4143, 4143,
+        0,    0, 4143, 4143, 4144, 4144, 4144,    0,    0,    0,
+     4144, 4145, 4145, 4145, 4145,    0,    0, 4145, 4145, 4146,
+     4146, 4146, 4146,    0,    0, 4146, 4146, 4147, 4147, 4147,
+        0,    0,    0, 4147, 4148, 4148, 4148, 4148,    0,    0,
+
+     4148, 4148, 4149, 4149, 4149,    0,    0,    0, 4149, 4150,
+     4150, 4150, 4150,    0,    0, 4150, 4150, 4151, 4151, 4151,
+        0,    0,    0, 4151, 4152, 4152, 4152, 4152,    0,    0,
+     4152, 4152, 4153, 4153, 4153, 4153,    0,    0, 4153, 4153,
+     4154, 4154, 4154,    0,    0,    0, 4154, 4155, 4155, 4155,
+     4155,    0,    0, 4155, 4155, 4156, 4156, 4156, 4156,    0,
+     4156,    0, 4156, 4157, 4157, 4157, 4157,    0,    0, 4157,
+     4157, 4158, 4158, 4158, 4158,    0, 4158,    0, 4158, 4159,
+     4159, 4159, 4159,    0,    0, 4159, 4159, 4160, 4160, 4160,
+        0,    0,    0, 4160, 4161, 4161, 4161, 4161,    0,    0,
+
+     4161, 4161, 4162, 4162, 4162,    0,    0,    0, 4162, 4163,
+     4163, 4163, 4163,    0,    0, 4163, 4163, 4164, 4164, 4164,
+        0,    0,    0, 4164, 4165, 4165, 4165, 4165,    0,    0,
+     4165, 4165, 4166, 4166, 4166, 4166,    0, 4166,    0, 4166,
+     4167, 4167, 4167, 4167,    0,    0, 4167, 4167, 4168, 4168,
+     4168,    0,    0,    0, 4168, 4169, 4169, 4169, 4169,    0,
+        0, 4169, 4169, 4170, 4170, 4170,    0,    0,    0, 4170,
+     4171, 4171, 4171, 4171,    0,    0, 4171, 4171, 4172, 4172,
+     4172,    0,    0,    0, 4172, 4173, 4173, 4173, 4173,    0,
+        0, 4173, 4173, 4174, 4174, 4174,    0,    0,    0, 4174,
+
+     4175, 4175, 4175, 4175,    0,    0, 4175, 4175, 4176, 4176,
+     4176,    0,    0,    0, 4176, 4177, 4177, 4177, 4177,    0,
+        0, 4177, 4177, 4178, 4178, 4178,    0,    0,    0, 4178,
+     4179, 4179, 4179, 4179,    0,    0, 4179, 4179, 4180, 4180,
+     4180,    0,    0,    0, 4180, 4181, 4181, 4181, 4181,    0,
+        0, 4181, 4181, 4182, 4182, 4182,    0,    0,    0, 4182,
+     4183, 4183, 4183, 4183,    0,    0, 4183, 4183, 4184, 4184,
+     4184,    0,    0,    0, 4184, 4185, 4185, 4185, 4185,    0,
+        0, 4185, 4185, 4186, 4186, 4186, 4186,    0, 4186,    0,
+     4186, 4187, 4187, 4187, 4187,    0,    0, 4187, 4187, 4188,
+
+     4188, 4188,    0,    0,    0, 4188, 4189, 4189, 4189, 4189,
+        0,    0, 4189, 4189, 4190, 4190, 4190,    0,    0,    0,
+     4190, 4191, 4191, 4191, 4191,    0,    0, 4191, 4191, 4192,
+     4192, 4192,    0,    0,    0, 4192, 4193, 4193, 4193, 4193,
+        0,    0, 4193, 4193, 4194, 4194, 4194, 4194, 4194, 4194,
+     4194, 4194, 4194, 4195, 4195, 4195, 4195, 4195, 4195, 4195,
+     4195, 4195, 4196, 4196, 4196,    0,    0,    0, 4196, 4197,
+     4197, 4197,    0,    0,    0, 4197, 4198, 4198, 4198, 4198,
+        0,    0, 4198, 4198, 4199, 4199, 4199,    0,    0,    0,
+     4199, 4200, 4200, 4200, 4200,    0,    0, 4200, 4200, 4201,
+
+     4201, 4201, 4201,    0, 4201,    0, 4201, 4202, 4202, 4202,
+     4202,    0,    0, 4202, 4202, 4203, 4203, 4203,    0,    0,
+        0, 4203, 4204, 4204, 4204, 4204,    0,    0, 4204, 4204,
+     4205, 4205, 4205,    0,    0,    0, 4205, 4206, 4206, 4206,
+     4206,    0,    0, 4206, 4206, 4207, 4207, 4207, 4207,    0,
+        0, 4207, 4207, 4208, 4208, 4208,    0,    0,    0, 4208,
+     4209, 4209, 4209, 4209,    0,    0, 4209, 4209, 4210, 4210,
+     4210,    0,    0,    0, 4210, 4211, 4211, 4211, 4211,    0,
+        0, 4211, 4211, 4212, 4212, 4212, 4212,    0, 4212,    0,
+     4212, 4213, 4213, 4213, 4213,    0,    0, 4213, 4213, 4214,
+
+     4214, 4214, 4214,    0,    0, 4214, 4214, 4215, 4215, 4215,
+        0,    0,    0, 4215, 4216, 4216, 4216, 4216,    0,    0,
+     4216, 4216, 4217, 4217, 4217, 4217,    0,    0, 4217, 4217,
+     4218, 4218, 4218, 4218,    0,    0, 4218, 4218, 4219, 4219,
+     4219,    0,    0,    0, 4219, 4220, 4220, 4220, 4220,    0,
+        0, 4220, 4220, 4221, 4221, 4221,    0,    0,    0, 4221,
+     4222, 4222, 4222, 4222,    0,    0, 4222, 4222, 4223, 4223,
+     4223, 4223,    0, 4223,    0, 4223, 4224, 4224, 4224, 4224,
+        0,    0, 4224, 4224, 4225, 4225, 4225,    0,    0,    0,
+     4225, 4226, 4226, 4226, 4226,    0,    0, 4226, 4226, 4227,
+
+     4227, 4227,    0,    0,    0, 4227, 4228, 4228, 4228, 4228,
+        0,    0, 4228, 4228, 4229, 4229, 4229,    0,    0,    0,
+     4229, 4230, 4230, 4230, 4230,    0,    0, 4230, 4230, 4231,
+     4231, 4231,    0,    0,    0, 4231, 4232, 4232, 4232, 4232,
+        0,    0, 4232, 4232, 4233, 4233, 4233, 4233,    0, 4233,
+        0, 4233, 4234, 4234, 4234, 4234,    0,    0, 4234, 4234,
+     4235, 4235, 4235,    0,    0,    0, 4235, 4236, 4236, 4236,
+     4236,    0,    0, 4236, 4236, 4237, 4237, 4237,    0,    0,
+        0, 4237, 4238, 4238, 4238, 4238,    0,    0, 4238, 4238,
+     4239, 4239, 4239,    0,    0,    0, 4239, 4240, 4240, 4240,
+
+     4240,    0,    0, 4240, 4240, 4241, 4241, 4241,    0,    0,
+        0, 4241, 4242, 4242, 4242, 4242,    0,    0, 4242, 4242,
+     4243, 4243, 4243,    0,    0,    0, 4243, 4244, 4244, 4244,
+     4244,    0,    0, 4244, 4244, 4245, 4245, 4245,    0,    0,
+        0, 4245, 4246, 4246, 4246, 4246,    0,    0, 4246, 4246,
+     4247, 4247, 4247,    0,    0,    0, 4247, 4248, 4248, 4248,
+     4248,    0,    0, 4248, 4248, 4249, 4249, 4249,    0,    0,
+        0, 4249, 4250, 4250, 4250, 4250,    0,    0, 4250, 4250,
+     4251, 4251, 4251,    0,    0,    0, 4251, 4252, 4252, 4252,
+     4252,    0,    0, 4252, 4252, 4253, 4253, 4253, 4253, 4253,
+
+     4253, 4253, 4253, 4253, 4254, 4254, 4254, 4254, 4254, 4254,
+     4254, 4254, 4254, 4255, 4255, 4255,    0,    0,    0, 4255,
+     4256, 4256, 4256, 4256,    0, 4256,    0, 4256, 4257, 4257,
+     4257, 4257,    0,    0, 4257, 4257, 4258, 4258, 4258,    0,
+        0,    0, 4258, 4259, 4259, 4259, 4259,    0,    0, 4259,
+     4259, 4260, 4260, 4260, 4260,    0,    0, 4260, 4260, 4261,
+     4261, 4261,    0,    0,    0, 4261, 4262, 4262, 4262, 4262,
+        0,    0, 4262, 4262, 4263, 4263, 4263, 4263,    0, 4263,
+        0, 4263, 4264, 4264, 4264, 4264,    0,    0, 4264, 4264,
+     4265, 4265, 4265, 4265,    0,    0, 4265, 4265, 4266, 4266,
+
+     4266, 4266,    0, 4266,    0, 4266, 4267, 4267, 4267, 4267,
+        0,    0, 4267, 4267, 4268, 4268, 4268, 4268,    0, 4268,
+        0, 4268, 4269, 4269, 4269, 4269,    0,    0, 4269, 4269,
+     4270, 4270, 4270, 4270,    0, 4270,    0, 4270, 4271, 4271,
+     4271, 4271,    0,    0, 4271, 4271, 4272, 4272, 4272, 4272,
+        0,    0, 4272, 4272, 4273, 4273, 4273,    0,    0,    0,
+     4273, 4274, 4274, 4274, 4274,    0,    0, 4274, 4274, 4275,
+     4275, 4275, 4275,    0,    0, 4275, 4275, 4276, 4276, 4276,
+     4276,    0,    0, 4276, 4276, 4277, 4277, 4277,    0,    0,
+        0, 4277, 4278, 4278, 4278, 4278,    0,    0, 4278, 4278,
+
+     4279, 4279, 4279,    0,    0,    0, 4279, 4280, 4280, 4280,
+     4280,    0,    0, 4280, 4280, 4281, 4281, 4281, 4281,    0,
+        0, 4281, 4281, 4282, 4282, 4282,    0,    0,    0, 4282,
+     4283, 4283, 4283, 4283,    0,    0, 4283, 4283, 4284, 4284,
+     4284,    0,    0,    0, 4284, 4285, 4285, 4285, 4285,    0,
+        0, 4285, 4285, 4286, 4286, 4286,    0,    0,    0, 4286,
+     4287, 4287, 4287, 4287,    0,    0, 4287, 4287, 4288, 4288,
+     4288,    0,    0,    0, 4288, 4289, 4289, 4289, 4289,    0,
+        0, 4289, 4289, 4290, 4290, 4290, 4290,    0,    0, 4290,
+     4290, 4291, 4291, 4291,    0,    0,    0, 4291, 4292, 4292,
+
+     4292, 4292,    0,    0, 4292, 4292, 4293, 4293, 4293,    0,
+        0,    0, 4293, 4294, 4294, 4294, 4294,    0,    0, 4294,
+     4294, 4295, 4295, 4295,    0,    0,    0, 4295, 4296, 4296,
+     4296, 4296,    0,    0, 4296, 4296, 4297, 4297, 4297, 4297,
+        0, 4297,    0, 4297, 4298, 4298, 4298, 4298,    0,    0,
+     4298, 4298, 4299, 4299, 4299,    0,    0,    0, 4299, 4300,
+     4300, 4300, 4300,    0,    0, 4300, 4300, 4301, 4301, 4301,
+        0,    0,    0, 4301, 4302, 4302, 4302, 4302,    0,    0,
+     4302, 4302, 4303, 4303, 4303,    0,    0,    0, 4303, 4304,
+     4304, 4304, 4304,    0,    0, 4304, 4304, 4305, 4305, 4305,
+
+        0,    0,    0, 4305, 4306, 4306, 4306, 4306,    0,    0,
+     4306, 4306, 4307, 4307, 4307, 4307,    0, 4307,    0, 4307,
+     4308, 4308, 4308, 4308,    0,    0, 4308, 4308, 4309, 4309,
+     4309, 4309, 4309, 4309, 4309, 4309, 4309, 4310, 4310, 4310,
+     4310, 4310, 4310, 4310, 4310, 4310, 4311, 4311, 4311, 4311,
+        0, 4311,    0, 4311, 4312, 4312, 4312,    0,    0,    0,
+     4312, 4313, 4313, 4313, 4313,    0,    0, 4313, 4313, 4314,
+     4314, 4314,    0,    0,    0, 4314, 4315, 4315, 4315, 4315,
+        0,    0, 4315, 4315, 4316, 4316, 4316, 4316,    0,    0,
+     4316, 4316, 4317, 4317, 4317,    0,    0,    0, 4317, 4318,
+
+     4318, 4318, 4318,    0,    0, 4318, 4318, 4319, 4319, 4319,
+     4319,    0,    0, 4319, 4319, 4320, 4320, 4320, 4320,    0,
+        0, 4320, 4320, 4321, 4321, 4321, 4321,    0,    0, 4321,
+     4321, 4322, 4322, 4322, 4322,    0, 4322,    0, 4322, 4323,
+     4323, 4323, 4323,    0,    0, 4323, 4323, 4324, 4324, 4324,
+        0,    0,    0, 4324, 4325, 4325, 4325, 4325,    0,    0,
+     4325, 4325, 4326, 4326, 4326, 4326,    0,    0, 4326, 4326,
+     4327, 4327, 4327,    0,    0,    0, 4327, 4328, 4328, 4328,
+     4328,    0,    0, 4328, 4328, 4329, 4329, 4329, 4329,    0,
+        0, 4329, 4329, 4330, 4330, 4330,    0,    0,    0, 4330,
+
+     4331, 4331, 4331,    0,    0,    0, 4331, 4332, 4332, 4332,
+     4332,    0,    0, 4332, 4332, 4333, 4333, 4333, 4333,    0,
+        0, 4333, 4333, 4334, 4334, 4334,    0,    0,    0, 4334,
+     4335, 4335, 4335, 4335,    0,    0, 4335, 4335, 4336, 4336,
+     4336,    0,    0,    0, 4336, 4337, 4337, 4337, 4337,    0,
+     4337,    0, 4337, 4338, 4338, 4338, 4338,    0,    0, 4338,
+     4338, 4339, 4339, 4339,    0,    0,    0, 4339, 4340, 4340,
+     4340, 4340,    0,    0, 4340, 4340, 4341, 4341, 4341,    0,
+        0,    0, 4341, 4342, 4342, 4342, 4342,    0,    0, 4342,
+     4342, 4343, 4343, 4343,    0,    0,    0, 4343, 4344, 4344,
+
+     4344, 4344,    0,    0, 4344, 4344, 4345, 4345, 4345,    0,
+        0,    0, 4345, 4346, 4346, 4346, 4346,    0,    0, 4346,
+     4346, 4347, 4347, 4347, 4347,    0, 4347,    0, 4347, 4348,
+     4348, 4348, 4348,    0,    0, 4348, 4348, 4349, 4349, 4349,
+     4349,    0, 4349,    0, 4349, 4350, 4350, 4350, 4350,    0,
+        0, 4350, 4350, 4351, 4351, 4351,    0,    0,    0, 4351,
+     4352, 4352, 4352, 4352,    0,    0, 4352, 4352, 4353, 4353,
+     4353, 4353,    0, 4353,    0, 4353, 4354, 4354, 4354, 4354,
+        0,    0, 4354, 4354, 4355, 4355, 4355, 4355,    0, 4355,
+        0, 4355, 4356, 4356, 4356,    0,    0,    0, 4356, 4357,
+
+     4357, 4357, 4357,    0,    0, 4357, 4357, 4358, 4358, 4358,
+     4358, 4358, 4358, 4358, 4358, 4358, 4359, 4359, 4359, 4359,
+     4359, 4359, 4359, 4359, 4359, 4360, 4360, 4360,    0,    0,
+        0, 4360, 4361, 4361, 4361, 4361,    0,    0, 4361, 4361,
+     4362, 4362, 4362, 4362,    0, 4362,    0, 4362, 4363, 4363,
+     4363, 4363,    0,    0, 4363, 4363, 4364, 4364, 4364,    0,
+        0,    0, 4364, 4365, 4365, 4365, 4365,    0,    0, 4365,
+     4365, 4366, 4366, 4366, 4366,    0,    0, 4366, 4366, 4367,
+     4367, 4367, 4367,    0,    0, 4367, 4367, 4368, 4368, 4368,
+     4368,    0,    0, 4368, 4368, 4369, 4369, 4369, 4369,    0,
+
+        0, 4369, 4369, 4370, 4370, 4370,    0,    0,    0, 4370,
+     4371, 4371, 4371, 4371,    0,    0, 4371, 4371, 4372, 4372,
+     4372, 4372,    0,    0, 4372, 4372, 4373, 4373, 4373,    0,
+        0,    0, 4373, 4374, 4374, 4374, 4374,    0,    0, 4374,
+     4374, 4375, 4375, 4375, 4375,    0,    0, 4375, 4375, 4376,
+     4376, 4376,    0,    0,    0, 4376, 4377, 4377, 4377,    0,
+        0,    0, 4377, 4378, 4378, 4378, 4378,    0,    0, 4378,
+     4378, 4379, 4379, 4379, 4379,    0,    0, 4379, 4379, 4380,
+     4380, 4380,    0,    0,    0, 4380, 4381, 4381, 4381,    0,
+        0,    0, 4381, 4382, 4382, 4382, 4382,    0,    0, 4382,
+
+     4382, 4383, 4383, 4383, 4383,    0, 4383,    0, 4383, 4384,
+     4384, 4384, 4384,    0,    0, 4384, 4384, 4385, 4385, 4385,
+        0,    0,    0, 4385, 4386, 4386, 4386, 4386,    0,    0,
+     4386, 4386, 4387, 4387, 4387,    0,    0,    0, 4387, 4388,
+     4388, 4388,    0,    0,    0, 4388, 4389, 4389, 4389, 4389,
+        0,    0, 4389, 4389, 4390, 4390, 4390,    0,    0,    0,
+     4390, 4391, 4391, 4391, 4391,    0,    0, 4391, 4391, 4392,
+     4392, 4392,    0,    0,    0, 4392, 4393, 4393, 4393, 4393,
+        0,    0, 4393, 4393, 4394, 4394, 4394,    0,    0,    0,
+     4394, 4395, 4395, 4395, 4395,    0,    0, 4395, 4395, 4396,
+
+     4396, 4396,    0,    0,    0, 4396, 4397, 4397, 4397, 4397,
+        0,    0, 4397, 4397, 4398, 4398, 4398, 4398, 4398, 4398,
+     4398, 4398, 4398, 4399, 4399, 4399, 4399, 4399, 4399, 4399,
+     4399, 4399, 4400, 4400, 4400,    0,    0,    0, 4400, 4401,
+     4401, 4401, 4401,    0,    0, 4401, 4401, 4402, 4402, 4402,
+     4402,    0, 4402,    0, 4402, 4403, 4403, 4403, 4403,    0,
+        0, 4403, 4403, 4404, 4404, 4404, 4404,    0, 4404,    0,
+     4404, 4405, 4405, 4405, 4405,    0,    0, 4405, 4405, 4406,
+     4406, 4406, 4406,    0,    0, 4406, 4406, 4407, 4407, 4407,
+     4407,    0,    0, 4407, 4407, 4408, 4408, 4408, 4408,    0,
+
+        0, 4408, 4408, 4409, 4409, 4409, 4409,    0,    0, 4409,
+     4409, 4410, 4410, 4410,    0,    0,    0, 4410, 4411, 4411,
+     4411, 4411,    0,    0, 4411, 4411, 4412, 4412, 4412,    0,
+        0,    0, 4412, 4413, 4413, 4413, 4413,    0,    0, 4413,
+     4413, 4414, 4414, 4414, 4414,    0,    0, 4414, 4414, 4415,
+     4415, 4415, 4415,    0, 4415,    0, 4415, 4416, 4416, 4416,
+     4416,    0, 4416,    0, 4416, 4417, 4417, 4417, 4417,    0,
+        0, 4417, 4417, 4418, 4418, 4418, 4418,    0,    0, 4418,
+     4418, 4419, 4419, 4419, 4419,    0, 4419,    0, 4419, 4420,
+     4420, 4420,    0,    0,    0, 4420, 4421, 4421, 4421, 4421,
+
+        0,    0, 4421, 4421, 4422, 4422, 4422, 4422,    0, 4422,
+        0, 4422, 4423, 4423, 4423, 4423,    0,    0, 4423, 4423,
+     4424, 4424, 4424, 4424,    0, 4424,    0, 4424, 4425, 4425,
+     4425,    0,    0,    0, 4425, 4426, 4426, 4426,    0,    0,
+        0, 4426, 4427, 4427, 4427,    0,    0,    0, 4427, 4428,
+     4428, 4428, 4428,    0,    0, 4428, 4428, 4429, 4429, 4429,
+        0,    0,    0, 4429, 4430, 4430, 4430, 4430,    0,    0,
+     4430, 4430, 4431, 4431, 4431,    0,    0,    0, 4431, 4432,
+     4432, 4432, 4432,    0,    0, 4432, 4432, 4433, 4433, 4433,
+        0,    0,    0, 4433, 4434, 4434, 4434, 4434,    0,    0,
+
+     4434, 4434, 4435, 4435, 4435, 4435, 4435, 4435, 4435, 4435,
+     4435, 4436, 4436, 4436, 4436, 4436, 4436, 4436, 4436, 4436,
+     4437, 4437, 4437,    0,    0,    0, 4437, 4438, 4438, 4438,
+     4438,    0, 4438,    0, 4438, 4439, 4439, 4439, 4439,    0,
+        0, 4439, 4439, 4440, 4440, 4440, 4440,    0,    0, 4440,
+     4440, 4441, 4441, 4441, 4441,    0,    0, 4441, 4441, 4442,
+     4442, 4442, 4442,    0,    0, 4442, 4442, 4443, 4443, 4443,
+     4443,    0,    0, 4443, 4443, 4444, 4444, 4444,    0,    0,
+        0, 4444, 4445, 4445, 4445,    0,    0,    0, 4445, 4446,
+     4446, 4446, 4446,    0,    0, 4446, 4446, 4447, 4447, 4447,
+
+        0,    0,    0, 4447, 4448, 4448, 4448, 4448,    0,    0,
+     4448, 4448, 4449, 4449, 4449, 4449,    0,    0, 4449, 4449,
+     4450, 4450, 4450,    0,    0,    0, 4450, 4451, 4451, 4451,
+     4451,    0,    0, 4451, 4451, 4452, 4452, 4452, 4452,    0,
+     4452,    0, 4452, 4453, 4453, 4453,    0,    0,    0, 4453,
+     4454, 4454, 4454,    0,    0,    0, 4454, 4455, 4455, 4455,
+        0,    0,    0, 4455, 4456, 4456, 4456,    0,    0,    0,
+     4456, 4457, 4457, 4457,    0,    0,    0, 4457, 4458, 4458,
+     4458, 4458,    0,    0, 4458, 4458, 4459, 4459, 4459,    0,
+        0,    0, 4459, 4460, 4460, 4460, 4460,    0,    0, 4460,
+
+     4460, 4461, 4461, 4461,    0,    0,    0, 4461, 4462, 4462,
+     4462, 4462,    0,    0, 4462, 4462, 4463, 4463, 4463, 4463,
+     4463, 4463, 4463, 4463, 4463, 4464, 4464, 4464, 4464, 4464,
+     4464, 4464, 4464, 4464, 4465, 4465, 4465, 4465,    0, 4465,
+        0, 4465, 4466, 4466, 4466, 4466, 4466, 4466, 4466, 4466,
+     4466, 4467, 4467, 4467, 4467, 4467, 4467, 4467, 4467, 4467,
+     4468, 4468, 4468, 4468, 4468, 4468, 4468, 4468, 4468, 4469,
+     4469, 4469, 4469, 4469, 4469, 4469, 4469, 4469, 4470, 4470,
+     4470, 4470, 4470, 4470, 4470, 4470, 4470, 4471, 4471, 4471,
+     4471, 4471, 4471, 4471, 4471, 4471, 3905, 3905, 3905, 3905,
+
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905,
+     3905, 3905
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[562] =
+static yyconst flex_int32_t yy_rule_can_match_eol[652] =
     {   0,
 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
     0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 
-    1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
-    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
-    0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
-    1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 
-    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 
-    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 
-    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
-    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 
     1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
     1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 
-    0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
-    0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
-    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 
-    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 
-    1, 0,     };
+    0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
+    0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 
+    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
+    0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 
+    1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 
+    1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
+    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 
+    1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+    1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
+    1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,     };
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
@@ -4463,6 +5136,21 @@ short int surfxml_ASroute_src_isset;
 AT_surfxml_ASroute_symmetrical AX_surfxml_ASroute_symmetrical;
 #define A_surfxml_ASroute_symmetrical AX_surfxml_ASroute_symmetrical
 short int surfxml_ASroute_symmetrical_isset;
+AT_surfxml_actor_function AX_surfxml_actor_function;
+#define A_surfxml_actor_function (surfxml_bufferstack + AX_surfxml_actor_function)
+short int surfxml_actor_function_isset;
+AT_surfxml_actor_host AX_surfxml_actor_host;
+#define A_surfxml_actor_host (surfxml_bufferstack + AX_surfxml_actor_host)
+short int surfxml_actor_host_isset;
+AT_surfxml_actor_kill___time AX_surfxml_actor_kill___time;
+#define A_surfxml_actor_kill___time (surfxml_bufferstack + AX_surfxml_actor_kill___time)
+short int surfxml_actor_kill___time_isset;
+AT_surfxml_actor_on___failure AX_surfxml_actor_on___failure;
+#define A_surfxml_actor_on___failure AX_surfxml_actor_on___failure
+short int surfxml_actor_on___failure_isset;
+AT_surfxml_actor_start___time AX_surfxml_actor_start___time;
+#define A_surfxml_actor_start___time (surfxml_bufferstack + AX_surfxml_actor_start___time)
+short int surfxml_actor_start___time_isset;
 AT_surfxml_argument_value AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 short int surfxml_argument_value_isset;
@@ -4493,6 +5181,18 @@ short int surfxml_bypassRoute_dst_isset;
 AT_surfxml_bypassRoute_src AX_surfxml_bypassRoute_src;
 #define A_surfxml_bypassRoute_src (surfxml_bufferstack + AX_surfxml_bypassRoute_src)
 short int surfxml_bypassRoute_src_isset;
+AT_surfxml_bypassZoneRoute_dst AX_surfxml_bypassZoneRoute_dst;
+#define A_surfxml_bypassZoneRoute_dst (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_dst)
+short int surfxml_bypassZoneRoute_dst_isset;
+AT_surfxml_bypassZoneRoute_gw___dst AX_surfxml_bypassZoneRoute_gw___dst;
+#define A_surfxml_bypassZoneRoute_gw___dst (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_gw___dst)
+short int surfxml_bypassZoneRoute_gw___dst_isset;
+AT_surfxml_bypassZoneRoute_gw___src AX_surfxml_bypassZoneRoute_gw___src;
+#define A_surfxml_bypassZoneRoute_gw___src (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_gw___src)
+short int surfxml_bypassZoneRoute_gw___src_isset;
+AT_surfxml_bypassZoneRoute_src AX_surfxml_bypassZoneRoute_src;
+#define A_surfxml_bypassZoneRoute_src (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_src)
+short int surfxml_bypassZoneRoute_src_isset;
 AT_surfxml_cabinet_bw AX_surfxml_cabinet_bw;
 #define A_surfxml_cabinet_bw (surfxml_bufferstack + AX_surfxml_cabinet_bw)
 short int surfxml_cabinet_bw_isset;
@@ -4778,6 +5478,27 @@ short int surfxml_trace___connect_kind_isset;
 AT_surfxml_trace___connect_trace AX_surfxml_trace___connect_trace;
 #define A_surfxml_trace___connect_trace (surfxml_bufferstack + AX_surfxml_trace___connect_trace)
 short int surfxml_trace___connect_trace_isset;
+AT_surfxml_zone_id AX_surfxml_zone_id;
+#define A_surfxml_zone_id (surfxml_bufferstack + AX_surfxml_zone_id)
+short int surfxml_zone_id_isset;
+AT_surfxml_zone_routing AX_surfxml_zone_routing;
+#define A_surfxml_zone_routing AX_surfxml_zone_routing
+short int surfxml_zone_routing_isset;
+AT_surfxml_zoneRoute_dst AX_surfxml_zoneRoute_dst;
+#define A_surfxml_zoneRoute_dst (surfxml_bufferstack + AX_surfxml_zoneRoute_dst)
+short int surfxml_zoneRoute_dst_isset;
+AT_surfxml_zoneRoute_gw___dst AX_surfxml_zoneRoute_gw___dst;
+#define A_surfxml_zoneRoute_gw___dst (surfxml_bufferstack + AX_surfxml_zoneRoute_gw___dst)
+short int surfxml_zoneRoute_gw___dst_isset;
+AT_surfxml_zoneRoute_gw___src AX_surfxml_zoneRoute_gw___src;
+#define A_surfxml_zoneRoute_gw___src (surfxml_bufferstack + AX_surfxml_zoneRoute_gw___src)
+short int surfxml_zoneRoute_gw___src_isset;
+AT_surfxml_zoneRoute_src AX_surfxml_zoneRoute_src;
+#define A_surfxml_zoneRoute_src (surfxml_bufferstack + AX_surfxml_zoneRoute_src)
+short int surfxml_zoneRoute_src_isset;
+AT_surfxml_zoneRoute_symmetrical AX_surfxml_zoneRoute_symmetrical;
+#define A_surfxml_zoneRoute_symmetrical AX_surfxml_zoneRoute_symmetrical
+short int surfxml_zoneRoute_symmetrical_isset;
 
 /* XML state. */
 #ifdef FLEX_DEBUG
@@ -4952,100 +5673,126 @@ const char* *surfxml_statenames=NULL;
 #define S_surfxml_ASroute_1 22
 #define S_surfxml_ASroute_2 23
 #define E_surfxml_ASroute 24
-#define AL_surfxml_argument 25
-#define E_surfxml_argument 26
-#define AL_surfxml_backbone 27
-#define E_surfxml_backbone 28
-#define AL_surfxml_bypassASroute 29
-#define S_surfxml_bypassASroute 30
-#define S_surfxml_bypassASroute_1 31
-#define S_surfxml_bypassASroute_2 32
-#define E_surfxml_bypassASroute 33
-#define AL_surfxml_bypassRoute 34
-#define S_surfxml_bypassRoute 35
-#define S_surfxml_bypassRoute_1 36
-#define S_surfxml_bypassRoute_2 37
-#define E_surfxml_bypassRoute 38
-#define AL_surfxml_cabinet 39
-#define E_surfxml_cabinet 40
-#define AL_surfxml_cluster 41
-#define S_surfxml_cluster 42
-#define S_surfxml_cluster_1 43
-#define S_surfxml_cluster_2 44
-#define E_surfxml_cluster 45
-#define AL_surfxml_config 46
-#define S_surfxml_config 47
-#define S_surfxml_config_1 48
-#define S_surfxml_config_2 49
-#define E_surfxml_config 50
-#define AL_surfxml_host 51
-#define S_surfxml_host 52
-#define S_surfxml_host_1 53
-#define S_surfxml_host_2 54
-#define E_surfxml_host 55
-#define AL_surfxml_host___link 56
-#define E_surfxml_host___link 57
-#define AL_surfxml_include 58
-#define S_surfxml_include 59
-#define S_surfxml_include_1 60
-#define S_surfxml_include_2 61
-#define E_surfxml_include 62
-#define AL_surfxml_link 63
-#define S_surfxml_link 64
-#define S_surfxml_link_1 65
-#define S_surfxml_link_2 66
-#define E_surfxml_link 67
-#define AL_surfxml_link___ctn 68
-#define E_surfxml_link___ctn 69
-#define AL_surfxml_model___prop 70
-#define E_surfxml_model___prop 71
-#define AL_surfxml_mount 72
-#define E_surfxml_mount 73
-#define AL_surfxml_peer 74
-#define E_surfxml_peer 75
-#define ROOT_surfxml_platform 76
-#define AL_surfxml_platform 77
-#define S_surfxml_platform 78
-#define S_surfxml_platform_1 79
-#define S_surfxml_platform_2 80
-#define S_surfxml_platform_3 81
-#define S_surfxml_platform_4 82
-#define S_surfxml_platform_5 83
-#define S_surfxml_platform_6 84
-#define S_surfxml_platform_7 85
-#define S_surfxml_platform_8 86
-#define E_surfxml_platform 87
-#define AL_surfxml_process 88
-#define S_surfxml_process 89
-#define S_surfxml_process_1 90
-#define S_surfxml_process_2 91
-#define E_surfxml_process 92
-#define AL_surfxml_prop 93
-#define E_surfxml_prop 94
-#define AL_surfxml_random 95
-#define E_surfxml_random 96
-#define AL_surfxml_route 97
-#define S_surfxml_route 98
-#define S_surfxml_route_1 99
-#define S_surfxml_route_2 100
-#define E_surfxml_route 101
-#define AL_surfxml_router 102
-#define E_surfxml_router 103
-#define AL_surfxml_storage 104
-#define S_surfxml_storage 105
-#define S_surfxml_storage_1 106
-#define S_surfxml_storage_2 107
-#define E_surfxml_storage 108
-#define AL_surfxml_storage___type 109
-#define S_surfxml_storage___type 110
-#define S_surfxml_storage___type_1 111
-#define S_surfxml_storage___type_2 112
-#define E_surfxml_storage___type 113
-#define AL_surfxml_trace 114
-#define IN_trace 115
-#define AL_surfxml_trace___connect 116
-#define E_surfxml_trace___connect 117
-#define IMPOSSIBLE 118
+#define AL_surfxml_actor 25
+#define S_surfxml_actor 26
+#define S_surfxml_actor_1 27
+#define S_surfxml_actor_2 28
+#define E_surfxml_actor 29
+#define AL_surfxml_argument 30
+#define E_surfxml_argument 31
+#define AL_surfxml_backbone 32
+#define E_surfxml_backbone 33
+#define AL_surfxml_bypassASroute 34
+#define S_surfxml_bypassASroute 35
+#define S_surfxml_bypassASroute_1 36
+#define S_surfxml_bypassASroute_2 37
+#define E_surfxml_bypassASroute 38
+#define AL_surfxml_bypassRoute 39
+#define S_surfxml_bypassRoute 40
+#define S_surfxml_bypassRoute_1 41
+#define S_surfxml_bypassRoute_2 42
+#define E_surfxml_bypassRoute 43
+#define AL_surfxml_bypassZoneRoute 44
+#define S_surfxml_bypassZoneRoute 45
+#define S_surfxml_bypassZoneRoute_1 46
+#define S_surfxml_bypassZoneRoute_2 47
+#define E_surfxml_bypassZoneRoute 48
+#define AL_surfxml_cabinet 49
+#define E_surfxml_cabinet 50
+#define AL_surfxml_cluster 51
+#define S_surfxml_cluster 52
+#define S_surfxml_cluster_1 53
+#define S_surfxml_cluster_2 54
+#define E_surfxml_cluster 55
+#define AL_surfxml_config 56
+#define S_surfxml_config 57
+#define S_surfxml_config_1 58
+#define S_surfxml_config_2 59
+#define E_surfxml_config 60
+#define AL_surfxml_host 61
+#define S_surfxml_host 62
+#define S_surfxml_host_1 63
+#define S_surfxml_host_2 64
+#define E_surfxml_host 65
+#define AL_surfxml_host___link 66
+#define E_surfxml_host___link 67
+#define AL_surfxml_include 68
+#define S_surfxml_include 69
+#define S_surfxml_include_1 70
+#define S_surfxml_include_2 71
+#define E_surfxml_include 72
+#define AL_surfxml_link 73
+#define S_surfxml_link 74
+#define S_surfxml_link_1 75
+#define S_surfxml_link_2 76
+#define E_surfxml_link 77
+#define AL_surfxml_link___ctn 78
+#define E_surfxml_link___ctn 79
+#define AL_surfxml_model___prop 80
+#define E_surfxml_model___prop 81
+#define AL_surfxml_mount 82
+#define E_surfxml_mount 83
+#define AL_surfxml_peer 84
+#define E_surfxml_peer 85
+#define ROOT_surfxml_platform 86
+#define AL_surfxml_platform 87
+#define S_surfxml_platform 88
+#define S_surfxml_platform_1 89
+#define S_surfxml_platform_2 90
+#define S_surfxml_platform_3 91
+#define S_surfxml_platform_4 92
+#define S_surfxml_platform_5 93
+#define S_surfxml_platform_6 94
+#define S_surfxml_platform_7 95
+#define S_surfxml_platform_8 96
+#define E_surfxml_platform 97
+#define AL_surfxml_process 98
+#define S_surfxml_process 99
+#define S_surfxml_process_1 100
+#define S_surfxml_process_2 101
+#define E_surfxml_process 102
+#define AL_surfxml_prop 103
+#define E_surfxml_prop 104
+#define AL_surfxml_random 105
+#define E_surfxml_random 106
+#define AL_surfxml_route 107
+#define S_surfxml_route 108
+#define S_surfxml_route_1 109
+#define S_surfxml_route_2 110
+#define E_surfxml_route 111
+#define AL_surfxml_router 112
+#define E_surfxml_router 113
+#define AL_surfxml_storage 114
+#define S_surfxml_storage 115
+#define S_surfxml_storage_1 116
+#define S_surfxml_storage_2 117
+#define E_surfxml_storage 118
+#define AL_surfxml_storage___type 119
+#define S_surfxml_storage___type 120
+#define S_surfxml_storage___type_1 121
+#define S_surfxml_storage___type_2 122
+#define E_surfxml_storage___type 123
+#define AL_surfxml_trace 124
+#define IN_trace 125
+#define AL_surfxml_trace___connect 126
+#define E_surfxml_trace___connect 127
+#define AL_surfxml_zone 128
+#define S_surfxml_zone 129
+#define S_surfxml_zone_1 130
+#define S_surfxml_zone_2 131
+#define S_surfxml_zone_3 132
+#define S_surfxml_zone_4 133
+#define S_surfxml_zone_5 134
+#define S_surfxml_zone_6 135
+#define S_surfxml_zone_7 136
+#define S_surfxml_zone_8 137
+#define E_surfxml_zone 138
+#define AL_surfxml_zoneRoute 139
+#define S_surfxml_zoneRoute 140
+#define S_surfxml_zoneRoute_1 141
+#define S_surfxml_zoneRoute_2 142
+#define E_surfxml_zoneRoute 143
+#define IMPOSSIBLE 144
 
 #ifndef YY_NO_UNISTD_H
 /* Special case for "unistd.h", since it is non-ANSI. We include it way
@@ -5166,7 +5913,7 @@ static int input (void );
                { \
                int c = '*'; \
                size_t n; \
-               for ( n = 0; n < (size_t) max_size && \
+               for ( n = 0; n < (size_t)max_size && \
                             (c = getc( surf_parse_in )) != EOF && c != '\n'; ++n ) \
                        buf[n] = (char) c; \
                if ( c == '\n' ) \
@@ -5305,6 +6052,8 @@ YY_DECL
   surfxml_bufferliteral('\0', &bnext, "0s");
   surfxml_bufferliteral('\0', &bnext, "-1.0");
   surfxml_bufferliteral('\0', &bnext, "-1.0");
+  surfxml_bufferliteral('\0', &bnext, "-1.0");
+  surfxml_bufferliteral('\0', &bnext, "-1.0");
   if(!surfxml_statenames) {surfxml_statenames= (const char **)calloc(IMPOSSIBLE,sizeof(char*));
   surfxml_statenames[PROLOG] = NULL;
   surfxml_statenames[DOCTYPE] = NULL;
@@ -5330,6 +6079,11 @@ YY_DECL
   surfxml_statenames[S_surfxml_ASroute_1] = "ASroute";
   surfxml_statenames[S_surfxml_ASroute_2] = "ASroute";
   surfxml_statenames[E_surfxml_ASroute] = "ASroute";
+  surfxml_statenames[AL_surfxml_actor] = NULL;
+  surfxml_statenames[S_surfxml_actor] = "actor";
+  surfxml_statenames[S_surfxml_actor_1] = "actor";
+  surfxml_statenames[S_surfxml_actor_2] = "actor";
+  surfxml_statenames[E_surfxml_actor] = "actor";
   surfxml_statenames[AL_surfxml_argument] = NULL;
   surfxml_statenames[E_surfxml_argument] = "argument";
   surfxml_statenames[AL_surfxml_backbone] = NULL;
@@ -5344,6 +6098,11 @@ YY_DECL
   surfxml_statenames[S_surfxml_bypassRoute_1] = "bypassRoute";
   surfxml_statenames[S_surfxml_bypassRoute_2] = "bypassRoute";
   surfxml_statenames[E_surfxml_bypassRoute] = "bypassRoute";
+  surfxml_statenames[AL_surfxml_bypassZoneRoute] = NULL;
+  surfxml_statenames[S_surfxml_bypassZoneRoute] = "bypassZoneRoute";
+  surfxml_statenames[S_surfxml_bypassZoneRoute_1] = "bypassZoneRoute";
+  surfxml_statenames[S_surfxml_bypassZoneRoute_2] = "bypassZoneRoute";
+  surfxml_statenames[E_surfxml_bypassZoneRoute] = "bypassZoneRoute";
   surfxml_statenames[AL_surfxml_cabinet] = NULL;
   surfxml_statenames[E_surfxml_cabinet] = "cabinet";
   surfxml_statenames[AL_surfxml_cluster] = NULL;
@@ -5423,6 +6182,22 @@ YY_DECL
   surfxml_statenames[IN_trace] = "trace";
   surfxml_statenames[AL_surfxml_trace___connect] = NULL;
   surfxml_statenames[E_surfxml_trace___connect] = "trace_connect";
+  surfxml_statenames[AL_surfxml_zone] = NULL;
+  surfxml_statenames[S_surfxml_zone] = "zone";
+  surfxml_statenames[S_surfxml_zone_1] = "zone";
+  surfxml_statenames[S_surfxml_zone_2] = "zone";
+  surfxml_statenames[S_surfxml_zone_3] = "zone";
+  surfxml_statenames[S_surfxml_zone_4] = "zone";
+  surfxml_statenames[S_surfxml_zone_5] = "zone";
+  surfxml_statenames[S_surfxml_zone_6] = "zone";
+  surfxml_statenames[S_surfxml_zone_7] = "zone";
+  surfxml_statenames[S_surfxml_zone_8] = "zone";
+  surfxml_statenames[E_surfxml_zone] = "zone";
+  surfxml_statenames[AL_surfxml_zoneRoute] = NULL;
+  surfxml_statenames[S_surfxml_zoneRoute] = "zoneRoute";
+  surfxml_statenames[S_surfxml_zoneRoute_1] = "zoneRoute";
+  surfxml_statenames[S_surfxml_zoneRoute_2] = "zoneRoute";
+  surfxml_statenames[E_surfxml_zoneRoute] = "zoneRoute";
   }
 
  /* COMMENTS and PIs: handled uniformly for efficiency. */
@@ -5452,13 +6227,13 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                                {
                                yy_current_state = (int) yy_def[yy_current_state];
-                               if ( yy_current_state >= 3334 )
+                               if ( yy_current_state >= 3906 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
                        ++yy_cp;
                        }
-               while ( yy_base[yy_current_state] != 11902 );
+               while ( yy_base[yy_current_state] != 13997 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -5473,7 +6248,7 @@ yy_find_action:
 
                if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
                        {
-                       int yyl;
+                       unsigned int yyl;
                        for ( yyl = 0; yyl < surf_parse_leng; ++yyl )
                                if ( surf_parse_text[yyl] == '\n' )
                                        
@@ -5684,6 +6459,7 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
@@ -5710,6 +6486,7 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
@@ -5828,8 +6605,10 @@ YY_RULE_SETUP
   if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
   LEAVE; STag_surfxml_ASroute(); surfxml_pcdata_ix = 0; ETag_surfxml_ASroute(); popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break;
-   case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_AS: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_1: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_5: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
@@ -5853,8 +6632,10 @@ YY_RULE_SETUP
   ETag_surfxml_ASroute();
   popbuffer(); /* attribute */
   switch (YY_START) {
-   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break;
-   case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_AS: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_1: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_5: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
@@ -5876,50 +6657,186 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</ASroute>' expected.");
 case 68:
 /* rule 68 can match eol */
 YY_RULE_SETUP
-FAIL("Starting tag <argument> is not allowed here.");
+FAIL("Starting tag <actor> is not allowed here.");
        YY_BREAK
 case 69:
 /* rule 69 can match eol */
 YY_RULE_SETUP
 {
-  AX_surfxml_argument_value = 0;
-  surfxml_argument_value_isset = 0;
-  ENTER(AL_surfxml_argument); pushbuffer(0);
+  AX_surfxml_actor_function = 0;
+  surfxml_actor_function_isset = 0;
+  AX_surfxml_actor_host = 0;
+  surfxml_actor_host_isset = 0;
+  AX_surfxml_actor_kill___time = 60;
+  surfxml_actor_kill___time_isset = 0;
+  AX_surfxml_actor_on___failure = A_surfxml_actor_on___failure_DIE;
+  surfxml_actor_on___failure_isset = 0;
+  AX_surfxml_actor_start___time = 55;
+  surfxml_actor_start___time_isset = 0;
+  ENTER(AL_surfxml_actor); pushbuffer(0);
   }
        YY_BREAK
 
 case 70:
 /* rule 70 can match eol */
 YY_RULE_SETUP
-if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value);
+if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_actor>");} surfxml_actor_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_function);
        YY_BREAK
 case 71:
 /* rule 71 can match eol */
 YY_RULE_SETUP
-if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");}  surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value);
+if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_actor>");}  surfxml_actor_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_function);
        YY_BREAK
 case 72:
+/* rule 72 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_actor>");} surfxml_actor_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_host);
+       YY_BREAK
+case 73:
+/* rule 73 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_actor>");}  surfxml_actor_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_host);
+       YY_BREAK
+case 74:
+/* rule 74 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_actor>");} surfxml_actor_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_kill___time);
+       YY_BREAK
+case 75:
+/* rule 75 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_actor>");}  surfxml_actor_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_kill___time);
+       YY_BREAK
+case 76:
+/* rule 76 can match eol */
+case 77:
+/* rule 77 can match eol */
+YY_RULE_SETUP
+A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_DIE;
+       YY_BREAK
+case 78:
+/* rule 78 can match eol */
+case 79:
+/* rule 79 can match eol */
+YY_RULE_SETUP
+A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_RESTART;
+       YY_BREAK
+case 80:
+/* rule 80 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_actor>");} surfxml_actor_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_start___time);
+       YY_BREAK
+case 81:
+/* rule 81 can match eol */
+YY_RULE_SETUP
+if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_actor>");}  surfxml_actor_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_start___time);
+       YY_BREAK
+case 82:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_actor_function) FAIL("Required attribute `function' not set for `actor' element.");
+  if (!AX_surfxml_actor_host) FAIL("Required attribute `host' not set for `actor' element.");
+  LEAVE; STag_surfxml_actor();surfxml_pcdata_ix = 0; ENTER(S_surfxml_actor);
+ }
+       YY_BREAK
+case 83:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_actor_function) FAIL("Required attribute `function' not set for `actor' element.");
+  if (!AX_surfxml_actor_host) FAIL("Required attribute `host' not set for `actor' element.");
+  LEAVE; STag_surfxml_actor(); surfxml_pcdata_ix = 0; ETag_surfxml_actor(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_4: case S_surfxml_platform_6: case S_surfxml_platform_7: case S_surfxml_platform_8: SET(S_surfxml_platform_8); break;
+  }
+ }
+       YY_BREAK
+case 84:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of actor element.", surf_parse_text[0]);
+       YY_BREAK
+case 85:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `actor' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_actor):
+FAIL("EOF in attribute list of `actor' element.");
+       YY_BREAK
+
+case 86:
+/* rule 86 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_actor();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_4: case S_surfxml_platform_6: case S_surfxml_platform_7: case S_surfxml_platform_8: SET(S_surfxml_platform_8); break;
+  }
+ }
+       YY_BREAK
+case 87:
+/* rule 87 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</actor>' expected.",surf_parse_text);
+       YY_BREAK
+case 88:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</actor>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_actor):
+case YY_STATE_EOF(S_surfxml_actor):
+case YY_STATE_EOF(S_surfxml_actor_2):
+if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</actor>' expected.");
+       YY_BREAK
+
+case 89:
+/* rule 89 can match eol */
+YY_RULE_SETUP
+FAIL("Starting tag <argument> is not allowed here.");
+       YY_BREAK
+case 90:
+/* rule 90 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_argument_value = 0;
+  surfxml_argument_value_isset = 0;
+  ENTER(AL_surfxml_argument); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 91:
+/* rule 91 can match eol */
+YY_RULE_SETUP
+if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value);
+       YY_BREAK
+case 92:
+/* rule 92 can match eol */
+YY_RULE_SETUP
+if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");}  surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value);
+       YY_BREAK
+case 93:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
   LEAVE; STag_surfxml_argument();surfxml_pcdata_ix = 0; ENTER(E_surfxml_argument);
  }
        YY_BREAK
-case 73:
+case 94:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
   LEAVE; STag_surfxml_argument(); surfxml_pcdata_ix = 0; ETag_surfxml_argument(); popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_actor: case S_surfxml_actor_1: case S_surfxml_actor_2: SET(S_surfxml_actor_2); break;
    case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
   }
  }
        YY_BREAK
-case 74:
+case 95:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]);
        YY_BREAK
-case 75:
+case 96:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text);
        YY_BREAK
@@ -5927,24 +6844,25 @@ case YY_STATE_EOF(AL_surfxml_argument):
 FAIL("EOF in attribute list of `argument' element.");
        YY_BREAK
 
-case 76:
-/* rule 76 can match eol */
+case 97:
+/* rule 97 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
   ETag_surfxml_argument();
   popbuffer(); /* attribute */
   switch (YY_START) {
+   case S_surfxml_actor: case S_surfxml_actor_1: case S_surfxml_actor_2: SET(S_surfxml_actor_2); break;
    case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
   }
  }
        YY_BREAK
-case 77:
-/* rule 77 can match eol */
+case 98:
+/* rule 98 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</argument>' expected.",surf_parse_text);
        YY_BREAK
-case 78:
+case 99:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</argument>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -5952,13 +6870,13 @@ case YY_STATE_EOF(E_surfxml_argument):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</argument>' expected.");
        YY_BREAK
 
-case 79:
-/* rule 79 can match eol */
+case 100:
+/* rule 100 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <backbone> is not allowed here.");
        YY_BREAK
-case 80:
-/* rule 80 can match eol */
+case 101:
+/* rule 101 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_backbone_bandwidth = 0;
@@ -5971,37 +6889,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 81:
-/* rule 81 can match eol */
+case 102:
+/* rule 102 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_bandwidth);
        YY_BREAK
-case 82:
-/* rule 82 can match eol */
+case 103:
+/* rule 103 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");}  surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_bandwidth);
        YY_BREAK
-case 83:
-/* rule 83 can match eol */
+case 104:
+/* rule 104 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");} surfxml_backbone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_id);
        YY_BREAK
-case 84:
-/* rule 84 can match eol */
+case 105:
+/* rule 105 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");}  surfxml_backbone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_id);
        YY_BREAK
-case 85:
-/* rule 85 can match eol */
+case 106:
+/* rule 106 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");} surfxml_backbone_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_latency);
        YY_BREAK
-case 86:
-/* rule 86 can match eol */
+case 107:
+/* rule 107 can match eol */
 YY_RULE_SETUP
 if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");}  surfxml_backbone_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_latency);
        YY_BREAK
-case 87:
+case 108:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_bandwidth) FAIL("Required attribute `bandwidth' not set for `backbone' element.");
@@ -6010,7 +6928,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone);
  }
        YY_BREAK
-case 88:
+case 109:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_backbone_bandwidth) FAIL("Required attribute `bandwidth' not set for `backbone' element.");
@@ -6019,14 +6937,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_backbone(); surfxml_pcdata_ix = 0; ETag_surfxml_backbone(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 89:
+case 110:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]);
        YY_BREAK
-case 90:
+case 111:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6034,8 +6953,8 @@ case YY_STATE_EOF(AL_surfxml_backbone):
 FAIL("EOF in attribute list of `backbone' element.");
        YY_BREAK
 
-case 91:
-/* rule 91 can match eol */
+case 112:
+/* rule 112 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6043,15 +6962,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 92:
-/* rule 92 can match eol */
+case 113:
+/* rule 113 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</backbone>' expected.",surf_parse_text);
        YY_BREAK
-case 93:
+case 114:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</backbone>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6059,13 +6979,13 @@ case YY_STATE_EOF(E_surfxml_backbone):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</backbone>' expected.");
        YY_BREAK
 
-case 94:
-/* rule 94 can match eol */
+case 115:
+/* rule 115 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassASroute> is not allowed here.");
        YY_BREAK
-case 95:
-/* rule 95 can match eol */
+case 116:
+/* rule 116 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassASroute_dst = 0;
@@ -6080,47 +7000,47 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 96:
-/* rule 96 can match eol */
+case 117:
+/* rule 117 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst);
        YY_BREAK
-case 97:
-/* rule 97 can match eol */
+case 118:
+/* rule 118 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst);
        YY_BREAK
-case 98:
-/* rule 98 can match eol */
+case 119:
+/* rule 119 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
        YY_BREAK
-case 99:
-/* rule 99 can match eol */
+case 120:
+/* rule 120 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
        YY_BREAK
-case 100:
-/* rule 100 can match eol */
+case 121:
+/* rule 121 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
        YY_BREAK
-case 101:
-/* rule 101 can match eol */
+case 122:
+/* rule 122 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
        YY_BREAK
-case 102:
-/* rule 102 can match eol */
+case 123:
+/* rule 123 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src);
        YY_BREAK
-case 103:
-/* rule 103 can match eol */
+case 124:
+/* rule 124 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");}  surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src);
        YY_BREAK
-case 104:
+case 125:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_dst) FAIL("Required attribute `dst' not set for `bypassASroute' element.");
@@ -6130,7 +7050,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute);
  }
        YY_BREAK
-case 105:
+case 126:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassASroute_dst) FAIL("Required attribute `dst' not set for `bypassASroute' element.");
@@ -6140,14 +7060,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassASroute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassASroute(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 106:
+case 127:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]);
        YY_BREAK
-case 107:
+case 128:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6155,8 +7076,8 @@ case YY_STATE_EOF(AL_surfxml_bypassASroute):
 FAIL("EOF in attribute list of `bypassASroute' element.");
        YY_BREAK
 
-case 108:
-/* rule 108 can match eol */
+case 129:
+/* rule 129 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6164,15 +7085,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 109:
-/* rule 109 can match eol */
+case 130:
+/* rule 130 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</bypassASroute>' expected.",surf_parse_text);
        YY_BREAK
-case 110:
+case 131:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</bypassASroute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6182,13 +7104,13 @@ case YY_STATE_EOF(S_surfxml_bypassASroute_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassASroute>' expected.");
        YY_BREAK
 
-case 111:
-/* rule 111 can match eol */
+case 132:
+/* rule 132 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <bypassRoute> is not allowed here.");
        YY_BREAK
-case 112:
-/* rule 112 can match eol */
+case 133:
+/* rule 133 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_bypassRoute_dst = 0;
@@ -6199,27 +7121,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 113:
-/* rule 113 can match eol */
+case 134:
+/* rule 134 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst);
        YY_BREAK
-case 114:
-/* rule 114 can match eol */
+case 135:
+/* rule 135 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");}  surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst);
        YY_BREAK
-case 115:
-/* rule 115 can match eol */
+case 136:
+/* rule 136 can match eol */
 YY_RULE_SETUP
 if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src);
        YY_BREAK
-case 116:
-/* rule 116 can match eol */
-YY_RULE_SETUP
+case 137:
+/* rule 137 can match eol */
+YY_RULE_SETUP
 if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");}  surfxml_bypassRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src);
        YY_BREAK
-case 117:
+case 138:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_dst) FAIL("Required attribute `dst' not set for `bypassRoute' element.");
@@ -6227,7 +7149,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute);
  }
        YY_BREAK
-case 118:
+case 139:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_bypassRoute_dst) FAIL("Required attribute `dst' not set for `bypassRoute' element.");
@@ -6235,14 +7157,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_bypassRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassRoute(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 119:
+case 140:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]);
        YY_BREAK
-case 120:
+case 141:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6250,8 +7173,8 @@ case YY_STATE_EOF(AL_surfxml_bypassRoute):
 FAIL("EOF in attribute list of `bypassRoute' element.");
        YY_BREAK
 
-case 121:
-/* rule 121 can match eol */
+case 142:
+/* rule 142 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6259,15 +7182,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 122:
-/* rule 122 can match eol */
+case 143:
+/* rule 143 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</bypassRoute>' expected.",surf_parse_text);
        YY_BREAK
-case 123:
+case 144:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</bypassRoute>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6277,13 +7201,138 @@ case YY_STATE_EOF(S_surfxml_bypassRoute_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassRoute>' expected.");
        YY_BREAK
 
-case 124:
-/* rule 124 can match eol */
+case 145:
+/* rule 145 can match eol */
+YY_RULE_SETUP
+FAIL("Starting tag <bypassZoneRoute> is not allowed here.");
+       YY_BREAK
+case 146:
+/* rule 146 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_bypassZoneRoute_dst = 0;
+  surfxml_bypassZoneRoute_dst_isset = 0;
+  AX_surfxml_bypassZoneRoute_gw___dst = 0;
+  surfxml_bypassZoneRoute_gw___dst_isset = 0;
+  AX_surfxml_bypassZoneRoute_gw___src = 0;
+  surfxml_bypassZoneRoute_gw___src_isset = 0;
+  AX_surfxml_bypassZoneRoute_src = 0;
+  surfxml_bypassZoneRoute_src_isset = 0;
+  ENTER(AL_surfxml_bypassZoneRoute); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 147:
+/* rule 147 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassZoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassZoneRoute>");} surfxml_bypassZoneRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_dst);
+       YY_BREAK
+case 148:
+/* rule 148 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassZoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassZoneRoute>");}  surfxml_bypassZoneRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_dst);
+       YY_BREAK
+case 149:
+/* rule 149 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassZoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassZoneRoute>");} surfxml_bypassZoneRoute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___dst);
+       YY_BREAK
+case 150:
+/* rule 150 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassZoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassZoneRoute>");}  surfxml_bypassZoneRoute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___dst);
+       YY_BREAK
+case 151:
+/* rule 151 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassZoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassZoneRoute>");} surfxml_bypassZoneRoute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___src);
+       YY_BREAK
+case 152:
+/* rule 152 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassZoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassZoneRoute>");}  surfxml_bypassZoneRoute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___src);
+       YY_BREAK
+case 153:
+/* rule 153 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassZoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassZoneRoute>");} surfxml_bypassZoneRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_src);
+       YY_BREAK
+case 154:
+/* rule 154 can match eol */
+YY_RULE_SETUP
+if (surfxml_bypassZoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassZoneRoute>");}  surfxml_bypassZoneRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_src);
+       YY_BREAK
+case 155:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_bypassZoneRoute_dst) FAIL("Required attribute `dst' not set for `bypassZoneRoute' element.");
+  if (!AX_surfxml_bypassZoneRoute_gw___dst) FAIL("Required attribute `gw_dst' not set for `bypassZoneRoute' element.");
+  if (!AX_surfxml_bypassZoneRoute_gw___src) FAIL("Required attribute `gw_src' not set for `bypassZoneRoute' element.");
+  if (!AX_surfxml_bypassZoneRoute_src) FAIL("Required attribute `src' not set for `bypassZoneRoute' element.");
+  LEAVE; STag_surfxml_bypassZoneRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassZoneRoute);
+ }
+       YY_BREAK
+case 156:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_bypassZoneRoute_dst) FAIL("Required attribute `dst' not set for `bypassZoneRoute' element.");
+  if (!AX_surfxml_bypassZoneRoute_gw___dst) FAIL("Required attribute `gw_dst' not set for `bypassZoneRoute' element.");
+  if (!AX_surfxml_bypassZoneRoute_gw___src) FAIL("Required attribute `gw_src' not set for `bypassZoneRoute' element.");
+  if (!AX_surfxml_bypassZoneRoute_src) FAIL("Required attribute `src' not set for `bypassZoneRoute' element.");
+  LEAVE; STag_surfxml_bypassZoneRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassZoneRoute(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+  }
+ }
+       YY_BREAK
+case 157:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of bypassZoneRoute element.", surf_parse_text[0]);
+       YY_BREAK
+case 158:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `bypassZoneRoute' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_bypassZoneRoute):
+FAIL("EOF in attribute list of `bypassZoneRoute' element.");
+       YY_BREAK
+
+case 159:
+/* rule 159 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_bypassZoneRoute();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+  }
+ }
+       YY_BREAK
+case 160:
+/* rule 160 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</bypassZoneRoute>' expected.",surf_parse_text);
+       YY_BREAK
+case 161:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</bypassZoneRoute>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_bypassZoneRoute):
+case YY_STATE_EOF(S_surfxml_bypassZoneRoute):
+case YY_STATE_EOF(S_surfxml_bypassZoneRoute_2):
+if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassZoneRoute>' expected.");
+       YY_BREAK
+
+case 162:
+/* rule 162 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cabinet> is not allowed here.");
        YY_BREAK
-case 125:
-/* rule 125 can match eol */
+case 163:
+/* rule 163 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cabinet_bw = 0;
@@ -6304,77 +7353,77 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 126:
-/* rule 126 can match eol */
+case 164:
+/* rule 164 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw);
        YY_BREAK
-case 127:
-/* rule 127 can match eol */
+case 165:
+/* rule 165 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");}  surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw);
        YY_BREAK
-case 128:
-/* rule 128 can match eol */
+case 166:
+/* rule 166 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id);
        YY_BREAK
-case 129:
-/* rule 129 can match eol */
+case 167:
+/* rule 167 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");}  surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id);
        YY_BREAK
-case 130:
-/* rule 130 can match eol */
+case 168:
+/* rule 168 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat);
        YY_BREAK
-case 131:
-/* rule 131 can match eol */
+case 169:
+/* rule 169 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");}  surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat);
        YY_BREAK
-case 132:
-/* rule 132 can match eol */
+case 170:
+/* rule 170 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix);
        YY_BREAK
-case 133:
-/* rule 133 can match eol */
+case 171:
+/* rule 171 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");}  surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix);
        YY_BREAK
-case 134:
-/* rule 134 can match eol */
+case 172:
+/* rule 172 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical);
        YY_BREAK
-case 135:
-/* rule 135 can match eol */
+case 173:
+/* rule 173 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");}  surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical);
        YY_BREAK
-case 136:
-/* rule 136 can match eol */
+case 174:
+/* rule 174 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cabinet>");} surfxml_cabinet_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_speed);
        YY_BREAK
-case 137:
-/* rule 137 can match eol */
+case 175:
+/* rule 175 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cabinet>");}  surfxml_cabinet_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_speed);
        YY_BREAK
-case 138:
-/* rule 138 can match eol */
+case 176:
+/* rule 176 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix);
        YY_BREAK
-case 139:
-/* rule 139 can match eol */
+case 177:
+/* rule 177 can match eol */
 YY_RULE_SETUP
 if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");}  surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix);
        YY_BREAK
-case 140:
+case 178:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_bw) FAIL("Required attribute `bw' not set for `cabinet' element.");
@@ -6387,7 +7436,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet);
  }
        YY_BREAK
-case 141:
+case 179:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cabinet_bw) FAIL("Required attribute `bw' not set for `cabinet' element.");
@@ -6402,14 +7451,15 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 142:
+case 180:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]);
        YY_BREAK
-case 143:
+case 181:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6417,8 +7467,8 @@ case YY_STATE_EOF(AL_surfxml_cabinet):
 FAIL("EOF in attribute list of `cabinet' element.");
        YY_BREAK
 
-case 144:
-/* rule 144 can match eol */
+case 182:
+/* rule 182 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6428,15 +7478,16 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 145:
-/* rule 145 can match eol */
+case 183:
+/* rule 183 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</cabinet>' expected.",surf_parse_text);
        YY_BREAK
-case 146:
+case 184:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</cabinet>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6444,13 +7495,13 @@ case YY_STATE_EOF(E_surfxml_cabinet):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cabinet>' expected.");
        YY_BREAK
 
-case 147:
-/* rule 147 can match eol */
+case 185:
+/* rule 185 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <cluster> is not allowed here.");
        YY_BREAK
-case 148:
-/* rule 148 can match eol */
+case 186:
+/* rule 186 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_cluster_bb___bw = 0;
@@ -6493,220 +7544,220 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 149:
-/* rule 149 can match eol */
+case 187:
+/* rule 187 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw);
        YY_BREAK
-case 150:
-/* rule 150 can match eol */
+case 188:
+/* rule 188 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");}  surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw);
        YY_BREAK
-case 151:
-/* rule 151 can match eol */
+case 189:
+/* rule 189 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat);
        YY_BREAK
-case 152:
-/* rule 152 can match eol */
+case 190:
+/* rule 190 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");}  surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat);
        YY_BREAK
-case 153:
-/* rule 153 can match eol */
-case 154:
-/* rule 154 can match eol */
+case 191:
+/* rule 191 can match eol */
+case 192:
+/* rule 192 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
        YY_BREAK
-case 155:
-/* rule 155 can match eol */
-case 156:
-/* rule 156 can match eol */
+case 193:
+/* rule 193 can match eol */
+case 194:
+/* rule 194 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
        YY_BREAK
-case 157:
-/* rule 157 can match eol */
+case 195:
+/* rule 195 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
        YY_BREAK
-case 158:
-/* rule 158 can match eol */
+case 196:
+/* rule 196 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");}  surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
        YY_BREAK
-case 159:
-/* rule 159 can match eol */
+case 197:
+/* rule 197 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
        YY_BREAK
-case 160:
-/* rule 160 can match eol */
+case 198:
+/* rule 198 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");}  surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
        YY_BREAK
-case 161:
-/* rule 161 can match eol */
+case 199:
+/* rule 199 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
        YY_BREAK
-case 162:
-/* rule 162 can match eol */
+case 200:
+/* rule 200 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");}  surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
        YY_BREAK
-case 163:
-/* rule 163 can match eol */
+case 201:
+/* rule 201 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
        YY_BREAK
-case 164:
-/* rule 164 can match eol */
+case 202:
+/* rule 202 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");}  surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
        YY_BREAK
-case 165:
-/* rule 165 can match eol */
+case 203:
+/* rule 203 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
        YY_BREAK
-case 166:
-/* rule 166 can match eol */
+case 204:
+/* rule 204 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");}  surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
        YY_BREAK
-case 167:
-/* rule 167 can match eol */
+case 205:
+/* rule 205 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
        YY_BREAK
-case 168:
-/* rule 168 can match eol */
+case 206:
+/* rule 206 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");}  surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
        YY_BREAK
-case 169:
-/* rule 169 can match eol */
+case 207:
+/* rule 207 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
        YY_BREAK
-case 170:
-/* rule 170 can match eol */
+case 208:
+/* rule 208 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");}  surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat);
        YY_BREAK
-case 171:
-/* rule 171 can match eol */
+case 209:
+/* rule 209 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
        YY_BREAK
-case 172:
-/* rule 172 can match eol */
+case 210:
+/* rule 210 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");}  surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
        YY_BREAK
-case 173:
-/* rule 173 can match eol */
+case 211:
+/* rule 211 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
        YY_BREAK
-case 174:
-/* rule 174 can match eol */
+case 212:
+/* rule 212 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");}  surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
        YY_BREAK
-case 175:
-/* rule 175 can match eol */
+case 213:
+/* rule 213 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id);
        YY_BREAK
-case 176:
-/* rule 176 can match eol */
+case 214:
+/* rule 214 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");}  surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id);
        YY_BREAK
-case 177:
-/* rule 177 can match eol */
-case 178:
-/* rule 178 can match eol */
+case 215:
+/* rule 215 can match eol */
+case 216:
+/* rule 216 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
        YY_BREAK
-case 179:
-/* rule 179 can match eol */
-case 180:
-/* rule 180 can match eol */
+case 217:
+/* rule 217 can match eol */
+case 218:
+/* rule 218 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
        YY_BREAK
-case 181:
-/* rule 181 can match eol */
-case 182:
-/* rule 182 can match eol */
+case 219:
+/* rule 219 can match eol */
+case 220:
+/* rule 220 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
        YY_BREAK
-case 183:
-/* rule 183 can match eol */
+case 221:
+/* rule 221 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cluster>");} surfxml_cluster_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_speed);
        YY_BREAK
-case 184:
-/* rule 184 can match eol */
+case 222:
+/* rule 222 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_cluster>");}  surfxml_cluster_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_speed);
        YY_BREAK
-case 185:
-/* rule 185 can match eol */
+case 223:
+/* rule 223 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
        YY_BREAK
-case 186:
-/* rule 186 can match eol */
+case 224:
+/* rule 224 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");}  surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
        YY_BREAK
-case 187:
-/* rule 187 can match eol */
+case 225:
+/* rule 225 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters);
        YY_BREAK
-case 188:
-/* rule 188 can match eol */
+case 226:
+/* rule 226 can match eol */
 YY_RULE_SETUP
 if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");}  surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters);
        YY_BREAK
-case 189:
-/* rule 189 can match eol */
-case 190:
-/* rule 190 can match eol */
+case 227:
+/* rule 227 can match eol */
+case 228:
+/* rule 228 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT;
        YY_BREAK
-case 191:
-/* rule 191 can match eol */
-case 192:
-/* rule 192 can match eol */
+case 229:
+/* rule 229 can match eol */
+case 230:
+/* rule 230 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS;
        YY_BREAK
-case 193:
-/* rule 193 can match eol */
-case 194:
-/* rule 194 can match eol */
+case 231:
+/* rule 231 can match eol */
+case 232:
+/* rule 232 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_topology = A_surfxml_cluster_topology_FAT___TREE;
        YY_BREAK
-case 195:
-/* rule 195 can match eol */
-case 196:
-/* rule 196 can match eol */
+case 233:
+/* rule 233 can match eol */
+case 234:
+/* rule 234 can match eol */
 YY_RULE_SETUP
 A_surfxml_cluster_topology = A_surfxml_cluster_topology_DRAGONFLY;
        YY_BREAK
-case 197:
+case 235:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
@@ -6719,7 +7770,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster);
  }
        YY_BREAK
-case 198:
+case 236:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element.");
@@ -6734,14 +7785,15 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 199:
+case 237:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]);
        YY_BREAK
-case 200:
+case 238:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6749,8 +7801,8 @@ case YY_STATE_EOF(AL_surfxml_cluster):
 FAIL("EOF in attribute list of `cluster' element.");
        YY_BREAK
 
-case 201:
-/* rule 201 can match eol */
+case 239:
+/* rule 239 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6760,15 +7812,16 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 202:
-/* rule 202 can match eol */
+case 240:
+/* rule 240 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</cluster>' expected.",surf_parse_text);
        YY_BREAK
-case 203:
+case 241:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</cluster>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6778,13 +7831,13 @@ case YY_STATE_EOF(S_surfxml_cluster_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cluster>' expected.");
        YY_BREAK
 
-case 204:
-/* rule 204 can match eol */
+case 242:
+/* rule 242 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <config> is not allowed here.");
        YY_BREAK
-case 205:
-/* rule 205 can match eol */
+case 243:
+/* rule 243 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_config_id = 0;
@@ -6793,23 +7846,23 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 206:
-/* rule 206 can match eol */
+case 244:
+/* rule 244 can match eol */
 YY_RULE_SETUP
 if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");} surfxml_config_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id);
        YY_BREAK
-case 207:
-/* rule 207 can match eol */
+case 245:
+/* rule 245 can match eol */
 YY_RULE_SETUP
 if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");}  surfxml_config_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id);
        YY_BREAK
-case 208:
+case 246:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config);
  }
        YY_BREAK
-case 209:
+case 247:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */
@@ -6818,11 +7871,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 210:
+case 248:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]);
        YY_BREAK
-case 211:
+case 249:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6830,8 +7883,8 @@ case YY_STATE_EOF(AL_surfxml_config):
 FAIL("EOF in attribute list of `config' element.");
        YY_BREAK
 
-case 212:
-/* rule 212 can match eol */
+case 250:
+/* rule 250 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6842,12 +7895,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 213:
-/* rule 213 can match eol */
+case 251:
+/* rule 251 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</config>' expected.",surf_parse_text);
        YY_BREAK
-case 214:
+case 252:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</config>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -6857,13 +7910,13 @@ case YY_STATE_EOF(S_surfxml_config_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</config>' expected.");
        YY_BREAK
 
-case 215:
-/* rule 215 can match eol */
+case 253:
+/* rule 253 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host> is not allowed here.");
        YY_BREAK
-case 216:
-/* rule 216 can match eol */
+case 254:
+/* rule 254 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host_availability___file = 0;
@@ -6884,77 +7937,77 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 217:
-/* rule 217 can match eol */
+case 255:
+/* rule 255 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file);
        YY_BREAK
-case 218:
-/* rule 218 can match eol */
+case 256:
+/* rule 256 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");}  surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file);
        YY_BREAK
-case 219:
-/* rule 219 can match eol */
+case 257:
+/* rule 257 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates);
        YY_BREAK
-case 220:
-/* rule 220 can match eol */
+case 258:
+/* rule 258 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");}  surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates);
        YY_BREAK
-case 221:
-/* rule 221 can match eol */
+case 259:
+/* rule 259 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core);
        YY_BREAK
-case 222:
-/* rule 222 can match eol */
+case 260:
+/* rule 260 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");}  surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core);
        YY_BREAK
-case 223:
-/* rule 223 can match eol */
+case 261:
+/* rule 261 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
        YY_BREAK
-case 224:
-/* rule 224 can match eol */
+case 262:
+/* rule 262 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");}  surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
        YY_BREAK
-case 225:
-/* rule 225 can match eol */
+case 263:
+/* rule 263 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate);
        YY_BREAK
-case 226:
-/* rule 226 can match eol */
+case 264:
+/* rule 264 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");}  surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate);
        YY_BREAK
-case 227:
-/* rule 227 can match eol */
+case 265:
+/* rule 265 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_host>");} surfxml_host_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_speed);
        YY_BREAK
-case 228:
-/* rule 228 can match eol */
+case 266:
+/* rule 266 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_host>");}  surfxml_host_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_speed);
        YY_BREAK
-case 229:
-/* rule 229 can match eol */
+case 267:
+/* rule 267 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file);
        YY_BREAK
-case 230:
-/* rule 230 can match eol */
+case 268:
+/* rule 268 can match eol */
 YY_RULE_SETUP
 if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");}  surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file);
        YY_BREAK
-case 231:
+case 269:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -6962,7 +8015,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host);
  }
        YY_BREAK
-case 232:
+case 270:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
@@ -6970,14 +8023,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host(); surfxml_pcdata_ix = 0; ETag_surfxml_host(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 233:
+case 271:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]);
        YY_BREAK
-case 234:
+case 272:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text);
        YY_BREAK
@@ -6985,8 +8039,8 @@ case YY_STATE_EOF(AL_surfxml_host):
 FAIL("EOF in attribute list of `host' element.");
        YY_BREAK
 
-case 235:
-/* rule 235 can match eol */
+case 273:
+/* rule 273 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -6994,15 +8048,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 236:
-/* rule 236 can match eol */
+case 274:
+/* rule 274 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</host>' expected.",surf_parse_text);
        YY_BREAK
-case 237:
+case 275:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</host>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7012,13 +8067,13 @@ case YY_STATE_EOF(S_surfxml_host_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host>' expected.");
        YY_BREAK
 
-case 238:
-/* rule 238 can match eol */
+case 276:
+/* rule 276 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <host_link> is not allowed here.");
        YY_BREAK
-case 239:
-/* rule 239 can match eol */
+case 277:
+/* rule 277 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_host___link_down = 0;
@@ -7031,37 +8086,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 240:
-/* rule 240 can match eol */
+case 278:
+/* rule 278 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");} surfxml_host___link_down_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_down);
        YY_BREAK
-case 241:
-/* rule 241 can match eol */
+case 279:
+/* rule 279 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");}  surfxml_host___link_down_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_down);
        YY_BREAK
-case 242:
-/* rule 242 can match eol */
+case 280:
+/* rule 280 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");} surfxml_host___link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_id);
        YY_BREAK
-case 243:
-/* rule 243 can match eol */
+case 281:
+/* rule 281 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");}  surfxml_host___link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_id);
        YY_BREAK
-case 244:
-/* rule 244 can match eol */
+case 282:
+/* rule 282 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");} surfxml_host___link_up_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_up);
        YY_BREAK
-case 245:
-/* rule 245 can match eol */
+case 283:
+/* rule 283 can match eol */
 YY_RULE_SETUP
 if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");}  surfxml_host___link_up_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_up);
        YY_BREAK
-case 246:
+case 284:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_down) FAIL("Required attribute `down' not set for `host_link' element.");
@@ -7070,7 +8125,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link);
  }
        YY_BREAK
-case 247:
+case 285:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_host___link_down) FAIL("Required attribute `down' not set for `host_link' element.");
@@ -7079,14 +8134,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_host___link(); surfxml_pcdata_ix = 0; ETag_surfxml_host___link(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 248:
+case 286:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]);
        YY_BREAK
-case 249:
+case 287:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7094,8 +8150,8 @@ case YY_STATE_EOF(AL_surfxml_host___link):
 FAIL("EOF in attribute list of `host_link' element.");
        YY_BREAK
 
-case 250:
-/* rule 250 can match eol */
+case 288:
+/* rule 288 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7103,15 +8159,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 251:
-/* rule 251 can match eol */
+case 289:
+/* rule 289 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</host_link>' expected.",surf_parse_text);
        YY_BREAK
-case 252:
+case 290:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</host_link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7119,13 +8176,13 @@ case YY_STATE_EOF(E_surfxml_host___link):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host_link>' expected.");
        YY_BREAK
 
-case 253:
-/* rule 253 can match eol */
+case 291:
+/* rule 291 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <include> is not allowed here.");
        YY_BREAK
-case 254:
-/* rule 254 can match eol */
+case 292:
+/* rule 292 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_include_file = 0;
@@ -7134,24 +8191,24 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 255:
-/* rule 255 can match eol */
+case 293:
+/* rule 293 can match eol */
 YY_RULE_SETUP
 if (surfxml_include_file_isset != 0) {FAIL("Multiple definition of attribute file in <surfxml_include>");} surfxml_include_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_include_file);
        YY_BREAK
-case 256:
-/* rule 256 can match eol */
+case 294:
+/* rule 294 can match eol */
 YY_RULE_SETUP
 if (surfxml_include_file_isset != 0) {FAIL("Multiple definition of attribute file in <surfxml_include>");}  surfxml_include_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_include_file);
        YY_BREAK
-case 257:
+case 295:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element.");
   LEAVE; STag_surfxml_include();surfxml_pcdata_ix = 0; ENTER(S_surfxml_include);
  }
        YY_BREAK
-case 258:
+case 296:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element.");
@@ -7160,14 +8217,15 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 259:
+case 297:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of include element.", surf_parse_text[0]);
        YY_BREAK
-case 260:
+case 298:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `include' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7175,8 +8233,8 @@ case YY_STATE_EOF(AL_surfxml_include):
 FAIL("EOF in attribute list of `include' element.");
        YY_BREAK
 
-case 261:
-/* rule 261 can match eol */
+case 299:
+/* rule 299 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7186,15 +8244,16 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 262:
-/* rule 262 can match eol */
+case 300:
+/* rule 300 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</include>' expected.",surf_parse_text);
        YY_BREAK
-case 263:
+case 301:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</include>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7204,13 +8263,13 @@ case YY_STATE_EOF(S_surfxml_include_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</include>' expected.");
        YY_BREAK
 
-case 264:
-/* rule 264 can match eol */
+case 302:
+/* rule 302 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link> is not allowed here.");
        YY_BREAK
-case 265:
-/* rule 265 can match eol */
+case 303:
+/* rule 303 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link_bandwidth = 0;
@@ -7231,88 +8290,88 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 266:
-/* rule 266 can match eol */
+case 304:
+/* rule 304 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
-case 267:
-/* rule 267 can match eol */
+case 305:
+/* rule 305 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");}  surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
        YY_BREAK
-case 268:
-/* rule 268 can match eol */
+case 306:
+/* rule 306 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file);
        YY_BREAK
-case 269:
-/* rule 269 can match eol */
+case 307:
+/* rule 307 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");}  surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file);
        YY_BREAK
-case 270:
-/* rule 270 can match eol */
+case 308:
+/* rule 308 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
-case 271:
-/* rule 271 can match eol */
+case 309:
+/* rule 309 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");}  surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
        YY_BREAK
-case 272:
-/* rule 272 can match eol */
+case 310:
+/* rule 310 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
-case 273:
-/* rule 273 can match eol */
+case 311:
+/* rule 311 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");}  surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
        YY_BREAK
-case 274:
-/* rule 274 can match eol */
+case 312:
+/* rule 312 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file);
        YY_BREAK
-case 275:
-/* rule 275 can match eol */
+case 313:
+/* rule 313 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");}  surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file);
        YY_BREAK
-case 276:
-/* rule 276 can match eol */
-case 277:
-/* rule 277 can match eol */
+case 314:
+/* rule 314 can match eol */
+case 315:
+/* rule 315 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
        YY_BREAK
-case 278:
-/* rule 278 can match eol */
-case 279:
-/* rule 279 can match eol */
+case 316:
+/* rule 316 can match eol */
+case 317:
+/* rule 317 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
        YY_BREAK
-case 280:
-/* rule 280 can match eol */
-case 281:
-/* rule 281 can match eol */
+case 318:
+/* rule 318 can match eol */
+case 319:
+/* rule 319 can match eol */
 YY_RULE_SETUP
 A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX;
        YY_BREAK
-case 282:
-/* rule 282 can match eol */
+case 320:
+/* rule 320 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file);
        YY_BREAK
-case 283:
-/* rule 283 can match eol */
+case 321:
+/* rule 321 can match eol */
 YY_RULE_SETUP
 if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");}  surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file);
        YY_BREAK
-case 284:
+case 322:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element.");
@@ -7320,7 +8379,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link);
  }
        YY_BREAK
-case 285:
+case 323:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element.");
@@ -7328,14 +8387,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_link(); surfxml_pcdata_ix = 0; ETag_surfxml_link(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 286:
+case 324:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]);
        YY_BREAK
-case 287:
+case 325:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7343,8 +8403,8 @@ case YY_STATE_EOF(AL_surfxml_link):
 FAIL("EOF in attribute list of `link' element.");
        YY_BREAK
 
-case 288:
-/* rule 288 can match eol */
+case 326:
+/* rule 326 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7352,15 +8412,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 289:
-/* rule 289 can match eol */
+case 327:
+/* rule 327 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link>' expected.",surf_parse_text);
        YY_BREAK
-case 290:
+case 328:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7370,13 +8431,13 @@ case YY_STATE_EOF(S_surfxml_link_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link>' expected.");
        YY_BREAK
 
-case 291:
-/* rule 291 can match eol */
+case 329:
+/* rule 329 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <link_ctn> is not allowed here.");
        YY_BREAK
-case 292:
-/* rule 292 can match eol */
+case 330:
+/* rule 330 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
@@ -7387,45 +8448,45 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 293:
-/* rule 293 can match eol */
-case 294:
-/* rule 294 can match eol */
+case 331:
+/* rule 331 can match eol */
+case 332:
+/* rule 332 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP;
        YY_BREAK
-case 295:
-/* rule 295 can match eol */
-case 296:
-/* rule 296 can match eol */
+case 333:
+/* rule 333 can match eol */
+case 334:
+/* rule 334 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN;
        YY_BREAK
-case 297:
-/* rule 297 can match eol */
-case 298:
-/* rule 298 can match eol */
+case 335:
+/* rule 335 can match eol */
+case 336:
+/* rule 336 can match eol */
 YY_RULE_SETUP
 A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
        YY_BREAK
-case 299:
-/* rule 299 can match eol */
+case 337:
+/* rule 337 can match eol */
 YY_RULE_SETUP
 if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link___ctn_id);
        YY_BREAK
-case 300:
-/* rule 300 can match eol */
+case 338:
+/* rule 338 can match eol */
 YY_RULE_SETUP
 if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");}  surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id);
        YY_BREAK
-case 301:
+case 339:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
   LEAVE; STag_surfxml_link___ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link___ctn);
  }
        YY_BREAK
-case 302:
+case 340:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
@@ -7434,15 +8495,17 @@ YY_RULE_SETUP
    case S_surfxml_ASroute: case S_surfxml_ASroute_1: case S_surfxml_ASroute_2: SET(S_surfxml_ASroute_2); break;
    case S_surfxml_bypassASroute: case S_surfxml_bypassASroute_1: case S_surfxml_bypassASroute_2: SET(S_surfxml_bypassASroute_2); break;
    case S_surfxml_bypassRoute: case S_surfxml_bypassRoute_1: case S_surfxml_bypassRoute_2: SET(S_surfxml_bypassRoute_2); break;
+   case S_surfxml_bypassZoneRoute: case S_surfxml_bypassZoneRoute_1: case S_surfxml_bypassZoneRoute_2: SET(S_surfxml_bypassZoneRoute_2); break;
    case S_surfxml_route: case S_surfxml_route_1: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
+   case S_surfxml_zoneRoute: case S_surfxml_zoneRoute_1: case S_surfxml_zoneRoute_2: SET(S_surfxml_zoneRoute_2); break;
   }
  }
        YY_BREAK
-case 303:
+case 341:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]);
        YY_BREAK
-case 304:
+case 342:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7450,8 +8513,8 @@ case YY_STATE_EOF(AL_surfxml_link___ctn):
 FAIL("EOF in attribute list of `link_ctn' element.");
        YY_BREAK
 
-case 305:
-/* rule 305 can match eol */
+case 343:
+/* rule 343 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7461,16 +8524,18 @@ YY_RULE_SETUP
    case S_surfxml_ASroute: case S_surfxml_ASroute_1: case S_surfxml_ASroute_2: SET(S_surfxml_ASroute_2); break;
    case S_surfxml_bypassASroute: case S_surfxml_bypassASroute_1: case S_surfxml_bypassASroute_2: SET(S_surfxml_bypassASroute_2); break;
    case S_surfxml_bypassRoute: case S_surfxml_bypassRoute_1: case S_surfxml_bypassRoute_2: SET(S_surfxml_bypassRoute_2); break;
+   case S_surfxml_bypassZoneRoute: case S_surfxml_bypassZoneRoute_1: case S_surfxml_bypassZoneRoute_2: SET(S_surfxml_bypassZoneRoute_2); break;
    case S_surfxml_route: case S_surfxml_route_1: case S_surfxml_route_2: SET(S_surfxml_route_2); break;
+   case S_surfxml_zoneRoute: case S_surfxml_zoneRoute_1: case S_surfxml_zoneRoute_2: SET(S_surfxml_zoneRoute_2); break;
   }
  }
        YY_BREAK
-case 306:
-/* rule 306 can match eol */
+case 344:
+/* rule 344 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</link_ctn>' expected.",surf_parse_text);
        YY_BREAK
-case 307:
+case 345:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</link_ctn>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7480,13 +8545,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link_ctn>' expected.")
 
 /* <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->
   * <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->  */
-case 308:
-/* rule 308 can match eol */
+case 346:
+/* rule 346 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <model_prop> is not allowed here.");
        YY_BREAK
-case 309:
-/* rule 309 can match eol */
+case 347:
+/* rule 347 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_model___prop_id = 0;
@@ -7497,27 +8562,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 310:
-/* rule 310 can match eol */
+case 348:
+/* rule 348 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");} surfxml_model___prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_id);
        YY_BREAK
-case 311:
-/* rule 311 can match eol */
+case 349:
+/* rule 349 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");}  surfxml_model___prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_id);
        YY_BREAK
-case 312:
-/* rule 312 can match eol */
+case 350:
+/* rule 350 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");} surfxml_model___prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_value);
        YY_BREAK
-case 313:
-/* rule 313 can match eol */
+case 351:
+/* rule 351 can match eol */
 YY_RULE_SETUP
 if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");}  surfxml_model___prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_value);
        YY_BREAK
-case 314:
+case 352:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
@@ -7525,7 +8590,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_model___prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_model___prop);
  }
        YY_BREAK
-case 315:
+case 353:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
@@ -7536,11 +8601,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 316:
+case 354:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of model_prop element.", surf_parse_text[0]);
        YY_BREAK
-case 317:
+case 355:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `model_prop' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7548,8 +8613,8 @@ case YY_STATE_EOF(AL_surfxml_model___prop):
 FAIL("EOF in attribute list of `model_prop' element.");
        YY_BREAK
 
-case 318:
-/* rule 318 can match eol */
+case 356:
+/* rule 356 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7560,12 +8625,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 319:
-/* rule 319 can match eol */
+case 357:
+/* rule 357 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</model_prop>' expected.",surf_parse_text);
        YY_BREAK
-case 320:
+case 358:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</model_prop>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7573,13 +8638,13 @@ case YY_STATE_EOF(E_surfxml_model___prop):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</model_prop>' expected.");
        YY_BREAK
 
-case 321:
-/* rule 321 can match eol */
+case 359:
+/* rule 359 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <mount> is not allowed here.");
        YY_BREAK
-case 322:
-/* rule 322 can match eol */
+case 360:
+/* rule 360 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_mount_name = 0;
@@ -7590,27 +8655,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 323:
-/* rule 323 can match eol */
+case 361:
+/* rule 361 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");} surfxml_mount_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_name);
        YY_BREAK
-case 324:
-/* rule 324 can match eol */
+case 362:
+/* rule 362 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");}  surfxml_mount_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_name);
        YY_BREAK
-case 325:
-/* rule 325 can match eol */
+case 363:
+/* rule 363 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");} surfxml_mount_storageId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_storageId);
        YY_BREAK
-case 326:
-/* rule 326 can match eol */
+case 364:
+/* rule 364 can match eol */
 YY_RULE_SETUP
 if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");}  surfxml_mount_storageId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_storageId);
        YY_BREAK
-case 327:
+case 365:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mount_name) FAIL("Required attribute `name' not set for `mount' element.");
@@ -7618,7 +8683,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_mount();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mount);
  }
        YY_BREAK
-case 328:
+case 366:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_mount_name) FAIL("Required attribute `name' not set for `mount' element.");
@@ -7629,11 +8694,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 329:
+case 367:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of mount element.", surf_parse_text[0]);
        YY_BREAK
-case 330:
+case 368:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `mount' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7641,8 +8706,8 @@ case YY_STATE_EOF(AL_surfxml_mount):
 FAIL("EOF in attribute list of `mount' element.");
        YY_BREAK
 
-case 331:
-/* rule 331 can match eol */
+case 369:
+/* rule 369 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7653,12 +8718,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 332:
-/* rule 332 can match eol */
+case 370:
+/* rule 370 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</mount>' expected.",surf_parse_text);
        YY_BREAK
-case 333:
+case 371:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</mount>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7666,13 +8731,13 @@ case YY_STATE_EOF(E_surfxml_mount):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</mount>' expected.");
        YY_BREAK
 
-case 334:
-/* rule 334 can match eol */
+case 372:
+/* rule 372 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <peer> is not allowed here.");
        YY_BREAK
-case 335:
-/* rule 335 can match eol */
+case 373:
+/* rule 373 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_peer_availability___file = 0;
@@ -7695,87 +8760,87 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 336:
-/* rule 336 can match eol */
+case 374:
+/* rule 374 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file);
        YY_BREAK
-case 337:
-/* rule 337 can match eol */
+case 375:
+/* rule 375 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");}  surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file);
        YY_BREAK
-case 338:
-/* rule 338 can match eol */
+case 376:
+/* rule 376 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in);
        YY_BREAK
-case 339:
-/* rule 339 can match eol */
+case 377:
+/* rule 377 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");}  surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in);
        YY_BREAK
-case 340:
-/* rule 340 can match eol */
+case 378:
+/* rule 378 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out);
        YY_BREAK
-case 341:
-/* rule 341 can match eol */
+case 379:
+/* rule 379 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");}  surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out);
        YY_BREAK
-case 342:
-/* rule 342 can match eol */
+case 380:
+/* rule 380 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates);
        YY_BREAK
-case 343:
-/* rule 343 can match eol */
+case 381:
+/* rule 381 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");}  surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates);
        YY_BREAK
-case 344:
-/* rule 344 can match eol */
+case 382:
+/* rule 382 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id);
        YY_BREAK
-case 345:
-/* rule 345 can match eol */
+case 383:
+/* rule 383 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");}  surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id);
        YY_BREAK
-case 346:
-/* rule 346 can match eol */
+case 384:
+/* rule 384 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat);
        YY_BREAK
-case 347:
-/* rule 347 can match eol */
+case 385:
+/* rule 385 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");}  surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat);
        YY_BREAK
-case 348:
-/* rule 348 can match eol */
+case 386:
+/* rule 386 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_peer>");} surfxml_peer_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_speed);
        YY_BREAK
-case 349:
-/* rule 349 can match eol */
+case 387:
+/* rule 387 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in <surfxml_peer>");}  surfxml_peer_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_speed);
        YY_BREAK
-case 350:
-/* rule 350 can match eol */
+case 388:
+/* rule 388 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file);
        YY_BREAK
-case 351:
-/* rule 351 can match eol */
+case 389:
+/* rule 389 can match eol */
 YY_RULE_SETUP
 if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");}  surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file);
        YY_BREAK
-case 352:
+case 390:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_bw___in) FAIL("Required attribute `bw_in' not set for `peer' element.");
@@ -7785,7 +8850,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer);
  }
        YY_BREAK
-case 353:
+case 391:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_peer_bw___in) FAIL("Required attribute `bw_in' not set for `peer' element.");
@@ -7797,14 +8862,15 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 354:
+case 392:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]);
        YY_BREAK
-case 355:
+case 393:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7812,8 +8878,8 @@ case YY_STATE_EOF(AL_surfxml_peer):
 FAIL("EOF in attribute list of `peer' element.");
        YY_BREAK
 
-case 356:
-/* rule 356 can match eol */
+case 394:
+/* rule 394 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7823,15 +8889,16 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 357:
-/* rule 357 can match eol */
+case 395:
+/* rule 395 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</peer>' expected.",surf_parse_text);
        YY_BREAK
-case 358:
+case 396:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</peer>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7843,6 +8910,11 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</peer>' expected.");
   *              DTD of SimGrid platform and deployment files.
   * More info: http://simgrid.gforge.inria.fr/simgrid/latest/doc/platform.html
   * To upgrade your files, use the tool simgrid_update_xml
+  * * New in DTD version 5 (in SimGrid 3.16): backward compatible change (v4 files are valid v5 files)
+  *    - <zone> can be used as a synonym for the now deprecated <as>
+  *    - <zoneZoute> an be used as a synonym for the now deprecated <asroute>
+  *    - <bypassZoneRoute> an be used as a synonym for the now deprecated <bypassAsRoute>
+  *    - <actor>  can be used as a synonym for the now deprecated <process>
   * * New in DTD version 4 (in SimGrid 3.13):
   *    - Rename (power->speed) the attributes describing the amount of flop
   *      that a <host>, <peer>, <cluster> or <cabinet> can deliver per second.
@@ -7888,13 +8960,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</peer>' expected.");
   *      - Link bandwidth: from Mb/s to b/s
   *      - CPU speed: from MFlop/s to Flop/s
   * -->  */
-case 359:
-/* rule 359 can match eol */
+case 397:
+/* rule 397 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <platform> is not allowed here.");
        YY_BREAK
-case 360:
-/* rule 360 can match eol */
+case 398:
+/* rule 398 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_platform_version = 1;
@@ -7903,23 +8975,23 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 361:
-/* rule 361 can match eol */
+case 399:
+/* rule 399 can match eol */
 YY_RULE_SETUP
 if (surfxml_platform_version_isset != 0) {FAIL("Multiple definition of attribute version in <surfxml_platform>");} surfxml_platform_version_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_version);
        YY_BREAK
-case 362:
-/* rule 362 can match eol */
+case 400:
+/* rule 400 can match eol */
 YY_RULE_SETUP
 if (surfxml_platform_version_isset != 0) {FAIL("Multiple definition of attribute version in <surfxml_platform>");}  surfxml_platform_version_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_version);
        YY_BREAK
-case 363:
+case 401:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_platform();surfxml_pcdata_ix = 0; ENTER(S_surfxml_platform);
  }
        YY_BREAK
-case 364:
+case 402:
 YY_RULE_SETUP
 {
   LEAVE; STag_surfxml_platform(); surfxml_pcdata_ix = 0; ETag_surfxml_platform(); popbuffer(); /* attribute */
@@ -7928,11 +9000,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 365:
+case 403:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of platform element.", surf_parse_text[0]);
        YY_BREAK
-case 366:
+case 404:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `platform' element start tag.",surf_parse_text);
        YY_BREAK
@@ -7940,8 +9012,8 @@ case YY_STATE_EOF(AL_surfxml_platform):
 FAIL("EOF in attribute list of `platform' element.");
        YY_BREAK
 
-case 367:
-/* rule 367 can match eol */
+case 405:
+/* rule 405 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -7952,12 +9024,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 368:
-/* rule 368 can match eol */
+case 406:
+/* rule 406 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</platform>' expected.",surf_parse_text);
        YY_BREAK
-case 369:
+case 407:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</platform>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -7971,13 +9043,13 @@ case YY_STATE_EOF(S_surfxml_platform_8):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</platform>' expected.");
        YY_BREAK
 
-case 370:
-/* rule 370 can match eol */
+case 408:
+/* rule 408 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <process> is not allowed here.");
        YY_BREAK
-case 371:
-/* rule 371 can match eol */
+case 409:
+/* rule 409 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_process_function = 0;
@@ -7994,61 +9066,61 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 372:
-/* rule 372 can match eol */
+case 410:
+/* rule 410 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
-case 373:
-/* rule 373 can match eol */
+case 411:
+/* rule 411 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");}  surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
        YY_BREAK
-case 374:
-/* rule 374 can match eol */
+case 412:
+/* rule 412 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
-case 375:
-/* rule 375 can match eol */
+case 413:
+/* rule 413 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");}  surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
        YY_BREAK
-case 376:
-/* rule 376 can match eol */
+case 414:
+/* rule 414 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time);
        YY_BREAK
-case 377:
-/* rule 377 can match eol */
+case 415:
+/* rule 415 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");}  surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time);
        YY_BREAK
-case 378:
-/* rule 378 can match eol */
-case 379:
-/* rule 379 can match eol */
+case 416:
+/* rule 416 can match eol */
+case 417:
+/* rule 417 can match eol */
 YY_RULE_SETUP
 A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
        YY_BREAK
-case 380:
-/* rule 380 can match eol */
-case 381:
-/* rule 381 can match eol */
+case 418:
+/* rule 418 can match eol */
+case 419:
+/* rule 419 can match eol */
 YY_RULE_SETUP
 A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART;
        YY_BREAK
-case 382:
-/* rule 382 can match eol */
+case 420:
+/* rule 420 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time);
        YY_BREAK
-case 383:
-/* rule 383 can match eol */
+case 421:
+/* rule 421 can match eol */
 YY_RULE_SETUP
 if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");}  surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time);
        YY_BREAK
-case 384:
+case 422:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_function) FAIL("Required attribute `function' not set for `process' element.");
@@ -8056,7 +9128,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process);
  }
        YY_BREAK
-case 385:
+case 423:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_process_function) FAIL("Required attribute `function' not set for `process' element.");
@@ -8067,11 +9139,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 386:
+case 424:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]);
        YY_BREAK
-case 387:
+case 425:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8079,8 +9151,8 @@ case YY_STATE_EOF(AL_surfxml_process):
 FAIL("EOF in attribute list of `process' element.");
        YY_BREAK
 
-case 388:
-/* rule 388 can match eol */
+case 426:
+/* rule 426 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8091,12 +9163,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 389:
-/* rule 389 can match eol */
+case 427:
+/* rule 427 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</process>' expected.",surf_parse_text);
        YY_BREAK
-case 390:
+case 428:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</process>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8108,13 +9180,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</process>' expected.");
 
 /* <!-- <!ATTLIST prop key CDATA #REQUIRED> -->
   * <!-- <!ATTLIST prop key CDATA #REQUIRED> -->  */
-case 391:
-/* rule 391 can match eol */
+case 429:
+/* rule 429 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <prop> is not allowed here.");
        YY_BREAK
-case 392:
-/* rule 392 can match eol */
+case 430:
+/* rule 430 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_prop_id = 0;
@@ -8125,27 +9197,27 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 393:
-/* rule 393 can match eol */
+case 431:
+/* rule 431 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");} surfxml_prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 394:
-/* rule 394 can match eol */
+case 432:
+/* rule 432 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");}  surfxml_prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id);
        YY_BREAK
-case 395:
-/* rule 395 can match eol */
+case 433:
+/* rule 433 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");} surfxml_prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 396:
-/* rule 396 can match eol */
+case 434:
+/* rule 434 can match eol */
 YY_RULE_SETUP
 if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");}  surfxml_prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value);
        YY_BREAK
-case 397:
+case 435:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -8153,7 +9225,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop);
  }
        YY_BREAK
-case 398:
+case 436:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
@@ -8161,6 +9233,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_prop(); surfxml_pcdata_ix = 0; ETag_surfxml_prop(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_2: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break;
+   case S_surfxml_actor: case S_surfxml_actor_1: case S_surfxml_actor_2: SET(S_surfxml_actor_2); break;
    case S_surfxml_cluster: case S_surfxml_cluster_1: case S_surfxml_cluster_2: SET(S_surfxml_cluster_2); break;
    case S_surfxml_config: case S_surfxml_config_1: case S_surfxml_config_2: SET(S_surfxml_config_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
@@ -8168,14 +9241,15 @@ YY_RULE_SETUP
    case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_storage: case S_surfxml_storage_1: case S_surfxml_storage_2: SET(S_surfxml_storage_2); break;
    case S_surfxml_storage___type: case S_surfxml_storage___type_1: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break;
+   case S_surfxml_zone: case S_surfxml_zone_2: case S_surfxml_zone_3: SET(S_surfxml_zone_3); break;
   }
  }
        YY_BREAK
-case 399:
+case 437:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]);
        YY_BREAK
-case 400:
+case 438:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8183,8 +9257,8 @@ case YY_STATE_EOF(AL_surfxml_prop):
 FAIL("EOF in attribute list of `prop' element.");
        YY_BREAK
 
-case 401:
-/* rule 401 can match eol */
+case 439:
+/* rule 439 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8192,6 +9266,7 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_2: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break;
+   case S_surfxml_actor: case S_surfxml_actor_1: case S_surfxml_actor_2: SET(S_surfxml_actor_2); break;
    case S_surfxml_cluster: case S_surfxml_cluster_1: case S_surfxml_cluster_2: SET(S_surfxml_cluster_2); break;
    case S_surfxml_config: case S_surfxml_config_1: case S_surfxml_config_2: SET(S_surfxml_config_2); break;
    case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break;
@@ -8199,15 +9274,16 @@ YY_RULE_SETUP
    case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break;
    case S_surfxml_storage: case S_surfxml_storage_1: case S_surfxml_storage_2: SET(S_surfxml_storage_2); break;
    case S_surfxml_storage___type: case S_surfxml_storage___type_1: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break;
+   case S_surfxml_zone: case S_surfxml_zone_2: case S_surfxml_zone_3: SET(S_surfxml_zone_3); break;
   }
  }
        YY_BREAK
-case 402:
-/* rule 402 can match eol */
+case 440:
+/* rule 440 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</prop>' expected.",surf_parse_text);
        YY_BREAK
-case 403:
+case 441:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</prop>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8215,13 +9291,13 @@ case YY_STATE_EOF(E_surfxml_prop):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</prop>' expected.");
        YY_BREAK
 
-case 404:
-/* rule 404 can match eol */
+case 442:
+/* rule 442 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <random> is not allowed here.");
        YY_BREAK
-case 405:
-/* rule 405 can match eol */
+case 443:
+/* rule 443 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
@@ -8244,105 +9320,105 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 406:
-/* rule 406 can match eol */
-case 407:
-/* rule 407 can match eol */
+case 444:
+/* rule 444 can match eol */
+case 445:
+/* rule 445 can match eol */
 YY_RULE_SETUP
 A_surfxml_random_generator = A_surfxml_random_generator_DRAND48;
        YY_BREAK
-case 408:
-/* rule 408 can match eol */
-case 409:
-/* rule 409 can match eol */
+case 446:
+/* rule 446 can match eol */
+case 447:
+/* rule 447 can match eol */
 YY_RULE_SETUP
 A_surfxml_random_generator = A_surfxml_random_generator_RAND;
        YY_BREAK
-case 410:
-/* rule 410 can match eol */
-case 411:
-/* rule 411 can match eol */
+case 448:
+/* rule 448 can match eol */
+case 449:
+/* rule 449 can match eol */
 YY_RULE_SETUP
 A_surfxml_random_generator = A_surfxml_random_generator_RNGSTREAM;
-       YY_BREAK
-case 412:
-/* rule 412 can match eol */
-case 413:
-/* rule 413 can match eol */
+       YY_BREAK
+case 450:
+/* rule 450 can match eol */
+case 451:
+/* rule 451 can match eol */
 YY_RULE_SETUP
 A_surfxml_random_generator = A_surfxml_random_generator_NONE;
        YY_BREAK
-case 414:
-/* rule 414 can match eol */
+case 452:
+/* rule 452 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_random>");} surfxml_random_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id);
        YY_BREAK
-case 415:
-/* rule 415 can match eol */
+case 453:
+/* rule 453 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_random>");}  surfxml_random_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id);
        YY_BREAK
-case 416:
-/* rule 416 can match eol */
+case 454:
+/* rule 454 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in <surfxml_random>");} surfxml_random_max_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max);
        YY_BREAK
-case 417:
-/* rule 417 can match eol */
+case 455:
+/* rule 455 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in <surfxml_random>");}  surfxml_random_max_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max);
        YY_BREAK
-case 418:
-/* rule 418 can match eol */
+case 456:
+/* rule 456 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in <surfxml_random>");} surfxml_random_mean_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean);
        YY_BREAK
-case 419:
-/* rule 419 can match eol */
+case 457:
+/* rule 457 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in <surfxml_random>");}  surfxml_random_mean_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean);
        YY_BREAK
-case 420:
-/* rule 420 can match eol */
+case 458:
+/* rule 458 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in <surfxml_random>");} surfxml_random_min_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min);
        YY_BREAK
-case 421:
-/* rule 421 can match eol */
+case 459:
+/* rule 459 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in <surfxml_random>");}  surfxml_random_min_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min);
        YY_BREAK
-case 422:
-/* rule 422 can match eol */
+case 460:
+/* rule 460 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_random>");} surfxml_random_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_radical);
        YY_BREAK
-case 423:
-/* rule 423 can match eol */
+case 461:
+/* rule 461 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_random>");}  surfxml_random_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_radical);
        YY_BREAK
-case 424:
-/* rule 424 can match eol */
+case 462:
+/* rule 462 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in <surfxml_random>");} surfxml_random_seed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_seed);
        YY_BREAK
-case 425:
-/* rule 425 can match eol */
+case 463:
+/* rule 463 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in <surfxml_random>");}  surfxml_random_seed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_seed);
        YY_BREAK
-case 426:
-/* rule 426 can match eol */
+case 464:
+/* rule 464 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in <surfxml_random>");} surfxml_random_std___deviation_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std___deviation);
        YY_BREAK
-case 427:
-/* rule 427 can match eol */
+case 465:
+/* rule 465 can match eol */
 YY_RULE_SETUP
 if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in <surfxml_random>");}  surfxml_random_std___deviation_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std___deviation);
        YY_BREAK
-case 428:
+case 466:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element.");
@@ -8353,7 +9429,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_random();surfxml_pcdata_ix = 0; ENTER(E_surfxml_random);
  }
        YY_BREAK
-case 429:
+case 467:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element.");
@@ -8367,11 +9443,11 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 430:
+case 468:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of random element.", surf_parse_text[0]);
        YY_BREAK
-case 431:
+case 469:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `random' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8379,8 +9455,8 @@ case YY_STATE_EOF(AL_surfxml_random):
 FAIL("EOF in attribute list of `random' element.");
        YY_BREAK
 
-case 432:
-/* rule 432 can match eol */
+case 470:
+/* rule 470 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8391,12 +9467,12 @@ YY_RULE_SETUP
   }
  }
        YY_BREAK
-case 433:
-/* rule 433 can match eol */
+case 471:
+/* rule 471 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</random>' expected.",surf_parse_text);
        YY_BREAK
-case 434:
+case 472:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</random>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8404,13 +9480,13 @@ case YY_STATE_EOF(E_surfxml_random):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</random>' expected.");
        YY_BREAK
 
-case 435:
-/* rule 435 can match eol */
+case 473:
+/* rule 473 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <route> is not allowed here.");
        YY_BREAK
-case 436:
-/* rule 436 can match eol */
+case 474:
+/* rule 474 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_route_dst = 0;
@@ -8423,41 +9499,41 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 437:
-/* rule 437 can match eol */
+case 475:
+/* rule 475 can match eol */
 YY_RULE_SETUP
 if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
-case 438:
-/* rule 438 can match eol */
+case 476:
+/* rule 476 can match eol */
 YY_RULE_SETUP
 if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");}  surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
        YY_BREAK
-case 439:
-/* rule 439 can match eol */
+case 477:
+/* rule 477 can match eol */
 YY_RULE_SETUP
 if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
-case 440:
-/* rule 440 can match eol */
+case 478:
+/* rule 478 can match eol */
 YY_RULE_SETUP
 if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");}  surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
        YY_BREAK
-case 441:
-/* rule 441 can match eol */
-case 442:
-/* rule 442 can match eol */
+case 479:
+/* rule 479 can match eol */
+case 480:
+/* rule 480 can match eol */
 YY_RULE_SETUP
 A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES;
        YY_BREAK
-case 443:
-/* rule 443 can match eol */
-case 444:
-/* rule 444 can match eol */
+case 481:
+/* rule 481 can match eol */
+case 482:
+/* rule 482 can match eol */
 YY_RULE_SETUP
 A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO;
        YY_BREAK
-case 445:
+case 483:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element.");
@@ -8465,7 +9541,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route);
  }
        YY_BREAK
-case 446:
+case 484:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element.");
@@ -8473,14 +9549,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_route(); surfxml_pcdata_ix = 0; ETag_surfxml_route(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 447:
+case 485:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]);
        YY_BREAK
-case 448:
+case 486:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8488,8 +9565,8 @@ case YY_STATE_EOF(AL_surfxml_route):
 FAIL("EOF in attribute list of `route' element.");
        YY_BREAK
 
-case 449:
-/* rule 449 can match eol */
+case 487:
+/* rule 487 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8497,15 +9574,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 450:
-/* rule 450 can match eol */
+case 488:
+/* rule 488 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</route>' expected.",surf_parse_text);
        YY_BREAK
-case 451:
+case 489:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</route>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8515,13 +9593,13 @@ case YY_STATE_EOF(S_surfxml_route_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</route>' expected.");
        YY_BREAK
 
-case 452:
-/* rule 452 can match eol */
+case 490:
+/* rule 490 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <router> is not allowed here.");
        YY_BREAK
-case 453:
-/* rule 453 can match eol */
+case 491:
+/* rule 491 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_router_coordinates = 0;
@@ -8532,48 +9610,49 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 454:
-/* rule 454 can match eol */
+case 492:
+/* rule 492 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");} surfxml_router_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates);
        YY_BREAK
-case 455:
-/* rule 455 can match eol */
+case 493:
+/* rule 493 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");}  surfxml_router_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates);
        YY_BREAK
-case 456:
-/* rule 456 can match eol */
+case 494:
+/* rule 494 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");} surfxml_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 457:
-/* rule 457 can match eol */
+case 495:
+/* rule 495 can match eol */
 YY_RULE_SETUP
 if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");}  surfxml_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id);
        YY_BREAK
-case 458:
+case 496:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
   LEAVE; STag_surfxml_router();surfxml_pcdata_ix = 0; ENTER(E_surfxml_router);
  }
        YY_BREAK
-case 459:
+case 497:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
   LEAVE; STag_surfxml_router(); surfxml_pcdata_ix = 0; ETag_surfxml_router(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 460:
+case 498:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]);
        YY_BREAK
-case 461:
+case 499:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8581,8 +9660,8 @@ case YY_STATE_EOF(AL_surfxml_router):
 FAIL("EOF in attribute list of `router' element.");
        YY_BREAK
 
-case 462:
-/* rule 462 can match eol */
+case 500:
+/* rule 500 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8590,15 +9669,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 463:
-/* rule 463 can match eol */
+case 501:
+/* rule 501 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</router>' expected.",surf_parse_text);
        YY_BREAK
-case 464:
+case 502:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</router>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8606,13 +9686,13 @@ case YY_STATE_EOF(E_surfxml_router):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</router>' expected.");
        YY_BREAK
 
-case 465:
-/* rule 465 can match eol */
+case 503:
+/* rule 503 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <storage> is not allowed here.");
        YY_BREAK
-case 466:
-/* rule 466 can match eol */
+case 504:
+/* rule 504 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_storage_attach = 0;
@@ -8629,57 +9709,57 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 467:
-/* rule 467 can match eol */
+case 505:
+/* rule 505 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in <surfxml_storage>");} surfxml_storage_attach_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_attach);
        YY_BREAK
-case 468:
-/* rule 468 can match eol */
+case 506:
+/* rule 506 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in <surfxml_storage>");}  surfxml_storage_attach_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_attach);
        YY_BREAK
-case 469:
-/* rule 469 can match eol */
+case 507:
+/* rule 507 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content);
        YY_BREAK
-case 470:
-/* rule 470 can match eol */
+case 508:
+/* rule 508 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");}  surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content);
        YY_BREAK
-case 471:
-/* rule 471 can match eol */
+case 509:
+/* rule 509 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type);
        YY_BREAK
-case 472:
-/* rule 472 can match eol */
+case 510:
+/* rule 510 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");}  surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type);
        YY_BREAK
-case 473:
-/* rule 473 can match eol */
+case 511:
+/* rule 511 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id);
        YY_BREAK
-case 474:
-/* rule 474 can match eol */
+case 512:
+/* rule 512 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");}  surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id);
        YY_BREAK
-case 475:
-/* rule 475 can match eol */
+case 513:
+/* rule 513 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId);
        YY_BREAK
-case 476:
-/* rule 476 can match eol */
+case 514:
+/* rule 514 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");}  surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId);
        YY_BREAK
-case 477:
+case 515:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element.");
@@ -8688,7 +9768,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage);
  }
        YY_BREAK
-case 478:
+case 516:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element.");
@@ -8697,14 +9777,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage(); surfxml_pcdata_ix = 0; ETag_surfxml_storage(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 479:
+case 517:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]);
        YY_BREAK
-case 480:
+case 518:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8712,8 +9793,8 @@ case YY_STATE_EOF(AL_surfxml_storage):
 FAIL("EOF in attribute list of `storage' element.");
        YY_BREAK
 
-case 481:
-/* rule 481 can match eol */
+case 519:
+/* rule 519 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8721,15 +9802,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 482:
-/* rule 482 can match eol */
+case 520:
+/* rule 520 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</storage>' expected.",surf_parse_text);
        YY_BREAK
-case 483:
+case 521:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</storage>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8739,13 +9821,13 @@ case YY_STATE_EOF(S_surfxml_storage_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage>' expected.");
        YY_BREAK
 
-case 484:
-/* rule 484 can match eol */
+case 522:
+/* rule 522 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <storage_type> is not allowed here.");
        YY_BREAK
-case 485:
-/* rule 485 can match eol */
+case 523:
+/* rule 523 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_storage___type_content = 0;
@@ -8762,57 +9844,57 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 486:
-/* rule 486 can match eol */
+case 524:
+/* rule 524 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content);
        YY_BREAK
-case 487:
-/* rule 487 can match eol */
+case 525:
+/* rule 525 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");}  surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content);
        YY_BREAK
-case 488:
-/* rule 488 can match eol */
+case 526:
+/* rule 526 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content___type);
        YY_BREAK
-case 489:
-/* rule 489 can match eol */
+case 527:
+/* rule 527 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");}  surfxml_storage___type_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content___type);
        YY_BREAK
-case 490:
-/* rule 490 can match eol */
+case 528:
+/* rule 528 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id);
        YY_BREAK
-case 491:
-/* rule 491 can match eol */
+case 529:
+/* rule 529 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");}  surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id);
        YY_BREAK
-case 492:
-/* rule 492 can match eol */
+case 530:
+/* rule 530 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model);
        YY_BREAK
-case 493:
-/* rule 493 can match eol */
+case 531:
+/* rule 531 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");}  surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model);
-       YY_BREAK
-case 494:
-/* rule 494 can match eol */
+       YY_BREAK
+case 532:
+/* rule 532 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size);
        YY_BREAK
-case 495:
-/* rule 495 can match eol */
+case 533:
+/* rule 533 can match eol */
 YY_RULE_SETUP
 if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");}  surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size);
        YY_BREAK
-case 496:
+case 534:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element.");
@@ -8821,7 +9903,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage___type();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage___type);
  }
        YY_BREAK
-case 497:
+case 535:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element.");
@@ -8830,14 +9912,15 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_storage___type(); surfxml_pcdata_ix = 0; ETag_surfxml_storage___type(); popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 498:
+case 536:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of storage_type element.", surf_parse_text[0]);
        YY_BREAK
-case 499:
+case 537:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `storage_type' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8845,8 +9928,8 @@ case YY_STATE_EOF(AL_surfxml_storage___type):
 FAIL("EOF in attribute list of `storage_type' element.");
        YY_BREAK
 
-case 500:
-/* rule 500 can match eol */
+case 538:
+/* rule 538 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8854,15 +9937,16 @@ YY_RULE_SETUP
   popbuffer(); /* attribute */
   switch (YY_START) {
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
   }
  }
        YY_BREAK
-case 501:
-/* rule 501 can match eol */
+case 539:
+/* rule 539 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</storage_type>' expected.",surf_parse_text);
        YY_BREAK
-case 502:
+case 540:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</storage_type>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -8872,13 +9956,13 @@ case YY_STATE_EOF(S_surfxml_storage___type_2):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage_type>' expected.");
        YY_BREAK
 
-case 503:
-/* rule 503 can match eol */
+case 541:
+/* rule 541 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <trace> is not allowed here.");
        YY_BREAK
-case 504:
-/* rule 504 can match eol */
+case 542:
+/* rule 542 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_trace_file = 0;
@@ -8891,37 +9975,37 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 505:
-/* rule 505 can match eol */
+case 543:
+/* rule 543 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_file_isset != 0) {FAIL("Multiple definition of attribute file in <surfxml_trace>");} surfxml_trace_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_file);
        YY_BREAK
-case 506:
-/* rule 506 can match eol */
+case 544:
+/* rule 544 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_file_isset != 0) {FAIL("Multiple definition of attribute file in <surfxml_trace>");}  surfxml_trace_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_file);
        YY_BREAK
-case 507:
-/* rule 507 can match eol */
+case 545:
+/* rule 545 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_trace>");} surfxml_trace_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_id);
        YY_BREAK
-case 508:
-/* rule 508 can match eol */
+case 546:
+/* rule 546 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_trace>");}  surfxml_trace_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_id);
        YY_BREAK
-case 509:
-/* rule 509 can match eol */
+case 547:
+/* rule 547 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_periodicity_isset != 0) {FAIL("Multiple definition of attribute periodicity in <surfxml_trace>");} surfxml_trace_periodicity_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_periodicity);
        YY_BREAK
-case 510:
-/* rule 510 can match eol */
+case 548:
+/* rule 548 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace_periodicity_isset != 0) {FAIL("Multiple definition of attribute periodicity in <surfxml_trace>");}  surfxml_trace_periodicity_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_periodicity);
        YY_BREAK
-case 511:
+case 549:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element.");
@@ -8929,7 +10013,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_trace();pushbuffer(surfxml_pcdata_ix); BUFFERSET(surfxml_pcdata_ix);; ENTER(IN_trace);
  }
        YY_BREAK
-case 512:
+case 550:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element.");
@@ -8939,14 +10023,15 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 513:
+case 551:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of trace element.", surf_parse_text[0]);
        YY_BREAK
-case 514:
+case 552:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `trace' element start tag.",surf_parse_text);
        YY_BREAK
@@ -8954,8 +10039,8 @@ case YY_STATE_EOF(AL_surfxml_trace):
 FAIL("EOF in attribute list of `trace' element.");
        YY_BREAK
 
-case 515:
-/* rule 515 can match eol */
+case 553:
+/* rule 553 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -8967,11 +10052,12 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 516:
-/* rule 516 can match eol */
+case 554:
+/* rule 554 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</trace>' expected.",surf_parse_text);
        YY_BREAK
@@ -8979,13 +10065,13 @@ case YY_STATE_EOF(IN_trace):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</trace>' expected.");
        YY_BREAK
 
-case 517:
-/* rule 517 can match eol */
+case 555:
+/* rule 555 can match eol */
 YY_RULE_SETUP
 FAIL("Starting tag <trace_connect> is not allowed here.");
        YY_BREAK
-case 518:
-/* rule 518 can match eol */
+case 556:
+/* rule 556 can match eol */
 YY_RULE_SETUP
 {
   AX_surfxml_trace___connect_element = 0;
@@ -8998,62 +10084,62 @@ YY_RULE_SETUP
   }
        YY_BREAK
 
-case 519:
-/* rule 519 can match eol */
+case 557:
+/* rule 557 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace___connect_element_isset != 0) {FAIL("Multiple definition of attribute element in <surfxml_trace___connect>");} surfxml_trace___connect_element_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace___connect_element);
        YY_BREAK
-case 520:
-/* rule 520 can match eol */
+case 558:
+/* rule 558 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace___connect_element_isset != 0) {FAIL("Multiple definition of attribute element in <surfxml_trace___connect>");}  surfxml_trace___connect_element_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace___connect_element);
        YY_BREAK
-case 521:
-/* rule 521 can match eol */
-case 522:
-/* rule 522 can match eol */
+case 559:
+/* rule 559 can match eol */
+case 560:
+/* rule 560 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_HOST___AVAIL;
        YY_BREAK
-case 523:
-/* rule 523 can match eol */
-case 524:
-/* rule 524 can match eol */
+case 561:
+/* rule 561 can match eol */
+case 562:
+/* rule 562 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_SPEED;
        YY_BREAK
-case 525:
-/* rule 525 can match eol */
-case 526:
-/* rule 526 can match eol */
+case 563:
+/* rule 563 can match eol */
+case 564:
+/* rule 564 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_LINK___AVAIL;
        YY_BREAK
-case 527:
-/* rule 527 can match eol */
-case 528:
-/* rule 528 can match eol */
+case 565:
+/* rule 565 can match eol */
+case 566:
+/* rule 566 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_BANDWIDTH;
        YY_BREAK
-case 529:
-/* rule 529 can match eol */
-case 530:
-/* rule 530 can match eol */
+case 567:
+/* rule 567 can match eol */
+case 568:
+/* rule 568 can match eol */
 YY_RULE_SETUP
 A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_LATENCY;
        YY_BREAK
-case 531:
-/* rule 531 can match eol */
+case 569:
+/* rule 569 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace___connect_trace_isset != 0) {FAIL("Multiple definition of attribute trace in <surfxml_trace___connect>");} surfxml_trace___connect_trace_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace___connect_trace);
        YY_BREAK
-case 532:
-/* rule 532 can match eol */
+case 570:
+/* rule 570 can match eol */
 YY_RULE_SETUP
 if (surfxml_trace___connect_trace_isset != 0) {FAIL("Multiple definition of attribute trace in <surfxml_trace___connect>");}  surfxml_trace___connect_trace_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace___connect_trace);
        YY_BREAK
-case 533:
+case 571:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_trace___connect_element) FAIL("Required attribute `element' not set for `trace_connect' element.");
@@ -9061,7 +10147,7 @@ YY_RULE_SETUP
   LEAVE; STag_surfxml_trace___connect();surfxml_pcdata_ix = 0; ENTER(E_surfxml_trace___connect);
  }
        YY_BREAK
-case 534:
+case 572:
 YY_RULE_SETUP
 {
   if (!AX_surfxml_trace___connect_element) FAIL("Required attribute `element' not set for `trace_connect' element.");
@@ -9071,14 +10157,15 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 535:
+case 573:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c' in attribute list of trace_connect element.", surf_parse_text[0]);
        YY_BREAK
-case 536:
+case 574:
 YY_RULE_SETUP
 FAIL("Bad attribute `%s' in `trace_connect' element start tag.",surf_parse_text);
        YY_BREAK
@@ -9086,8 +10173,8 @@ case YY_STATE_EOF(AL_surfxml_trace___connect):
 FAIL("EOF in attribute list of `trace_connect' element.");
        YY_BREAK
 
-case 537:
-/* rule 537 can match eol */
+case 575:
+/* rule 575 can match eol */
 YY_RULE_SETUP
 {
   LEAVE;
@@ -9097,15 +10184,16 @@ YY_RULE_SETUP
    case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
    case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
    case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
   }
  }
        YY_BREAK
-case 538:
-/* rule 538 can match eol */
+case 576:
+/* rule 576 can match eol */
 YY_RULE_SETUP
 FAIL("Unexpected end-tag `%s': `</trace_connect>' expected.",surf_parse_text);
        YY_BREAK
-case 539:
+case 577:
 YY_RULE_SETUP
 FAIL("Unexpected character `%c': `</trace_connect>' expected.",surf_parse_text[0]);
        YY_BREAK
@@ -9113,9 +10201,319 @@ case YY_STATE_EOF(E_surfxml_trace___connect):
 if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</trace_connect>' expected.");
        YY_BREAK
 
+case 578:
+/* rule 578 can match eol */
+YY_RULE_SETUP
+FAIL("Starting tag <zone> is not allowed here.");
+       YY_BREAK
+case 579:
+/* rule 579 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_zone_id = 0;
+  surfxml_zone_id_isset = 0;
+  AX_surfxml_zone_routing = AU_surfxml_zone_routing;
+  surfxml_zone_routing_isset = 0;
+  ENTER(AL_surfxml_zone); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 580:
+/* rule 580 can match eol */
+YY_RULE_SETUP
+if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_zone>");} surfxml_zone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zone_id);
+       YY_BREAK
+case 581:
+/* rule 581 can match eol */
+YY_RULE_SETUP
+if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_zone>");}  surfxml_zone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zone_id);
+       YY_BREAK
+case 582:
+/* rule 582 can match eol */
+case 583:
+/* rule 583 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_Full;
+       YY_BREAK
+case 584:
+/* rule 584 can match eol */
+case 585:
+/* rule 585 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_Floyd;
+       YY_BREAK
+case 586:
+/* rule 586 can match eol */
+case 587:
+/* rule 587 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_Dijkstra;
+       YY_BREAK
+case 588:
+/* rule 588 can match eol */
+case 589:
+/* rule 589 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_DijkstraCache;
+       YY_BREAK
+case 590:
+/* rule 590 can match eol */
+case 591:
+/* rule 591 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_None;
+       YY_BREAK
+case 592:
+/* rule 592 can match eol */
+case 593:
+/* rule 593 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_Vivaldi;
+       YY_BREAK
+case 594:
+/* rule 594 can match eol */
+case 595:
+/* rule 595 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_Cluster;
+       YY_BREAK
+case 596:
+/* rule 596 can match eol */
+case 597:
+/* rule 597 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterTorus;
+       YY_BREAK
+case 598:
+/* rule 598 can match eol */
+case 599:
+/* rule 599 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterFatTree;
+       YY_BREAK
+case 600:
+/* rule 600 can match eol */
+case 601:
+/* rule 601 can match eol */
+YY_RULE_SETUP
+A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterDragonfly;
+       YY_BREAK
+case 602:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_zone_id) FAIL("Required attribute `id' not set for `zone' element.");
+  if (!AX_surfxml_zone_routing) FAIL("Required attribute `routing' not set for `zone' element.");
+  LEAVE; STag_surfxml_zone();surfxml_pcdata_ix = 0; ENTER(S_surfxml_zone);
+ }
+       YY_BREAK
+case 603:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_zone_id) FAIL("Required attribute `id' not set for `zone' element.");
+  if (!AX_surfxml_zone_routing) FAIL("Required attribute `routing' not set for `zone' element.");
+  LEAVE; STag_surfxml_zone(); surfxml_pcdata_ix = 0; ETag_surfxml_zone(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
+   case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+  }
+ }
+       YY_BREAK
+case 604:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of zone element.", surf_parse_text[0]);
+       YY_BREAK
+case 605:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `zone' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_zone):
+FAIL("EOF in attribute list of `zone' element.");
+       YY_BREAK
+
+case 606:
+/* rule 606 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_zone();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break;
+   case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break;
+   case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break;
+  }
+ }
+       YY_BREAK
+case 607:
+/* rule 607 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</zone>' expected.",surf_parse_text);
+       YY_BREAK
+case 608:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</zone>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_zone):
+case YY_STATE_EOF(S_surfxml_zone):
+case YY_STATE_EOF(S_surfxml_zone_1):
+case YY_STATE_EOF(S_surfxml_zone_3):
+case YY_STATE_EOF(S_surfxml_zone_4):
+case YY_STATE_EOF(S_surfxml_zone_6):
+case YY_STATE_EOF(S_surfxml_zone_8):
+if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</zone>' expected.");
+       YY_BREAK
+
+case 609:
+/* rule 609 can match eol */
+YY_RULE_SETUP
+FAIL("Starting tag <zoneRoute> is not allowed here.");
+       YY_BREAK
+case 610:
+/* rule 610 can match eol */
+YY_RULE_SETUP
+{
+  AX_surfxml_zoneRoute_dst = 0;
+  surfxml_zoneRoute_dst_isset = 0;
+  AX_surfxml_zoneRoute_gw___dst = 0;
+  surfxml_zoneRoute_gw___dst_isset = 0;
+  AX_surfxml_zoneRoute_gw___src = 0;
+  surfxml_zoneRoute_gw___src_isset = 0;
+  AX_surfxml_zoneRoute_src = 0;
+  surfxml_zoneRoute_src_isset = 0;
+  AX_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_YES;
+  surfxml_zoneRoute_symmetrical_isset = 0;
+  ENTER(AL_surfxml_zoneRoute); pushbuffer(0);
+  }
+       YY_BREAK
+
+case 611:
+/* rule 611 can match eol */
+YY_RULE_SETUP
+if (surfxml_zoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_zoneRoute>");} surfxml_zoneRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_dst);
+       YY_BREAK
+case 612:
+/* rule 612 can match eol */
+YY_RULE_SETUP
+if (surfxml_zoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_zoneRoute>");}  surfxml_zoneRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_dst);
+       YY_BREAK
+case 613:
+/* rule 613 can match eol */
+YY_RULE_SETUP
+if (surfxml_zoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_zoneRoute>");} surfxml_zoneRoute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_gw___dst);
+       YY_BREAK
+case 614:
+/* rule 614 can match eol */
+YY_RULE_SETUP
+if (surfxml_zoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_zoneRoute>");}  surfxml_zoneRoute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_gw___dst);
+       YY_BREAK
+case 615:
+/* rule 615 can match eol */
+YY_RULE_SETUP
+if (surfxml_zoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_zoneRoute>");} surfxml_zoneRoute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_gw___src);
+       YY_BREAK
+case 616:
+/* rule 616 can match eol */
+YY_RULE_SETUP
+if (surfxml_zoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_zoneRoute>");}  surfxml_zoneRoute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_gw___src);
+       YY_BREAK
+case 617:
+/* rule 617 can match eol */
+YY_RULE_SETUP
+if (surfxml_zoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_zoneRoute>");} surfxml_zoneRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_src);
+       YY_BREAK
+case 618:
+/* rule 618 can match eol */
+YY_RULE_SETUP
+if (surfxml_zoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_zoneRoute>");}  surfxml_zoneRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_src);
+       YY_BREAK
+case 619:
+/* rule 619 can match eol */
+case 620:
+/* rule 620 can match eol */
+YY_RULE_SETUP
+A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_YES;
+       YY_BREAK
+case 621:
+/* rule 621 can match eol */
+case 622:
+/* rule 622 can match eol */
+YY_RULE_SETUP
+A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_NO;
+       YY_BREAK
+case 623:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_zoneRoute_dst) FAIL("Required attribute `dst' not set for `zoneRoute' element.");
+  if (!AX_surfxml_zoneRoute_gw___dst) FAIL("Required attribute `gw_dst' not set for `zoneRoute' element.");
+  if (!AX_surfxml_zoneRoute_gw___src) FAIL("Required attribute `gw_src' not set for `zoneRoute' element.");
+  if (!AX_surfxml_zoneRoute_src) FAIL("Required attribute `src' not set for `zoneRoute' element.");
+  LEAVE; STag_surfxml_zoneRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_zoneRoute);
+ }
+       YY_BREAK
+case 624:
+YY_RULE_SETUP
+{
+  if (!AX_surfxml_zoneRoute_dst) FAIL("Required attribute `dst' not set for `zoneRoute' element.");
+  if (!AX_surfxml_zoneRoute_gw___dst) FAIL("Required attribute `gw_dst' not set for `zoneRoute' element.");
+  if (!AX_surfxml_zoneRoute_gw___src) FAIL("Required attribute `gw_src' not set for `zoneRoute' element.");
+  if (!AX_surfxml_zoneRoute_src) FAIL("Required attribute `src' not set for `zoneRoute' element.");
+  LEAVE; STag_surfxml_zoneRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_zoneRoute(); popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_AS: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_1: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_5: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+  }
+ }
+       YY_BREAK
+case 625:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of zoneRoute element.", surf_parse_text[0]);
+       YY_BREAK
+case 626:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `zoneRoute' element start tag.",surf_parse_text);
+       YY_BREAK
+case YY_STATE_EOF(AL_surfxml_zoneRoute):
+FAIL("EOF in attribute list of `zoneRoute' element.");
+       YY_BREAK
+
+case 627:
+/* rule 627 can match eol */
+YY_RULE_SETUP
+{
+  LEAVE;
+  ETag_surfxml_zoneRoute();
+  popbuffer(); /* attribute */
+  switch (YY_START) {
+   case S_surfxml_AS: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break;
+   case S_surfxml_AS_1: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break;
+   case S_surfxml_zone: case S_surfxml_zone_5: SET(S_surfxml_zone_6); break;
+   case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break;
+  }
+ }
+       YY_BREAK
+case 628:
+/* rule 628 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</zoneRoute>' expected.",surf_parse_text);
+       YY_BREAK
+case 629:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</zoneRoute>' expected.",surf_parse_text[0]);
+       YY_BREAK
+case YY_STATE_EOF(E_surfxml_zoneRoute):
+case YY_STATE_EOF(S_surfxml_zoneRoute):
+case YY_STATE_EOF(S_surfxml_zoneRoute_2):
+if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</zoneRoute>' expected.");
+       YY_BREAK
+
 /* EPILOG: after the root element. */
 
-case 540:
+case 630:
 YY_RULE_SETUP
 {SET(PROLOG); yyless(0); CLEANUP; return -1;}
        YY_BREAK
@@ -9126,58 +10524,58 @@ SUCCEED;
 /* CHARACTER DATA. */
 
 /* Non-defined standard entities... */
-case 541:
+case 631:
 YY_RULE_SETUP
 BUFFERPUTC('&');
        YY_BREAK
-case 542:
+case 632:
 YY_RULE_SETUP
 BUFFERPUTC('<');
        YY_BREAK
-case 543:
+case 633:
 YY_RULE_SETUP
 BUFFERPUTC('>');
        YY_BREAK
-case 544:
+case 634:
 YY_RULE_SETUP
 BUFFERPUTC('\'');
        YY_BREAK
-case 545:
+case 635:
 YY_RULE_SETUP
 BUFFERPUTC('"');
        YY_BREAK
 /* Character entities. */
-case 546:
+case 636:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)atoi(surf_parse_text+2));
        YY_BREAK
-case 547:
+case 637:
 YY_RULE_SETUP
 BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16));
        YY_BREAK
 
-case 548:
-/* rule 548 can match eol */
-case 549:
-/* rule 549 can match eol */
-case 550:
-/* rule 550 can match eol */
-case 551:
-/* rule 551 can match eol */
+case 638:
+/* rule 638 can match eol */
+case 639:
+/* rule 639 can match eol */
+case 640:
+/* rule 640 can match eol */
+case 641:
+/* rule 641 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC('\n');
        YY_BREAK
 
-case 552:
+case 642:
 YY_RULE_SETUP
 ENTER(CDATA);
        YY_BREAK
-case 553:
+case 643:
 YY_RULE_SETUP
 FAIL("Unexpected `]""]>' in character data.");
        YY_BREAK
 
-case 554:
+case 644:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -9185,7 +10583,7 @@ case YY_STATE_EOF(VALUE1):
 FAIL("EOF in literal (\"'\" expected).");
        YY_BREAK
 
-case 555:
+case 645:
 YY_RULE_SETUP
 BUFFERDONE; LEAVE;
        YY_BREAK
@@ -9193,22 +10591,22 @@ case YY_STATE_EOF(VALUE2):
 FAIL("EOF in literal (`\"' expected).");
        YY_BREAK
 
-case 556:
-/* rule 556 can match eol */
+case 646:
+/* rule 646 can match eol */
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
-case 557:
+case 647:
 YY_RULE_SETUP
 FAIL("Spurious `%c' in character data.",surf_parse_text[0]);
        YY_BREAK
 
-case 558:
+case 648:
 YY_RULE_SETUP
 LEAVE;
        YY_BREAK
 /* "]""]"              BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */
-case 559:
+case 649:
 YY_RULE_SETUP
 BUFFERPUTC(surf_parse_text[0]);
        YY_BREAK
@@ -9220,13 +10618,13 @@ FAIL("EOF in CDATA section.");
 /* Ideally, this should be replaced by code in flexml.pl that
     generates just the states not covered by other rules. */
 
-case 560:
-/* rule 560 can match eol */
+case 650:
+/* rule 650 can match eol */
 YY_RULE_SETUP
 FAIL("Syntax error on character `%c'.", surf_parse_text[0]);
        YY_BREAK
 
-case 561:
+case 651:
 YY_RULE_SETUP
 ECHO;
        YY_BREAK
@@ -9235,8 +10633,10 @@ case YY_STATE_EOF(S_surfxml_AS_2):
 case YY_STATE_EOF(S_surfxml_AS_5):
 case YY_STATE_EOF(S_surfxml_AS_7):
 case YY_STATE_EOF(S_surfxml_ASroute_1):
+case YY_STATE_EOF(S_surfxml_actor_1):
 case YY_STATE_EOF(S_surfxml_bypassASroute_1):
 case YY_STATE_EOF(S_surfxml_bypassRoute_1):
+case YY_STATE_EOF(S_surfxml_bypassZoneRoute_1):
 case YY_STATE_EOF(S_surfxml_cluster_1):
 case YY_STATE_EOF(S_surfxml_config_1):
 case YY_STATE_EOF(S_surfxml_host_1):
@@ -9250,6 +10650,10 @@ case YY_STATE_EOF(S_surfxml_process_1):
 case YY_STATE_EOF(S_surfxml_route_1):
 case YY_STATE_EOF(S_surfxml_storage_1):
 case YY_STATE_EOF(S_surfxml_storage___type_1):
+case YY_STATE_EOF(S_surfxml_zone_2):
+case YY_STATE_EOF(S_surfxml_zone_5):
+case YY_STATE_EOF(S_surfxml_zone_7):
+case YY_STATE_EOF(S_surfxml_zoneRoute_1):
 case YY_STATE_EOF(IMPOSSIBLE):
        yyterminate();
 
@@ -9394,7 +10798,7 @@ static int yy_get_next_buffer (void)
 {
        char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
        char *source = (yytext_ptr);
-       yy_size_t number_to_move, i;
+       int number_to_move, i;
        int ret_val;
 
        if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
@@ -9423,7 +10827,7 @@ static int yy_get_next_buffer (void)
        /* Try to read more data. */
 
        /* First move last chars to start of buffer. */
-       number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+       number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
 
        for ( i = 0; i < number_to_move; ++i )
                *(dest++) = *(source++);
@@ -9505,7 +10909,7 @@ static int yy_get_next_buffer (void)
        else
                ret_val = EOB_ACT_CONTINUE_SCAN;
 
-       if ((int) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+       if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
                /* Extend the array by 50%, plus the number we really need. */
                int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
                YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) surf_parse_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
@@ -9542,7 +10946,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 3334 )
+                       if ( yy_current_state >= 3906 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
@@ -9570,11 +10974,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 3334 )
+               if ( yy_current_state >= 3906 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
-       yy_is_jam = (yy_current_state == 3333);
+       yy_is_jam = (yy_current_state == 3905);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -9986,15 +11390,15 @@ YY_BUFFER_STATE surf_parse__scan_bytes  (yyconst char * yybytes, int  _yybytes_l
        YY_BUFFER_STATE b;
        char *buf;
        yy_size_t n;
-       yy_size_t i;
+       int i;
     
        /* Get memory for full buffer, including space for trailing EOB's. */
-       n = (yy_size_t) _yybytes_len + 2;
+       n = (yy_size_t) (_yybytes_len + 2);
        buf = (char *) surf_parse_alloc(n  );
        if ( ! buf )
                YY_FATAL_ERROR( "out of dynamic memory in surf_parse__scan_bytes()" );
 
-       for ( i = 0; i < (yy_size_t) _yybytes_len; ++i )
+       for ( i = 0; i < _yybytes_len; ++i )
                buf[i] = yybytes[i];
 
        buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
index 9cc998a..722f962 100644 (file)
@@ -52,6 +52,8 @@ XBT_PUBLIC(void) STag_surfxml_AS(void);
 XBT_PUBLIC(void) ETag_surfxml_AS(void);
 XBT_PUBLIC(void) STag_surfxml_ASroute(void);
 XBT_PUBLIC(void) ETag_surfxml_ASroute(void);
+XBT_PUBLIC(void) STag_surfxml_actor(void);
+XBT_PUBLIC(void) ETag_surfxml_actor(void);
 XBT_PUBLIC(void) STag_surfxml_argument(void);
 XBT_PUBLIC(void) ETag_surfxml_argument(void);
 XBT_PUBLIC(void) STag_surfxml_backbone(void);
@@ -60,6 +62,8 @@ XBT_PUBLIC(void) STag_surfxml_bypassASroute(void);
 XBT_PUBLIC(void) ETag_surfxml_bypassASroute(void);
 XBT_PUBLIC(void) STag_surfxml_bypassRoute(void);
 XBT_PUBLIC(void) ETag_surfxml_bypassRoute(void);
+XBT_PUBLIC(void) STag_surfxml_bypassZoneRoute(void);
+XBT_PUBLIC(void) ETag_surfxml_bypassZoneRoute(void);
 XBT_PUBLIC(void) STag_surfxml_cabinet(void);
 XBT_PUBLIC(void) ETag_surfxml_cabinet(void);
 XBT_PUBLIC(void) STag_surfxml_cluster(void);
@@ -102,6 +106,10 @@ XBT_PUBLIC(void) STag_surfxml_trace(void);
 XBT_PUBLIC(void) ETag_surfxml_trace(void);
 XBT_PUBLIC(void) STag_surfxml_trace___connect(void);
 XBT_PUBLIC(void) ETag_surfxml_trace___connect(void);
+XBT_PUBLIC(void) STag_surfxml_zone(void);
+XBT_PUBLIC(void) ETag_surfxml_zone(void);
+XBT_PUBLIC(void) STag_surfxml_zoneRoute(void);
+XBT_PUBLIC(void) ETag_surfxml_zoneRoute(void);
 
 /* XML application data. */
 typedef int AT_surfxml_AS_id;
@@ -116,6 +124,15 @@ typedef int AT_surfxml_ASroute_gw___src;
 typedef int AT_surfxml_ASroute_src;
 #define AU_surfxml_ASroute_src NULL
 typedef enum { AU_surfxml_ASroute_symmetrical, A_surfxml_ASroute_symmetrical_YES,A_surfxml_ASroute_symmetrical_NO } AT_surfxml_ASroute_symmetrical;
+typedef int AT_surfxml_actor_function;
+#define AU_surfxml_actor_function NULL
+typedef int AT_surfxml_actor_host;
+#define AU_surfxml_actor_host NULL
+typedef int AT_surfxml_actor_kill___time;
+#define AU_surfxml_actor_kill___time NULL
+typedef enum { AU_surfxml_actor_on___failure, A_surfxml_actor_on___failure_DIE,A_surfxml_actor_on___failure_RESTART } AT_surfxml_actor_on___failure;
+typedef int AT_surfxml_actor_start___time;
+#define AU_surfxml_actor_start___time NULL
 typedef int AT_surfxml_argument_value;
 #define AU_surfxml_argument_value NULL
 typedef int AT_surfxml_backbone_bandwidth;
@@ -136,6 +153,14 @@ typedef int AT_surfxml_bypassRoute_dst;
 #define AU_surfxml_bypassRoute_dst NULL
 typedef int AT_surfxml_bypassRoute_src;
 #define AU_surfxml_bypassRoute_src NULL
+typedef int AT_surfxml_bypassZoneRoute_dst;
+#define AU_surfxml_bypassZoneRoute_dst NULL
+typedef int AT_surfxml_bypassZoneRoute_gw___dst;
+#define AU_surfxml_bypassZoneRoute_gw___dst NULL
+typedef int AT_surfxml_bypassZoneRoute_gw___src;
+#define AU_surfxml_bypassZoneRoute_gw___src NULL
+typedef int AT_surfxml_bypassZoneRoute_src;
+#define AU_surfxml_bypassZoneRoute_src NULL
 typedef int AT_surfxml_cabinet_bw;
 #define AU_surfxml_cabinet_bw NULL
 typedef int AT_surfxml_cabinet_id;
@@ -317,6 +342,18 @@ typedef int AT_surfxml_trace___connect_element;
 typedef enum { AU_surfxml_trace___connect_kind, A_surfxml_trace___connect_kind_HOST___AVAIL,A_surfxml_trace___connect_kind_SPEED,A_surfxml_trace___connect_kind_LINK___AVAIL,A_surfxml_trace___connect_kind_BANDWIDTH,A_surfxml_trace___connect_kind_LATENCY } AT_surfxml_trace___connect_kind;
 typedef int AT_surfxml_trace___connect_trace;
 #define AU_surfxml_trace___connect_trace NULL
+typedef int AT_surfxml_zone_id;
+#define AU_surfxml_zone_id NULL
+typedef enum { AU_surfxml_zone_routing, A_surfxml_zone_routing_Full,A_surfxml_zone_routing_Floyd,A_surfxml_zone_routing_Dijkstra,A_surfxml_zone_routing_DijkstraCache,A_surfxml_zone_routing_None,A_surfxml_zone_routing_Vivaldi,A_surfxml_zone_routing_Cluster,A_surfxml_zone_routing_ClusterTorus,A_surfxml_zone_routing_ClusterFatTree,A_surfxml_zone_routing_ClusterDragonfly } AT_surfxml_zone_routing;
+typedef int AT_surfxml_zoneRoute_dst;
+#define AU_surfxml_zoneRoute_dst NULL
+typedef int AT_surfxml_zoneRoute_gw___dst;
+#define AU_surfxml_zoneRoute_gw___dst NULL
+typedef int AT_surfxml_zoneRoute_gw___src;
+#define AU_surfxml_zoneRoute_gw___src NULL
+typedef int AT_surfxml_zoneRoute_src;
+#define AU_surfxml_zoneRoute_src NULL
+typedef enum { AU_surfxml_zoneRoute_symmetrical, A_surfxml_zoneRoute_symmetrical_YES,A_surfxml_zoneRoute_symmetrical_NO } AT_surfxml_zoneRoute_symmetrical;
 
 /* FleXML-provided data. */
 XBT_PUBLIC_DATA(int) surfxml_pcdata_ix;
@@ -343,6 +380,21 @@ XBT_PUBLIC_DATA(short int) surfxml_ASroute_src_isset;
 XBT_PUBLIC_DATA(AT_surfxml_ASroute_symmetrical) AX_surfxml_ASroute_symmetrical;
 #define A_surfxml_ASroute_symmetrical AX_surfxml_ASroute_symmetrical
 XBT_PUBLIC_DATA(short int) surfxml_ASroute_symmetrical_isset;
+XBT_PUBLIC_DATA(AT_surfxml_actor_function) AX_surfxml_actor_function;
+#define A_surfxml_actor_function (surfxml_bufferstack + AX_surfxml_actor_function)
+XBT_PUBLIC_DATA(short int) surfxml_actor_function_isset;
+XBT_PUBLIC_DATA(AT_surfxml_actor_host) AX_surfxml_actor_host;
+#define A_surfxml_actor_host (surfxml_bufferstack + AX_surfxml_actor_host)
+XBT_PUBLIC_DATA(short int) surfxml_actor_host_isset;
+XBT_PUBLIC_DATA(AT_surfxml_actor_kill___time) AX_surfxml_actor_kill___time;
+#define A_surfxml_actor_kill___time (surfxml_bufferstack + AX_surfxml_actor_kill___time)
+XBT_PUBLIC_DATA(short int) surfxml_actor_kill___time_isset;
+XBT_PUBLIC_DATA(AT_surfxml_actor_on___failure) AX_surfxml_actor_on___failure;
+#define A_surfxml_actor_on___failure AX_surfxml_actor_on___failure
+XBT_PUBLIC_DATA(short int) surfxml_actor_on___failure_isset;
+XBT_PUBLIC_DATA(AT_surfxml_actor_start___time) AX_surfxml_actor_start___time;
+#define A_surfxml_actor_start___time (surfxml_bufferstack + AX_surfxml_actor_start___time)
+XBT_PUBLIC_DATA(short int) surfxml_actor_start___time_isset;
 XBT_PUBLIC_DATA(AT_surfxml_argument_value) AX_surfxml_argument_value;
 #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value)
 XBT_PUBLIC_DATA(short int) surfxml_argument_value_isset;
@@ -373,6 +425,18 @@ XBT_PUBLIC_DATA(short int) surfxml_bypassRoute_dst_isset;
 XBT_PUBLIC_DATA(AT_surfxml_bypassRoute_src) AX_surfxml_bypassRoute_src;
 #define A_surfxml_bypassRoute_src (surfxml_bufferstack + AX_surfxml_bypassRoute_src)
 XBT_PUBLIC_DATA(short int) surfxml_bypassRoute_src_isset;
+XBT_PUBLIC_DATA(AT_surfxml_bypassZoneRoute_dst) AX_surfxml_bypassZoneRoute_dst;
+#define A_surfxml_bypassZoneRoute_dst (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_dst)
+XBT_PUBLIC_DATA(short int) surfxml_bypassZoneRoute_dst_isset;
+XBT_PUBLIC_DATA(AT_surfxml_bypassZoneRoute_gw___dst) AX_surfxml_bypassZoneRoute_gw___dst;
+#define A_surfxml_bypassZoneRoute_gw___dst (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_gw___dst)
+XBT_PUBLIC_DATA(short int) surfxml_bypassZoneRoute_gw___dst_isset;
+XBT_PUBLIC_DATA(AT_surfxml_bypassZoneRoute_gw___src) AX_surfxml_bypassZoneRoute_gw___src;
+#define A_surfxml_bypassZoneRoute_gw___src (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_gw___src)
+XBT_PUBLIC_DATA(short int) surfxml_bypassZoneRoute_gw___src_isset;
+XBT_PUBLIC_DATA(AT_surfxml_bypassZoneRoute_src) AX_surfxml_bypassZoneRoute_src;
+#define A_surfxml_bypassZoneRoute_src (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_src)
+XBT_PUBLIC_DATA(short int) surfxml_bypassZoneRoute_src_isset;
 XBT_PUBLIC_DATA(AT_surfxml_cabinet_bw) AX_surfxml_cabinet_bw;
 #define A_surfxml_cabinet_bw (surfxml_bufferstack + AX_surfxml_cabinet_bw)
 XBT_PUBLIC_DATA(short int) surfxml_cabinet_bw_isset;
@@ -658,6 +722,27 @@ XBT_PUBLIC_DATA(short int) surfxml_trace___connect_kind_isset;
 XBT_PUBLIC_DATA(AT_surfxml_trace___connect_trace) AX_surfxml_trace___connect_trace;
 #define A_surfxml_trace___connect_trace (surfxml_bufferstack + AX_surfxml_trace___connect_trace)
 XBT_PUBLIC_DATA(short int) surfxml_trace___connect_trace_isset;
+XBT_PUBLIC_DATA(AT_surfxml_zone_id) AX_surfxml_zone_id;
+#define A_surfxml_zone_id (surfxml_bufferstack + AX_surfxml_zone_id)
+XBT_PUBLIC_DATA(short int) surfxml_zone_id_isset;
+XBT_PUBLIC_DATA(AT_surfxml_zone_routing) AX_surfxml_zone_routing;
+#define A_surfxml_zone_routing AX_surfxml_zone_routing
+XBT_PUBLIC_DATA(short int) surfxml_zone_routing_isset;
+XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_dst) AX_surfxml_zoneRoute_dst;
+#define A_surfxml_zoneRoute_dst (surfxml_bufferstack + AX_surfxml_zoneRoute_dst)
+XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_dst_isset;
+XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_gw___dst) AX_surfxml_zoneRoute_gw___dst;
+#define A_surfxml_zoneRoute_gw___dst (surfxml_bufferstack + AX_surfxml_zoneRoute_gw___dst)
+XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_gw___dst_isset;
+XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_gw___src) AX_surfxml_zoneRoute_gw___src;
+#define A_surfxml_zoneRoute_gw___src (surfxml_bufferstack + AX_surfxml_zoneRoute_gw___src)
+XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_gw___src_isset;
+XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_src) AX_surfxml_zoneRoute_src;
+#define A_surfxml_zoneRoute_src (surfxml_bufferstack + AX_surfxml_zoneRoute_src)
+XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_src_isset;
+XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_symmetrical) AX_surfxml_zoneRoute_symmetrical;
+#define A_surfxml_zoneRoute_symmetrical AX_surfxml_zoneRoute_symmetrical
+XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_symmetrical_isset;
 
 /* XML application utilities. */
 XBT_PUBLIC(int) surfxml_element_context(int);
index 5890b6e..ba3dab8 100644 (file)
@@ -15,7 +15,7 @@
 
 #include "src/surf/xml/platf_private.hpp"
 
-#if HAVE_LUA
+#if SIMGRID_HAVE_LUA
 extern "C" {
 #include "src/bindings/lua/simgrid_lua.h"
 
@@ -131,14 +131,14 @@ void parse_after_config() {
 /* This function acts as a main in the parsing area. */
 void parse_platform_file(const char *file)
 {
-#if HAVE_LUA
+#if SIMGRID_HAVE_LUA
   int len    = (file == nullptr ? 0 : strlen(file));
   int is_lua = (file != nullptr && len > 3 && file[len - 3] == 'l' && file[len - 2] == 'u' && file[len - 1] == 'a');
 #endif
 
   sg_platf_init();
 
-#if HAVE_LUA
+#if SIMGRID_HAVE_LUA
   /* Check if file extension is "lua". If so, we will use
    * the lua bindings to parse the platform file (since it is
    * written in lua). If not, we will use the (old?) XML parser
@@ -180,7 +180,8 @@ void parse_platform_file(const char *file)
 
     /* connect all traces relative to hosts */
     xbt_dict_cursor_t cursor = nullptr;
-    char *trace_name, *elm;
+    char* trace_name;
+    char* elm;
 
     xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
       tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
index f33d910..03adf83 100644 (file)
@@ -287,7 +287,7 @@ static std::vector<double> surf_parse_get_all_speeds(char* speeds, const char* e
 /* The default current property receiver. Setup in the corresponding opening callbacks. */
 xbt_dict_t current_property_set = nullptr;
 std::map<std::string, std::string>* current_model_property_set = nullptr;
-int AS_TAG                            = 0; // Whether we just opened an AS tag (to see what to do with the properties)
+int ZONE_TAG                            = 0; // Whether we just opened a zone tag (to see what to do with the properties)
 
 /* dictionary of random generator data */
 xbt_dict_t random_data_list = nullptr;
@@ -300,7 +300,7 @@ FILE *surf_file_to_parse = nullptr;
  */
 void STag_surfxml_storage()
 {
-  AS_TAG = 0;
+  ZONE_TAG = 0;
   XBT_DEBUG("STag_surfxml_storage");
   xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)");
 }
@@ -321,7 +321,7 @@ void ETag_surfxml_storage()
 }
 void STag_surfxml_storage___type()
 {
-  AS_TAG = 0;
+  ZONE_TAG = 0;
   XBT_DEBUG("STag_surfxml_storage___type");
   xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)");
   xbt_assert(current_model_property_set == nullptr, "Someone forgot to reset the model property set to nullptr in its closing tag (or XML malformed)");
@@ -446,16 +446,30 @@ void STag_surfxml_platform() {
       "Use simgrid_update_xml to update your file automatically. "
       "This program is installed automatically with SimGrid, or "
       "available in the tools/ directory of the source archive.");
-  xbt_assert((version >= 4.0), "******* FILE %s IS TOO OLD (v:%.1f) *********\n "
-      "Changes introduced in SimGrid 3.13:\n"
-      "  - 'power' attribute of hosts (and others) got renamed to 'speed'.\n"
-      "  - In <trace_connect>, attribute kind=\"POWER\" is now kind=\"SPEED\".\n"
-      "  - DOCTYPE now point to the rignt URL: http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd\n"
-      "  - speed, bandwidth and latency attributes now MUST have an explicit unit (f, Bps, s by default)"
-      "\n\n"
-      "Use simgrid_update_xml to update your file automatically. "
-      "This program is installed automatically with SimGrid, or "
-      "available in the tools/ directory of the source archive.",surf_parsed_filename, version);
+  xbt_assert((version >= 4.0),
+             "******* FILE %s IS TOO OLD (v:%.1f) *********\n "
+             "Changes introduced in SimGrid 3.13:\n"
+             "  - 'power' attribute of hosts (and others) got renamed to 'speed'.\n"
+             "  - In <trace_connect>, attribute kind=\"POWER\" is now kind=\"SPEED\".\n"
+             "  - DOCTYPE now point to the rignt URL: http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd\n"
+             "  - speed, bandwidth and latency attributes now MUST have an explicit unit (f, Bps, s by default)"
+             "\n\n"
+             "Use simgrid_update_xml to update your file automatically. "
+             "This program is installed automatically with SimGrid, or "
+             "available in the tools/ directory of the source archive.",
+             surf_parsed_filename, version);
+  if (version < 4.1) {
+    XBT_INFO("You're using a v%.1f XML file (%s) while the current standard is v4.1 "
+             "That's fine, the new version is backward compatible. \n\n"
+             "Use simgrid_update_xml to update your file automatically. "
+             "This program is installed automatically with SimGrid, or "
+             "available in the tools/ directory of the source archive.",
+             version, surf_parsed_filename);
+  }
+  xbt_assert(version <= 4.1, "******* FILE %s COMES FROM THE FUTURE (v:%.1f) *********\n "
+                             "The most recent formalism that this version of SimGrid understands is v4.1.\n"
+                             "Please update your code, or use another, more adapted, file.",
+             surf_parsed_filename, version);
 
   sg_platf_begin();
 }
@@ -464,15 +478,15 @@ void ETag_surfxml_platform(){
 }
 
 void STag_surfxml_host(){
-  AS_TAG = 0;
+  ZONE_TAG = 0;
   xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)");
 }
 
 void STag_surfxml_prop()
 {
-  if (AS_TAG) { // We need to retrieve the most recently opened AS
-    XBT_DEBUG("Set AS property %s -> %s", A_surfxml_prop_id, A_surfxml_prop_value);
-    simgrid::s4u::NetZone* netzone = simgrid::s4u::Engine::instance()->netzoneByNameOrNull(A_surfxml_AS_id);
+  if (ZONE_TAG) { // We need to retrieve the most recently opened zone
+    XBT_DEBUG("Set zone property %s -> %s", A_surfxml_prop_id, A_surfxml_prop_value);
+    simgrid::s4u::NetZone* netzone = simgrid::s4u::Engine::instance()->netzoneByNameOrNull(A_surfxml_zone_id);
 
     netzone->setProperty(A_surfxml_prop_id, A_surfxml_prop_value);
   }
@@ -597,7 +611,7 @@ void ETag_surfxml_cluster(){
 }
 
 void STag_surfxml_cluster(){
-  AS_TAG = 0;
+  ZONE_TAG = 0;
   parse_after_config();
   xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)");
 }
@@ -637,7 +651,7 @@ void STag_surfxml_peer(){
 }
 
 void STag_surfxml_link(){
-  AS_TAG = 0;
+  ZONE_TAG = 0;
   xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)");
 }
 
@@ -689,6 +703,9 @@ void STag_surfxml_link___ctn(){
     link_name = bprintf("%s_DOWN", A_surfxml_link___ctn_id);
     link      = simgrid::surf::LinkImpl::byName(link_name);
     break;
+  default:
+    surf_parse_error("Invalid direction for link %s", link_name);
+    break;
   }
   xbt_free(link_name); // no-op if it's already nullptr
 
@@ -729,15 +746,26 @@ void STag_surfxml_route(){
 
 void STag_surfxml_ASroute(){
   surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_ASroute_src), "ASroute src='%s' does name a node.",
-                    A_surfxml_route_src);
+                    A_surfxml_ASroute_src);
   surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_ASroute_dst), "ASroute dst='%s' does name a node.",
-                    A_surfxml_route_dst);
+                    A_surfxml_ASroute_dst);
 
   surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_ASroute_gw___src), "ASroute gw_src='%s' does name a node.",
                     A_surfxml_ASroute_gw___src);
   surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_ASroute_gw___dst), "ASroute gw_dst='%s' does name a node.",
                     A_surfxml_ASroute_gw___dst);
 }
+void STag_surfxml_zoneRoute(){
+  surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_src), "zoneRoute src='%s' does name a node.",
+                    A_surfxml_zoneRoute_src);
+  surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_dst), "zoneRoute dst='%s' does name a node.",
+                    A_surfxml_zoneRoute_dst);
+
+  surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___src), "zoneRoute gw_src='%s' does name a node.",
+                    A_surfxml_zoneRoute_gw___src);
+  surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___dst), "zoneRoute gw_dst='%s' does name a node.",
+                    A_surfxml_zoneRoute_gw___dst);
+}
 
 void STag_surfxml_bypassRoute(){
   surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassRoute_src), "bypassRoute src='%s' does name a node.",
@@ -756,6 +784,16 @@ void STag_surfxml_bypassASroute(){
   surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_gw___dst),
                     "bypassASroute gw_dst='%s' does name a node.", A_surfxml_bypassASroute_gw___dst);
 }
+void STag_surfxml_bypassZoneRoute(){
+  surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_src),
+                    "bypassASroute src='%s' does name a node.", A_surfxml_bypassZoneRoute_src);
+  surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_dst),
+                    "bypassASroute dst='%s' does name a node.", A_surfxml_bypassZoneRoute_dst);
+  surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___src),
+                    "bypassASroute gw_src='%s' does name a node.", A_surfxml_bypassZoneRoute_gw___src);
+  surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___dst),
+                    "bypassASroute gw_dst='%s' does name a node.", A_surfxml_bypassZoneRoute_gw___dst);
+}
 
 void ETag_surfxml_route(){
   s_sg_platf_route_cbarg_t route;
@@ -776,15 +814,25 @@ void ETag_surfxml_route(){
   delete route.link_list;
 }
 
-void ETag_surfxml_ASroute(){
+void ETag_surfxml_ASroute()
+{
+  AX_surfxml_zoneRoute_src = AX_surfxml_ASroute_src;
+  AX_surfxml_zoneRoute_dst = AX_surfxml_ASroute_dst;
+  AX_surfxml_zoneRoute_gw___src = AX_surfxml_ASroute_gw___src;
+  AX_surfxml_zoneRoute_gw___dst = AX_surfxml_ASroute_gw___dst;
+  AX_surfxml_zoneRoute_symmetrical = (AT_surfxml_zoneRoute_symmetrical)AX_surfxml_ASroute_symmetrical;
+  ETag_surfxml_zoneRoute();
+}
+void ETag_surfxml_zoneRoute()
+{
   s_sg_platf_route_cbarg_t ASroute;
   memset(&ASroute,0,sizeof(ASroute));
 
-  ASroute.src = sg_netpoint_by_name_or_null(A_surfxml_ASroute_src); // tested to not be nullptr in start tag
-  ASroute.dst = sg_netpoint_by_name_or_null(A_surfxml_ASroute_dst); // tested to not be nullptr in start tag
+  ASroute.src = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_src); // tested to not be nullptr in start tag
+  ASroute.dst = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_dst); // tested to not be nullptr in start tag
 
-  ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_ASroute_gw___src); // tested to not be nullptr in start tag
-  ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_ASroute_gw___dst); // tested to not be nullptr in start tag
+  ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___src); // tested to not be nullptr in start tag
+  ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___dst); // tested to not be nullptr in start tag
 
   ASroute.link_list = new std::vector<simgrid::surf::LinkImpl*>();
 
@@ -792,12 +840,12 @@ void ETag_surfxml_ASroute(){
     ASroute.link_list->push_back(link);
   parsed_link_list.clear();
 
-  switch (A_surfxml_ASroute_symmetrical) {
-  case AU_surfxml_ASroute_symmetrical:
-  case A_surfxml_ASroute_symmetrical_YES:
+  switch (A_surfxml_zoneRoute_symmetrical) {
+  case AU_surfxml_zoneRoute_symmetrical:
+  case A_surfxml_zoneRoute_symmetrical_YES:
     ASroute.symmetrical = true;
     break;
-  case A_surfxml_ASroute_symmetrical_NO:
+  case A_surfxml_zoneRoute_symmetrical_NO:
     ASroute.symmetrical = false;
     break;
   }
@@ -825,12 +873,21 @@ void ETag_surfxml_bypassRoute(){
   delete route.link_list;
 }
 
-void ETag_surfxml_bypassASroute(){
+void ETag_surfxml_bypassASroute()
+{
+  AX_surfxml_bypassZoneRoute_src = AX_surfxml_bypassASroute_src;
+  AX_surfxml_bypassZoneRoute_dst = AX_surfxml_bypassASroute_dst;
+  AX_surfxml_bypassZoneRoute_gw___src = AX_surfxml_bypassASroute_gw___src;
+  AX_surfxml_bypassZoneRoute_gw___dst = AX_surfxml_bypassASroute_gw___dst;
+  ETag_surfxml_bypassZoneRoute();
+}
+void ETag_surfxml_bypassZoneRoute()
+{
   s_sg_platf_route_cbarg_t ASroute;
   memset(&ASroute,0,sizeof(ASroute));
 
-  ASroute.src         = sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_src);
-  ASroute.dst         = sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_dst);
+  ASroute.src         = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_src);
+  ASroute.dst         = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_dst);
   ASroute.link_list   = new std::vector<simgrid::surf::LinkImpl*>();
   for (auto link: parsed_link_list)
     ASroute.link_list->push_back(link);
@@ -838,8 +895,8 @@ void ETag_surfxml_bypassASroute(){
 
   ASroute.symmetrical = false;
 
-  ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_gw___src);
-  ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_gw___dst);
+  ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___src);
+  ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___dst);
 
   sg_platf_new_bypassRoute(&ASroute);
   delete ASroute.link_list;
@@ -857,7 +914,8 @@ void ETag_surfxml_trace(){
   sg_platf_new_trace(&trace);
 }
 
-void STag_surfxml_trace___connect(){
+void STag_surfxml_trace___connect()
+{
   parse_after_config();
   s_sg_platf_trace_connect_cbarg_t trace_connect;
   memset(&trace_connect,0,sizeof(trace_connect));
@@ -882,38 +940,59 @@ void STag_surfxml_trace___connect(){
   case A_surfxml_trace___connect_kind_LINK___AVAIL:
     trace_connect.kind =  SURF_TRACE_CONNECT_KIND_LINK_AVAIL;
     break;
+  default:
+    surf_parse_error("Invalid trace kind");
+    break;
   }
   sg_platf_trace_connect(&trace_connect);
 }
 
-void STag_surfxml_AS(){
+void STag_surfxml_AS()
+{
+  AX_surfxml_zone_id = AX_surfxml_AS_id;
+  AX_surfxml_zone_routing = (AT_surfxml_zone_routing)AX_surfxml_AS_routing;
+  STag_surfxml_zone();
+}
+
+void ETag_surfxml_AS()
+{
+  ETag_surfxml_zone();
+}
+
+void STag_surfxml_zone()
+{
   parse_after_config();
-  AS_TAG                   = 1;
-  s_sg_platf_AS_cbarg_t AS = { A_surfxml_AS_id, (int)A_surfxml_AS_routing};
+  ZONE_TAG                 = 1;
+  s_sg_platf_AS_cbarg_t AS = {A_surfxml_zone_id, (int)A_surfxml_zone_routing};
 
   sg_platf_new_AS_begin(&AS);
 }
-void ETag_surfxml_AS(){
+
+void ETag_surfxml_zone()
+{
   sg_platf_new_AS_seal();
 }
 
-void STag_surfxml_config(){
-  AS_TAG = 0;
+void STag_surfxml_config()
+{
+  ZONE_TAG = 0;
   xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)");
   XBT_DEBUG("START configuration name = %s",A_surfxml_config_id);
   if (_sg_cfg_init_status == 2) {
-    surf_parse_error("All <config> tags must be given before any platform elements (such as <AS>, <host>, <cluster>, <link>, etc).");
+    surf_parse_error("All <config> tags must be given before any platform elements (such as <zone>, <host>, <cluster>, "
+                     "<link>, etc).");
   }
 }
-void ETag_surfxml_config(){
+
+void ETag_surfxml_config()
+{
   xbt_dict_cursor_t cursor = nullptr;
   char *key;
   char *elem;
   xbt_dict_foreach(current_property_set, cursor, key, elem) {
     if (xbt_cfg_is_default_value(key)) {
-      char* cfg = bprintf("%s:%s", key, elem);
-      xbt_cfg_set_parse(cfg);
-      free(cfg);
+      std::string cfg = std::string(key) + ":" + elem;
+      xbt_cfg_set_parse(cfg.c_str());
     } else
       XBT_INFO("The custom configuration '%s' is already defined by user!",key);
   }
@@ -926,37 +1005,56 @@ void ETag_surfxml_config(){
 static int argc;
 static char **argv;
 
-void STag_surfxml_process(){
-  AS_TAG  = 0;
+void STag_surfxml_process()
+{
+  AX_surfxml_actor_function = AX_surfxml_process_function;
+  STag_surfxml_actor();
+}
+void STag_surfxml_actor()
+{
+  ZONE_TAG  = 0;
   argc    = 1;
   argv    = xbt_new(char *, 1);
-  argv[0] = xbt_strdup(A_surfxml_process_function);
+  argv[0] = xbt_strdup(A_surfxml_actor_function);
   xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)");
 }
 
-void ETag_surfxml_process(){
-  s_sg_platf_process_cbarg_t process;
-  memset(&process,0,sizeof(process));
-
-  process.argc       = argc;
-  process.argv       = (const char **)argv;
-  process.properties = current_property_set;
-  process.host       = A_surfxml_process_host;
-  process.function   = A_surfxml_process_function;
-  process.start_time = surf_parse_get_double(A_surfxml_process_start___time);
-  process.kill_time  = surf_parse_get_double(A_surfxml_process_kill___time);
-
-  switch (A_surfxml_process_on___failure) {
-  case AU_surfxml_process_on___failure:
-  case A_surfxml_process_on___failure_DIE:
-    process.on_failure =  SURF_PROCESS_ON_FAILURE_DIE;
+void ETag_surfxml_process()
+{
+  AX_surfxml_actor_host = AX_surfxml_process_host;
+  AX_surfxml_actor_function = AX_surfxml_process_function;
+  AX_surfxml_actor_start___time = AX_surfxml_process_start___time;
+  AX_surfxml_actor_kill___time = AX_surfxml_process_kill___time;
+  AX_surfxml_actor_on___failure = (AT_surfxml_actor_on___failure)AX_surfxml_process_on___failure;
+  ETag_surfxml_actor();
+}
+void ETag_surfxml_actor()
+{
+  s_sg_platf_process_cbarg_t actor;
+  memset(&actor,0,sizeof(actor));
+
+  actor.argc       = argc;
+  actor.argv       = (const char **)argv;
+  actor.properties = current_property_set;
+  actor.host       = A_surfxml_actor_host;
+  actor.function   = A_surfxml_actor_function;
+  actor.start_time = surf_parse_get_double(A_surfxml_actor_start___time);
+  actor.kill_time  = surf_parse_get_double(A_surfxml_actor_kill___time);
+
+  switch (A_surfxml_actor_on___failure) {
+  case AU_surfxml_actor_on___failure:
+  case A_surfxml_actor_on___failure_DIE:
+    actor.on_failure =  SURF_ACTOR_ON_FAILURE_DIE;
     break;
-  case A_surfxml_process_on___failure_RESTART:
-    process.on_failure =  SURF_PROCESS_ON_FAILURE_RESTART;
+  case A_surfxml_actor_on___failure_RESTART:
+    actor.on_failure =  SURF_ACTOR_ON_FAILURE_RESTART;
+    break;
+  default:
+    surf_parse_error("Invalid on failure behavior");
     break;
   }
 
-  sg_platf_new_process(&process);
+  sg_platf_new_process(&actor);
 
   for (int i = 0; i != argc; ++i)
     xbt_free(argv[i]);
@@ -1032,6 +1130,6 @@ static int _surf_parse() {
   return surf_parse_lex();
 }
 
-int_f_void_t surf_parse = _surf_parse;
+int_f_void_t surf_parse = &_surf_parse;
 
 SG_END_DECL()
index cb8ef6d..20891ae 100644 (file)
@@ -24,7 +24,7 @@
 #include "xbt/str.h"
 #include "xbt/module.h"         /* xbt_binary_name */
 #include "src/xbt_modinter.h"       /* backtrace initialization headers */
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 #define UNW_LOCAL_ONLY
 #include <libunwind.h>
 #endif
@@ -34,8 +34,9 @@ extern char **environ;          /* the environment, as specified by the opengrou
 
 #include <unwind.h>
 struct trace_arg {
-  void **array;
-  int cnt, size;
+  void** array;
+  int cnt;
+  int size;
 };
 
 static _Unwind_Reason_Code
@@ -190,7 +191,8 @@ std::vector<std::string> resolveBacktrace(
   }
 
   /* To read the output of addr2line */
-  char line_func[1024], line_pos[1024];
+  char line_func[1024];
+  char line_pos[1024];
   for (std::size_t i = 0; i < count; i++) {
     XBT_DEBUG("Looking for symbol %zd, addr = '%s'", i, addrs[i].c_str());
     if (fgets(line_func, 1024, pipe)) {
@@ -217,7 +219,8 @@ std::vector<std::string> resolveBacktrace(
 
       char maps_buff[512];
       long int offset = 0;
-      char *p, *p2;
+      char* p;
+      char* p2;
       int found = 0;
 
       /* let's look for the offset of this library in our addressing space */
@@ -233,7 +236,8 @@ std::vector<std::string> resolveBacktrace(
         addrs[i].c_str(), addr);
 
       while (!found) {
-        long int first, last;
+        long int first;
+        long int last;
 
         if (fgets(maps_buff, 512, maps) == nullptr)
           break;
@@ -338,7 +342,7 @@ std::vector<std::string> resolveBacktrace(
 }
 }
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 int xbt_libunwind_backtrace(void** bt, int size){
   for (int i = 0; i < size; i++)
     bt[i] = nullptr;
index bac2505..94e16a6 100644 (file)
@@ -88,7 +88,9 @@ struct s_xbt_test_unit {
   xbt_dynar_t tests;            /* of xbt_test_test_t */
 
   int nb_tests;
-  int test_failed, test_ignore, test_expect;
+  int test_failed;
+  int test_ignore;
+  int test_expect;
 };
 
 static void xbt_test_unit_dump(xbt_test_unit_t unit)
@@ -112,9 +114,14 @@ struct s_xbt_test_suite {
   char *title;
   xbt_dynar_t units;            /* of xbt_test_unit_t */
 
-  int nb_tests, nb_units;
-  int test_failed, test_ignore, test_expect;
-  int unit_failed, unit_ignore, unit_disabled;
+  int nb_tests;
+  int nb_units;
+  int test_failed;
+  int test_ignore;
+  int test_expect;
+  int unit_failed;
+  int unit_ignore;
+  int unit_disabled;
 };
 
 /* destroy test suite */
@@ -245,7 +252,9 @@ static int xbt_test_suite_run(xbt_test_suite_t suite, int verbosity)
   const char *file;
   int line;
   char *cp;
-  unsigned int it_unit, it_test, it_log;
+  unsigned int it_unit;
+  unsigned int it_test;
+  unsigned int it_log;
 
   int first = 1;                /* for result pretty printing */
 
@@ -253,25 +262,22 @@ static int xbt_test_suite_run(xbt_test_suite_t suite, int verbosity)
     return 0;
 
   /* suite title pretty-printing */
-  {
-    char suite_title[81];
-    int suite_len = strlen(suite->title);
-    int i;
-
-    xbt_assert(suite_len < 68, "suite title \"%s\" too long (%d should be less than 68", suite->title, suite_len);
-
-    suite_title[0] = ' ';
-    for (i = 1; i < 80; i++)
-      suite_title[i] = '=';
-    suite_title[i++] = '\n';
-    suite_title[80] = '\0';
-
-    snprintf(suite_title + 40 - (suite_len + 4) / 2, 81-(40 - (suite_len + 4)/ 2), "[ %s ]", suite->title);
-    suite_title[40 + (suite_len + 5) / 2] = '=';
-    if (!suite->enabled)
-      snprintf(suite_title + 70, 11, " DISABLED ");
-    fprintf(stderr, "\n%s\n", suite_title);
-  }
+  char suite_title[81];
+  int suite_len = strlen(suite->title);
+
+  xbt_assert(suite_len < 68, "suite title \"%s\" too long (%d should be less than 68", suite->title, suite_len);
+
+  suite_title[0] = ' ';
+  for (int i = 1; i < 79; i++)
+    suite_title[i] = '=';
+  suite_title[79]  = '\n';
+  suite_title[80]  = '\0';
+
+  snprintf(suite_title + 40 - (suite_len + 4) / 2, 81 - (40 - (suite_len + 4) / 2), "[ %s ]", suite->title);
+  suite_title[40 + (suite_len + 5) / 2] = '=';
+  if (!suite->enabled)
+    snprintf(suite_title + 70, 11, " DISABLED ");
+  fprintf(stderr, "\n%s\n", suite_title);
 
   if (suite->enabled) {
     /* iterate through all tests */
index cc112b9..9d5dc32 100644 (file)
@@ -113,7 +113,8 @@ static void xbt_dict_rehash(xbt_dict_t dict)
 
   xbt_dictelm_t *currcell = (xbt_dictelm_t *) xbt_realloc((char *) dict->table, newsize * sizeof(xbt_dictelm_t));
   memset(&currcell[oldsize], 0, oldsize * sizeof(xbt_dictelm_t));       /* zero second half */
-  dict->table_size = --newsize;
+  newsize--;
+  dict->table_size = newsize;
   dict->table = currcell;
   XBT_DEBUG("REHASH (%d->%d)", oldsize, newsize);
 
@@ -559,7 +560,10 @@ void xbt_dict_postexit()
         total_count += size;
       }
     }
-    printf("; %f elm per cell\n", avg / (double) total_count);
+    if (total_count > 0)
+      printf("; %f elm per cell\n", avg / (double)total_count);
+    else
+      printf("; 0 elm per cell\n");
   }
 }
 
index ab5872c..d9f3b14 100644 (file)
@@ -108,7 +108,8 @@ inline void xbt_dict_cursor_step(xbt_dict_cursor_t cursor)
       XBT_CDEBUG(xbt_dict_cursor, "next element: %p", current);
     }
 
-    while (current == NULL && ++line <= cursor->dict->table_size) {
+    while (current == NULL && (line + 1) <= cursor->dict->table_size) {
+      line++;
       XBT_CDEBUG(xbt_dict_cursor, "current is NULL, take the next line");
       current = cursor->dict->table[line];
       XBT_CDEBUG(xbt_dict_cursor, "element in the next line: %p", current);
index f6db218..b0f5564 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ex, xbt, "Exception mechanism");
 
-xbt_ex::~xbt_ex() {}
-
-void _xbt_throw(
-  char* message, xbt_errcat_t errcat, int value, 
-  const char* file, int line, const char* func)
+void _xbt_throw(char* message, xbt_errcat_t errcat, int value, const char* file, int line, const char* func)
 {
   xbt_ex e(simgrid::xbt::ThrowPoint(file, line, func), message);
   free(message);
@@ -110,6 +106,8 @@ const char *xbt_ex_catname(xbt_errcat_t cat)
     return "io error";
   case vm_error:
     return "vm error";
+  default:
+    return "INVALID ERROR";
   }
   return "INVALID ERROR";
 }
index 84aef42..2fc6aea 100644 (file)
@@ -102,7 +102,6 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(log);
   XBT_LOG_CONNECT(module);
   XBT_LOG_CONNECT(replay);
-  XBT_LOG_CONNECT(strbuff);
   XBT_LOG_CONNECT(xbt_cfg);
   XBT_LOG_CONNECT(xbt_dict);
   XBT_LOG_CONNECT(xbt_dict_cursor);
@@ -125,7 +124,7 @@ static void xbt_log_connect_categories(void)
   /* The following categories are only defined in libsimgrid */
 
   /* bindings */
-#if HAVE_LUA
+#if SIMGRID_HAVE_LUA
   XBT_LOG_CONNECT(lua);
   XBT_LOG_CONNECT(lua_host);
   XBT_LOG_CONNECT(lua_platf);
@@ -148,13 +147,13 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(instr_surf);
 
   /* jedule */
-#if HAVE_JEDULE
+#if SIMGRID_HAVE_JEDULE
   XBT_LOG_CONNECT(jedule);
   XBT_LOG_CONNECT(jed_sd);
 #endif
 
   /* mc */
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   XBT_LOG_CONNECT(mc);
   XBT_LOG_CONNECT(mc_checkpoint);
   XBT_LOG_CONNECT(mc_comm_determinism);
@@ -243,7 +242,7 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(surf_lagrange_dichotomy);
   XBT_LOG_CONNECT(surf_maxmin);
   XBT_LOG_CONNECT(surf_network);
-#if HAVE_NS3
+#if SIMGRID_HAVE_NS3
   XBT_LOG_CONNECT(ns3);
 #endif
   XBT_LOG_CONNECT(surf_parse);
index f898c39..408e115 100644 (file)
@@ -71,7 +71,7 @@ void xbt_mallocator_initialization_is_done(int protect)
 
 /** used by the module to know if it's time to activate the mallocators yet */
 static inline int xbt_mallocator_is_active(void) {
-#if HAVE_MALLOCATOR
+#if SIMGRID_HAVE_MALLOCATOR
   return initialization_done && !MC_is_active();
 #else
   return 0;
index e4e138d..3bf3d68 100644 (file)
@@ -19,7 +19,8 @@ namespace xbt {
 
 /** An virtual memory map entry from /proc/$pid/maps */
 struct VmMap {
-  std::uint64_t start_addr, end_addr;
+  std::uint64_t start_addr;
+  std::uint64_t end_addr;
   int prot;                     /* Memory protection */
   int flags;                    /* Additional memory flags */
   std::uint64_t offset;         /* Offset in the file/whatever */
index a08c7dd..5294c14 100644 (file)
@@ -1,7 +1,6 @@
 /* Free a block of memory allocated by `mmalloc'. */
 
-/* Copyright (c) 2010-2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -14,6 +13,7 @@
 #include "mmprivate.h"
 #include "xbt/ex.h"
 #include "mc/mc.h"
+#include "src/mc/mc_ignore.h"
 
 /* Return memory to the heap.
    Like `mfree' but don't call a mfree_hook if there is one.  */
index dafcbbd..a8962f7 100644 (file)
@@ -51,7 +51,7 @@ xbt_mheap_t mmalloc_set_current_heap(xbt_mheap_t new_heap)
 }
 
 /* Override the malloc-like functions if MC is activated at compile time */
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 
 /* ***** Temporary allocator
  *
@@ -267,4 +267,4 @@ void free(void *p)
   mfree(mdp, p);
   UNLOCK(mdp);
 }
-#endif /* HAVE_MC */
+#endif /* SIMGRID_HAVE_MC */
index 67ed936..2a1851b 100644 (file)
@@ -218,6 +218,8 @@ static void xbt_parmap_set_mode(xbt_parmap_t parmap, e_xbt_parmap_mode_t mode)
     case XBT_PARMAP_DEFAULT:
       THROW_IMPOSSIBLE;
       break;
+    default:
+      THROW_IMPOSSIBLE;
   }
 }
 
index f23e429..afc6445 100644 (file)
@@ -15,7 +15,7 @@
 namespace simgrid {
 namespace xbt {
 
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
 
 const char string::NUL = '\0';
 
index 1de4e72..50a82e2 100644 (file)
@@ -7,7 +7,6 @@
 
 #include "src/internal_config.h"       /* execinfo when available */
 #include "xbt/sysdep.h"
-#include "xbt/strbuff.h"
 #include "src/xbt/log_private.h"
 #include "simgrid/simix.h"      /* SIMIX_host_self_get_name */
 #include "surf/surf.h"
@@ -90,6 +89,7 @@ static int xbt_log_layout_format_doit(xbt_log_layout_t l, xbt_log_event_t ev, co
       case '\0':
         fprintf(stderr, "Layout format (%s) ending with %%\n", (char *)l->data);
         xbt_abort();
+        break;
       case '%':
         *p = '%';
         check_overflow(1);
@@ -152,34 +152,6 @@ static int xbt_log_layout_format_doit(xbt_log_layout_t l, xbt_log_event_t ev, co
       case 'M':                /* method (ie, function) name; LOG4J compliant */
         show_string(ev->functionName);
         break;
-      case 'b':                 /* backtrace; called %throwable in LOG4J */
-      case 'B':         /* short backtrace; called %throwable{short} in LOG4J */
-// TODO, backtrace
-#if 0 && HAVE_BACKTRACE && HAVE_EXECINFO_H && HAVE_POPEN && defined(ADDR2LINE)
-        {
-          xbt_ex_t e("");
-
-          e.used = backtrace((void **) e.bt, XBT_BACKTRACE_SIZE);
-          e.bt_strings = NULL;
-          xbt_ex_setup_backtrace(&e);
-          if (*q == 'B') {
-            show_string(e.bt_strings[1] + 8);
-          } else {
-            xbt_strbuff_t buff = xbt_strbuff_new();
-            int i;
-            xbt_strbuff_append(buff, e.bt_strings[1] + 8);
-            for (i = 2; i < e.used; i++) {
-              xbt_strbuff_append(buff, "\n");
-              xbt_strbuff_append(buff, e.bt_strings[i] + 8);
-            }
-            show_string(buff->data);
-            xbt_strbuff_free(buff);
-          }
-        }
-#else
-        show_string("(no backtrace on this arch)");
-#endif
-        break;
       case 'd':                 /* date; LOG4J compliant */
         show_double(surf_get_clock());
         break;
index c709fca..6ec8eeb 100644 (file)
@@ -7,7 +7,6 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "xbt/sysdep.h"
-#include "xbt/strbuff.h"        /* For dynamic version when the static one fails */
 #include "src/xbt/log_private.h"
 
 #include "simgrid/simix.h"      /* SIMIX_host_self_get_name */
index f042417..ce2bc71 100644 (file)
@@ -96,7 +96,7 @@ static void xbt_preinit(void) {
   xbt_log_preinit();
   xbt_os_thread_mod_preinit();
   xbt_dict_preinit();
-   
+
   srand(seed);
 #ifndef _WIN32
   srand48(seed);
@@ -106,14 +106,15 @@ static void xbt_preinit(void) {
 
 static void xbt_postexit(void)
 {
-  if(!_sg_do_clean_atexit) return;
+  if (!_sg_do_clean_atexit)
+    return;
   xbt_initialized--;
   xbt_dict_postexit();
   xbt_os_thread_mod_postexit();
   xbt_dynar_free(&xbt_cmdline);
   xbt_log_postexit();
   free(xbt_binary_name);
-#if HAVE_MC
+#if SIMGRID_HAVE_MC
   mmalloc_postexit();
 #endif
 }
@@ -123,14 +124,15 @@ void xbt_init(int *argc, char **argv)
 {
   simgrid::xbt::installExceptionHandler();
 
-  if (xbt_initialized++) {
-    XBT_DEBUG("XBT was initialized %d times.", xbt_initialized);
+  if (xbt_initialized) {
+    xbt_initialized++;
+    XBT_DEBUG("XBT has been initialized %d times.", xbt_initialized);
     return;
   }
 
   xbt_binary_name = xbt_strdup(argv[0]);
-  xbt_cmdline = xbt_dynar_new(sizeof(char*),NULL);
-  for (int i=0;i<*argc;i++)
+  xbt_cmdline     = xbt_dynar_new(sizeof(char*), NULL);
+  for (int i = 0; i < *argc; i++)
     xbt_dynar_push(xbt_cmdline,&(argv[i]));
   
   xbt_log_init(argc, argv);
@@ -158,8 +160,7 @@ void xbt_abort(void)
   __gcov_flush();
 #endif
 #ifdef _WIN32
-  /* It was said *in silence*.  We don't want to see the error message printed
-   * by the Microsoft's implementation of abort(). */
+  /* We said *in silence*. We don't want to see the error message printed by Microsoft's implementation of abort(). */
   raise(SIGABRT);
   signal(SIGABRT, SIG_DFL);
   raise(SIGABRT);
index 46dd79a..789c141 100644 (file)
  */
 ssize_t xbt_getline(char **buf, size_t *n, FILE *stream)
 {
-  ssize_t i;
-  int ch;
-
-  ch = getc(stream);
+  int ch = getc(stream);
   if (ferror(stream) || feof(stream))
     return -1;
 
@@ -48,15 +45,20 @@ ssize_t xbt_getline(char **buf, size_t *n, FILE *stream)
     *buf = xbt_malloc(*n);
   }
 
-  i = 0;
+  ssize_t i = 0;
   do {
-    if (i == *n)
-      *buf = xbt_realloc(*buf, *n += 512);
-    (*buf)[i++] = ch;
+    if (i == *n) {
+      *n += 512;
+      *buf = xbt_realloc(*buf, *n);
+    }
+    (*buf)[i] = ch;
+    i++;
   } while (ch != '\n' && (ch = getc(stream)) != EOF);
 
-  if (i == *n)
-    *buf = xbt_realloc(*buf, *n += 1);
+  if (i == *n) {
+    *n += 1;
+    *buf = xbt_realloc(*buf, *n);
+  }
   (*buf)[i] = '\0';
 
   return i;
index 8496a21..76ad09e 100644 (file)
@@ -11,7 +11,6 @@
 #include "xbt/misc.h"
 #include "xbt/sysdep.h"
 #include "xbt/str.h"            /* headers of these functions */
-#include "xbt/strbuff.h"
 
 /**  @brief Strip whitespace (or other characters) from the end of a string.
  *
@@ -141,31 +140,6 @@ void xbt_str_subst(char *str, char from, char to, int occurence)
   }
 }
 
-/** @brief Replaces a set of variables by their values
- *
- * @param str The input of the replacement process
- * @param patterns The changes to apply
- * @return The string modified
- *
- * Both '$toto' and '${toto}' are valid (and the two writing are equivalent).
- *
- * If the variable name contains spaces, use the brace version (ie, ${toto tutu})
- *
- * You can provide a default value to use if the variable is not set in the dict by using '${var:=default}' or
- * '${var:-default}'. These two forms are equivalent, even if they shouldn't to respect the shell standard (:= form
- * should set the value in the dict, but does not) (BUG).
- */
-char *xbt_str_varsubst(const char *str, xbt_dict_t patterns)
-{
-  xbt_strbuff_t buff = xbt_strbuff_new_from(str);
-  char *res;
-  xbt_strbuff_varsubst(buff, patterns);
-  res = buff->data;
-  xbt_strbuff_free_container(buff);
-  return res;
-}
-
-
 /** @brief Splits a string into a dynar of strings
  *
  * @param s: the string to split
@@ -183,8 +157,6 @@ char *xbt_str_varsubst(const char *str, xbt_dict_t patterns)
 xbt_dynar_t xbt_str_split(const char *s, const char *sep)
 {
   xbt_dynar_t res = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
-  const char *p, *q;
-  int done;
   const char *sep_dflt = " \t\n\r\x0B";
   char is_sep[256] = { 1, 0 };
 
@@ -197,12 +169,12 @@ xbt_dynar_t xbt_str_split(const char *s, const char *sep)
     while (*sep)
       is_sep[(unsigned char) *sep++] = 1;
   }
-  is_sep[0] = 1;                /* End of string is also separator */
+  is_sep[0] = 1; /* End of string is also separator */
 
   /* Do the job */
-  p = s;
-  q = s;
-  done = 0;
+  const char* p = s;
+  const char* q = s;
+  int done      = 0;
 
   if (s[0] == '\0')
     return res;
@@ -233,12 +205,10 @@ xbt_dynar_t xbt_str_split(const char *s, const char *sep)
 xbt_dynar_t xbt_str_split_str(const char *s, const char *sep)
 {
   xbt_dynar_t res = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
-  int done;
-  const char *p, *q;
 
-  p = s;
-  q = s;
-  done = 0;
+  const char* p = s;
+  const char* q = s;
+  int done      = 0;
 
   if (s[0] == '\0')
     return res;
@@ -287,10 +257,12 @@ xbt_dynar_t xbt_str_split_str(const char *s, const char *sep)
  */
 xbt_dynar_t xbt_str_split_quoted_in_place(char *s) {
   xbt_dynar_t res = xbt_dynar_new(sizeof(char *), nullptr);
-  char *beg, *end;              /* pointers around the parsed chunk */
-  int in_simple_quote = 0, in_double_quote = 0;
-  int done = 0;
-  int ctn = 0;                  /* Got something in this block */
+  char* beg;
+  char* end; /* pointers around the parsed chunk */
+  int in_simple_quote = 0;
+  int in_double_quote = 0;
+  int done            = 0;
+  int ctn             = 0; /* Got something in this block */
 
   if (s[0] == '\0')
     return res;
@@ -403,8 +375,7 @@ char *xbt_str_join(xbt_dynar_t dyn, const char *sep)
 {
   int len = 1, dyn_len = xbt_dynar_length(dyn);
   unsigned int cpt;
-  char *cursor;
-  char *res, *p;
+  char* cursor;
 
   if (!dyn_len)
     return xbt_strdup("");
@@ -415,8 +386,8 @@ char *xbt_str_join(xbt_dynar_t dyn, const char *sep)
   }
   len += strlen(sep) * dyn_len;
   /* Do the job */
-  res = (char*) xbt_malloc(len);
-  p = res;
+  char* res = (char*)xbt_malloc(len);
+  char* p   = res;
   xbt_dynar_foreach(dyn, cpt, cursor) {
     if ((int) cpt < dyn_len - 1)
       p += snprintf(p,len, "%s%s", cursor, sep);
@@ -433,26 +404,24 @@ char *xbt_str_join(xbt_dynar_t dyn, const char *sep)
  */
 char *xbt_str_join_array(const char *const *strs, const char *sep)
 {
-  char *res,*q;
   int amount_strings=0;
   int len=0;
-  int i;
 
   if ((!strs) || (!strs[0]))
     return xbt_strdup("");
 
   /* compute the length before malloc */
-  for (i=0;strs[i];i++) {
+  for (int i = 0; strs[i]; i++) {
     len += strlen(strs[i]);
     amount_strings++;
   }
   len += strlen(sep) * amount_strings;
 
   /* Do the job */
-  res = (char*) xbt_malloc(len);
-  q = res;
-  for (i=0;strs[i];i++) {
-    if (i!=0) { // not first loop
+  char* res = (char*)xbt_malloc(len);
+  char* q   = res;
+  for (int i = 0; strs[i]; i++) {
+    if (i != 0) { // not first loop
       q += snprintf(q,len, "%s%s", sep, strs[i]);
     } else {
       q += snprintf(q,len, "%s",strs[i]);
@@ -468,7 +437,7 @@ char *xbt_str_join_array(const char *const *strs, const char *sep)
  */
 long int xbt_str_parse_int(const char* str, const char* error_msg)
 {
-  char *endptr;
+  charendptr;
   if (str == nullptr || str[0] == '\0')
     THROWF(arg_error, 0, error_msg, str);
 
diff --git a/src/xbt/xbt_strbuff.c b/src/xbt/xbt_strbuff.c
deleted file mode 100644 (file)
index 4369aca..0000000
+++ /dev/null
@@ -1,377 +0,0 @@
-/* strbuff -- string buffers                                                */
-
-/* Copyright (c) 2007-2015. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/strbuff.h"
-#include <stdarg.h>
-
-#define minimal_increment 512
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(strbuff, xbt, "String buffers");
-
-/** @brief Remove any content from the buffer */
-inline void xbt_strbuff_clear(xbt_strbuff_t b)
-{
-  b->used = 0;
-  b->data[0] = '\0';
-}
-
-/** @brief Constructor */
-xbt_strbuff_t xbt_strbuff_new(void)
-{
-  xbt_strbuff_t res = xbt_malloc(sizeof(s_xbt_strbuff_t));
-  res->data = xbt_malloc(512);
-  res->size = 512;
-  xbt_strbuff_clear(res);
-  return res;
-}
-
-/** @brief creates a new string buffer containing the provided string
- *
- * Beware, the ctn is copied, you want to free it afterward, anyhow
- */
-inline xbt_strbuff_t xbt_strbuff_new_from(const char *ctn)
-{
-  xbt_strbuff_t res = xbt_malloc(sizeof(s_xbt_strbuff_t));
-  res->data = xbt_strdup(ctn);
-  res->size = strlen(ctn);
-  res->used = res->size;
-  return res;
-}
-
-/** @brief frees only the container without touching to the contained string */
-inline void xbt_strbuff_free_container(xbt_strbuff_t b)
-{
-  free(b);
-}
-
-/** @brief frees the buffer and its content */
-inline void xbt_strbuff_free(xbt_strbuff_t b)
-{
-  if (b) {
-    free(b->data);
-    free(b);
-  }
-}
-
-/** @brief Adds some content at the end of the buffer */
-void xbt_strbuff_append(xbt_strbuff_t b, const char *toadd)
-{
-  int addlen;
-  int needed_space;
-
-  xbt_assert(b, "Asked to append stuff to NULL buffer");
-
-  addlen = strlen(toadd);
-  needed_space = b->used + addlen + 1;
-
-  if (needed_space > b->size) {
-    b->size = MAX(minimal_increment + b->used, needed_space);
-    b->data = xbt_realloc(b->data, b->size);
-  }
-  strncpy(b->data + b->used, toadd, b->size-b->used);
-  b->used += addlen;
-}
-
-/** @brief format some content and push it at the end of the buffer */
-void xbt_strbuff_printf(xbt_strbuff_t b, const char *fmt, ...)
-{
-  va_list ap;
-  va_start(ap, fmt);
-  char *data = bvprintf(fmt, ap);
-  xbt_strbuff_append(b, data);
-  xbt_free(data);
-  va_end(ap);
-}
-
-/** @brief Replaces a set of variables by their values
- *
- * @param b buffer to modify
- * @param patterns variables to substitute in the buffer
- *
- * Both '$toto' and '${toto}' are valid (and the two writing are equivalent).
- *
- * If the variable name contains spaces, use the brace version (ie, ${toto tutu})
- *
- * You can provide a default value to use if the variable is not set in the dict by using  '${var:=default}' or
- * '${var:-default}'. These two forms are equivalent, even if they shouldn't to respect the shell standard (:= form
- * should set the value in the dict, but does not) (BUG).
- */
-void xbt_strbuff_varsubst(xbt_strbuff_t b, xbt_dict_t patterns)
-{
-  char *end;                    /* pointers around the parsed chunk */
-  int in_simple_quote = 0;
-  int in_double_quote = 0;
-  int done = 0;
-
-  if (b->data[0] == '\0')
-    return;
-  end = b->data;
-
-  while (!done) {
-    switch (*end) {
-    case '\\':
-      /* Protected char; pass the protection */
-      end++;
-      xbt_assert(*end != '\0', "String ends with \\");
-      break;
-    case '\'':
-      if (!in_double_quote) {
-        /* simple quote not protected by double ones, note it */
-        in_simple_quote = !in_simple_quote;
-      }
-      break;
-    case '"':
-      if (!in_simple_quote) {
-        /* double quote protected by simple ones, note it */
-        in_double_quote = !in_double_quote;
-      }
-      break;
-    case '$':
-      if (!in_simple_quote) {
-        /* Go for the substitution. First search the variable name */
-        char *beg_var;
-        char *end_var;        /* variable name boundary */
-        char *beg_subst = end;
-        char *end_subst = NULL;     /* where value should be written to */
-        char *value;
-        char *default_value = NULL;
-        int val_len;
-
-        if (*(++end) == '{') {
-          /* the variable name is enclosed in braces. */
-          beg_var = end + 1;
-          /* Search name's end */
-          end_var = beg_var;
-          while (*end_var != '\0' && *end_var != '}') {
-            /* TODO: we do not respect the standard for ":=", we should set this value in the dict */
-            if (*end_var == ':'
-                && ((*(end_var + 1) == '=') || (*(end_var + 1) == '-'))) {
-              /* damn, we have a default value */
-              char *p = end_var + 1;
-              while (*p != '\0' && *p != '}')
-                p++;
-              xbt_assert (*p != '\0', "Variable default value not terminated ('}' missing)");
-
-              default_value = xbt_malloc(p - end_var - 1);
-              memcpy(default_value, end_var + 2, p - end_var - 2);
-              default_value[p - end_var - 2] = '\0';
-
-              end_subst = p + 1;        /* eat '}' */
-              break;
-            }
-            end_var++;
-          }
-          xbt_assert(*end_var != '\0', "Variable name not terminated ('}' missing)");
-
-          if (!end_subst)       /* already set if there's a default value */
-            end_subst = end_var + 1;    /* also kill the } in the name */
-
-          xbt_assert(end_var != beg_var, "Variable name empty (${} is not valid)");
-        } else {
-          /* name given directly */
-          beg_var = end;
-          end_var = beg_var;
-          while (*end_var != '\0' && *end_var != ' ' && *end_var != '\t' && *end_var != '\n')
-            end_var++;
-          end_subst = end_var;
-          xbt_assert (end_var != beg_var, "Variable name empty ($ is not valid)");
-        }
-
-        /* ok, we now have the variable name. Search the dictionary for the substituted value */
-        value = xbt_dict_get_or_null_ext(patterns, beg_var, end_var - beg_var);
-
-        if (value)
-          value = xbt_strdup(value);
-        else if (default_value)
-          value = xbt_strdup(default_value);
-        else
-          value = xbt_strdup("");
-
-        /* En route for the actual substitution */
-        val_len = strlen(value);
-        if (val_len <= end_subst - beg_subst) {
-          /* enough room to do the substitute in place */
-          memmove(beg_subst, value, val_len);   /* substitute */
-          /* move the end of the string closer */
-          memmove(beg_subst + val_len, end_subst, b->used - (end_subst - b->data) + 1);
-//          XBT_DEBUG("String is now: '%s'",b->data);
-          end = beg_subst + val_len;    /* update the currently explored char in the overall loop */
-//          XBT_DEBUG("end of substituted section is now '%s'",end);
-          b->used -= end_subst - beg_subst - val_len;   /* update string buffer used size */
-//          XBT_DEBUG("Used:%d end:%d ending char:%d",b->used,end-b->data,*end);
-        } else {
-          /* we have to extend the data area */
-          int tooshort = val_len - (end_subst - beg_subst) + 1 /* don't forget \0 */ ;
-          int newused = b->used + tooshort;
-          end += tooshort;      /* update the pointer of the overall loop */
-//          XBT_DEBUG("Too short (by %d chars; %d chars left in area)",val_len-(end_subst-beg_subst),b->size - b->used);
-          if (newused > b->size) {
-            /* We have to realloc the data area before (because b->size is too small).
-             * We have to update our pointers, too */
-            char *newdata = xbt_realloc(b->data, b->used + MAX(minimal_increment, tooshort));
-            int offset = newdata - b->data;
-            b->data = newdata;
-            b->size = b->used + MAX(minimal_increment, tooshort);
-            end += offset;
-            beg_subst += offset;
-            end_subst += offset;
-          }
-          /* move the end of the string a bit further */
-          memmove(beg_subst + val_len, end_subst, b->used - (end_subst - b->data) + 1);
-          memmove(beg_subst, value, val_len);   /* substitute */
-          b->used = newused;
-//          XBT_DEBUG("String is now: %s",b->data);
-        }
-        free(value);
-        free(default_value);
-        end--;                  /* compensate the next end++ */
-      }
-      break;
-    case '\0':
-      done = 1;
-      break;
-    }
-    end++;
-  }
-}
-
-#ifdef SIMGRID_TEST
-#include "xbt/strbuff.h"
-
-/* buffstr have 512 chars by default. Adding 1000 chars like this will force a resize, allowing us to test that
- * b->used and b->size are consistent */
-#define force_resize \
-  "1.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "2.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "3.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "4.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "5.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "6.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "7.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "8.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "9.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \
-  "0.........1.........2.........3.........4.........5.........6.........7.........8.........9........."
-
-static void mytest(const char *input, const char *patterns, const char *expected)
-{
-  xbt_dynar_t dyn_patterns;     /* splited string */
-  xbt_dict_t p;                 /* patterns */
-  unsigned int cpt;
-  char *str;                    /*foreach */
-  xbt_strbuff_t sb;             /* what we test */
-
-  p = xbt_dict_new_homogeneous(free);
-  dyn_patterns = xbt_str_split(patterns, " ");
-  xbt_dynar_foreach(dyn_patterns, cpt, str) {
-    xbt_dynar_t keyvals = xbt_str_split(str, "=");
-    char *key = xbt_dynar_get_as(keyvals, 0, char *);
-    char *val = xbt_dynar_get_as(keyvals, 1, char *);
-    xbt_str_subst(key, '_', ' ', 0);    // to put space in names without breaking the enclosing dynar_foreach
-    xbt_dict_set(p, key, xbt_strdup(val), NULL);
-    xbt_dynar_free(&keyvals);
-  }
-  xbt_dynar_free(&dyn_patterns);
-  sb = xbt_strbuff_new();
-  xbt_strbuff_append(sb, input);
-  xbt_strbuff_varsubst(sb, p);
-  xbt_dict_free(&p);
-  xbt_test_assert(!strcmp(sb->data, expected), "Input (%s) with patterns (%s) leads to (%s) instead of (%s)",
-                   input, patterns, sb->data, expected);
-  xbt_strbuff_free(sb);
-}
-
-XBT_TEST_SUITE("xbt_strbuff", "String Buffers");
-XBT_TEST_UNIT("xbt_strbuff_substitute", test_strbuff_substitute, "test the function xbt_strbuff_substitute")
-{
-  xbt_test_add("Empty");
-  mytest("", "", "");
-
-  xbt_test_add("Value shorter, no braces, only variable");
-  mytest("$tutu", "tutu=t", "t");
-  xbt_test_add("Value shorter, braces, only variable");
-  mytest("${tutu}", "tutu=t", "t");
-  xbt_test_add("Value shorter, no braces, data after");
-  mytest("$tutu toto", "tutu=t", "t toto");
-  xbt_test_add("Value shorter, braces, data after");
-  mytest("${tutu} toto", "tutu=t", "t toto");
-  xbt_test_add("Value shorter, no braces, data before");
-  mytest("toto $tutu", "tutu=t", "toto t");
-  xbt_test_add("Value shorter, braces, data before");
-  mytest("toto ${tutu}", "tutu=t", "toto t");
-  xbt_test_add("Value shorter, no braces, data before and after");
-  mytest("toto $tutu tata", "tutu=t", "toto t tata");
-  xbt_test_add("Value shorter, braces, data before and after");
-  mytest("toto ${tutu} tata", "tutu=t", "toto t tata");
-
-  xbt_test_add("Value as long, no braces, only variable");
-  mytest("$tutu", "tutu=12345", "12345");
-  xbt_test_add("Value as long, braces, only variable");
-  mytest("${tutu}", "tutu=1234567", "1234567");
-  xbt_test_add("Value as long, no braces, data after");
-  mytest("$tutu toto", "tutu=12345", "12345 toto");
-  xbt_test_add("Value as long, braces, data after");
-  mytest("${tutu} toto", "tutu=1234567", "1234567 toto");
-  xbt_test_add("Value as long, no braces, data before");
-  mytest("toto $tutu", "tutu=12345", "toto 12345");
-  xbt_test_add("Value as long, braces, data before");
-  mytest("toto ${tutu}", "tutu=1234567", "toto 1234567");
-  xbt_test_add("Value as long, no braces, data before and after");
-  mytest("toto $tutu tata", "tutu=12345", "toto 12345 tata");
-  xbt_test_add("Value as long, braces, data before and after");
-  mytest("toto ${tutu} tata", "tutu=1234567", "toto 1234567 tata");
-
-  xbt_test_add("Value longer, no braces, only variable");
-  mytest("$t", "t=tututu", "tututu");
-  xbt_test_add("Value longer, braces, only variable");
-  mytest("${t}", "t=tututu", "tututu");
-  xbt_test_add("Value longer, no braces, data after");
-  mytest("$t toto", "t=tututu", "tututu toto");
-  xbt_test_add("Value longer, braces, data after");
-  mytest("${t} toto", "t=tututu", "tututu toto");
-  xbt_test_add("Value longer, no braces, data before");
-  mytest("toto $t", "t=tututu", "toto tututu");
-  xbt_test_add("Value longer, braces, data before");
-  mytest("toto ${t}", "t=tututu", "toto tututu");
-  xbt_test_add("Value longer, no braces, data before and after");
-  mytest("toto $t tata", "t=tututu", "toto tututu tata");
-  xbt_test_add("Value longer, braces, data before and after");
-  mytest("toto ${t} tata", "t=tututu", "toto tututu tata");
-
-  xbt_test_add("Value much longer, no braces, only variable");
-  mytest("$t", "t=" force_resize, force_resize);
-  xbt_test_add("Value much longer, no braces, data after");
-  mytest("$t toto", "t=" force_resize, force_resize " toto");
-  xbt_test_add("Value much longer, braces, data after");
-  mytest("${t} toto", "t=" force_resize, force_resize " toto");
-  xbt_test_add("Value much longer, no braces, data before");
-  mytest("toto $t", "t=" force_resize, "toto " force_resize);
-  xbt_test_add("Value much longer, braces, data before");
-  mytest("toto ${t}", "t=" force_resize, "toto " force_resize);
-  xbt_test_add("Value much longer, no braces, data before and after");
-  mytest("toto $t tata", "t=" force_resize, "toto " force_resize " tata");
-  xbt_test_add("Value much longer, braces, data before and after");
-  mytest("toto ${t} tata", "t=" force_resize, "toto " force_resize " tata");
-
-  xbt_test_add("Escaped $");
-  mytest("\\$tutu", "tutu=t", "\\$tutu");
-  xbt_test_add("Space in var name (with braces)");
-  mytest("${tu ti}", "tu_ti=t", "t");
-
-  xbt_test_add("Two variables");
-  mytest("$toto $tutu", "toto=1 tutu=2", "1 2");
-
-  // Commented: I'm too lazy to do a memmove in var name to remove the backslash after use.
-  // Users should use braces.
-  //  xbt_test_add("Escaped space in var name", "$tu\\ ti", "tu_ti=t", "t");
-
-  xbt_test_add("Default value");
-  mytest("${t:-toto}", "", "toto");
-  xbt_test_add("Useless default value (variable already defined)");
-  mytest("${t:-toto}", "t=TRUC", "TRUC");
-}
-#endif                          /* SIMGRID_TEST */
index e0240df..f76b1a6 100644 (file)
@@ -14,7 +14,6 @@ SG_BEGIN_DECL()
 /* Modules definitions */
 
 void xbt_log_preinit(void);
-void xbt_log_init(int *argc, char **argv);
 void xbt_log_postexit(void);
 
 void xbt_dict_preinit(void);
index 1e42720..5d42234 100644 (file)
@@ -1,5 +1,5 @@
 foreach(x dwarf dwarf-expression)
-  if (HAVE_MC)
+  if (SIMGRID_HAVE_MC)
     add_executable       (${x}  ${x}/${x}.cpp)
     target_link_libraries(${x}  simgrid)
     set_target_properties(${x}  PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x})
@@ -28,7 +28,7 @@ set(tesh_files     ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/random-bug/rando
                                     ${CMAKE_CURRENT_SOURCE_DIR}/mutex-handling/without-mutex-handling.tesh PARENT_SCOPE)
 set(xml_files      ${xml_files}     ${CMAKE_CURRENT_SOURCE_DIR}/mutex-handling/mutex-handling_d.xml        PARENT_SCOPE)
 
-IF(HAVE_MC)
+IF(SIMGRID_HAVE_MC)
   ADD_TESH(tesh-mc-dwarf                       --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/mc/dwarf            --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/mc/dwarf dwarf.tesh)
   ADD_TESH(tesh-mc-dwarf-expression            --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/mc/dwarf-expression --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/mc/dwarf-expression dwarf-expression.tesh)
   ADD_TESH(tesh-mc-mutex-handling              --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/mc/mutex-handling --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/mc/mutex-handling mutex-handling.tesh --cfg=model-check/reduction:none)
index f1325de..d6eb805 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Tremblay" function="receiver"/>
-  <process host="Boivin" function="sender">
+<platform version="4.1">
+  <actor host="Tremblay" function="receiver"/>
+  <actor host="Boivin" function="sender">
     <argument value="X"/>
-  </process>
-  <process host="Fafard" function="sender">
+  </actor>
+  <actor host="Fafard" function="sender">
     <argument value="Y"/>
-  </process>
+  </actor>
 </platform>
index 68c4ccc..b761bdb 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="0">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="0">
     <argument value="40"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index d12fc7b..aa093e3 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="0">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="0">
     <argument value="220"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index 6ae2f4e..a919a73 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="10">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="10">
     <argument value="40"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index 4c9a178..28c048a 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="10">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="10">
     <argument value="260"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index 33087be..a6ee0c0 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="20">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="20">
     <argument value="40"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index 028b9a1..2bf91a1 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="20">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="20">
     <argument value="140"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index 8beb1c2..cd8c9c0 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="40">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="40">
     <argument value="40"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index c412fe1..4fd1842 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="40">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="40">
     <argument value="260"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index b4a9f57..4d2d81a 100644 (file)
@@ -1,16 +1,16 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace">
     <argument value="170"/>
     <argument value="1.0"/>
-  </process>
-  <process host="Cpu B" function="test_trace">
+  </actor>
+  <actor host="Cpu B" function="test_trace">
     <argument value="170"/>
     <argument value="1.0"/>
-  </process>
-  <process host="Cpu B" function="test_trace" start_time="30">
+  </actor>
+  <actor host="Cpu B" function="test_trace" start_time="30">
     <argument value="100"/>
     <argument value="1.0"/>
-  </process>
+  </actor>
 </platform>
index 504497c..7de0dc6 100644 (file)
@@ -1,16 +1,16 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="10">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="10">
     <argument value="25"/>
     <argument value="1.0"/>
-  </process>
-  <process host="Cpu B" function="test_trace" start_time="10">
+  </actor>
+  <actor host="Cpu B" function="test_trace" start_time="10">
     <argument value="75"/>
     <argument value="3.0"/>
-  </process>
-  <process host="Cpu B" function="test_trace" start_time="20">
+  </actor>
+  <actor host="Cpu B" function="test_trace" start_time="20">
     <argument value="120"/>
     <argument value="4.0"/>
-  </process>
+  </actor>
 </platform>
index aaa2f6c..b31e3ca 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="10">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="10">
     <argument value="150"/>
     <argument value="1.5"/>
-  </process>
-  <process host="Cpu B" function="test_trace" start_time="20">
+  </actor>
+  <actor host="Cpu B" function="test_trace" start_time="20">
     <argument value="70"/>
     <argument value="1.5"/>
-  </process>
+  </actor>
 </platform>
index 163924b..0048734 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <process host="Cpu B" function="test_trace" start_time="10">
+<platform version="4.1">
+  <actor host="Cpu B" function="test_trace" start_time="10">
     <argument value="50"/>
     <argument value="2.5"/>
-  </process>
-  <process host="Cpu B" function="test_trace" start_time="10">
+  </actor>
+  <actor host="Cpu B" function="test_trace" start_time="10">
     <argument value="70"/>
     <argument value="1.5"/>
-  </process>
+  </actor>
 </platform>
index df3f8ca..ec79ca1 100644 (file)
@@ -30,5 +30,5 @@ $ ${bindir:=.}/availability ../../../examples/platforms/simulacrum_7_hosts.xml
 > [0.000000] [test/INFO] Scheduling ID00024@mJPEG to node: Host 30
 > [0.000000] [test/INFO] Scheduling end to node: Host 26
 > [0.000000] [test/INFO] DAX scheduled
-> [164.052870] [test/INFO] Simulation done.
+> [164.054322] [test/INFO] Simulation done.
 
index 6a28da6..b45ef48 100644 (file)
@@ -1,11 +1,11 @@
 ! expect signal SIGABRT
 $ ${bindir:=.}/flatifier ../platforms/bogus_missing_src_gateway.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
 > [  0.000000] [0:maestro@] Switching to the L07 model to handle parallel tasks.
-> [  0.000000] [0:maestro@] Parse error at ../platforms/bogus_missing_src_gateway.xml:14: ASroute gw_src='nod-cluster_router.cluster.us' does name a node.
+> [  0.000000] [0:maestro@] Parse error at ../platforms/bogus_missing_src_gateway.xml:14: zoneRoute gw_src='nod-cluster_router.cluster.us' does name a node.
 > [  0.000000] [0:maestro@] Exiting now
 
 ! expect signal SIGABRT
 $ ${bindir:=.}/flatifier ../platforms/bogus_missing_dst_gateway.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
 > [  0.000000] [0:maestro@] Switching to the L07 model to handle parallel tasks.
-> [  0.000000] [0:maestro@] Parse error at ../platforms/bogus_missing_dst_gateway.xml:14: ASroute gw_dst='neud-grappe_router.grappe.fr' does name a node.
+> [  0.000000] [0:maestro@] Parse error at ../platforms/bogus_missing_dst_gateway.xml:14: zoneRoute gw_dst='neud-grappe_router.grappe.fr' does name a node.
 > [  0.000000] [0:maestro@] Exiting now
index 5baf868..d654328 100644 (file)
@@ -61,7 +61,8 @@ static void dump_platform()
   int version = 4;
   xbt_dict_t props = nullptr;
   xbt_dict_cursor_t cursor = nullptr;
-  char *key, *data;
+  char* key;
+  char* data;
 
   std::printf("<?xml version='1.0'?>\n");
   std::printf("<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd\">\n");
index 6039c37..80d0a67 100644 (file)
@@ -14,7 +14,6 @@ $ ${bindir:=.}/is-router ${srcdir}/teshsuite/simdag/platforms/test_of_is_router.
 >    - Seen: "host09". Type: host
 >    - Seen: "host10". Type: host
 > NetCards count: 21
->    - Seen: "AS". Type: netzone
 >    - Seen: "AS0". Type: netzone
 >    - Seen: "AS1". Type: netzone
 >    - Seen: "AS2". Type: netzone
@@ -35,3 +34,4 @@ $ ${bindir:=.}/is-router ${srcdir}/teshsuite/simdag/platforms/test_of_is_router.
 >    - Seen: "router3". Type: router
 >    - Seen: "router4". Type: router
 >    - Seen: "router5". Type: router
+>    - Seen: "zone". Type: netzone
index d04c636..cf18d7b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Dijkstra">
+<platform version="4.1">
+  <zone id="AS0" routing="Dijkstra">
     <host id="NODO01" speed="10Mf"/>
     <host id="NODO02" speed="10Mf"/>
 
@@ -32,5 +32,5 @@
       <link_ctn id="11"/>
       <link_ctn id="12"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 019c2c8..af700d0 100644 (file)
@@ -1,4 +1,4 @@
-PERIODICITY 1.0
-0.0 1.0
-11.0 0.5
-20.0 0.8
+ 0 1.0
+11 0.5
+20 0.8
+LOOPAFTER 1
index d038fc1..d13d470 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!-- THIS FILE IS INVALID.
        It declares a storage attached to a nonexistant host (plouf). See bogus_disk_attachment.tesh -->
-  <AS id="AS0" routing="Full">
+  <zone id="AS0" routing="Full">
     <storage_type id="single_HDD" model="SSD" size="4kB">
       <model_prop id="Bwrite" value="30MBps" />
       <model_prop id="Bread" value="100MBps" />
@@ -15,5 +15,5 @@
     <host id="client" speed="1Gf">
       <mount storageId="cdisk" name="/sd1" />
     </host>
-  </AS>
+  </zone>
 </platform>
index d297f04..c754f89 100644 (file)
@@ -1,18 +1,18 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="World" routing="Full">
-    <AS id="us" routing="Full">
+<platform version="4.1">
+  <zone id="World" routing="Full">
+    <zone id="us" routing="Full">
       <cluster id="cluster" suffix=".cluster.us" prefix="node-" radical="1-4" speed="1Gf" bw="938MBps" lat="270us"/>
-    </AS>
-    <AS id="fr" routing="Full">
+    </zone>
+    <zone id="fr" routing="Full">
       <cluster id="grappe" suffix=".grappe.fr" prefix="noeud-" radical="1-4" speed="1Gf" bw="938MBps" lat="270us"/>
-    </AS>
+    </zone>
 
     <link id="backbone" bandwidth="1.25GBps" latency="500us"/>
 
-    <ASroute src="us" gw_src="node-cluster_router.cluster.us" dst="fr" gw_dst="neud-grappe_router.grappe.fr">
+    <zoneRoute src="us" gw_src="node-cluster_router.cluster.us" dst="fr" gw_dst="neud-grappe_router.grappe.fr">
       <link_ctn id="backbone"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index b935300..8de74a8 100644 (file)
@@ -1,18 +1,18 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="World" routing="Full">
-    <AS id="us" routing="Full">
+<platform version="4.1">
+  <zone id="World" routing="Full">
+    <zone id="us" routing="Full">
       <cluster id="cluster" suffix=".cluster.us" prefix="node-" radical="1-4" speed="1Gf" bw="938MBps" lat="270us"/>
-    </AS>
-    <AS id="fr" routing="Full">
+    </zone>
+    <zone id="fr" routing="Full">
       <cluster id="grappe" suffix=".grappe.fr" prefix="noeud-" radical="1-4" speed="1Gf" bw="938MBps" lat="270us"/>
-    </AS>
+    </zone>
 
     <link id="backbone" bandwidth="1.25GBps" latency="500us"/>
 
-    <ASroute src="us" gw_src="nod-cluster_router.cluster.us" dst="fr" gw_dst="noeud-grappe_router.grappe.fr">
+    <zoneRoute src="us" gw_src="nod-cluster_router.cluster.us" dst="fr" gw_dst="noeud-grappe_router.grappe.fr">
       <link_ctn id="backbone"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index ec52306..34eb3f2 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <!-- THIS FILE IS INVALID.
        It declares a route alice->bob and another bob->alice, both being different.
        It is used to check that this (bogus) file is detected as is (see two_hosts_asymetric.tesh) -->
-  <AS  id="AS0"  routing="Full">
+  <zone  id="AS0"  routing="Full">
     <host id="bob" speed="1Gf"/>
     <host id="alice" speed="500Mf"/>
 
@@ -17,5 +17,5 @@
     <route src="alice" dst="bob">
       <link_ctn id="link2"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 0610bcf..6d89586 100644 (file)
@@ -1,3 +1,3 @@
-PERIODICITY 10.0
-1.0 -1.0
-2.0 1.0
+1  -1.0
+2  1.0
+LOOPAFTER 10
index 3f3d3a2..4c7378e 100644 (file)
@@ -1,4 +1,4 @@
-PERIODICITY 1.0
-0.0 1.0
-9.0 0.7
-15.0 0.4
+ 0 1.0
+ 9 0.7
+15 0.4
+LOOPAFTER 1
index 3e851a6..eaa710a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Floyd">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Floyd">
     <host id="host1" speed="1Gf"/>
     <host id="host2" speed="1Gf"/>
     <host id="host3" speed="1Gf"/>
@@ -24,5 +24,5 @@
     <route src="host3" dst="host4">
       <link_ctn id="link4"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index b0d28e0..daedebb 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="alice" speed="1Gf"/> <!-- connected to an in-file speed trace --> 
     <host id="bob" speed="1Gf"/>   <!-- connected to an out-file speed trace -->
     <host id="carol" speed="500Mf" state_file="carol.fail"/>  <!-- out-file state trace as attribute -->
@@ -11,7 +11,7 @@
       <prop id="OS" value="Linux 2.6.22-14"/>
     </host>
     <host id="erin" speed="500Mf" availability_file="erin.avail"/> <!--uses someone else's trace --> 
-  </AS>
+  </zone>
 
   <trace id="myTrace" periodicity="1.0">
     0.0 1.0
index ac0d5aa..c91df60 100644 (file)
@@ -1,3 +1,3 @@
-PERIODICITY 12.0
-4.0 40000000
-8.0 60000000
+ 4 40000000
+ 8 60000000
+LOOPAFTER 12
index 0610bcf..3bee23b 100644 (file)
@@ -1,3 +1,3 @@
-PERIODICITY 10.0
-1.0 -1.0
-2.0 1.0
+1 -1.0
+1.0
+LOOPAFTER 10
index f4a4bb3..d447a89 100644 (file)
@@ -1,4 +1,4 @@
-PERIODICITY 5.0
-1.0 0.001
-2.0 0.01
-3.0 0.001
+1 0.001
+2 0.01
+3 0.001
+LOOPAFTER 5
index 62bc33d..9e037ae 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="bob" speed="500Mf"/>
 
     <link id="link1" bandwidth="125MBps" latency="50us"/>
     <link id="link2" bandwidth="125MBps" latency="50us" sharing_policy="FATPIPE"/>
     <link id="link3" bandwidth="80MBps" latency="100us" bandwidth_file="link.bw" latency_file="link.lat"/>
     <link id="link4" bandwidth="80MBps" latency="100us" state_file="link.fail"/>
-  </AS>
+  </zone>
 </platform>
index 29c7984..fc8e1cd 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu" radical="0,2-4,6" speed="1Gf" bw="125MBps" lat="50us"
              bb_bw="2.25GBps" bb_lat="500us"/>
-  </AS>
+  </zone>
 </platform>
index d998894..c44fa11 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu" radical="0,2-4,6" speed="1Gf" bw="125MBps" lat="50us"
              bb_bw="2.25GBps" bb_lat="500us" sharing_policy="FULLDUPLEX"/>
-  </AS>
+  </zone>
 </platform>
index 18de947..7c1d08e 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu" radical="0,2-4,6" speed="1Gf" core="6" bw="125MBps" lat="50us"/>
-  </AS>
+  </zone>
 </platform>
index 3682739..fa52d2b 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu" radical="0,2-4,6" speed="1Gf" bw="125MBps" lat="50us"
              bb_bw="2.25GBps" bb_lat="500us" router_id="bob_cluster_router"/>
-  </AS>
+  </zone>
 </platform>
index d996cbc..fc9eae4 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <host id="cpu0" speed="1f"/>
     <host id="cpu1" speed="1f"/>
 
@@ -13,5 +13,5 @@
     <route src="cpu0" dst="cpu1">
       <link_ctn id="link0"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 12d2174..9f76670 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <host id="cpu0" speed="1f"/>
     <host id="cpu1" speed="1f"/>
 
@@ -10,5 +10,5 @@
     <route src="cpu0" dst="cpu1">
       <link_ctn id="link0"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index ed3396e..bc4740a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="cpu0" speed="1f"/>
     <host id="cpu1" speed="1f"/>
 
@@ -10,5 +10,5 @@
     <route src="cpu0" dst="cpu1">
       <link_ctn id="link0"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index c0d1e78..db1e5b8 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="cpu0" speed="1f" />
     <host id="cpu1" speed="2f" />
 
@@ -10,5 +10,5 @@
     <route src="cpu0" dst="cpu1">
       <link_ctn id="link0" />
     </route>
-  </AS>
+  </zone>
 </platform>
index 34286fc..2082b8a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="cpu0" speed="1f"/>
     <host id="cpu1" speed="1f"/>
 
@@ -14,5 +14,5 @@
       <link_ctn id="switch"/>
       <link_ctn id="link1"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index e14dbf1..bc41679 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0" routing="Full">
+<platform version="4.1">
+  <zone id="AS0" routing="Full">
     <host id="cpu0" speed="1f"/>
     <host id="cpu1" speed="1f"/>
     <host id="cpu2" speed="1f"/>
@@ -43,5 +43,5 @@
       <link_ctn id="switch"/>
       <link_ctn id="link3"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index d73a133..fa5cede 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="main" routing="Full">
+<platform version="4.1">
+  <zone id="main" routing="Full">
     <include file="clusterA.xml"/>
     <include file="clusterB.xml"/>
-  </AS>
+  </zone>
 </platform>
index 28dfd08..d1d2760 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
+<platform version="4.1">
   <config id="General">
     <prop id="maxmin/precision" value="0.000010"/>
     <prop id="cpu/optim" value="TI"/>
@@ -8,7 +8,7 @@
     <prop id="network/model" value="Vegas"/>
     <prop id="path" value="~/"/>
   </config>
-  <AS  id="AS0"  routing="Full">
+  <zone  id="AS0"  routing="Full">
     <host id="bob" speed="500Mf"/>
-  </AS>
+  </zone>
 </platform>
index 70d10ce..c20f45e 100644 (file)
@@ -1,31 +1,31 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS"  routing="Full">
-    <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="zone"  routing="Full">
+    <zone  id="AS0"  routing="Full">
       <host id="host01" speed="1Gf"/>
       <host id="host02" speed="500Mf"/>
       <router id="router1"/>
-    </AS>
-    <AS  id="AS1"  routing="Floyd">
+    </zone>
+    <zone  id="AS1"  routing="Floyd">
       <host id="host03" speed="1Gf"/>
       <host id="host04" speed="500Mf"/>
       <router id="router2"/>
-    </AS>
-    <AS  id="AS2"  routing="Dijkstra">
+    </zone>
+    <zone  id="AS2"  routing="Dijkstra">
       <host id="host05" speed="1Gf"/>
       <host id="host06" speed="500Mf"/>
       <router id="router3"/>
-    </AS>
-    <AS  id="AS3"  routing="DijkstraCache">
+    </zone>
+    <zone  id="AS3"  routing="DijkstraCache">
       <host id="host07" speed="1Gf"/>
       <host id="host08" speed="500Mf"/>
       <router id="router4"/>
-    </AS>
-    <AS  id="AS4"  routing="None">
+    </zone>
+    <zone  id="AS4"  routing="None">
       <host id="host09" speed="1Gf"/>
       <host id="host10" speed="500Mf"/>
       <router id="router5"/>
-    </AS>
-  </AS>
+    </zone>
+  </zone>
 </platform>
index b37590c..e34b492 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="bob" speed="1Gf"/>
     <host id="alice" speed="500Mf"/>
     <host id="trudy" speed="250Mf"/>
@@ -23,5 +23,5 @@
     <route src="trudy" dst="alice">
       <link_ctn id="link3"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 962dbd7..afd0e81 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu" radical="0-1" speed="1Gf" bw="125MBps" lat="50us"
              bb_bw="2.25GBps" bb_lat="500us"/>
     <cluster id="alice_cluster" prefix="alice" suffix=".crepe.fr" radical="0-1" speed="1Gf" bw="125MBps" lat="50us"
@@ -9,9 +9,9 @@
 
     <link id="backbone" bandwidth="1.25GBps" latency="500us"/>  
 
-    <ASroute src="bob_cluster" dst="alice_cluster" gw_src="bobbob_cluster_router.hamburger.edu" 
+    <zoneRoute src="bob_cluster" dst="alice_cluster" gw_src="bobbob_cluster_router.hamburger.edu" 
              gw_dst="alicealice_cluster_router.crepe.fr">
       <link_ctn id="backbone"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index 0625fd3..dc50aa1 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone id="AS0"  routing="Full">
     <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu" radical="0-1" speed="1Gf" bw="125MBps" lat="50us"
              bb_bw="2.25GBps" bb_lat="500us"/>
 
@@ -10,9 +10,9 @@
 
     <link id="backbone" bandwidth="1.25GBps" latency="500us"/>  
 
-    <ASroute src="bob_cluster" dst="bob_cluster_1" gw_src="bobbob_cluster_router.hamburger.edu" 
+    <zoneRoute src="bob_cluster" dst="bob_cluster_1" gw_src="bobbob_cluster_router.hamburger.edu" 
              gw_dst="bobbob_cluster_1_router.hamburger.edu">
       <link_ctn id="backbone"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index b6cd862..43d4e46 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu" radical="0-4" speed="1Gf" bw="125MBps" lat="50us"
              bb_bw="2.25GBps" bb_lat="500us" router_id="bob_cluster_router"/>
     <cluster id="alice_cluster" prefix="alice" suffix=".crepe.fr" radical="0-4" speed="1Gf" bw="125MBps" lat="50us"
@@ -9,11 +9,11 @@
 
     <link id="backbone" bandwidth="1.25GBps" latency="500us"/>  
 
-    <ASroute src="bob_cluster" dst="alice_cluster" gw_src="bob_cluster_router" gw_dst="alice_cluster_router">
+    <zoneRoute src="bob_cluster" dst="alice_cluster" gw_src="bob_cluster_router" gw_dst="alice_cluster_router">
       <link_ctn id="backbone"/>
-    </ASroute>
-    <ASroute src="alice_cluster" dst="bob_cluster" gw_src="alice_cluster_router" gw_dst="bob_cluster_router">
+    </zoneRoute>
+    <zoneRoute src="alice_cluster" dst="bob_cluster" gw_src="alice_cluster_router" gw_dst="bob_cluster_router">
       <link_ctn id="backbone"/>
-    </ASroute>
-  </AS>
+    </zoneRoute>
+  </zone>
 </platform>
index 15a3b02..bb44044 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="bob" speed="1Gf"/>
     <host id="alice" speed="500Mf"/>
 
@@ -14,5 +14,5 @@
       <link_ctn id="switch"/>
       <link_ctn id="link_alice"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 56e7e4b..afef580 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="bob" speed="1Gf"/>
     <host id="alice" speed="500Mf"/>
 
@@ -10,5 +10,5 @@
     <route src="bob" dst="alice">
       <link_ctn id="link1"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index 515fd53..750ac91 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version='1.0'?>
 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
-<platform version="4">
-  <AS  id="AS0"  routing="Full">
+<platform version="4.1">
+  <zone  id="AS0"  routing="Full">
     <host id="bob" speed="1Gf"/>
     <host id="alice" speed="500Mf"/>
 
@@ -13,5 +13,5 @@
     <route src="bob" dst="alice" symmetrical="NO">
       <link_ctn id="link1" direction="DOWN"/>
     </route>
-  </AS>
+  </zone>
 </platform>
index bb8b899..5c7f74c 100644 (file)
@@ -30,7 +30,7 @@ static int master(int argc, char *argv[])
 {
   XBT_INFO("Launching our nice bugged recursive function...");
   unsigned i = 1;
-  while (i <= 0x80000000u) {
+  while (i <= 0x80000000U) {
     i *= 2;
     unsigned res = collatz(i, i);
     XBT_VERB("collatz(%u, %u) returned %u", i, i, res);
index 8ebe1cb..ed2a264 100644 (file)
@@ -8,7 +8,7 @@ if(enable_smpi)
   include_directories(BEFORE "${CMAKE_HOME_DIRECTORY}/include/smpi")
   foreach(x coll-allgather coll-allgatherv coll-allreduce coll-alltoall coll-alltoallv coll-barrier coll-bcast 
             coll-gather coll-reduce coll-reduce-scatter coll-scatter macro-sample pt2pt-dsend pt2pt-pingpong 
-            type-hvector type-indexed type-struct type-vector bug-17132 timers )
+            type-hvector type-indexed type-struct type-vector bug-17132 timers privatization )
     add_executable       (${x}  ${x}/${x}.c)
     target_link_libraries(${x}  simgrid)
     set_target_properties(${x}  PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x})
@@ -34,7 +34,8 @@ set(tesh_files    ${tesh_files}     ${CMAKE_CURRENT_SOURCE_DIR}/coll-allreduce/c
                                     ${CMAKE_CURRENT_SOURCE_DIR}/coll-allreduce/coll-allreduce-automatic.tesh
                                     ${CMAKE_CURRENT_SOURCE_DIR}/coll-alltoall/clusters.tesh
                                     ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt-pingpong/broken_hostfiles.tesh
-                                    ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt-pingpong/TI_output.tesh              PARENT_SCOPE)
+                                    ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt-pingpong/TI_output.tesh              
+                                    ${CMAKE_CURRENT_SOURCE_DIR}/privatization/privatization_dlopen.tesh                             PARENT_SCOPE)
 set(bin_files       ${bin_files}    ${CMAKE_CURRENT_SOURCE_DIR}/hostfile
                                     ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_cluster
                                     ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_coll
@@ -116,4 +117,12 @@ if(enable_smpi)
   # Extra pt2pt pingpong test: broken usage ti-tracing
   ADD_TESH_FACTORIES(tesh-smpi-broken  "thread"   --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/pt2pt-pingpong --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt-pingpong broken_hostfiles.tesh)
   ADD_TESH(tesh-smpi-replay-ti-tracing            --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/pt2pt-pingpong --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt-pingpong TI_output.tesh)
+
+  # Simple privatization tests
+  if(HAVE_PRIVATIZATION)
+    ADD_TESH_FACTORIES(tesh-smpi-privatization-mmap  "thread;ucontext;raw;boost"   --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/privatization --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/privatization privatization.tesh)
+  endif()
+
+    ADD_TESH_FACTORIES(tesh-smpi-privatization-dlopen  "thread;ucontext;raw;boost"   --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/privatization --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/privatization privatization_dlopen.tesh)
+
 endif()
index 728b8f3..597628b 100644 (file)
@@ -1,3 +1,3 @@
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -np 16 -platform ../../../examples/platforms/small_platform.xml -hostfile ../hostfile ${bindir:=.}/bug-17132 --cfg=smpi/simulate-computation:no --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning
-> You requested to use 16 processes, but there is only 5 processes in your hostfile...
+> You requested to use 16 ranks, but there is only 5 processes in your hostfile...
 > Walltime = 0.468274
index 0c83cb7..d6bf366 100644 (file)
@@ -62,7 +62,6 @@ int main(int argc, char **argv)
   int i;
   int rank;
   int size;
-  int *sendcounts, *recvcounts, *rdispls, *sdispls;
 
   MPI_Init(&argc, &argv);
 
@@ -81,10 +80,10 @@ int main(int argc, char **argv)
   }
 
   /* Create and load the arguments to alltoallv */
-  sendcounts = (int *) xbt_malloc(size * sizeof(int));
-  recvcounts = (int *) xbt_malloc(size * sizeof(int));
-  rdispls = (int *) xbt_malloc(size * sizeof(int));
-  sdispls = (int *) xbt_malloc(size * sizeof(int));
+  int* sendcounts = (int*)xbt_malloc(size * sizeof(int));
+  int* recvcounts = (int*)xbt_malloc(size * sizeof(int));
+  int* rdispls    = (int*)xbt_malloc(size * sizeof(int));
+  int* sdispls    = (int*)xbt_malloc(size * sizeof(int));
   for (i = 0; i < size; i++) {
     sendcounts[i] = i;
     recvcounts[i] = rank;
index 4ae5dba..e1a4bf7 100644 (file)
@@ -48,7 +48,8 @@ int main(int argc, char *argv[])
     /* I want the standard error to go below 0.1 second.
      * Two tests at least will be run (count is not > 0) */
     SMPI_SAMPLE_LOCAL(0, 0.1) {
-      if (verbose || n++ < 2) {
+      if (verbose || n < 2) {
+        n++;
         if (verbose)
           fprintf(stderr, "(%12.6f)", MPI_Wtime());
         else
diff --git a/teshsuite/smpi/privatization/privatization.c b/teshsuite/smpi/privatization/privatization.c
new file mode 100644 (file)
index 0000000..07c2b8f
--- /dev/null
@@ -0,0 +1,27 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <mpi.h>
+
+
+static int myvalue = 0;
+
+int main(int argc, char **argv)
+{
+    int me;
+
+    MPI_Init(&argc, &argv);
+
+    MPI_Comm_rank(MPI_COMM_WORLD, &me);
+
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    myvalue = me;
+
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    if(myvalue!=me)
+      printf("Privatization error - %d != %d\n", myvalue, me);
+    MPI_Finalize();
+    return 0;
+}
diff --git a/teshsuite/smpi/privatization/privatization.tesh b/teshsuite/smpi/privatization/privatization.tesh
new file mode 100644 (file)
index 0000000..42d8bf3
--- /dev/null
@@ -0,0 +1,5 @@
+p Test privatization
+! setenv LD_LIBRARY_PATH=../../lib
+! timeout 5
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ../hostfile -platform ../../../examples/platforms/small_platform.xml -np 32 ${bindir:=.}/privatization --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/privatization:1 --log=simix_context.thres:error
+> You requested to use 32 ranks, but there is only 5 processes in your hostfile...
diff --git a/teshsuite/smpi/privatization/privatization_dlopen.tesh b/teshsuite/smpi/privatization/privatization_dlopen.tesh
new file mode 100644 (file)
index 0000000..ced2221
--- /dev/null
@@ -0,0 +1,5 @@
+p Test privatization with dlopen
+! setenv LD_LIBRARY_PATH=../../lib
+! timeout 5
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ../hostfile -platform ../../../examples/platforms/small_platform.xml -np 32 ${bindir:=.}/privatization --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/privatization:dlopen --log=simix_context.thres:error
+> You requested to use 32 ranks, but there is only 5 processes in your hostfile...
index e1b28ce..735efee 100644 (file)
@@ -1,4 +1,4 @@
-foreach(x lmm_usage surf_usage surf_usage2 trace_usage)
+foreach(x lmm_usage surf_usage surf_usage2)
   add_executable       (${x}  ${x}/${x}.cpp)
   target_link_libraries(${x}  simgrid)
   set_target_properties(${x}  PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x})
@@ -18,7 +18,7 @@ endforeach()
 set(tesh_files     ${tesh_files}                                                               PARENT_SCOPE)
 set(teshsuite_src  ${teshsuite_src} ${CMAKE_CURRENT_SOURCE_DIR}/maxmin_bench/maxmin_bench.cpp  PARENT_SCOPE)
 
-foreach(x lmm_usage surf_usage surf_usage2 trace_usage)
+foreach(x lmm_usage surf_usage surf_usage2)
   ADD_TESH(tesh-surf-${x} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/surf/${x} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/surf/${x} ${x}.tesh)
 endforeach()
 
index bc5bbe5..7d4323c 100644 (file)
@@ -38,9 +38,9 @@ static unsigned int int_random(int max)
 static void test(int nb_cnst, int nb_var, int nb_elem, unsigned int pw_base_limit, unsigned int pw_max_limit,
                  float rate_no_limit, int max_share, int mode)
 {
-  lmm_constraint_t *cnst = xbt_new0(lmm_constraint_t, nb_cnst);
-  lmm_variable_t *var = xbt_new0(lmm_variable_t, nb_var);
-  int *used = xbt_new0(int, nb_cnst);
+  lmm_constraint_t cnst[nb_cnst];
+  lmm_variable_t var[nb_var];
+  int used[nb_cnst];
   int concurrency_share;
 
   lmm_system_t Sys = lmm_system_new(1);
@@ -106,9 +106,6 @@ static void test(int nb_cnst, int nb_var, int nb_elem, unsigned int pw_base_limi
   for (int i = 0; i < nb_var; i++)
     lmm_variable_free(Sys, var[i]);
   lmm_system_free(Sys);
-  free(cnst);
-  free(var);
-  free(used);
 }
 
 unsigned int TestClasses [][4]=
index 3fc8d87..4e60bff 100644 (file)
@@ -26,7 +26,5 @@ $ $SG_TEST_EXENV ${bindir:=.}/surf_usage ${srcdir:=.}/../../../examples/platform
 > [110.000000] [surf_test/INFO] Next Event : 110
 > [120.000000] [surf_test/INFO] Next Event : 120
 > [130.000000] [surf_test/INFO] Next Event : 130
-> [140.000000] [surf_test/INFO] Next Event : 140
-> [150.000000] [surf_test/INFO] Next Event : 150
-> [157.500000] [surf_test/INFO] Next Event : 157.5
-> [157.500000] [surf_test/INFO]    CPU Done action
+> [132.500000] [surf_test/INFO] Next Event : 132.5
+> [132.500000] [surf_test/INFO]    CPU Done action
index 5e025d6..12a74fb 100644 (file)
@@ -23,8 +23,6 @@ $ $SG_TEST_EXENV ${bindir:=.}/surf_usage2  ${srcdir:=.}/../../../examples/platfo
 > [110.000000] [surf_test/INFO] Next Event : 110
 > [120.000000] [surf_test/INFO] Next Event : 120
 > [130.000000] [surf_test/INFO] Next Event : 130
-> [140.000000] [surf_test/INFO] Next Event : 140
-> [150.000000] [surf_test/INFO] Next Event : 150
-> [157.500000] [surf_test/INFO] Next Event : 157.5
-> [157.500000] [surf_test/INFO]    * Done Action
-> [157.500000] [surf_test/INFO] Simulation Terminated
+> [132.500000] [surf_test/INFO] Next Event : 132.5
+> [132.500000] [surf_test/INFO]    * Done Action
+> [132.500000] [surf_test/INFO] Simulation Terminated
diff --git a/teshsuite/surf/trace_usage/trace_usage.cpp b/teshsuite/surf/trace_usage/trace_usage.cpp
deleted file mode 100644 (file)
index 3bcd610..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/* A few tests for the trace library                                       */
-
-/* Copyright (c) 2004-2006, 2009-2015. The SimGrid Team.
- * All rights reserved.                                                     */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "surf/surf.h"
-#include "xbt/log.h"
-#include "src/surf/network_interface.hpp"
-#include "src/surf/trace_mgr.hpp"
-
-XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test, "Messages specific for surf example");
-
-class DummyTestResource
-    : public simgrid::surf::Resource {
-public:
-  explicit DummyTestResource(const char* name) : Resource(nullptr, name, nullptr) {}
-  bool isUsed() override {return false;}
-  void apply_event(tmgr_trace_iterator_t it, double value) override {}
-};
-
-int main(int argc, char **argv)
-{
-  surf_init(&argc, argv);
-
-  simgrid::trace_mgr::future_evt_set *fes = new simgrid::trace_mgr::future_evt_set();
-  tmgr_trace_t trace_A = tmgr_trace_new_from_file("trace_A.txt");
-  tmgr_trace_t trace_B = tmgr_trace_new_from_file("trace_B.txt");
-  double value = -1.0;
-  simgrid::surf::Resource *resource = nullptr;
-  simgrid::surf::Resource *hostA = new DummyTestResource("Host A");
-  simgrid::surf::Resource *hostB = new DummyTestResource("Host B");
-
-  fes->add_trace(trace_A, 1.0, hostA);
-  fes->add_trace(trace_B, 0.0, hostB);
-
-  double next_event_date = fes->next_date();
-  while (next_event_date > -1.0) {
-    XBT_INFO("%g:", next_event_date);
-    while (fes->pop_leq(next_event_date, &value, &resource)) {
-      XBT_INFO("   %s: %g", resource->cname(), value);
-    }
-    if (next_event_date > 100)
-      break;
-    next_event_date = fes->next_date();
-  }
-
-  delete fes;
-  delete hostA;
-  delete hostB;
-
-  surf_exit();
-  return 0;
-}
diff --git a/teshsuite/surf/trace_usage/trace_usage.tesh b/teshsuite/surf/trace_usage/trace_usage.tesh
deleted file mode 100644 (file)
index 70d3e57..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#! ./tesh
-
-$ $SG_TEST_EXENV ${bindir:=.}/trace_usage --cfg=path:../../../examples/platforms/trace/
-> [0.000000] [surf_test/INFO] 0:
-> [0.000000] [surf_test/INFO]    Host B: 1
-> [0.000000] [surf_test/INFO] 1:
-> [0.000000] [surf_test/INFO]    Host A: 1
-> [0.000000] [surf_test/INFO] 10:
-> [0.000000] [surf_test/INFO]    Host B: 0.8
-> [0.000000] [surf_test/INFO] 12:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 20:
-> [0.000000] [surf_test/INFO]    Host B: 0.4
-> [0.000000] [surf_test/INFO] 21:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
-> [0.000000] [surf_test/INFO] 22:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 30:
-> [0.000000] [surf_test/INFO]    Host B: 0.8
-> [0.000000] [surf_test/INFO] 31:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
-> [0.000000] [surf_test/INFO] 32:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 40:
-> [0.000000] [surf_test/INFO]    Host B: 0.4
-> [0.000000] [surf_test/INFO] 41:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
-> [0.000000] [surf_test/INFO] 42:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 50:
-> [0.000000] [surf_test/INFO]    Host B: 0.8
-> [0.000000] [surf_test/INFO] 51:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
-> [0.000000] [surf_test/INFO] 52:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 60:
-> [0.000000] [surf_test/INFO]    Host B: 0.4
-> [0.000000] [surf_test/INFO] 61:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
-> [0.000000] [surf_test/INFO] 62:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 70:
-> [0.000000] [surf_test/INFO]    Host B: 0.8
-> [0.000000] [surf_test/INFO] 71:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
-> [0.000000] [surf_test/INFO] 72:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 80:
-> [0.000000] [surf_test/INFO]    Host B: 0.4
-> [0.000000] [surf_test/INFO] 81:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
-> [0.000000] [surf_test/INFO] 82:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 90:
-> [0.000000] [surf_test/INFO]    Host B: 0.8
-> [0.000000] [surf_test/INFO] 91:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
-> [0.000000] [surf_test/INFO] 92:
-> [0.000000] [surf_test/INFO]    Host A: 0.5
-> [0.000000] [surf_test/INFO] 100:
-> [0.000000] [surf_test/INFO]    Host B: 0.4
-> [0.000000] [surf_test/INFO] 101:
-> [0.000000] [surf_test/INFO]    Host A: 0.9
index a3f1b0f..16505df 100644 (file)
@@ -45,15 +45,13 @@ static const char *parmap_mode_name(e_xbt_parmap_mode_t mode)
 
 static int parmap_skip_mode(e_xbt_parmap_mode_t mode)
 {
-  switch (mode) {
 #if !HAVE_FUTEX_H
-  case XBT_PARMAP_FUTEX:
+  if (mode == XBT_PARMAP_FUTEX) {
     printf("not available\n");
     return 1;
+  } else
 #endif
-  default:
     return 0;
-  }
 }
 
 static unsigned fibonacci(unsigned n)
index 54a297c..42b8753 100644 (file)
@@ -20,7 +20,7 @@ if(enable_compile_warnings AND enable_compile_optimizations)
   SET(BUILDNAME "FULL_FLAGS" CACHE INTERNAL "Buildname" FORCE)
 endif()
 
-if(HAVE_MC)
+if(SIMGRID_HAVE_MC)
   SET(BUILDNAME "MODEL-CHECKING" CACHE INTERNAL "Buildname" FORCE)
 endif()
 
index 9cc3fc3..f9dc6e6 100644 (file)
@@ -53,6 +53,7 @@ set(EXTRA_DIST
   src/surf/network_ib.hpp
   src/surf/ns3/ns3_interface.h
   src/surf/ns3/ns3_simulator.h
+  src/surf/trace_mgr_test.cpp
   src/surf/xml/simgrid.dtd
   src/surf/xml/simgrid_dtd.h
   src/surf/xml/simgrid_dtd.c
@@ -287,7 +288,6 @@ set(XBT_SRC
   src/xbt/xbt_os_time.c
   src/xbt/xbt_replay.cpp
   src/xbt/xbt_str.cpp
-  src/xbt/xbt_strbuff.c
   src/xbt/xbt_virtu.c
   src/xbt_modinter.h
   )
@@ -724,7 +724,6 @@ set(headers_to_install
   include/xbt/log.hpp
   include/xbt/mallocator.h
   include/xbt/matrix.h
-  include/xbt/memory.hpp
   include/xbt/misc.h
   include/xbt/mmalloc.h
   include/xbt/module.h
@@ -732,7 +731,6 @@ set(headers_to_install
   include/xbt/range.hpp
   include/xbt/replay.hpp
   include/xbt/str.h
-  include/xbt/strbuff.h
   include/xbt/swag.h
   include/xbt/synchro.h
   include/xbt/sysdep.h
@@ -784,7 +782,7 @@ set(simgrid_sources
   ${XBT_SRC}
   )
 
-if(${HAVE_JEDULE})  
+if(${SIMGRID_HAVE_JEDULE})  
   set(simgrid_sources  ${simgrid_sources}  ${JEDULE_SRC})
 else()
   set(EXTRA_DIST       ${EXTRA_DIST}       ${JEDULE_SRC})
@@ -794,11 +792,11 @@ if(enable_smpi)
   set(simgrid_sources  ${simgrid_sources}  ${SMPI_SRC})
 endif()
 
-if(HAVE_MC)
+if(SIMGRID_HAVE_MC)
   set(simgrid_sources  ${simgrid_sources}  ${MC_SRC})
 endif()
 
-if(HAVE_NS3)
+if(SIMGRID_HAVE_NS3)
   set(simgrid_sources  ${simgrid_sources}  ${NS3_SRC})
 endif()
 
@@ -812,7 +810,7 @@ if(WIN32)
     )
 endif()
 
-if(HAVE_LUA)
+if(SIMGRID_HAVE_LUA)
   set(simgrid_sources  ${simgrid_sources}  ${LUA_SRC})
 else()
   set(EXTRA_DIST       ${EXTRA_DIST}       ${LUA_SRC})
index 43e867b..6a53677 100644 (file)
@@ -121,7 +121,7 @@ add_custom_target(uninstall
   COMMAND ${CMAKE_COMMAND} -E  echo "uninstall man ok"
   WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}")
 
-if(HAVE_LUA)
+if(SIMGRID_HAVE_LUA)
   add_custom_command(TARGET uninstall
     COMMAND ${CMAKE_COMMAND} -E echo "uninstall binding lua ok"
     COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_INSTALL_PREFIX}/lib/lua/5.1/simgrid.${LIB_EXE}
@@ -318,7 +318,6 @@ add_custom_target(maintainer-clean
   COMMAND ${CMAKE_COMMAND} -E remove -f src/simgrid_units_main.c
   COMMAND ${CMAKE_COMMAND} -E remove -f src/swag_unit.c
   COMMAND ${CMAKE_COMMAND} -E remove -f src/xbt_str_unit.c
-  COMMAND ${CMAKE_COMMAND} -E remove -f src/xbt_strbuff_unit.c
   COMMAND ${CMAKE_COMMAND} -E remove -f src/xbt_synchro_unit.c
   WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}")
 
index 410bcb7..6615daa 100644 (file)
@@ -124,7 +124,7 @@ if(enable_model-checking AND enable_compile_optimizations)
       src/xbt/xbt_log_layout_format.c src/xbt/xbt_log_layout_simple.c
       src/xbt/dict.cpp src/xbt/dict_elm.c src/xbt/dict_cursor.c
       src/xbt/dynar.cpp src/xbt/heap.c src/xbt/swag.c
-      src/xbt/str.c src/xbt/strbuff.c src/xbt/snprintf.c
+      src/xbt/str.c src src/xbt/snprintf.c
       src/xbt/queue.c
       src/xbt/xbt_os_time.c src/xbt/xbt_os_thread.c
       src/xbt/backtrace_linux.c
index c56ab59..1378bd4 100644 (file)
@@ -39,7 +39,7 @@ if(HAVE_PTHREAD AND ${HAVE_THREAD_CONTEXTS} AND NOT APPLE)
   SET(SIMGRID_DEP "${SIMGRID_DEP} -pthread")
 endif()
 
-if(HAVE_LUA)
+if(SIMGRID_HAVE_LUA)
   ADD_CUSTOM_TARGET(link_simgrid_lua ALL
     DEPENDS    simgrid
     ${CMAKE_BINARY_DIR}/examples/lua/simgrid.${LIB_EXE}
@@ -79,11 +79,11 @@ if(HAVE_GRAPHVIZ)
   endif()
 endif()
 
-if(HAVE_MC AND HAVE_GNU_LD AND NOT ${DL_LIBRARY} STREQUAL "")
+if(SIMGRID_HAVE_MC AND HAVE_GNU_LD AND NOT ${DL_LIBRARY} STREQUAL "")
   SET(SIMGRID_DEP "${SIMGRID_DEP} ${DL_LIBRARY}")
 endif()
 
-if(HAVE_NS3)
+if(SIMGRID_HAVE_NS3)
   SET(SIMGRID_DEP "${SIMGRID_DEP} -lns${NS3_VERSION}-core${NS3_SUFFIX} -lns${NS3_VERSION}-csma${NS3_SUFFIX} -lns${NS3_VERSION}-point-to-point${NS3_SUFFIX} -lns${NS3_VERSION}-internet${NS3_SUFFIX} -lns${NS3_VERSION}-applications${NS3_SUFFIX}")
 endif()
 
index 2904b98..1ac9d00 100644 (file)
@@ -3,7 +3,7 @@
 #  Input variable:
 #     LUA_HINT: path to Lua installation -- only needed for non-standard installs
 #  Output variable:
-#     HAVE_LUA         : if Lua was found
+#     SIMGRID_HAVE_LUA         : if Lua was found
 #     LUA_LIBRARY      : the path to the dynamic library
 #     LUA_INCLUDE_DIR  : where to find lua.h
 #     LUA_VERSION_MAJOR: First part of the version (often, 5)
@@ -56,7 +56,7 @@ unset(lua_version_str)
   
 # Check that we have a sufficient version of Lua
 if(LUA_VERSION_MAJOR EQUAL 5 AND LUA_VERSION_MINOR EQUAL 3)
-  set(HAVE_LUA 1)
+  set(SIMGRID_HAVE_LUA 1)
   include_directories(${LUA_INCLUDE_DIR})
 else()
   message(FATAL_ERROR "Error: Lua version 5.3 is required, but version ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR} found instead.")
index 750400e..3e61256 100644 (file)
@@ -16,7 +16,7 @@
 #   - Add "ns3.${version}-core ns3.${version}-core-debug ns3.${version}-core-optimized" to the NAME line of the find_library below
 #   - Add "include/ns3{version}" to the PATH_SUFFIXES line of the find_path below
 
-set(HAVE_NS3 0)
+set(SIMGRID_HAVE_NS3 0)
 set(NS3_HINT ${ns3_path} CACHE PATH "Path to search for NS3 lib and include")
 
 find_library(NS3_LIBRARIES
@@ -50,7 +50,7 @@ mark_as_advanced(NS3_LIBRARIES)
 
 if(NS3_INCLUDE_DIR)
   if(NS3_LIBRARIES)
-    set(HAVE_NS3 1)
+    set(SIMGRID_HAVE_NS3 1)
     if(NS3_LIBRARIES MATCHES "-optimized")
       set (NS3_SUFFIX "-optimized")
     elseif(NS3_LIBRARIES MATCHES "-debug")
@@ -78,7 +78,7 @@ if(NS3_INCLUDE_DIR)
 endif()
 mark_as_advanced(NS3_LIBRARY_PATH)
 
-if(HAVE_NS3)
+if(SIMGRID_HAVE_NS3)
   link_directories(${NS3_LIBRARY_PATH})
   include_directories(${NS3_INCLUDE_DIR})
 else()
index f207bfc..c432450 100644 (file)
@@ -57,7 +57,7 @@ IF(enable_java)
   ENDIF()
 ENDIF()
 
-IF(HAVE_MC)
+IF(SIMGRID_HAVE_MC)
   ADD_TESH_FACTORIES(mc-bugged1                "ucontext;raw" --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh)
   ADD_TESH_FACTORIES(mc-bugged2                "ucontext;raw" --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh)
   IF(HAVE_UCONTEXT_CONTEXTS AND SIMGRID_PROCESSOR_x86_64) # liveness model-checking works only on 64bits (for now ...)
@@ -79,7 +79,7 @@ IF(enable_smpi_MPICH3_testsuite AND SMPI_FORTRAN AND HAVE_THREAD_CONTEXTS)
   SET_TESTS_PROPERTIES(test-smpi-mpich3-thread-f90 PROPERTIES PASS_REGULAR_EXPRESSION "tests passed!")
 ENDIF()
 
-IF(HAVE_LUA)
+IF(SIMGRID_HAVE_LUA)
   # Tests testing simulation from C but using lua for platform files. Executed like this
   # ~$ ./masterslave platform.lua deploy.lua
   ADD_TESH(lua-platform-masterslave                --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/lua --cd ${CMAKE_BINARY_DIR}/examples/lua ${CMAKE_HOME_DIRECTORY}/teshsuite/lua/lua_platforms.tesh)
@@ -87,3 +87,15 @@ IF(HAVE_LUA)
 ENDIF()
 
 ADD_TEST(testall                                 ${CMAKE_BINARY_DIR}/testall)
+
+# New tests should use the Boost Unit Test Framework
+
+
+if(Boost_UNIT_TEST_FRAMEWORK_FOUND)
+  add_executable       (unit_tmgr src/surf/trace_mgr_test.cpp)
+  target_link_libraries(unit_tmgr simgrid ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+  ADD_TEST(unit_tmgr ${CMAKE_BINARY_DIR}/unit_tmgr --build_info=yes)
+  
+else()
+  set(EXTRA_DIST       ${EXTRA_DIST}       src/surf/trace_mgr_test.cpp)
+endif()
\ No newline at end of file
index 41ed454..16701f7 100644 (file)
@@ -11,11 +11,10 @@ set(FILES_CONTAINING_UNITTESTS
   src/xbt/dict.cpp
   src/xbt/swag.c
   src/xbt/xbt_str.cpp
-  src/xbt/xbt_strbuff.c
   src/xbt/config.cpp
 )
 
-if(HAVE_MC)
+if(SIMGRID_HAVE_MC)
   set(FILES_CONTAINING_UNITTESTS ${FILES_CONTAINING_UNITTESTS}
       src/mc/PageStore.cpp
       src/mc/mc_snapshot.cpp
index 4bc7710..b98161a 100644 (file)
@@ -66,7 +66,7 @@
 /* process_vm_readv: transfer data between process address spaces */
 #cmakedefine01 HAVE_PROCESS_VM_READV
 /* Set to true if enable_model-checking is true and the dependencies available */
-#cmakedefine01 HAVE_MC
+#cmakedefine01 SIMGRID_HAVE_MC
 
 /* SMPI variables */
 /* SMPI enabled */
index bc1ee3f..a874451 100644 (file)
@@ -10,6 +10,7 @@
 - doc/html/.*
 
 + BuildSimGrid.sh
++ circle.yml
 + \.classpath
 + \.cproject
 + \.project
index 4ba5bbb..48cc959 100644 (file)
@@ -91,7 +91,6 @@ smpi
 smx
 src
 std
-strbuff
 strerror
 strlen
 struct
index 96558bb..d76f57f 100755 (executable)
@@ -55,8 +55,8 @@ ctest -D ExperimentalCoverage
 # See https://docs.travis-ci.com/user/sonarqube/ for more info on tokens
 # don't show the token in the logs
 set +x
-sonar-scanner -Dsonar.host.url=https://sonarqube.com -Dsonar.login=$SONAR_TOKEN     \
-  | grep -v 'INFO: Parsing /home/travis/build/simgrid/simgrid/Testing/CoverageInfo' \
+sonar-scanner -Dsonar.host.url=https://sonarqube.com -Dsonar.login=$SONAR_TOKEN 2>&1 \
+  | grep -v 'INFO: Parsing /home/travis/build/simgrid/simgrid/Testing/CoverageInfo'  \
   | grep -v 'WARN: File not analysed by Sonar, so ignoring coverage: /usr/include/'
 
 exit $outcome
\ No newline at end of file
index 82cd7a8..e15cfce 100644 (file)
    fun:smpi_simulated_main_
 }
 
+#SMPI leaks the dlopen handle used for loading the program
+{
+   dlopen handle leaks (1/2)
+   Memcheck:Leak
+   match-leak-kinds:reachable
+   fun:malloc
+   ...
+   fun:dlopen@@GLIBC_*
+   ...
+   fun:main
+}
+
+{
+   dlopen handle leaks (2/2)
+   Memcheck:Leak
+   match-leak-kinds:reachable
+   fun:calloc
+   ...
+   fun:dlopen@@GLIBC_*
+   ...
+   fun:main
+}
+
 # Memory leaks appearing to be in libcgraph.  They can be seen with the
 # following simple program:
 # ,----
index a67fcab..006c1d7 100755 (executable)
@@ -87,7 +87,7 @@ Several tags were renamed (for sake of XML sanity):
 
 =back
 
-=item B<Version 4:> Introduced in SimGrid 3.13 (this is the current version)
+=item B<Version 4:> Introduced in SimGrid 3.13
 
 =over 4
 
@@ -123,6 +123,21 @@ Units are now mandatory in attributes. USE THE SCRIPT sg_xml_unit_converter.py T
 
 =back
 
+=item B<Version 4.1:> Introduced in SimGrid 3.16 (this is the current version)
+
+=over 4
+
+=item
+
+Rename a few tags, but in a backward-compatible manner: the old names are still accepted.
+
+  AS            -> zone
+  ASroute       -> zoneRoute
+  bypassAsRoute -> bypassZoneRoute
+  process       -> actor
+
+=back
+
 =back
 
 =head1 AUTHORS
@@ -142,7 +157,7 @@ under the terms of GNU LGPL (v2.1) license.
 use strict;
 
 my $fromversion=-1;
-my $toversion=4;
+my $toversion=4.1;
 
 my $filename = $ARGV[0] or die "Usage: simgrid_update_xml.pl file_to_convert.xml\nPlease provide an XML to convert as a parameter.\n";
 open INPUT, "$filename" or die "Cannot open input file $filename: $!\n";
@@ -164,10 +179,10 @@ while (defined($line = <INPUT>)) {
        $fromversion = 0;
        print "$filename was using version 0\n";
        next if !$line =~ /\S/;
-    } elsif ($line =~ s/<platform.*version=["']*([0-9.])["']*>//) {
+    } elsif ($line =~ s/<platform.*version=["']*([0-9.]*)["']*>//) {
        $fromversion = $1;
        if ($fromversion == $toversion) {
-           die "Input platform file $filename is already conformant to version $fromversion. This should be a no-op.\n";
+           warn "Input platform file $filename is already conformant to version $fromversion. This should be a no-op.\n";
        }
        if ($fromversion > $toversion) {
            die "Input platform file $filename is more recent than this script (file version: $fromversion; script version: $toversion)\n";
@@ -225,6 +240,12 @@ while (defined($line = <INPUT>)) {
        $line =~ s/\bpower\b/speed/g;   
        $line =~ s/\bkind="POWER"/kind="SPEED"/g;
     }
+    if ($fromversion < 4.1) {
+       $line =~ s/\bAS\b/zone/g;
+       $line =~ s/\bASroute\b/zoneRoute/g;
+       $line =~ s/\bbypassAsRoute\b/bypassZoneRoute/g;
+       $line =~ s/\bprocess\b/actor/g;
+    }
        
     $output_string .= "$line\n";
 }
index 985cadc..70947d3 100755 (executable)
@@ -442,6 +442,8 @@ if __name__ == '__main__':
            re.compile("==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top:"),
            re.compile("False positive error reports may follow"),
            re.compile("For details see http://code.google.com/p/address-sanitizer/issues/detail?id=189"),
+           
+           re.compile("Python runtime initialized with LC_CTYPE=C .*"),
            ]
         TeshState().jenkins = True # This is a Jenkins build