From ce8a122e1c42f8dffc203ae3ef001321c9c79d44 Mon Sep 17 00:00:00 2001 From: mugurelionut <mugurelionut@gmail.com> Date: Thu, 28 Nov 2019 14:18:19 +0100 Subject: [PATCH] find path improvement --- r2sol-old.cc | 319 ++++++++++++++++++++++++++++++++++++++++--------- r2sol.cc | 99 +++++++++++---- r2sol.exe | Bin 75712 -> 76448 bytes run_local.py | 4 +- scores.txt | 182 +++++++++++----------------- tmp-scores.txt | 29 ++++- 6 files changed, 432 insertions(+), 201 deletions(-) diff --git a/r2sol-old.cc b/r2sol-old.cc index c3b37f6..7ae3f34 100644 --- a/r2sol-old.cc +++ b/r2sol-old.cc @@ -72,7 +72,7 @@ namespace SOLVE { FILE* fin; char fname[128]; -int H, W, T, N, TINIT; +int H, W, T, TEST, N, TINIT; double TSTART; struct Node { @@ -98,7 +98,8 @@ void ReadTransitionsMap() { } } nnodes = 0; - T = 8 * (H + W + 20); + T = TMAX - 7; + //T = 8 * (H + W + 20); int row, col, o1, o2, num_transitions = 0; while (fscanf(fin, "%d %d %d %d", &row, &col, &o1, &o2) == 4) { if (row < 0 || col < 0 || o1 < 0 || o2 < 0) break; @@ -314,11 +315,45 @@ bool reschedule; int num_done_agents, num_planned, num_reschedules, num_adjust_ipaths; int num_adjust_ipaths_without_full_plan_regeneration; +int important_row[2 * NMAX], important_col[2 * NMAX]; +char visited[2 * NMAX]; + +void DFSMarkCities(int aid) { + visited[aid] = 1; + static const int kMaxDiff = 2; + for (int aid2 = 0; aid2 < 2 * N; ++aid2) { + if (visited[aid2]) continue; + if (abs(important_row[aid] - important_row[aid2]) <= kMaxDiff && abs(important_col[aid] - important_col[aid2]) <= kMaxDiff) + DFSMarkCities(aid2); + } +} + +void EstimateT() { + for (int aid = 0; aid < N; ++aid) { + const auto& agent_aid = agent[aid]; + important_row[2 * aid] = agent_aid.poz_row; + important_col[2 * aid] = agent_aid.poz_col; + important_row[2 * aid + 1] = agent_aid.target_row; + important_col[2 * aid + 1] = agent_aid.target_col; + visited[2 * aid] = visited[2 * aid + 1] = 0; + } + int num_cities = 0; + for (int aid = 0; aid < 2 * N; ++aid) { + if (visited[aid]) continue; + DFSMarkCities(aid); + ++num_cities; + } + if (1.0 * N / num_cities < 20.0 - 1e-6) + TEST = (int)(8.0 * (H + W + 1.0 * N / num_cities)); + else + TEST = 8 * (H + W + 20); + DBG(0, "(estimated) num_cities=%d TEST=%d\n", num_cities, TEST); +} + void ReadAgentsData(bool replay_mode = false) { fscanf(fin, "%d %d", &N, &TINIT); DBG(2, "[ReadAgentsData] N=%d TINIT=%d/%d\n", N, TINIT, T); assert(1 <= N && N < NMAX); - assert(TINIT < T); if (replay_mode) { fscanf(fin, "%d %d %d", &num_reschedules, &num_planned, &num_adjust_ipaths_without_full_plan_regeneration); reschedule = TINIT == 0; @@ -445,6 +480,11 @@ void ReadAgentsData(bool replay_mode = false) { } } + if (TINIT == 0 || replay_mode) { + if (TINIT == 0) EstimateT(); + else fscanf(fin, "%d", &T); + } + //exit(1); } @@ -707,8 +747,21 @@ bool OverlapsOngoingMove(int t1, int t2, int node, const int covered_by[][MAXNOD if (!USE_SPACING_TO_AVOID_DEADLOCKS) return false; if (t1 < tend_ongoing_move[node]) return true; + //if (t2 <= tend_ongoing_move[node]) return true; + + const int min_tstart = t2;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? t2 : t1; + //const int min_tstart = t1;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? t2 : t1; + const int aid_t1 = is_covered[t1][node] == is_covered_idx ? covered_by[t1][node] : -1; + for (int tend = t2 + 1; tend <= t2 + 3 && tend <= T; ++tend) { + if (is_covered[tend][node] == is_covered_idx) { + const auto& aid = covered_by[tend][node]; + const auto& agent_aid = agent[aid]; + if (tend - agent_aid.cturns < min_tstart && (aid != aid_t1 || is_covered[tend - 1][node] != is_covered_idx)) return true; + } + } + if (USE_STRICT_SPACING_TO_AVOID_DEADLOCKS) { for (int tend = t1 + 1; tend <= t2; ++tend) { if (is_covered[tend][node] == is_covered_idx) { @@ -718,15 +771,6 @@ bool OverlapsOngoingMove(int t1, int t2, int node, const int covered_by[][MAXNOD } } - const int min_tstart = t2;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? t2 : t1; - for (int tend = t2 + 1; tend <= t2 + 3 && tend <= T; ++tend) { - if (is_covered[tend][node] == is_covered_idx) { - const auto& aid = covered_by[tend][node]; - const auto& agent_aid = agent[aid]; - if (tend - agent_aid.cturns < min_tstart && (aid != aid_t1 || is_covered[tend - 1][node] != is_covered_idx)) return true; - } - } - /*for (int tend = t2 + 1; tend <= t2 + 3 && tend <= T; ++tend) { if (is_covered[tend][node] == is_covered_idx) { const auto& aid = covered_by[tend][node]; @@ -775,7 +819,7 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere if (!agent_aid.inside_poz) { rnode = agent_aid.poz_node; ro = agent_aid.poz_o; - t1 = TINIT + max(agent_aid.malfunc - 1/*2*/, 0); + t1 = TINIT + max(agent_aid.malfunc - 1, 0); for (int tstart = t1; tstart < T; ++tstart) { if (!CanEnterCell(aid, tstart + 1, -1, rnode, covered_by, is_covered, is_covered_idx, tmp_path)) continue; int t2 = tstart + 1; @@ -839,22 +883,27 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere } } - int TMIN = T + 1, best_o = -1; - - /*if (aid == 126 || aid == 50) { - DBG(0, ">>> aid=%d\n", aid); - for (int t = 40; t <= 50 && t <= ipath[aid].tmax; ++t) DBG(0, " t=%d node=%d\n", t, ipath[aid].p[t].node); - }*/ - + int TMIN = T + 1, best_o = -1, best_node = -1, best_t1 = -1; + if (tmp_path_aid.tmax < TINIT || tmp_path_aid.p[tmp_path_aid.tmax].node == agent_aid.target_node) TMIN = tmp_path_aid.tmax; - while (hsize >= 1 /*&& TMIN > T*/) { + while (hsize >= 1) { int t, node, o, ct1; ExtractMinFromHeap(h, hsize, t, node, o, ct1); - //DBG(0, "aid=%d hsize=%d t=%d node=%d o=%d ct1=%d can_reach=%d/%d\n", aid, hsize, t, node, o, ct1, can_reach[t][node][o], can_reach_idx); + assert(0 <= t && t <= T); assert(can_reach[t][node][o] == can_reach_idx); if (ct1 != can_reach_with_t1[t][node][o]) continue; - if (t + dmin_aid[node][o] >= TMIN) break; + + if (best_node == target_node && t + dmin_aid[node][o] > TMIN) break; + if (t > TMIN || t > T) continue; + + if (t == T && (best_node < 0 || (best_node >= 0 && best_node != target_node && best_t1 < ct1))) { + TMIN = t; + best_node = node; + best_o = o; + best_t1 = ct1; + //assert(false); + } // Case 1: Wait. if (t + 1 < TMIN && CanEnterCell(aid, t + 1, node, node, covered_by, is_covered, is_covered_idx, tmp_path) && @@ -868,10 +917,10 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere new_prev.o = o; new_prev.type = WAITED; const int est_tmin = t + 1 + dmin_aid[node][o]; - if (est_tmin < TMIN) InsertIntoHeap(h, hsize, t + 1, node, o, ct1, est_tmin); + if ((t + 1 <= T && best_node != target_node) || est_tmin <= TMIN) InsertIntoHeap(h, hsize, t + 1, node, o, ct1, est_tmin); } - if (t + cturns >= TMIN) continue; + if (t + cturns > TMIN) continue; const int tarrive_node2 = t + cturns; if (!IsFreeTimeWindow(aid, t + 1, tarrive_node2 - 1, node, covered_by, is_covered, is_covered_idx, tmp_path)) continue; @@ -893,7 +942,7 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere new_prev.o = o; new_prev.type = STARTED_MOVING; const int est_tmin = tarrive_node2 + dmin_aid[node2][onext]; - if (est_tmin < TMIN) InsertIntoHeap(h, hsize, tarrive_node2, node2, onext, ct1, est_tmin); + if ((tarrive_node2 <= T && best_node != target_node) || est_tmin <= TMIN) InsertIntoHeap(h, hsize, tarrive_node2, node2, onext, ct1, est_tmin); } else { can_reach[tarrive_node2][node2][onext] = can_reach_idx; can_reach_with_t1[tarrive_node2][node2][onext] = ct1; @@ -902,24 +951,40 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere new_prev.node = node; new_prev.o = o; new_prev.type = STARTED_MOVING; - if (tarrive_node2 < TMIN) { + if (best_node != target_node || tarrive_node2 < TMIN || (tarrive_node2 == TMIN && best_t1 < ct1)) { TMIN = tarrive_node2; + best_node = target_node; best_o = onext; + best_t1 = ct1; } } } } } + //if (agent_aid.inside_poz) assert(best_o >= 0); if (best_o < 0) return false; + if (best_node != target_node && !agent_aid.inside_poz) { + tmp_path_aid.tmax = T; + for (int t = TINIT; t <= T; ++t) { + auto& new_path_elem = tmp_path_aid.p[t]; + new_path_elem.node = agent_aid.poz_node; + new_path_elem.o = agent_aid.poz_o; + new_path_elem.moving_to_node = new_path_elem.moving_to_o = -1; + new_path_elem.num_partial_turns = 0; + new_path_elem.how_i_got_here = OUTSIDE_SRC; + } + return true; + } + + //assert(best_node == target_node); tmp_path_aid.tmax = TMIN; - int ct = TMIN, cnode = target_node, co = best_o; + int ct = TMIN, cnode = best_node, co = best_o; while (1) { assert(can_reach[ct][cnode][co] == can_reach_idx); assert(ct >= can_reach_with_t1[ct][cnode][co]); const auto& cprev = prev[ct][cnode][co]; - //DBG(0, "ct=%d cnode=%d co=%d cprev.t=%d cprev.type=%d\n", ct, cnode, co, cprev.t, cprev.type); if (cprev.t < 0) break; if (cprev.type == WAITED || cprev.type == MALFUNCTIONED) { // Wait 1 unit. @@ -935,7 +1000,6 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere int num_partial_turns = 0; for (int tmove = cprev.t; tmove < ct; ++tmove) { - //DBG(0, " tmove=%d npt=%d\n", tmove, num_partial_turns); auto& new_path_elem = tmp_path_aid.p[tmove + 1]; ++num_partial_turns; if (num_partial_turns < agent_aid.cturns) { @@ -1009,6 +1073,25 @@ void UncoverPath(int aid, const Path& path, int covered_by[][MAXNODES], int is_c } } +void CoverPath1(int aid, const Path& path, int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { + const auto& agent_aid = agent[aid]; + if (!agent_aid.inside_poz) return; + for (int t = TINIT; t <= T; ++t) { + assert(is_covered[t][agent_aid.poz_node] != is_covered_idx); + is_covered[t][agent_aid.poz_node] = is_covered_idx; + covered_by[t][agent_aid.poz_node] = aid; + } +} + +void UncoverPath1(int aid, const Path& path, int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { + const auto& agent_aid = agent[aid]; + if (!agent_aid.inside_poz) return; + for (int t = TINIT; t <= T; ++t) { + assert(is_covered[t][agent_aid.poz_node] == is_covered_idx && covered_by[t][agent_aid.poz_node] == aid); + is_covered[t][agent_aid.poz_node] = 0; + } +} + bool RunConsistencyChecks(Path path[], const int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, bool crash_on_error = true) { for (int aid = 0; aid < N; ++aid) { const auto& agent_aid = agent[aid]; @@ -1160,10 +1243,12 @@ void CheckNonDeadlockPaths() { } } -const double kScoreExponent = 1.0;//2.0; -const double kMaxTmaxWeight = 0.0; +double SCORE_EXPONENT1, SCORE_EXPONENT2; +double MAX_TMAX_WEIGHT; -void RandomPermutations(int tid, int ntries) { +#define GetScore(t) (t <= TEST ? pow(1.0 * t / TEST, SCORE_EXPONENT1) : pow(1.0 * t / TEST, SCORE_EXPONENT2)) + +/*void RandomPermutations(int tid, int ntries) { auto& pused_tid = pused[tid]; auto& perm_tid = perm[tid]; auto& xor128_tid = xor128[tid]; @@ -1198,20 +1283,20 @@ void RandomPermutations(int tid, int ntries) { int last_trial_update = -1, last_idx_update = -1; for (int trial = 1; trial <= ntries; ++trial) { - if (0&&tid == 0 && trial <= 2) { + if (tid == 0 && trial <= 1) { if (trial == 2) reverse(shpaths_sorted.begin(), shpaths_sorted.end()); for (int i = 0; i < N; ++i) perm_tid[i] = shpaths_sorted[i].second; } else { for (int i = 0; i < N; ++i) pused_tid[i] = 0; int idx = 0; - if ((trial & 3) >= 2) { + if ((0&&trial & 3) >= 2) { for (int i = 0; i < N; ++i) { do { perm_tid[idx] = xor128_tid.rand() % N; } while (pused_tid[perm_tid[idx]]); pused_tid[perm_tid[idx++]] = 1; } - } else if ((trial & 3) == 1) { + } else if (0&&(trial & 3) == 1) { for (int cturns = MAX_CTURNS - 1; cturns >= 0; --cturns) { const auto& cturns_agents_cturns = cturns_agents[cturns]; const auto& num_cturns_agents_cturns = num_cturns_agents[cturns]; @@ -1308,19 +1393,140 @@ void RandomPermutations(int tid, int ntries) { } } } +*/ + +void RandomPermutations(int tid, int ntries) { + auto& pused_tid = pused[tid]; + auto& perm_tid = perm[tid]; + auto& xor128_tid = xor128[tid]; + auto& covered_by_tid = covered_by[tid]; + auto& is_covered_tid = is_covered[tid]; + auto& is_covered_idx_tid = is_covered_idx[tid]; + auto& can_reach_tid = can_reach[tid]; + auto& can_reach_idx_tid = can_reach_idx[tid]; + auto& can_reach_with_t1_tid = can_reach_with_t1[tid]; + auto& heap_tid = heap[tid]; + auto& heap_size_tid = heap_size[tid]; + auto& prev_tid = prev[tid]; + auto& tmp_path_tid = tmp_path[tid]; + auto& tmp_path2_tid = tmp_path2[tid]; + auto& tmax_at_poz_node_tid = tmax_at_poz_node[tid]; + + if (tid == 0) { + shpaths_sorted.resize(N); + for (int aid = 0; aid < N; ++aid) { + shpaths_sorted[aid].second = aid; + const auto& agent_aid = agent[aid]; + shpaths_sorted[aid].first = agent_aid.malfunc + dmin[aid][agent_aid.poz_node][agent_aid.poz_o]; + } + sort(shpaths_sorted.begin(), shpaths_sorted.end()); + } + + for (int trial = 1; trial <= ntries; ++trial) { + if (tid == 0 && trial <= 1) { + for (int i = 0; i < N; ++i) perm_tid[i] = shpaths_sorted[i].second; + reverse(shpaths_sorted.begin(), shpaths_sorted.end()); + } else { + for (int i = 0; i < N; ++i) pused_tid[i] = 0; + int idx = 0; + if (0&&(trial & 1) == 1) { + for (int cturns = MAX_CTURNS - 1; cturns >= 0; --cturns) { + const auto& cturns_agents_cturns = cturns_agents[cturns]; + const auto& num_cturns_agents_cturns = num_cturns_agents[cturns]; + for (int i = 0; i < num_cturns_agents_cturns; ++i) { + do { + perm_tid[idx] = cturns_agents_cturns[xor128_tid.rand() % num_cturns_agents_cturns]; + } while (pused_tid[perm_tid[idx]]); + pused_tid[perm_tid[idx++]] = 1; + } + } + } else { + for (int cturns = 0; cturns < MAX_CTURNS; ++cturns) { + const auto& cturns_agents_cturns = cturns_agents[cturns]; + const auto& num_cturns_agents_cturns = num_cturns_agents[cturns]; + for (int i = 0; i < num_cturns_agents_cturns; ++i) { + do { + perm_tid[idx] = cturns_agents_cturns[xor128_tid.rand() % num_cturns_agents_cturns]; + } while (pused_tid[perm_tid[idx]]); + pused_tid[perm_tid[idx++]] = 1; + } + } + } + } + ++is_covered_idx_tid; + for (int aid = 0; aid < N; ++aid) { + auto& tmax_at_poz_node_tid_aid = tmax_at_poz_node_tid[aid]; + tmax_at_poz_node_tid_aid = -1; + auto& tmp_path_tid_aid = tmp_path_tid[aid]; + CopyPath(ipath[aid], &tmp_path_tid_aid); + const auto& agent_aid = agent[aid]; + if (agent_aid.status == DONE_REMOVED) continue; + CoverPath(aid, tmp_path_tid_aid, covered_by_tid, is_covered_tid, is_covered_idx_tid); + if (agent_aid.inside_poz) { + tmax_at_poz_node_tid_aid = TINIT; + for (int t = TINIT + 1; t <= tmp_path_tid_aid.tmax; ++t) { + const auto& path_elem = tmp_path_tid_aid.p[t]; + if (path_elem.node != agent_aid.poz_node) break; + tmax_at_poz_node_tid_aid = t; + } + } + } + bool inconsistent = false; + for (int idx = 0; idx < N; ++idx) { + const auto& aid = perm_tid[idx]; + const auto& agent_aid = agent[aid]; + if (agent_aid.status == DONE_REMOVED) continue; + auto& tmp_path_tid_aid = tmp_path_tid[aid]; + UncoverPath(aid, tmp_path_tid_aid, covered_by_tid, is_covered_tid, is_covered_idx_tid); + if (!FindBestPath(aid, covered_by_tid, is_covered_tid, is_covered_idx_tid, can_reach_tid, can_reach_idx_tid, can_reach_with_t1_tid, heap_tid, heap_size_tid, prev_tid, tmp_path_tid, &tmp_path2_tid[aid], tmax_at_poz_node_tid)) { + //inconsistent = true; + //break; + } + CoverPath(aid, tmp_path_tid_aid, covered_by_tid, is_covered_tid, is_covered_idx_tid); + } + if (!inconsistent && RunConsistencyChecks(tmp_path_tid, covered_by_tid, is_covered_tid, is_covered_idx_tid, false)) { + int num_done_agents = 0; + double cost = 0.0; + int max_tmax = 0; + for (int aid = 0; aid < N; ++aid) { + const auto& agent_aid = agent[aid]; + if (agent_aid.status == DONE_REMOVED) continue; + const auto& tmp_path_tid_aid = tmp_path_tid[aid]; + assert(tmp_path_tid_aid.tmax > TINIT); + if (tmp_path_tid_aid.tmax > TINIT && tmp_path_tid_aid.tmax <= T && tmp_path_tid_aid.p[tmp_path_tid_aid.tmax].node == agent_aid.target_node) { + ++num_done_agents; + cost += GetScore(tmp_path_tid_aid.tmax); + if (tmp_path_tid_aid.tmax > max_tmax) max_tmax = tmp_path_tid_aid.tmax; + } + } + if (num_done_agents >= 1) cost /= num_done_agents; + + { + lock_guard<mutex> guard(m); + if (num_done_agents > MAX_DONE_AGENTS || (num_done_agents == MAX_DONE_AGENTS && cost < MIN_COST - 1e-6)) { + MAX_DONE_AGENTS = num_done_agents; + MIN_COST = cost; + updated_best_solution = true; + CopyTmpPathToPath(tid); + DBG(0, "[RandomPermutations] rerun=%d tid=%d trial=%d/%d maxda=%d/%d minc=%.6lf time=%.3lf\n", rerun, tid, trial, ntries, MAX_DONE_AGENTS, num_planned, MIN_COST, GetTime() - TSTART); + } + } + } + } +} bool any_best_solution_updates; void RegenerateFullPlan() { + ++num_reschedules; any_best_solution_updates = false; updated_best_solution = true; rerun = 0; - const int kMaxReruns = 2;//4; - + const int kMaxReruns = 4;//2; + while (updated_best_solution && rerun < kMaxReruns) { updated_best_solution = false; - ++num_reschedules; ++rerun; for (int node = 0; node < nnodes; ++node) tend_ongoing_move[node] = TINIT; @@ -1344,7 +1550,7 @@ void RegenerateFullPlan() { if (max_threads >= 2) th = new thread*[max_threads - 1]; // Random Permutations. - const int kNumRandomPermutations = TINIT == 0 ? 10 : 6; + const int kNumRandomPermutations = TINIT == 0 ? 20 /*10*/ : 12 /*6*/; if (max_threads >= 2) { for (int tid = 0; tid + 1 < max_threads; ++tid) th[tid] = new thread([tid, kNumRandomPermutations]{ RandomPermutations(tid, kNumRandomPermutations); @@ -1498,7 +1704,7 @@ bool AdjustIPaths() { else new_path_elem.how_i_got_here = first_expected_step.how_i_got_here; } else new_path_elem.how_i_got_here = OUTSIDE_SRC; - const int tmin = TINIT + max(0, agent_aid.malfunc - (agent_aid.inside_poz ? /*1*/ 0 : /*2*/1)); + const int tmin = TINIT + max(0, agent_aid.malfunc - (agent_aid.inside_poz ? 0 : 1)); for (int t = TINIT + 1; t <= tmin && t <= T; ++t) { auto& new_path_elem = path_aid.p[t]; memcpy(&new_path_elem, &path_aid.p[t - 1], sizeof(PathElem)); @@ -1629,7 +1835,7 @@ bool AdjustIPaths() { int tend_move = ipath_visiting_order_next_node[next_vidx_next_node].first; - //const bool print_debug = (aid == 56 || aid == 49 || aid == 27) && (curr_node == 191 || next_node == 191); + //const bool print_debug = (aid == 76 || aid == 24) && (curr_node == 117 || next_node == 117); const bool print_debug = false; if (print_debug) DBG(0, "\n[AdjustIPaths-Debug-A] aid=%d next_aidx_aid=%d next_node=%d:(%d %d) next_vidx_next_node=%d curr_node=%d:(%d %d) t_curr_node=%d tend_move=%d(init) \n", aid, next_aidx_aid, next_node, node[next_node].row, node[next_node].col, next_vidx_next_node, curr_node, node[curr_node].row, node[curr_node].col, t_curr_node, tend_move); @@ -1738,12 +1944,9 @@ bool AdjustIPaths() { assert(next_vidx_next_node >= 1); const int prev_aid = ipath_visiting_order_next_node[next_vidx_next_node - 1].second; DBG(0, " prev_aid=%d\n", prev_aid); - if (agent_aid.target_node == next_node || agent[prev_aid].target_node == next_node) { - SwapVisitingOrder(aid, next_aidx_aid, prev_aid); - updated_visiting_order = true; - break; - } - exit(1); + SwapVisitingOrder(aid, next_aidx_aid, prev_aid); + updated_visiting_order = true; + break; } if (new_path_elem->node != agent_aid.target_node) { is_covered_0[t][new_path_elem->node] = is_covered_idx_0; @@ -1797,7 +2000,7 @@ bool AdjustIPaths() { const auto& last_path_elem = path_aid1.p[path_aid1.tmax]; int tend_move_aid1 = tend_move + (aid1 < aid && agent[aid1].target_node != next_node ? 1 : 0); const auto& agent_aid1 = agent[aid1]; - if (USE_SPACING_TO_AVOID_DEADLOCKS && last_path_elem.num_partial_turns == 0) { + if (USE_SPACING_TO_AVOID_DEADLOCKS && last_path_elem.num_partial_turns == 0 && (next_aidx[aid1] > next_checkpoint[aid1] || agent[aid1].moving_to_node < 0)) { const int min_tstart = tend_move;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? tend_move : t_curr_node; assert(t_curr_node < tend_move); if (tend_move_aid1 - agent_aid1.cturns < min_tstart) tend_move_aid1 = min_tstart + agent_aid1.cturns; @@ -1819,7 +2022,7 @@ bool AdjustIPaths() { const auto& last_path_elem = path_aid1.p[path_aid1.tmax]; int tend_move_aid1 = tend_move + (aid1 < aid ? 1 : 0); const auto& agent_aid1 = agent[aid1]; - if (USE_SPACING_TO_AVOID_DEADLOCKS && last_path_elem.num_partial_turns == 0) { + if (USE_SPACING_TO_AVOID_DEADLOCKS && last_path_elem.num_partial_turns == 0 && (next_aidx[aid1] > next_checkpoint[aid1] || agent[aid1].moving_to_node < 0)) { const int min_tstart = t_curr_node;//USE_STRICT_SPACING_TO_AVOID_DEADLOCKS ? tend_move : t_curr_node; assert(t_curr_node < tend_move); if (tend_move_aid1 - agent_aid1.cturns < min_tstart) tend_move_aid1 = min_tstart + agent_aid1.cturns; @@ -1956,17 +2159,17 @@ bool AdjustIPaths() { assert(path_aid.tmax > TINIT); if (path_aid.p[path_aid.tmax].node == agent_aid.target_node) { ++MAX_DONE_AGENTS; - MIN_COST += pow(path_aid.tmax, kScoreExponent); + MIN_COST += GetScore(path_aid.tmax); if (path_aid.tmax > new_max_tmax) new_max_tmax = path_aid.tmax; } else { assert(path_aid.tmax == T); } } - MIN_COST += new_max_tmax * kMaxTmaxWeight; - + if (MAX_DONE_AGENTS >= 1) MIN_COST /= MAX_DONE_AGENTS; + const bool changed_important_data = MAX_DONE_AGENTS != num_planned || new_max_tmax > max_tmax; if (changed_important_data) { - DBG(0, ">>> [AdjustIPaths] mda=%d/%d minc=%.3lf new_max_tmax=%d/%d\n", MAX_DONE_AGENTS, num_planned, MIN_COST, new_max_tmax, max_tmax); + DBG(0, ">>> [AdjustIPaths] mda=%d/%d minc=%.6lf new_max_tmax=%d/%d\n", MAX_DONE_AGENTS, num_planned, MIN_COST, new_max_tmax, max_tmax); } CheckNonDeadlockPaths(); @@ -2118,6 +2321,7 @@ void SaveDataForReplay(const char* testid) { fprintf(f, "%d %d %d %d\n", node[checkpoints_aid[cid]].row, node[checkpoints_aid[cid]].col, checkpoints_o_aid[cid], checkpoints_t_aid[cid]); } } + fprintf(f, "%d\n", T); fclose(f); } @@ -2134,6 +2338,8 @@ void GetMoves(const char* testid, bool replay_mode = false) { ReinitDataStructures(); ComputeShortestPaths(); } + SCORE_EXPONENT1 = 2.0;//2.0; + SCORE_EXPONENT2 = 4.0;//3.0; DBG(2, "testid=%s TINIT=%d: resc=%d nda=%d npl=%d\n", testid, TINIT, reschedule, num_done_agents, num_planned); if (reschedule) { if (TINIT >= MIN_TINIT_FOR_SAVE_DATA_FOR_REPLAY) SaveDataForReplay(testid); @@ -2142,7 +2348,7 @@ void GetMoves(const char* testid, bool replay_mode = false) { updated_paths_ok = AdjustIPaths(); ++num_adjust_ipaths_without_full_plan_regeneration; } - const int kMaxNumAdjustIPathsWithoutFullPlanRegenartion = 10; + const int kMaxNumAdjustIPathsWithoutFullPlanRegenartion = 5;//10; if (!updated_paths_ok || num_adjust_ipaths_without_full_plan_regeneration > kMaxNumAdjustIPathsWithoutFullPlanRegenartion) { RegenerateFullPlan(); if (TINIT >= 1 && any_best_solution_updates) AdjustIPaths(); @@ -2152,7 +2358,7 @@ void GetMoves(const char* testid, bool replay_mode = false) { WriteMoves(testid); if (TINIT == 0) total_time = 0.0; total_time += GetTime() - TSTART; - DBG(0, "[GetMoves] testid=%s TINIT=%d/%d ttime=%.3lf nresc=%d nadjip=%d nadjipwofpr=%d nda=%d npl=%d sum=%d/%d(%.2lf)\n", testid, TINIT, T, total_time, num_reschedules, num_adjust_ipaths, num_adjust_ipaths_without_full_plan_regeneration, num_done_agents, num_planned, num_done_agents + num_planned, N, 100.0 * (num_done_agents + num_planned) / N); + DBG(0, "[GetMoves] testid=%s TINIT=%d/%d ttime=%.3lf nresc=%d nadjip=%d nadjipwofpr=%d nda=%d npl=%d sum=%d/%d(%.2lf)\n", testid, TINIT, TEST, total_time, num_reschedules, num_adjust_ipaths, num_adjust_ipaths_without_full_plan_regeneration, num_done_agents, num_planned, num_done_agents + num_planned, N, 100.0 * (num_done_agents + num_planned) / N); /*for (int aid = 0; aid < N; ++aid) { if (aid == 27 || aid == 49 || aid == 56) { @@ -2175,3 +2381,4 @@ int main() { SOLVE::GetMoves("1", true); return 0; } + diff --git a/r2sol.cc b/r2sol.cc index 73bef06..20f210b 100644 --- a/r2sol.cc +++ b/r2sol.cc @@ -98,7 +98,8 @@ void ReadTransitionsMap() { } } nnodes = 0; - T = TMAX - 7;//8 * (H + W + 20); + T = TMAX - 7; + //T = 8 * (H + W + 20); int row, col, o1, o2, num_transitions = 0; while (fscanf(fin, "%d %d %d %d", &row, &col, &o1, &o2) == 4) { if (row < 0 || col < 0 || o1 < 0 || o2 < 0) break; @@ -882,36 +883,43 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere } } - int TMIN = T + 1, best_o = -1; + int TMIN = T + 1, best_o = -1, best_node = -1, best_t1 = -1; if (tmp_path_aid.tmax < TINIT || tmp_path_aid.p[tmp_path_aid.tmax].node == agent_aid.target_node) TMIN = tmp_path_aid.tmax; - while (hsize >= 1 /*&& TMIN > T*/) { + while (hsize >= 1) { int t, node, o, ct1; ExtractMinFromHeap(h, hsize, t, node, o, ct1); - //DBG(0, "aid=%d hsize=%d t=%d node=%d o=%d ct1=%d can_reach=%d/%d\n", aid, hsize, t, node, o, ct1, can_reach[t][node][o], can_reach_idx); + assert(0 <= t && t <= T); assert(can_reach[t][node][o] == can_reach_idx); if (ct1 != can_reach_with_t1[t][node][o]) continue; - if (t + dmin_aid[node][o] >= TMIN) break; + if (/*best_node == target_node &&*/ t + dmin_aid[node][o] > TMIN) break; + if (t > T) continue; + + /*if (t == T && (best_node < 0 || (best_node >= 0 && best_node != target_node && best_t1 < ct1))) { + TMIN = t; + best_node = node; + best_o = o; + best_t1 = ct1; + }*/ // Case 1: Wait. - if (t + 1 < TMIN && CanEnterCell(aid, t + 1, node, node, covered_by, is_covered, is_covered_idx, tmp_path) && + if (t + 1 <= TMIN && t + 1 <= T && CanEnterCell(aid, t + 1, node, node, covered_by, is_covered, is_covered_idx, tmp_path) && (can_reach[t + 1][node][o] != can_reach_idx || can_reach_with_t1[t + 1][node][o] < ct1) && (agent_aid.inside_poz || t > ct1)) { - can_reach[t + 1][node][o] = can_reach_idx; - can_reach_with_t1[t + 1][node][o] = ct1; - auto& new_prev = prev[t + 1][node][o]; - new_prev.t = t; - new_prev.node = node; - new_prev.o = o; - new_prev.type = WAITED; - const int est_tmin = t + 1 + dmin_aid[node][o]; - if (est_tmin < TMIN) InsertIntoHeap(h, hsize, t + 1, node, o, ct1, est_tmin); - } - - if (t + cturns >= TMIN) continue; + can_reach[t + 1][node][o] = can_reach_idx; + can_reach_with_t1[t + 1][node][o] = ct1; + auto& new_prev = prev[t + 1][node][o]; + new_prev.t = t; + new_prev.node = node; + new_prev.o = o; + new_prev.type = WAITED; + const int est_tmin = t + 1 + dmin_aid[node][o]; + if (best_node != target_node || est_tmin <= TMIN) InsertIntoHeap(h, hsize, t + 1, node, o, ct1, est_tmin); + } const int tarrive_node2 = t + cturns; + if (tarrive_node2 > TMIN || tarrive_node2 > T) continue; if (!IsFreeTimeWindow(aid, t + 1, tarrive_node2 - 1, node, covered_by, is_covered, is_covered_idx, tmp_path)) continue; // Case 2: Move. @@ -931,7 +939,7 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere new_prev.o = o; new_prev.type = STARTED_MOVING; const int est_tmin = tarrive_node2 + dmin_aid[node2][onext]; - if (est_tmin < TMIN) InsertIntoHeap(h, hsize, tarrive_node2, node2, onext, ct1, est_tmin); + if (best_node != target_node || est_tmin <= TMIN) InsertIntoHeap(h, hsize, tarrive_node2, node2, onext, ct1, est_tmin); } else { can_reach[tarrive_node2][node2][onext] = can_reach_idx; can_reach_with_t1[tarrive_node2][node2][onext] = ct1; @@ -940,19 +948,36 @@ bool FindBestPath(int aid, const int covered_by[][MAXNODES], const int is_covere new_prev.node = node; new_prev.o = o; new_prev.type = STARTED_MOVING; - if (tarrive_node2 < TMIN) { + if (best_node != target_node || tarrive_node2 < TMIN || (tarrive_node2 == TMIN && best_t1 < ct1)) { TMIN = tarrive_node2; + best_node = target_node; best_o = onext; + best_t1 = ct1; } } } } } + //if (agent_aid.inside_poz) assert(best_o >= 0); if (best_o < 0) return false; + if (best_node != target_node && !agent_aid.inside_poz) { + tmp_path_aid.tmax = T; + for (int t = TINIT; t <= T; ++t) { + auto& new_path_elem = tmp_path_aid.p[t]; + new_path_elem.node = agent_aid.poz_node; + new_path_elem.o = agent_aid.poz_o; + new_path_elem.moving_to_node = new_path_elem.moving_to_o = -1; + new_path_elem.num_partial_turns = 0; + new_path_elem.how_i_got_here = OUTSIDE_SRC; + } + return true; + } + + //assert(best_node == target_node); tmp_path_aid.tmax = TMIN; - int ct = TMIN, cnode = target_node, co = best_o; + int ct = TMIN, cnode = best_node, co = best_o; while (1) { assert(can_reach[ct][cnode][co] == can_reach_idx); assert(ct >= can_reach_with_t1[ct][cnode][co]); @@ -1045,6 +1070,25 @@ void UncoverPath(int aid, const Path& path, int covered_by[][MAXNODES], int is_c } } +void CoverPath1(int aid, const Path& path, int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { + const auto& agent_aid = agent[aid]; + if (!agent_aid.inside_poz) return; + for (int t = TINIT; t <= T; ++t) { + assert(is_covered[t][agent_aid.poz_node] != is_covered_idx); + is_covered[t][agent_aid.poz_node] = is_covered_idx; + covered_by[t][agent_aid.poz_node] = aid; + } +} + +void UncoverPath1(int aid, const Path& path, int covered_by[][MAXNODES], int is_covered[][MAXNODES], int is_covered_idx) { + const auto& agent_aid = agent[aid]; + if (!agent_aid.inside_poz) return; + for (int t = TINIT; t <= T; ++t) { + assert(is_covered[t][agent_aid.poz_node] == is_covered_idx && covered_by[t][agent_aid.poz_node] == aid); + is_covered[t][agent_aid.poz_node] = 0; + } +} + bool RunConsistencyChecks(Path path[], const int covered_by[][MAXNODES], const int is_covered[][MAXNODES], int is_covered_idx, bool crash_on_error = true) { for (int aid = 0; aid < N; ++aid) { const auto& agent_aid = agent[aid]; @@ -1424,17 +1468,20 @@ void RandomPermutations(int tid, int ntries) { } } } + bool inconsistent = false; for (int idx = 0; idx < N; ++idx) { const auto& aid = perm_tid[idx]; const auto& agent_aid = agent[aid]; if (agent_aid.status == DONE_REMOVED) continue; auto& tmp_path_tid_aid = tmp_path_tid[aid]; UncoverPath(aid, tmp_path_tid_aid, covered_by_tid, is_covered_tid, is_covered_idx_tid); - FindBestPath(aid, covered_by_tid, is_covered_tid, is_covered_idx_tid, can_reach_tid, can_reach_idx_tid, can_reach_with_t1_tid, heap_tid, heap_size_tid, prev_tid, tmp_path_tid, &tmp_path2_tid[aid], tmax_at_poz_node_tid); + if (!FindBestPath(aid, covered_by_tid, is_covered_tid, is_covered_idx_tid, can_reach_tid, can_reach_idx_tid, can_reach_with_t1_tid, heap_tid, heap_size_tid, prev_tid, tmp_path_tid, &tmp_path2_tid[aid], tmax_at_poz_node_tid)) { + //inconsistent = true; + //break; + } CoverPath(aid, tmp_path_tid_aid, covered_by_tid, is_covered_tid, is_covered_idx_tid); } - - if (RunConsistencyChecks(tmp_path_tid, covered_by_tid, is_covered_tid, is_covered_idx_tid, false)) { + if (!inconsistent && RunConsistencyChecks(tmp_path_tid, covered_by_tid, is_covered_tid, is_covered_idx_tid, false)) { int num_done_agents = 0; double cost = 0.0; int max_tmax = 0; @@ -1468,6 +1515,7 @@ void RandomPermutations(int tid, int ntries) { bool any_best_solution_updates; void RegenerateFullPlan() { + ++num_reschedules; any_best_solution_updates = false; updated_best_solution = true; rerun = 0; @@ -1476,7 +1524,6 @@ void RegenerateFullPlan() { while (updated_best_solution && rerun < kMaxReruns) { updated_best_solution = false; - ++num_reschedules; ++rerun; for (int node = 0; node < nnodes; ++node) tend_ongoing_move[node] = TINIT; @@ -2119,7 +2166,7 @@ bool AdjustIPaths() { const bool changed_important_data = MAX_DONE_AGENTS != num_planned || new_max_tmax > max_tmax; if (changed_important_data) { - DBG(0, ">>> [AdjustIPaths] mda=%d/%d minc=%.3lf new_max_tmax=%d/%d\n", MAX_DONE_AGENTS, num_planned, MIN_COST, new_max_tmax, max_tmax); + DBG(0, ">>> [AdjustIPaths] mda=%d/%d minc=%.6lf new_max_tmax=%d/%d\n", MAX_DONE_AGENTS, num_planned, MIN_COST, new_max_tmax, max_tmax); } CheckNonDeadlockPaths(); diff --git a/r2sol.exe b/r2sol.exe index d880c25cf96d662f43da3ac527f2231190ae955f..2cfca4c12a2f7749ec74179eef1cf436a5521965 100755 GIT binary patch delta 37781 zcma&P3w%sh_Xa#OnPD(-f`rh7&`BHjq)pUFrZO?Z872fFiMtLey$~d*hDl7Oa(bL3 zdfa-aS8ZvjyH=YZ32kZ6qV%FSouNvjRg}*6ti31deZTkr{l4i>_SyT{*R|JLd+oLN zIj#O&zwS$YRdn0xwi@<J=Yi&Iw-r6!XxYCtkM?i9;&h*ud)M;V-nD95Z68nCeLUI} zY9e@Ci=Y|)RsG82RX6`LEDz)HQ=k2w$DTsvbcj$nf2f>4RIVwEqYU_kLiJ;<v+I=O zJng^3ZPW?;wyE89Bf9=yJt+wFq(FUEml}Cx&^NiehR$B#ir=|w^UAzQPga#3Q2jcy zxeF?48k9y`O7-d}Ee`*VPCxRvrBRMiZMtavJ;<e&{@zZfxvowP>!4oKM{B#P>kS>W z@2M-oI%wZwe@`$hORrZW4UyVgENw6SRpXGqkx;Fkm9jF-$Nny4e?9DPE&IDk{a)We zTh8*YR@<PJPgr^z_BT@<sgG9kkUE*gFS5UVQST5#TTrqadfZOeN~h|YExl`W;eCmd zCl}6~JA1+8$EMGExNzp=>2v4Ko|`qyt(G?XxaH%0=FRTYPg5{^!Pd0qTCMIri<)el zsJ>_vJenacXU3r1+{yR%N$ztWV+ox`r_pN+nlSv=4F8(rp9U#m_-Djl`mcqiCH@)^ zwgP6-gd;{j!uU@MnvVoQi96!(FYBHskkzEIh1h`bL0Zqh8Kf1f!9J}t&f6IbnpvR= zrl5ij`T5}*G?WdTDve}uqh?YlzLJ%1u9+E%7k12Vp+Ohth2lk>C?2NqAWlCmFs)kD zqMb($<v9M{qXrFz^js)D_1YRdHPgHviWhc&#z=(N7K+bhxK2}zIQ^O=1)11yT{|AG z4M{>%`q?%ioTqz0RsNe2DzN##3N(b`yZ$RZF_M?7{;%}(Q2N3DN^e-e^Pl>UbiGDX za!h@?W#>*!?SSeU>PkqmHD_<C`&xGENJ7)}I~C+lB=N1(TP-_;cWi<X`qh!GI;j0y znL5Vak$UZpGM&|ltvXmc+=0enM(BqrU<|_|^c*VH9M2&_Gblmbf;QH+GKFIRw}1WB z?~!^CsnoNkpQyGmL7tJ?L~25ERU1+hOs4RbO&Jl+ROcWy7pY*k+rNeCdZd;kRk)p| z(Uhx4k-E!d>KK|*hOND$$8FVbOdY~Q^TE&!YEpOyH9FkXvHcx2?Yg5(v}z6S(6Q4U z=)pVCySB~=KdyZyqMPUZZyHT7{#X1Jx}@WY;xnmK;A{}T_#Y@vL=7~s_-Tq02?NzE zevINIuYt`h{t3m2n1OXHzK`NG9f2wq-$QXCYoLVUp7{4Ef#xMpz%sl|aiVZw3X8u& zaR{9zkj3K9QJiQUNN4e9C{79_kjUasQ`|)HI2K<@ahiod1dA`Ccx#Gl5cdS*=TZVq zNZ|56NQr-h;>5Lqvn>7)#c65+4J<y6;<Qu-s#$y##fj4cn^}A)#c8qv>sUO4;!zZ@ zV(|fp&!|G2euFil*P4hFO`%CttU_;htp7B!iPCre_tBdfRigJ-<3}_BfLE-CSo~e7 z(Ii!i-UG({G-aY<cp^isZPRaL;39yl$X1T*elOLcM16roQAvq^Q>PK@4V@6s51D>k zfuP<H(Ueke2oF8_MOM_XMRm1(z%#X})^yZLtp@(O6$}bpN~oTsi%#k2BvJZ7^!{`? zE8C?QPOqZc!{@QU`ZbL>>L0A;e+XUdtlh4xLxxTiSgsXDiL&7YaM4#?*dll~R4+!x z>KB!k*53(LQqKRXn%doE-xSJg44$3As%*+yVyywBDe5~06rDtmqVzL}DqEjM#2=2H z_-CRwb%tlvN89z#eV(VTX&0|OtL|+VtsepPtUlZBZtJ?6M72SF(Q={a7aHyOiTgp} zQa@GKJn;M9!C)2Qa}XabN`E8G{|(YGUE>4OR7>Q5XzRAdJY}%fu1pHETN*q?qWgqP z>3!w6Do4sKntf)>6WvkEwyIsCw&*q<Q;$Ur?|5^EMzd!-SRSL?_ACX~z)R?|UbVE( z3Hwa@o2s^V=w3Ujo^JnUufH2=^JLd2qVJGUp3UYdynH*#Z|3FGVV|M=6A1iO>ZT6q z9s3gc1xJ5b!_bv40DVAh7Cooq>)U{y;pjw;E~2(Ksa4S_9dih6;HbdS2`>VjtbQBa z!E-O6?{f6J)vV^_&jaoI7tt`>Nbn{OS9AD9f+IK_*a~<fhu3qMa`}J1%1VDi@H-q{ z%HcACk8${&ts0MJ&)Xb#bKL(N@U0wQPQ~Biu${xt61<Ybj}!bVhvPYXFV$Ye;o$_o z#^Gihrd<B99PUf->mH8(!a02<)&2m-BM5(!!v{I6rQ*>X{{4Nx>pA=uhyTH}`>+4W zMt+RoS2+AMhXtzqG>5kmd>pU`?D8nb6KFy|;P^_ykMZIz4u4N%e}ThA1b@!q-W(o4 z@L~>+CHM%3TXR^YzD?rr0|dX%Vb7(NY|j56d?3f82|vW~1`a<?eUIbt^(}yRb9f7f zCsAoF!LoJFPgG%)fOeV2ORDyt<j6W8{wMMLF=;~o3QF}T;cruYAMyGg;`P;2eeeIl zC@B-Xm&1cN{44^$%HhWdKFwh>hg%RS3OSrf@K+o*aJVgvWekV=cnCkm@pCF8#iJy4 z{WvZVe3HZU9F8Hl1K=j@2G!2uGlWakjiS(_x>1;9SiJ*vk#?`L<zR|?f*Q85wlTKs zF{7~-<bqCLY;4S%CaSYy?$f@bu8-;DDMbP#uJIiTqAnr80->b5Lxc69J=t&uX<on9 zipn&?vTj(Q<=Fj5Q-%dguk%DQfyDf3h&fHd+`whj75Ox(*?$3#+JoX>M@1$1DY52z zT}YSf+t313uTclYcAP3IcC+1)6s$M=?Z2FdN>EE|B-J9>&C!IWyOfk4Z(L*v5tNWd zkddDH*Bd&bH`owB&Fam8<<w2o?NXxJY}X(#blR?d7&|U(xaor0v2&lE{fVNo3#H{q zGe~mr?Z!O6@k%i0y`~p@0#-RW+uYwShiAR5&h4D46W&(e>zt;0;urN|=a{Z%hBfA) z&Xuh$<Yh{~4w53zJ8OPwHb`=v*P}&is|#w6F8R~jw64n=RIlGaV{s@MTDxTU=-lNz zSAHGQC{ufCuoUSHTw$xB#x5Jy1GJT1+X-VtsGJ5y&2%4x>Tk&!i{Ib!Lf#-L`>+Ph z9M)$_hcRKZTV7DFb(!QD9$uH1QLlfRTCyowS}E%0&uB>drCrj$6Hw3sM&j7em}eK> z3%5`x8%`sKUAm5mmaVhCV{`TklnfIbzjB!g)L5kZlkgn)nieS~d^$0u7p-7gV_`>N zspwDzP3nLA62k`*zLewtR51K3viXN|_+Ek^<?weLb`#u}!$yK9ak!epOl?MRIItP8 zkHhOZJcmmE?)eRCb1~0UOPL<ynHKX*QIzR0@?ZdO5d1iYCvmtX!S8Z-8NstSJdne; z5cn%OJd@x84##o$G6KP009;<S;WF4J>a#c0^IeDQzNl9Rbn6l|{*A^w%ZbH(MMeKH z<Y5RF|F}AJR<{J*)mn9JxBf}J-b0<&d7Y68BUuXwlz-YqlJj(p!*`|-oZoxp(03uu zv4=lZwRgws&WUQm-5I8*;<VXLtzT4nuZ>gZ-#wvaH`F#m$TmFmp8ECOopkemP_NxR zP`B!UYBA4hnfWdUm3P%G=I9ppcF|^|WLg*Xm^n>1>3cOIzSuT%6VJ1Og?$eS%kF~F z1Ip!WL_Z_QhEq}og3~bdFF=U=mFNG}M@nzoLG^HaM!$>iAagR${H4S)w?-L%Jj-m? zXq@gWeWu%Haw?{BQ87VHM0Iae9ryIG`_Rq|0S$Z8xp`7db+zMlP2+XtQ^VT=tX~re zZshcHaJa3y^&XqfxKX`&&)tzfz74!9FaBvc>x!uMzPFcdUX42b-mab!!ecl-ljDm} zjenP)RX>$r+WBDEP7agt?SGcT83bSBa1RcrQRzh-zMJ4^UU@4H=RN~?JcspflNHi| z<G(Iro$I~=cpArlehbA-96rq9SE%t=4%ZRfio@@6IF;akeqmjIli)5KuH^7e^uhlf zhsz1>?BRF;$GwDCb3C7LEr&;P_$3mR^&B2ba9a-F$KhY7@ueK@NpK>E+i|#xM(*aY ziQv9~J)r9!PqC5P2)A?m;s)UDdGRkfe4ZMQ=kO7NdvSONhr@_&%{crX!2*ZZaQF)< z{mVH<m@0x>bJ(+x;|k#iIX;K*o*d8P@M?nJ;_xVfdvJIFher_nG>7jexI2gM;&2}j z!2c+RBMFY<@J%1)AA;nhzPmX7=bOOq;`levc7PWVU3+u*1i|Da1l>O3a4Ra^n!`H@ zj_2^p9DWQ+#eeB%HuALun>k#<V2||~^wHk{TsHK3sWFe+3N9snZ(WvSjOe~J+E%CU zrS(-WaVDLC9(v<QmIDj%z=K&1TS;1srl^}uwr|qddfH#qc&l|-KNm#UWc|Cgp8A(~ ze12!y@b!x@Exh}++G@)wPyP6bwh6Y0wn^A~d7uoiS1pB-x$xDD8GVE<WsoMmdehcb zw!VU*zMxRinRPqrUe<ni9C~M0h6G*8D5Fa{1hqP9Z!Ij2lsD_M93zy-eL@$ksW620 z8S89Xgw?rq6x10-Z;j3_Wn8n%=^O2mXD~hNLc&diAKInCH(i!vMYT!Ck`7g2fNeBI z5z<Nj570%jH5y&<)@V_wR?!c{?(ADwUWXcm9*4*RlMQ;{VFn%kBCQ_ASWTl45#9$x zCylls-LB|s*I{s2a=U&(QyBHO2b>c!R$(7}_yWw32WYNjtA=vGjtiXp>9&RqHFvO4 z$VJt8hOghyXd3N8uj&h%m`z1^(xJd?P?N>U0*rE_QYi3T1h%oDPy!}CWDl19>e+?< zNX6#j^zvf!lW6u6WSb_+`uGIus8nVKzrtVOKZah&hG?KlR<QI&JyL~bqg%sohr$}c zS7p+G;Ne%EZ_IOGb6GaUpwZMBP9Dp0kZp4ip~F`#l*J)gHnixV&6ch8$m@X*A^V+L zX7JS;#)Y2bsLj9t*+L24YHhutj4Hzq+)(xqnyWX=3Z+PfUG25mzGFhgOJs#AhT4pa zIpE<3KLAhE+s%nojI6~hVEHwNf%We8)n!<3J<d^b0+Q8gQ!YKH<9XSGz1Xve=O;fL z#-1b8eLe3>Ohn4MJ+*oDW#)3K6hDyk2gn#wmh%Lf-(2)xnqW>-&AnV6^N%EbhHrMG zH{JtTmT19u2>q9rn<3d6@AWWY*(t<Dx8Wno;*R<N0kM=6ejQK5L`QiToBtY(dnaP7 zX>M<W6>3Cn0}4I^0P^V5NCpocQDgD$TJ=(|_MS%(-31ZS%<tVKW70lq1GPu#P%B6b zuH8p<fm<6Ed@n@}LK)v7c^ey;uxejYHT88>b=L;TFp#jTg70K=GJ2kP7D9SV@Hyei z!$^PFMg5<havmXOvBU1#fqCFbzWo9a2d|BQ3h-z>$@BKUgwQ6mnI9o^H=EHWkr(lM zkSBisF7?CSG5LSqq9K{QcEtv3TJLo!`VtvL9)WPEqOTUUHE8_3UUhj=OgVL~JGdde z4D2$6`sFqpTnny3i3rI{#+t8s;V^6;(!*@>5-6?taG{y@i_)noHNDTho|>W)qHH%u zi0%@~EXsvu%zk(uD-1EY*qmOk-$L}H^o086G`#v|O$lOsGfJ@R^CXCF7j`O2GWg0m zcQ<$`zh)y<r|2)E$rwv=b8s_=Xp;x)AtB|jwE#h_`n4Vyj@JZbHKKrw1ieL2%DFW_ zE(^-@9El+0T|&YOzr37hIVdRW2=Oj4fv;AzWW^&b^+Lr4BvWPv%Y&mWbwb5;BTxGs zA)1LHT#tN~8jnzM6Nygu-~`$fRklV=VD;bMU~}-4@`P4OdkW(!0WD~JJ7`3F1}-9x zlveILw#49HPg@BuL{RJW)?xRFC$SWQ7?XhN@DRa>feZ<Hil#TEiynHi7=Bybm?u>J zf&GVU_!iITU|BWD#net=3`A`T=m9l%7$Ew$+QZb<qu-Gd<=ShSct2NXg70UHNGv@- zO0Q`VvQ6G!XIOAJ%K;5D6#*bf*yzKarbkC85scjUdPwf-4VOZX^@fYLpL&LJN`|g@ z@){m#qs`U^w%>r$5405}!?)W>JO{fZ!znzGzG?)AVkl2)gdNsDKFe~*DLa73;U8}I z)aD63=y#eHv&B$?WZ~s%VMld~%OUBI3^Ed1ToYCq_Mj-qX4#+6uaJR007$q7^Durm z4-+AGZvNPN7(&R`k~pDzvKbHkkUymv5}nfEEX39OlA=9L%pWjg6Z!Az+~P0!LnfeT zx>r-vzhEe6dfhhGbo>S$_TJ1xYWhq5Xx)ntEzE$Z|J(FhB!-%v6$f;FqD}C$S&|M0 zjKRj|lj~gel{s1|*-L!a#B-3pG|qQVB|!3%%V~We=RT8k^yt!dNS$m=Sj8A*`eJlb z`bJb#Ce__*vAFgAhPKG@vsPkjocb!I3zhRA%MPdefT(<EhJQ@sk_ycQqO#2lFAT;R zlP+S}j6?M+P`yJsC)WHJMtR{hLH&j1XqS>5s~4p-vs!UqoQL*uPGtx=lznI>Q@Vx) z18SE}5rU(^xGxpsfD$>3SxMDnT<}e#lY^qa2uDPmf9}^9j=RjfjVkvZh$At54)jhn zY*Qg0N(Is0y^{3}Y*oI5u&9*`n@iZ;A<vAqfh`X<cuA;^`K*qpqnA;~BkJ(`)3u^n zd4IGm!fx5j$e{cU%f|&07Z5cQ(ECNG6y4qVB*~d5o%Ty-Ae&(!^%(X11MlXbay4*& z=P97hM)Nv!`2*66REsD|j}c|!$D+7P$<mWT$Z|<vx|D@_QQ;I3QNGE=h0#ZgvdNq& zU3W@;H2=dh@V!XqFlpCLs}Co4_soE5Pc_tkPD2<+Y92KvkgX|tYxPcVz1|Y-SxIfj z+2pb5AWqqJ^aer|L0uM^DwmoeZjzd_-pEn=R$%c4{IBv4lwQAWgo#bvWP|HQEn2&y zSE5uSO6TDh61UWH2inL*Fs=KXRufZtdRicnDBhY;{K^sPt`5&$YvbnHJZS1s=(`-% z4Naqum93e>#UKMCxl|FR3oGkMrq}SaI6TKbk7o$hHUvzIklg&Q1=Q<74uDHYvL->Y z+RR8NVH13B!<|k`q;EYQ0v0q&oQl;W3))1z29KCw5lm`rU>TmP&^4(W7`EQf4;2#Y z%Hhd)qT>W6a!U9U&ti}96i5svS+Rfu>)#7;Q04#rBtQJv{T>@r?;0Ma9O7X#jqNa= zF`jb>yoTn~uFyS(v{Ppq?Z@w_>-r6VD3ySnP_e-hs=~%YtCNQblsS_>$B#jXDkmX8 zJ@X?l9_$@ZZ!fC15B~i(Q363sHYWA&N^*o^LI<D#R{nu3i1H+}Fy*d=nB8j_lwFRp zAgcq!S!uW%U|<M5iBePq9wo!LmdrA(d<AL#{NF+3JWvwV#X^znd4&@yWj-TRCoih> zonY`k@DlEMjl=CZoJ#Nv568bFd;`b-Dq_X62_M2?a>VZ0!QoRJzC~~Xhu0H)io?4( z+}Q`X1&5as{1u0v<M0CnpZ^kPp6I)q@Z%hRlH+Ho_D_KWwiEmXhbM6OcY-%^IG*4y zIc(*yt_-lk;bsJ%<Zx#W4<mRMhdtz{-19WYgN1D5uayEH0o;F@XWCDB$cYLrJj3(E zf{6Z}fUz}1AL-C&&jOxfH_y?Ua<t$T(4o<ug&cm4!)w5H{_|gW*bwQ^XwPYmKgsb9 zRQ%H~I0XonI6Q&FyQ%m_4wGMV&j}7&IXr*}qyWBS7d)d%4u9?wxP@~>H@3Rrzcu^N zZc~q2qIE}`sTVC{J=d)xn86ZqE%w-mor&RBB%*2z($r9IIENVg*@*T26pya_?{>99 z%x#OY%TFXgsbV+({*eSbwnRPGtQu5r*o$0YR6yD%8P-w}?I|g04IadrvwA6N6-zoO zMXj`|`v$;sc=4Ikxug5ZWScGNJUZzN=qr5(1?=yKwZjq{1H|*&cy`*{blNH#nz8&s z1$m2YV<5}UYh5~{4-dU+%(LMnIKIU@YHez_*q^a?^47w5Jdo=wt!2hy>3#|<z2A6R z)u%m}H{)q$6;>R@m~A;YrEn?MH{LVlI+70A#$s^K_3oAHQewNj4Fxa;(mZtY;haqA zPg{1Tbd#NlB*?LyQ3q}QjLMT*Y}+DWaI|_seLhWUed_IDxfYYINJST2eboD`<+_YS z^+RhH-TL0@H`c*fd2qk%p-Vd8v@NqKus%8mQ>kqrvoGh4vlpBvM2#-T(voeCbYV4J zXtOj5$^jH5_4y(~OZbIab>4&Hb??5ZHas{{=Ut}u9hlJB@oR0KLpD{}ya6q2eVUv6 zV`j_|M$_W1twjT$)Ot*CMDO{EcjKqWST|10LN}5RGk&~?9qOLl9IoZ?I)bA(e1za# z9Dakt3kbgY8TgU85?t<Mpg^<vI!%Tpt;%BzoWb}o(`-+<e}?DIp(?S#*PwJue<eGc z*+QcGFBeS4Ypm;aY!<`H%;Zjn5oP8(b6D#dN^qH{kavNGpr=j6V4GK~#i>;p*&TZ9 z&$7+wvY76|bVaz3JAqp8h!VF*K}z5Is7B6>6Wt>0*DMqDLL>KHhYGwGv?wvn1q+(m z62w!etw8&?=-!XBD<&9P9J;)=^lTp@avi1MY)6OlE0@x1sSDPN(Isy*8&UW|S56tr zLgV5V9vik~Wj9zu{n3!K^gzi6n9vJ?vI=AkZexRmMKKeCv4<8;>Dw%_^6&@t3LXlv zk4pBJV*$2}A6HggxR=ZmBWV8Ttq<&S<Yw(@%Xy(vq&cDzghrs)G+{@vxj+urWJvmZ zXvYK5(5N>uI(wR7M{kpwiEBZ%5~reHCPho4KD~Tlgp_NPvP@2Qd+!acP;oyxBf9rB z<&qZ~<pPs*^yqcbjqNlq3g4KCMp$tTB7H@e4FQRK#;HWEamg)(Hf`;4R)k&Hkr82+ zMuFr<U6N5!R}X5}v{c*WnMmd?6Bj0m@c|89lwV+kabbUK2XUuK`<ylB!sNHe_#CcG zOX@{tw=q*XXP2j$r(DS3B)54VG}x6z+M<4=?b3O>6tGMGKxt5o*kwj@l7gHbe>-fx zY&ht;VFOKtvKVZSEMI!6rQ>qcV@qL4hM1D<L!;%iQ1LfRGP1kH&>jl}kTCN$%!Bcj z+B|p}{B~K4vni$|%U5vYM1Zqqit<8}42Hx+h^R1{xET9f>6E7@A2VjcrTvSThh`%( zo!OaU%@1KimE=VK=0m}t@1orM>r$BVQfqjEq!-xkO3b&LMXs$2&C|${P!QU8iQ3Dk zrxd-~`u7L+u(T@ahUJn_VQx*XMs`z%NfY+M@PR_rWZC7dL{fWd%A?eZqF^`w0kNSS z^i4*4Yr!_qe1&*ijz=+nLa1pZ=0eV4yK)z7NOYiQ9l}Qsn{D!l7@Isf(jhO1Zelij z`80DPahwOjW(2#CBWFmYoE~A5hM47MsH<`l)R*rJd>ZJo9Q9)fd>W^P<<BD~y02uq zf68?KMy7cL33q=n{|HIb2qk7C@qNNjrPqt-Bs`1lu?y^Lw?wuUd<Up(*hVG*Y&r|W zJ#b7qh`k{(xlqi~jSuWDtsh-0lTFJ=;Iv;^u6u@AZU`ezqW#K)P1BFeG3%hiF#Y&v zlOL;3(0*fi%$!_ovh?nU-U`Ye7y$_!DH56JQ%PQ8?}v<jFbY9ek5Kj=6Ic)v)jW@X zgRr#hf0@<19}`oUnj2Ht3hIn}rjfKTqpMk>oBP}{-F2e7*j&hVvd;X2L<GCUc4nyR zBd`FBGFk>q?b!BAzRPBbX(9MdhZ8AQnmwcp?5W8uh2_5>2{mYb!$mGE<6_uyro`lI ztsZu3IlG8}{)m}UjYGOD*4HxTkXN$N*r}&902gQmXDJ)SKQGnd6uj4drW6A&Q$H}~ ztYJ!|(=L28#R&D_IboMNK__4v{D`qW1Hu9(8y6|#JYWBj)BT6&{+kxU2-YJd@*|hq zrNuT-zlt(uDv@Chxr;OZ5Dhz1I_R*(v=n@}ev7ejJ!iM*jY1_|l0+^(v>)^~>5Kz6 z%4mRex+Q0~VIypW(}<d7ZD|k6xhA{fzG?H`)Cx}#k9hyq3BDg7d~!6pUtqLZ8ia~% zR0uNyr4QX=>)zmy{(v%rQ*U1q)<d`s!Amt4`rme`M%$$Vy&VeH4h<{y&5D2(0xfG3 zR@LAPBHG3dAH<t>%RcNwiCy+-ZBR%D?Gj36sk6imo(~*lSJ7mmV7HUQA?o2-IxzYK zGpgLk)B>K9W$W6-uq2QJS+SmRooW*t`;j)y>E553wzN3Gj$Th8Z3yLh+Acw&T;^#1 z)q}wxDMJ-&4c8Xf$lrE~dDzhmykfKuv`f>>{r7;18k_WulGfHz?|Dpge=fR@xs*sq z1{Q&uA9OgyU8Ce^hbhS&<UFHYcAD(+B!q)aaDci-DA^q%ZSo@~yQNmBT#C9J@<T?4 z<?F=;q!bp~Er*5Wbiiw~e7&T#-GgYE0a2#M?9v6&{QU!UY-g%*SPmAqvRTe7IftjB z@2j9(S_nG^N4Vr>qCD0pv}ujzu?!7|X`n5)L4AxgN;m!$(?EYrHPji^(~jzSiRyV4 zWWWvszbk@gcE_g5P%n0#7v5!*P~2L@5wu&*3d`3+rlA($o0))HDWUbuA^qZ#U*oG8 zH2qAw{1_IjaGSSYYq#7I%EqIRE!!!5WtV=pON}r^F)s;NxY)Ws9lJwYt}U;u+EaA6 zX*vTdF=&jitBuxHr#!$Z&ox4ocC*X22#1t`(OE=kjuGPw+{MOa*JzYMS{Iaf2?m2^ zzzs8{Iy<bKg-tey%RF-=V`p^a_DbphxiJ_VhvtQtvMX3KNzGz>WMW~7W|hGevrug_ zEXwm3Q<B9@rF{&M!lef5$>(Zut7JlbI_@hJwM+%K3Kh?zo?(i9BL)cG#cG8E4^l|j zmz1)tL|Pj${{)Gxu)_tnFccQqRiySs9A}`tndn7fxd<yLe8(RjK&&8IiJtm&6MDep zGB>2n!)Ps}8y4Xs&=KmBrLZQZsHG*_oDAk-1LB&RI>9t{F{|Au(^B0Z3$&ya*YbWS zA#<reM3}_6T#S$kj7>ZwdfXArZu*G41poi+CQnrALJ(v*N{|)h^Wp(ah^b9vGSp;9 z-S@u?sf9+Vz+^8^r&fzz4h-?I!Zals@L&HXW^sYvW{U1wlJN+}o%s!<IAPZ^%?Opr zsEZ@LDx#k75xL^EM~Un-E5ntT4X`JEKS(#Mz#|S^&aL?onj6#Z)b1x<5M9z4QSs<Y zL@hjjW#$qTv&(lod_OI0VNZ?Ux#MzPag+_aHMrmOHt#Kc(f5HmI6G!kHSr#C<8OB9 zdvNBR)-PGUc{nJTG#Q5PN7Ph8ru&;r_ZP&5GciRqXpNk(U?<gMF+C-ejUXme4EB7T z2K>^WSbhUC(B{M?tu(L0vrst)LUE@K{Gmw&Ufj=Apf3v<Xktr{9s9TTYr#BW7$|0? z&V|Kq9nwhvsA_xaLouv<p{y5^01yer5Os@sASIWIZn!~R=7s1qRzJO$C(#pMayjLt zg?h5t6T!+b#=+axv%h~}2U9~q!1xIxKO*{&OXcL`WgteO_BTrgxH%Ojg;42v5$ncn zZiMFN21tlP#L3O?u=zzjdSsLm?Bz2fB#~H2bT{{2gWW%ts&O|oF`!+}Fv@dHQVkjY zxT?qPdwG$`@|UNr-I8Gx6f;U7Cir6T0OlP4L1Q}$mkiB|?d_-tVaGyf-z-@BH7=<o zj@6CQTvK}aq6jou^jhFYcH6BC1I185Cei6W0RpUFO+srLg;ufSiySK#p2We}r$X7V zKQVzykv5Ql2T;Oju}8tEQ=C`fM=NDZ0<K62ADs)Vh5OPW)xk_4tqh0X{Q0zBjD*b< z3HN&JKr|s|A14Q}uMa4VYjSo=<Kl_7?l7@fnJo0Dzz*9-$##Z${W=spj(s1<Hx1)V z7Zv;dL|T*7Uq<x33uX=_>B)whCf27L!AL<V8nFU3DXW8L7Ww$x`yq$P4qU2-(xF`e z>PQc3S}-!DOD@G+Bb}luY*Ouo$DtDL5EQJ}(&;;;1Zy`KE!ltV*N~*lB1S_}qD`u^ z;h5V*ouCJ!hdoI+UBRYAPf5)7qK8QG?Kr&$qHUIof-)LpgBYD#Nqd{fYnE{lf^Q(w za7tjlMxqRUO3g?Rlxe8(icOgPnAz`Sn9!z|S?>LPA@;h^pb@vLw&5%<VwCp6i*i&g zK$;EgJ`9`iEU_aO*gnPCPWLr?_k9eM3nD=B4q92n`K#UovV#w>&j<Nw;gu4}aFRq- z?9;`wujmAGI0UYO0cfFENZf5PEfbU!a6{lZ{DHWZ6MKQRks%8kgi+o1i`Z34r$p^v zV%Rn|6&P1&FNSTH|L_OFAg}nvP{p@Jo1`as858Yd4^$z^wTa@Wygyqo{)d1=wy|u5 zWLnOMNu`}b%T$Q6P*wy+Kv^TGR!AltZMR@Uunicp1s=z0#nxp=#1=BCZ*QG(XE|9x zZdmZ&>m4#IWK%yH4_j38uaUNQO617+4~37bxAir|4-QFhkzyXCtu3hxQ6k=%M$7B% zT@3nUBn<+ufv|&}cj-&y-apU9Bx5^g_rQg)5H5s*kPD%ypy<{xm2yAa+yAXnhMJ_h zqyOMF223b(8IVf(+|z|r%3{6cb9#j%w2A7y7!Apqz^_;e{-=6T4~*&x1_^)t3An2k z)Ba0InTVSZP$7?uhr4Ri?qHBeE%;hvk;FKOsEk972rujtT)&qcBdfYl;t0(E+NKGB z<y;F5N{@kK+&`aAjV$4fT+3yRMCIegnqNdK=tNh-PjLJzjt>Uz@6KTz!6!Mqhr_{{ zfLn6-$Ay4@<nZ$x-aQWRg<TLn_(iO*V9g2L41zpFjYrv$qwR9p{cJJ9pzQw5RF!Of z0y*hW(4U1kzu`UuPu#S}ogD2P_0Q4Wb?;WGaoJPimoGrWUD)cG@>&iXmW}%L$4;_I zVDigRBMa2mvwQ1qRH|QOPx35+TYFDWUZ8O-EAa8dD3E~yc)!S9A3BUJfF7AuNqa&Q zZZ_D`@kY)>*-$o{t{X>56yV0xFqiw3(>*65Gye>^*j(DL?5X-Kg()uW=?gK`Jb_|q z4fDU1?nB_wV3)V0FcKF&wh&0{nf5;FTJq(7x*>*{cmjt6ds280NAe!dryj1~K_^cC z(ZM4X)WJw}FoQa{NKW}_7IiQ-K!N33&rFy5$Y`fK13f&%dg##}LKjPmM&itOX+~;V ztD+%8m6a_CyAaQN3`3mv7(Fd5!mi7-RAha}mgag<w6{)MuP+5>VI<!!X&Aqs&kQtN z_!Rj5_YCAcUpt1;_RksUxqmxNMj4fP08Z^YoX87hLw|G?tos<bWN0bF$#qvsVy@6z zwA?7M`U>@_F<o`Fiu%@=uXW9jsmsQ839Hl8ZGCHOvUb4EX?XvLn5@~Wx0%e}V;ke9 zE3e?K#Bu)5wg!VZQWP~pSy$)|&Q>S4svUA)NU|V{LkckNw2c~xeFSmnXjF=`>(Tz9 zD2lq<As5&((SQDZ^{3o?-7>d2BCkuQm*6AcQ^1Ejb|f3}iqRPI8(Y-!y!cL&3C`wl z2M&)S_~9*TecnBtx)3~`!zZ&?>9z#lyG3n2?%|;?%>ukQR5^!NjH1dnH_1b2Osm+7 zTH&)OKRY~EQtsjTr&9j;o7G+8dUWbRFrAS@&-^fgwH8b8eVf&r<GSdMwo+rq->W-# zOdULagl*?z$b5e@mbov_T#NzuJ@3(6me5?1bqI!y{Z%=flbS3G$`I1Sa*P?Qa7s~6 zj8D{^t5S^<2I_upRGkybbl)vkKcCQ1cVM}Ce!|ch(T}19k+)El$+~j{4f)S*VhZW{ zBY>S8p2OjT1lItrf<;tX0A(1}Wkw^;h}IW{Zn8**XYh!tI(@z8wUFSL+3Ir>@6QRI z)nv0CONIjls|Ja?wx_o3^2e30``{MK2S|_&Tc%Sz$3ywN*ZvWfllHVL={o3~fv?j0 zA1VE-H@GtMtJyw8i8^vtHBVYH=G*79a2K$!SzzQAbS$ZQ|9_l#L0Nn`4ObPhRlYW+ z-mnRosUxFtyt-r#=(KIV3r9OYC0$H92C;nuS#dC?mZ^VD8tv(a%*b*9gWpqvLP^z0 zXBd}aff&qk#(xLQ|MojXu#}^mNWFmgb2cJLs+A2b5yL^&fPZhh$l>2UhaMj)Y=N7q zBfv>g4UUDSA9&5uCI5Jog<IcpZ|o5_&bk^z=@R6@JM3TC8h{+*k&KJ4fp_0gFHes4 zh-f^i+BTMTw5gMoD1ZB19T?Q%Gmzj9yv@2B!Mpn?C9TE?<nRf2WJO_Mx$rDX^%w)% z{@cZFL2X7Z5b3LRmvK6MMyOCh6U_0U_b=vkBr_3FI1jA@3{;f%`gqgOrLLROUuS<u zJw4@q&p?#)tdb3rpT*Ur@Wl^NzDuDN!$%<z4ZA5-iAq9~S+c=~L}&s3m*}%>9R@6K z5?$Z*LQ$dVie)Ao#`SK#6b64&52$H)1PyZybWmq~w8h07N{SPeR))#mVMvSbuWwY> zOnpFiV!YZgb)YW%ZMDrqQ5^<?!sw4pt{~sG|ChJWWNhA4)%sAhZp~6P=b<@~dxv6e zAL)>X|LTzK2lVJz##`#w55@E;G~gN^S>P#eKXo`KME|H9$}XE;>S<bwtQu4ZHgOu> zRqt^R>0$;rL^gdCstI>XwEpKe1cSNb(D`mpsmtAB+JVV%4Oi~NHb)Mx#&Z+7=!L4N zLMM884@y8S_6PFs6|_Lro5A2S)4FMUsCQ2rt~-;e&YLz@+gv?2ZLhYY`r7mXx^Gj} zv(r;NXHVd)G<^LjO*URnZCV&ci|+5l{QYsp6IvX)9mJ$c+tZ-5u`t85j#63fi5uvO zX#Vk%xZLKVRD=z@V;%Z^V&?{zwAW0z0ZWc@*xoM^U!X9pt^L+Oq@<z}L|bC-AN6p} z*PX@uPfK3eg=4$z3wbMT(8>S;SPPn^Q(}P?Ff670CtW&=l5Zx988&3W|4a?}rcgru ze$!tc!bNe$OqP(g4jtHqPAyf@sP+`vU5k_|y3q9<Jh67!qtLkMf^kKFO2~^h*kvE< zy^@mY#__c;8yTQg(SQBNP%{Whgq6Nj*1W!+wc!(4%y1J0s2O?UF7!8n5+z?E$EF-Y zx0SMJ;w)%v?Ze0_`8?5t=GU`c*ZiUvadas8=;jOFksFWm#l5U~i8&U8$}#9;$zEz3 z%c#gY93{GRbXZVP4MnXK1e2;Sm~ML?MG4!@eei%=A41n?o1utW(Nb4*PLvHDP|zd7 zD_u5^biCJZ6yZhoZbRgD1#(Ln+ogTD<nG7D`x+hOiAH(oO=<2;3EL~nzPaDXhWpV` z-a}D#Y=Fd#JE6&zw`ZZ7HaTsXGD0gYK4?ShxI$Yo0&?q;r>{-Ip5*Z=9J5Z`44L_I z5pCEF4;By0MP8S51t)Y)>A;1aUdKVLy!fEgi@R5)2k4+zHXIm7=b`-6*SkL#w^}Q{ zzy#Uq9qjU(OS<Zke(~>v)!=<HJ*@CU>Xj&ufr`b(IddJVbIAH-{y72MJ&{Kz`i>Po zhr7IwqE?%{gXRZBvPlk&<#!KUFk=q7;CoPFU#;)bSxy~6+w}Zn)Di4&_laSvXtHdn zY3&5xNIan(Fq}Re1?E19Yl4b>Um{eytNUr<QYC64YQd8{1_U{NA>2bR)K^Da7W#`? zNJo{CT1(>+__HPg&C~?6tir|U{KU=BA|KN<(<?GAc{_0xJZd($C!`m1DI#3}LDxaI zJ^2JoQmN>mQ~HO@NsRs=_EXp`m5@4DBC~AX;xFhn)|=RTKvqui<8$yVXoR*mLrQnm zQ8zzzNdZy%)_=oK14A`1k6qGvsIY~fKNLGiHtlrDnI)*)B|FN4MO9RPel@QSa)&cT zxu`lTShO~{ouo6korE^X1Ubk=-S4SB&Z{0G>vvLX=mL~kI$D+c`;X)G8v^V!ek_P0 zxIu5X#MbAMQjAAkqRa+whl@)dvyPf`&>M)0*ZOntY8brFzB16u%Y|5GfyGB6FDUED zV)H1|PmSj<kJu(p+%NAXru7AvB*{$T@M;3Ma`<EtYd9BtOr*nBiBthdTSsDpeZOU2 z(I2Eb#CpeOQg!t{nh|;;r9m14|FDvR`UVZF?3$B$ym<2r(6aJj@V>iVPWy<~wU1EB zC1oCzhv7VF0p|E8(Y=bQL(bQ!EN>qCwE*RCUbdReEcU|KhBSoiLOD#HhjXigc6pdl z+IOMFGqaOCVUB|({WV4PbsDWxv75Eh{dQ>>{NIC&(lFBysrYqGrsa=9BT1bK$B}j~ zYZS9iUG+LPYrz4VMej9(;A@ZW1kRId#Ly;(UzV{z8PVOg_{;O@Hr}OU*fzN2P0`3H zIS#tyy&jU23km;PK_uC58|6|9{34FUa9}JZwt|lSz@z5mu)@<e*@4@b8(8{Kw85V} z`$#Uy&!$*^+TW$KO-_c%YjTDp6BPNxrM+QE?ojls95oMxX9%84)$}%t4Vx#tmVmbu z+KkzZhfnCO8tfzQqL(6`>8;iHzkDeeM1;`XhCmK_P0(zD_B25kesuV*7KXFe9c)66 zI#kkt&pfnI(DOp5dF$m*ABv?W4*F+=%6JY!dVR&ves)XBBhzd1iXSNKf->Kdkt>uX zVTDJz-6-cTdlBS~LjoE$Jb<i?!UV%Fli6E8`{sXYmr{Bl(JpVNbqcLSwWFx?SDhhc zuuh}(7k+|!Yh6$Y4VYvW2e6GEyw815He@c(a-g^2D^MM(4R?;Amy03{N2gJZ3avKK zQZmeZX2QtfXK~pJo3B!I6V}-K$d)BD3Cg1DJsSU7v;%x9aON}UPn{>x^coTyG}&}{ zsyo7f=iGJ5Xeg!nXwhN*%g~~;bRGlQ;&JnHP4<5-8-W{OHB#cJ>svy-`eoX{YE~pA ziTAG?1#ZK#Y%-A=q58z`H^}i_b0dseTXxce&N`((gr(c@;5)QrIGGrQwRy@DSTZ47 z4;}fyegVF6;wqbDuhYBSL-knt@P5T1x-#K%XKZk34`nL)a(U>78DXZUu%gxR_4Ha% zeWvA{P*w>?r%O7!XCRtzNq^y5v8(%KvF2KsDD3q>uU#Gp7a_cq+GGAN{-CVqkjwAH zV_*!5LS#sC0y{DFvf=6xO*R%HDf}WH0@uljr<m(q)Xsw-uS<&WZ`Wx8_tA`X$I@c$ zil`{n`CIhGRLF+5h`QwXb_nF~IivCVhf}Hx=#gEj_qTt(Y5xjkFTq{3=L-XAtCZ3K z6j((oruOJ_s9M?|Xz>EeT!v9WFq@nQxc~RXAf0BkOPPKX2F-+d&|=^<uOT4eI&7Wc zK6<6G&hRGk;7y2UJqYP18&o`buZ0PfI%JTemRDWQgA%PXETJ5dp%4MKW_M%zD2MMH zMSB6mOr*i5y9#Hx8VSZowH}jN^rsyDJa97Jyr>zM*|5R!A;pn|V<p49xnxr$<5W4S zV46!EGWTH*1_Zz2lA%dKul3f*#ystk5nk(Mdgyr7d(P;sGx;CIYzR9HRT(->S#{Bn z5^D>3_fqgZj~2k-_y9}Oa={L?z1Holp61HJ;DxO-s+iOy1^s4TjgwVVxLb~@L^c=3 zm4;QDbfaQDHka%J!-aff9!|RZl4csJq$Pxuq2G%Q4^%}i%6U$qM?rjLtj<uJfRBvP zx;9#UVqRzW_Bu?F65bk4sy+Cs7tP?{{%i(&reX$HuWg!Ud4WmBCA*?4v~t<+m`3&y z2h2jn<vcm%SQf~Mw@CiMOz`ddgs;_>g$a0f=>i#Vt&xr{Z!DmdCuP<A!#NIITfp9m zEc?1EJu#lBkN^4=uftido!OYvbO=rda8N=G-u|#U)_|O-Bl^!xIYZsOs%)u!1jUOq z7Y+u~VWM4#sj^EwapH%0uElFvgKmnFC)a4{BUFr`Y;N;gcDdKvI4_w7A9B4Y=NiS- z+=!x2T`*PUbSz+BLFzKQ|4xD@l+i6tQAyJ{>-SwFQGvDi)R(NelXMh`Z4(_8<5Ccg z&ap?N3xLtol?eaNHIOnK8so&;gG4(95l3fC2`&Xq!t;XWP=Qms&#A>7m+lV9rgvGc z6g~i<#+u2<Y?u4m<;l<^^+u<+1~kaO=8*Dkik82NeiFSGjIQoi#F`6XE@i^0h)gUg z!%>#Hh4&ihT@7>#$9i_NC&7i2pE$O$<(<2^8e>88B6S1@>y!~4OrYy8=p{D5tn0&+ zv}r^}C-yn`IFL)43<EAF0>rG`{ttNL_WQAv8#nl`I&p!7UavCd;^G_LpsHc-Pu*9# zk3zd8YQ=Cez51f8Y_Kf9OrDMDkp9-EH-Z(e?j_B~y^(5M(J+sU-9BuF1G#rdO%-$f z!C1M4yqZ7~b%W7L+=cm}Ul$Q?mo1A1Ao_wuU)nw(zXBL7sX8zmiD1Oa6sX7xZ}4)r zHPYzNW>pT)L&ILflK3)cqIv^93BrER`l(>hTQJ*{IS?D@cg4`*EA_jg9tk5d!TIoL zOzg(EbLHipxo{^GP`N9@lK5@Ru^rpuaW!dvyOb=%;B=S@{s*Tonr<YE=OXWo_ep!0 z=*E?k{ajXln&g61SW{-HPs|^xTj5e`=MUE9MX2EmMtI^Ps2+p!@nN}{+WiiBPz1fx zT2YE*yF9)>4z`xGAU})mlQ?8-de1L%K5jxapj;c2b7~tLsYbykA%`P1OE37Q(36~H zbl{35j3C^W!exmJ6TMAPezPlST#JMo;Fe=TlyVVqYO=f*4|G9E`LL^cc|m(!U2E02 zu(z(~F!h0jS)SJ~ZK4-{zb!b7d*gcSko9ldE!9Gqqct?60-ek@pv@6tv25OwC>XVS zbc?(UDfvD!p>fq0_X3ot7aKR_NXbvjDZlQ=6pV#?Fy%a+q^Pg)7sjtI1{H!>+Z*8v z?@YQrvck4ot2TS0_uWrCIxH7z@&TyGM1R_=bfB{&ekFX0M0!{-vFX|B*eAM<`rb(l z`W=jW|9J>J=I8EOO*ZPnT;Do?eQ7kVY0;hRbUAiA^4g_1*)V0<WqP~T2vM`s4D5&o zohF#=DC5|v9(tlje`h|fOebB%%7Tgi?6VVN$o}^(P7kw7XK>L@%eW@;w@o>A*^!7L zytNfIg!go+Jr||it3f+9%TZyu5A1|19{8wB-c)>fOEIP6<c+R;wRS3nt<`0V%&jYh zviTjMefMb{lDSgdy(rD&8A+r}OC%@fy)b-fC}BIWxauQN8%|(vUp2;cGV?N<G{J`h zS@yyb?zppkvfV;AXew(VK6LfV&b)V-vFM{!E8>g{NlAy2E~4V6k8cE18(xK(gri;~ z3<?wcp(z)7!fh5c%cGV&*-1CbtG@7LuNEm`@6$(RVxCfuKKY>M;kGn3!-*wCidf-S zVj1g(EodUfOHM@4HUZmika+?gb1kQY<(3%a#hGCO+U@)}F&FNJrpD|NlrDtipX9t0 zo^c*4OXv=gG6;%{Zu)9Z+vVgHu)~G&R(EMM(RSQsunUR?&!RiqY=rnO#I$JCH;Q{j zeT%;I+Xm-J8W;gx=r5G5=%oHq+~eNAF;OLHVOZhQI#F+cA#d%`jp)99JlnS^)*Yp4 z|Hb_~AH>Aa;bJ*WqoQxH%!ItHq(mh)eUe(SxQqEx3sRH4H#!>giaR>pUt%jlw-Aov z)<`=@H!hR+?5G}H+$AmzHaqSQB>0Z)rd|rekBa#?aN#44ope!+SQ6#2n~NQmfZ%(V z_%XIODz#a@!L3r10NDy5GUdBXuxoKkhj=L;BxbvBMUS0Pc>Y9VUTT_F@MWPmqjOlc zx!9&Sw6xTsS0Cda&C)tp^>XpabZFbwSWYHbT)3iJ_N>W6#jxPfC1l#z;&v6U-qZo5 zTA_NmScsrq>n}{`O}K1ff?=JKMHRY^u&=^(p$Sn^zL{XmQ$)sn6Xccc$<0DcnJZMj z8jd^EM+IL2EKmzp9zm%^TXbTLmz~$5=&LA-8*q{6ZF**Y19br!@E9$G(W17Ix`_Ka z*;tQj&gn9h7%afJv4I`(BlRc7xU}EmX$q>K)pUw8|1yy{Q+u2ax=UzKNRESMDFJ^! z>&82yN^$|NiZ)i+Bu}l4zt|1WtWB!6>=%?>VWcP*C3xuYJzY@1Q@BlJ!&}n6_vu`R z+yUNwxO*9(p%j0JX)uT|&K`lg5kq;g2L;wyy<nVOd^%){{hw3gK~^KW^#7h4Ep{Xr zb|JW5nm`L>es<H;$Ic&b#8z%&J0daIIb9j8g=Y8d2A|q-<2YULeZV-K<POZtXn=fK zV*clh`?Lqaz_l6B3WH<3#rKH$e=&*^kI@yCNNjox?a&5XBC-x*>^s*1g9?f9jg5E? z39j3;3j-)Wul`nI4%dN!>huD1zV)y7)Gnn_;yPr76}fvcZdpnCm#GGbUdmffP;yka znTK=W^ZE#~9*J*cV6*j+=>CvhHFLR5AGxF>gHrWR3(EOsYH?||`^O&Mn3L(&KPAeh zPY0*EYV<-`4roM+UKmr(dWd0cB649AI4O;dU#uQ2?HF^6I6z7M1Y-&=gbU-CJY1hj z{f=$OQ=2XAo`Eh|wdY8g#Xk2A2%5IclI9gEuQ7&CD?##)Q)r)&wh%Y8{}!1(Is>o@ zNInWk?N!&ZSatQ%4!RKw)%TWm^58`s%M0waUZHF~pT~vB9E0Z3)}L=f`SZ(ZTG5TW zM9`j!Vc^f3a%BBl(Vh0Ph<A;_-w9Bn6QH5V{aHCXipm=DX5bhwZLOe8MjY!azGp(O zv9KA=|CCLxJi%ek5_Vugz7F*%v+lYgF|OFXi?If7V+2O^cAMo}LAehI1Z!bn3T?LC zhv=GTG&X)CbJZ8U37+QDO}Wyd2)s)4mN%#s${qlv>oeGeAiFddX2(#IQ1J@cL1FA$ z2feT65ZnA_x6FshLLWJ`TZWqi-(ozGP~jForo+x9>pV$J{$+M%j%GzisyRt0`<3R4 z@5se|VK9A>Tq*cMA2nLD@5C6opBHJjm@0(jB`_Ra?v^%LCRuQ#4vi7YX8o<EuWH|a z0&-%p+-Z|~Z6WC`8%{n3C4AZ-2x~qU)|>G}Rjai-gw^#FcloKkpN;mIc;QOBWU7#d z8llz8^I*B8;tqwNjKEW<#lSb%wZrrPO+W-(pXD?OT!h4u{XpcL0^d~<maa&lqBm^c zrm-~*t*8xF-xq35jIpIAOF~&oWRX3j3n8%y?7D(%om52qy!|%7=M%}F=-M9x;eHLx zW`Q&AI{Q2H-zRe6LH$_Sbdc>*M~;$TFjphPXsT?coPA0^N{&1=3LkaBo8KP-kX;S> zk+Qx)3S`lNd}k|0HbyQ}?_S-}V*o+m_c>CCw!H@m{IC0neujU*#b8u2qUN;&geKOZ zCcNFjkHlo_3shpQD7TX*(8)wpR04SprLX*3sRr3v4BVf?p1EZpzX>KhEhq14l7BR_ zrW<m}X}kQhzku_k2X?jpZe<uJRg~URdp_IAGoYHyGn*>Lqw%CImGBH3=J_=~&!_Ju z`dOFVi-voY-B}gX(N`0P<;sQaBW+S)hsZ!5Tu8!%V#zC;i3`rC=z2OT+RC@yD|kh( zno-gBUOFTnp;(`tj$H!j*G%`(dVM8Cgc|eyL|QL$H9oUP8)7i0NfydZ(S0X;RgUVc z<#j&D>%7Z?IxD<tqR$dN|1#?Y?e_}VU3zB1kGQIq`r0Q<AJ6Ry3si&P>q58B@a6)P zFItWDk2dD@%x)DCXns}w*w?<5fGKjMwi3$b=+(2nNKg3$oQ`Vu+2wIYvJj;j*mSss z$u<wt&^D+;ZaYlMZf>OQN#F&1BJW?a)6KF3?8<k*oE;3k{^2;hA8DCT7lZqeq&;9- zZh$!A5>+{M#(gNGPOpJenSWD*Im#m8DYMiF-XIKj+(kPAQgj%tE_>=8-H37Odr!sa zj*e0fKNbB*hwqp^-VE-RO{Er-SEzVKk2+})WLi#%P5uE{VD8McTY9PZ>IoUAbONHp zp3Wm@X$@joWPf!(YS*5(TLN~$g;&;MC!kJ;gl;W2m!O-_-S>L>QQcIR=#Eqaf5KA- zzGyS*|FUOJLe^=*L5$?*VNJ|~{V@oQI^@T$V12kKNNsWX6y`y(u-r&bp9ntY^}oG_ zucf>G#du$qR@}_?iXIP!^&^dWPHi>Z4KAq;?+U7|%Dc7ARGuT%W|N+wz;e9!sG43L z=gEUY#Xcj`Z47M<T=c$S_&py&k4U{r?aENvT`aTHJ1_x!8~{DGSy&Z?J`kM*eb0C< z96M-Nhc&w!_^(+>(_S6kf(f__pDR>64K_^*1|s0^x^2gJ{)dg(Di?fN2pbch(Mh7q zw@r4Y?{38GsIb_E<HzOwh<djTS=_l)tOZ#Zx%+p_*eJXi(txGQrLDivfjJFmAG=(S zGNSu3zQh$RHAu@gbOJ4KAJ?+K_<OAF^FjYURE3g!*`=09v7Wt<I1Br{V&N7Hw__TH zo56>>r866DV^<7U>tXj?Fq6!Xw;mk<gO}N%FedUp4O!awQqnbC&$Q!R$fkR{_307d z9gyv|PQE%8OlK+Fj|J#)`X2;{`TN*=cuK78eH^{xdUk)g9oTR7o)crFUS69NiKAM> zRBEuyNK<Qv0i2FYy@B7L>l~@0vGMTn6>CB&djBF<7JtOD-hXu;dT(FC7a7KA$}l)g zFikEfEy2@;SQ}Ly4$Ot5+2nS#C!7#6$9s@o%ZDuU@maqajx`&$@@5o~iyw#xv|x%a z)&NOi8>h0hH23Z@{-qKn{IkcYZd0j}uEp17a0zlHN(SaprhI7h<}J<C$=G|oB?-k_ z6L2Sd;IQ}w<+*=tszYPcx1a9h`38lgeW}>32tJX}+l--Dlh7||WpmE=i}Ue8)WCA| zOfC~BDX@#_c_#4>k0Aps61RpY9ESixuRR0O1zbeGf4i+kx4Fi^t0lbeYL(o^^Bf2+ zx^IAqwq}A7O0tLU{$itpZN5FxkC)kT=@7R|abvv&{Erc$gtvt9>-qFrJ-befskf1T z036x^*S|^bq+ZL|*Wz(C>E*d}l?E=?7m<ZIz{ta36<<bvycfJngV}|pXM{yu^a><H ziLLkwP84kV>3U-sszpY=*N?WujzVoh1-+~f?ujo@waXK9PmWW2F7Fz@_ROz2a@rc& z?kOjG=E{+4u-1AX)o4ZylCxje(E5HWMV+&}ou{f81D36Mz_7BX`x6nzM|1Rp<j6PC zjrHqUH};&`lw(WH_F?~2BPijJ9(>)dlcq2hHXGBy?i-@^AGFp6tyyAr3T5}f)<xVl z8|DD6hRH>k&T5`D?Pd6g<YdbJiuR1ES9<EA=BP<ZC(l4KkPQpoh2tj5az8Fa;I^h= zCZa^MaU}Omw|+pi<-?5Rq=A9@+o)Q666Y4!EEjp1|Jl3P9)_-#^=H(vPI-}*Ha*15 z`e*K8xNS_!@aC4V{4&_gCT}MmlA}I1-bbHX6)Nvnk11yCrJ*-Y2+BF^RAonm%>u8% zPV~Vp8=gc)dKIVgEt(L;@a85>Httcz6yUqLO6-^0)uf8Zc7tYAkqe+a59J+}?*%2x zpiZfX)?Lx7iz@o|^Y()z4~ET(<>fBsRj~GlK>Htkg01(`CxL7x@+qB0W0}TXBkfiH zcTcO|Rdj8>Hi^7m6>9U!B<*R{QkkNA$*C4pW_YGR48ZY~b8(aodm$YZX|++4jV~!m zVR*?Kk2ZEs9n&u$f|e7u(Ul-;SEn)0KVctA8D2@`XS_a6xt&=gPATia0QAmc_{o#M z=Gc{7xZ0vzUv7f)DBL&paE^CiSYeE_ja&Z=E?cayS*n)^a?DdwjB2ln%XeCiWA8)N z;dJ@~)Ui7mLw}vC;E}YQRID=+G4%Bdz>7-wa|A!Z;rlq;p)cU29Db7EMI3I&;RJ%+ z3)I6^3p@>Q2BMN5??)~hC-0N(SsOlVg#Dk+XXHhW8p`o2SEYG8$9&qUzl9w2hBXiJ zD~?HLk`Ce9T_vF?CjXo1Sq}Iz3W{4YT4Fy@IEZX>I#`|fAU?chlfHsP-8}<r1FsZl zoeK@k4B{+S!rz|;0$&_*&|7={Q)rRBM0pVGbcgdC&d1juXhDZBbBB{d@~5OT^@gC8 zcg(45$`w#gz2WCj%7vaVRz0bPNqxW`KGNVe?*aDVw9qM&-4Z{5u!>U*TY@9^Z}^dW z7nb}2lAU;M3TLA7gSSuDanOzvc1v-Trs!2U>Q-+$U+2f`Uc-De9XeqT9j<#CJUu~) z@XmM%(?1mhqXuxeZg3#0Wj_wE4XJn%T&Dt)vAv<J7xc*54_Pl9$F%eYvG&a66IUC_ zChpH@OiNS|o7dI^KgQuVI6M`T=f7IWtraY{a`+Ev?4v>zqaY9HEIzUsVW>kIt^nYf zKCIcsumf>+9s&7%ZZo6+Q`od?d1M-D(PL8|H3fW07ZS^<b=f)+fNh*@ygvbPeyjOG z-me8o=$F&TKFOLQ@Q(dKY&jVn!?1D*4|1-(OnW88`gjk(>45Q~<%vKn+dY<G3V?-o zr|hXbdkxP%yeG1^;kC6ScmRiA;cy*Mp>ZCp7!<#NZtuB|<6e%RqSlVjWAJAL-^<}? z9G*k)HV$th_#O^BINX-tRUED$xC@8x;c!1{d_KYWF#c@9J9E4_$MuBg@Zwnn$8y-; zmQg~XO?Q6|ClS1pi{&8>Pf7sXk;82X9?DC<&0!r?eq$~h*%c3HzQ@mTnd6TTeum>; z5KRA@Cg`-sI6U$mz#npWJHe|soEfT};1@Z(n&6cj?!#dfZUg@kz@Y;qk0zk|o^|CB z%G`nXM8`Ad&_G5ZGbv}%%7(z}IPNd|3kBd1gK?A*NqmUat=B_r;hjDd>Q{?brkAs~ zQQ#x1wBfBTIL}7lvJw6b86w;FC)l#^_S~o}?AJYIW_a3|8{m;+n{sfuQ@;z#z(*Nm z&5%b=Ux!PJa#rLhvR+_kfUB}-U$zdVur4CAVZ}=PzhPvQldUtR{(BAiX(EDb9gQTI z3R(Uhh;tc8Cj@U&^uZmoJ*)VT+q7X*yBeb4pE`%(<ACpZnUk+Eg29uCx)~f!CHOfG zALnp?qVC-sjv@G24sYY|AsCl_J%?}g20XPnncFz5=J+V0_s<2a@ox#w<$asa;cvj4 z{yKtb1BX+KkjoJy*gS>EZw-hbfBtbYjzJpcdAAnXZj%z1J8(-faxCn`=kafzO)l*9 zSHf7llQve?WR1Zr&&&d8`Ghp>h4c3_GbpUgyh}}dA;vQh%%6oOo2xVd%gqPaMCjKB z@|jT^E>OocT;shdFsgk>()brX)C;0t#+tR~B~F%d4j(46oZ|3Nf?wcpK8M>Ayqm-C z_X5H8Y~^Gb%JJ4jmghLGQt=kN@tz#+M(~q>vD%1ho!GR63_Et^vD>FTbFp(?iUH+p zCI4$Oj7@ynQ%S+iL0Gvsy-qi}+>xur?$_wd-lcYazU7#EshL>b%*U<S7$a$n0`G;9 z;A6a#>p1LzMENhz3I=gRc+xKC=xw9qf%vql^@T~CoPVrT7eC*@bAeRL8&r*Koec<_ zo9G{mIOp66c)H^Sf~qm1bZfM9g@n*wh1zMUqfZAa;ZxAyo)XLr`+sF5Rr9q%v7Ww% z?o>@OG$zs=t2TzW5%;H{D28ll%h=JnlhS^mG|ABOUOe|(1oG|p+us?d0_a!=N?QtC zPANoI?3&A_!CorEVekZmxZhKY+DoiMC*pMm)ba8ymbeRvh)IYQ=Hi4NMXduf1iZRD z7Nu}lAM5u#ehRgQ2Pb4XaNkslx{3$y4TDFYrY*e3fA$!_C>=F<Y)N>DwJ&Odm1{xi zdP6<3B8nC+`J3YvK-utBJeh_?tzdIxOe6@Tef)7wBsuC$<d;)+BM+kxt-Ev)?-<ci zHdFw`@_S+|(dtlNb|1}9N||9BT%QoqGKwhz<oE<pT<)32P+GC`!cU^aNKp!mf&n%f z>Cjwek{j6&&nj+X*p5Poc4E;<pWv|_9zCIpYa7r_)I0~7zyad;iGjha<8(X5f94~i zkrvg`?V=SByE{HZ_RktPZDM~i(`U#6MZj?J^^(6oBgiL6h4Zs=Et1*)fQxx4{C}T7 zbT85{erh1;YTzyG$Z=($j1f(g2jZ?np)ufnj7ib{fBkB#0ugsZQbl<L?wt&Y5W62_ zm&z=43;N=+8}6)C)$>}s)p$qrCOwPTVig4-XTOWm5aa%)@1)_51<V2Zb)jn$Fu!eM zoYF0NIpz<1yG;6&rbg`9#VLK~tO<s>aEZ>+C@kH88eNuuT-Z?wgMM>qZ;6&#Q5fPE zYktO+xl8`v9;FLu-{XQA48v%0ZP#O4M7`LD&$NU(6hMcZ@?wuBQ_jRK6m;x{({jBq zj^CTG%Q|^3F3Qkd^BNo-*se))ZaOVTaaA3JG58-t6L6@dxwL;~N<}yT)L(T<k4HEq z2MYYhwJg|CmG@!}_dEgu-@f1?TK*~Yh)Rxe>+W@*>Dp&&G}z_zPDD7`)%|BC-QI_{ zKL4t(`TLuvXw^ry>=F{=(yVcXarfMVKX}?2_kMrf)|_o4o8Ox-eO_Vy<5LT#PwO5x ztLX8`?)<|1>GQ1d)8eunqq7mVq|s~CE$>He{on(KAtry`WcTd()8|f~HokD;_^A(1 zpH(<{YW}o71+y1TR;#L`<0$+8XQt}v?ydi`+}11AOSP>E=jKm+3@!GJpQgUFFF|cM z5c%rY`&wxGso#7mcbq@nT{wI0fB};;Cr_I`V`|Z3XttnW`mAaAUu|~STJqT%tu{&R za70w69EoC2&aJ`2&xR#THd-zPgZHOXw=|l#bow)Soi2l7_@%SInuv6D-BGh=8<ax| zQmWH%=^68$_+T)YfG{252JGLbAWVdgE<q?FoH8&NY(SYTTnVQC^JNu6x)|Gl@HK>I z5wgprwqWoJN=FzSrqNu+y=$D*Ya*N|hp=jRFt`r?^GnTHJZwWkVh%Fu(Gi5X2sL@Z zU?IX1+&ed7&z%U4a3P$6ko`{p!BZO$*Ff-%SP&zy@RuP>M7S2=6dVT3#2SMm?%)du zs}VLJoPx6tGAQGg1%oCd6new*U~nbYs<Q|;AWW|e2LC`<P=$(Hpr;695H_p;1rVNH z6%0-Rk4#yO3K3q0Mo9yu(q9P%s}UBw1`3+cafE3IH{)%d<p>Lo1cRr-(UAt!2TC>| zOiu)fF5`jzZ$*hv-!6m=2$v&VcN`?52EIUpD3J9fI;iFyzgJgoRhJ&`W7sty7%Wh? zAHTbg2D67Q-~RnSZCwj=l-0F9=bxF72l<%<!X$*p<Y5dcgainoRdXkgfdnE1i4ud7 z2@iz=As4A}RUu))qFhBC?tk&8_TfmYjV)zio3%pkRXex!TDaE-R$d}vXuH<sD$oR~ z(%W9=e*2t#tc=}j&7AXpd!K#I*=L`9&YXW{em`=Ejbb<I#KuigG2XlJ`qOPr`H9JN zkSF%zHM$0uCF6@RzSs~b!sj!3;D89$IA1?8!78qCcAcoR4%ayUd7{ud7<R6l81EYh z<0qj`+R6FjFD}5UtqY0>Qu2=Ch0c8^+t=NS%h~9me`zAIokSXK{}Wc7o%^__&JOPJ zHrl1Td<}NRjudNYx?Ngp2f?ee{dIQgJXlgtL$;uN1m$mmTG3$pJwm42sm&QtTt>m$ z*_uc^;Jk6NFlD|yEIs?2k55jwUiUbA-w#-xgU)TI@_qDsqHgEjQ~%(jr%Rr5o;?-t z?L=<adHK{WzE_cJasKbra$hmrZP>Z@bkF1%ay!>05;#y+^g7-LfJK3ojdQM?o9NhQ zMomS1>C(O~7u$W--AHSx1ucXuWF$<;be~gsGG~1_!?W1%mO`cuJgXC#Foc(x;$OFr zyB$cYL25k6EdbJHkW4RfRB5BV+p4vr);&-K2SO`%VoD4@;=FREJmm<o8@4)E&y+2| zu3cQh<;AUu#52?*tIsAM3F76&Wa-|9S&O{bV*7Vk*1dM>{9o5n7SK+-N+C14H<38x zQ+?lddX#hfyUQmW20R<{jE07&5wBN)RqS+r_3pfKKc-m&rdtv7sm5ZOf|z>Pbt)>w z`&?ifzU9n0TavyS*}mP0gx~AjcXprbasGNXw{jv}`{HYf#2nHCyZE0ZA9}(Qwu6s* z!*=N&@}XTRwf5W{qvqQo>*qB1lc_d(_~*IbBoa@ly3h}#j{tk<G3SZ*N+!^Bzx60S z>@j;9(wBf;KkB^sURlZ|WOqO2eD>a*E4CL1k)J<$RB9A$m<zFDybdB_%*O=vJ^&Yj zxprAgGE<tK^gQ8x+_xuX$0*NbZ#s(9W_a2?<-wM6s)ec`lHY7;zC*}|{G+~eQ-SkS zJfJB$Q~R4YAKE~x@j8ci^Uzbyhv!yKYCuJy{fPw43!-Mc+JM~(tjy^=UF?fW&ubQW z+Soc0YD7!>Au#bf2(TqIZkS-oLVcF!=`rw}Rq&j}_I|6$j=_ui;Z29F1@;lE!MW#r z&`M2n&c9!r67-RzlX|{*T$e<4849%^t%Lh{+AU|>`DruKFeP_ei@<4sx_VX@hPp<m zTW-fu%~5NiecWox@Ki|W;Q9Pu2u=JG+8K=_e2||h12)*XJ3RC3pr^?h_d&sug?5mJ zaqeg#zKi2bIENx~=VoA~6$qt-ATBJkQw8CxfmZ;3m+*zQ-#TWeHX!>5@ZGODkA6^B z{wlID_!GI4Azb<Yl8R3hzxU_-a-6t2wv_&jU3&9;KfmyUyV4iL*kR4Hk|V}}S%G;} zv3Ue?h}r@&k2uy>aPHqa|9h#Vpq}eCO`s=J6PfESr}FZYtbu-w;yhVV)akrDMaG=% zmuKL=*<VEdE$8jaGwM<knonjV@^gmUAdKB`ysC(nCnAGK(w(|1iz*`UHX`gWH&N=P zH_$L&=Q1C6gcaW@7#ZvIWrpQNr}pYtr^WI*6@QGSJ;*E0E_!x3_|u%!;p2JqQ}tw` zXL;vBOO7X1L@32NOG|4qd9XZ|j&{B_GEYXKG(aX8$?=X61O3j=M#`Ja<J!Mi&Lgr# z?#VAAI`0u<Meuij4<9F@=tqtxN5qf@WWTx!;2DpE=89D3pRV@E!;ZWb$fGkqqL6wQ z0%y^}61J#tD#7hnyJj73NZ|D6+)i+fYbehJXCDTg%0`^M*8;s2`1%h~9uLmP;7Z{a zp*J*6Ya&q)V@&waZ}m0J6QZe%4=3R>84odDpv49LGfV05YrI#OX6-i>ysafof&XGW z#&{7c@*-?egMy5AGv2~@=(q;nVf-xPLvLx|4wYa-HW_|Liu#z*$_3Ui9%Ote<3C|M z{-y@*Wc(WAA;woTUXO)P>1T`LKt|ESz^z^kL};A`zQK$%xGoJ)oblZl5+XWTBt?QN zn5tp%2Fu5IBA8voCoCW5ij765W2i|##fpuj!^HT#U{D1SE|AX^{E7>hV5DLlc<(Fu z@xlZn<14pdAyYl(v0u)5zU^H2IM757r={wLvl-^(dB%fDp^hH9s{Azxf6J-;B+ztT z)rC34bHM2IA$U+J6G#o71zaL>N0a1L+wv+DH(N~noss9%xo|bmTLZ2TSt5D<&p@EF z$ckoCaG@ni8)kG;UF}NGxG%MNJ>$u3+ots7mI)JhS-<!fFtQK~Vi)yYo!qeIJm>8F zG?4eN%oUy`3a4M+6aS3!@1F*muQ4|m)9w|@)2R;uk#q*TFE1nMziypEiI`&W4b$4_ z+Thi|De^85D_A0QA@y#OpdYFebuk`G8Burxolb$iW$@$s>gk&H%|x!V{d%C6_7d3` zz?StIrJWDaF~(yn^|jgUeFWSu^00~5+BFv^MZl>)M-uu#3bRy^jqxJ=F`jm1h%-dx zz#-o&;x93RzZ4+G+c2JL&_ud|L3AQ&SW)yg4NPTx8kWN#8bto~MT)R|T$vZ!I%Yo3 zcql>uE;_jWL(a2*4)neZg!&QrGasyBb`zZjUWk5(AL;8Bu5AStU6PO8^O~~y5S{CS zwlaS1C>~l1GWK|s@q<Zr>eo1Cc~XHRU=-qPVC<w5T=XR_YWn*T@NAOk9h<3bSFwhw z#6WSavl)+b=wj32&*-_cBf7Ky%qp81pEmt{73EChJ6X^1Ra(CZ72nYEWumX>g=S)z zIq;~dzzhy+dfIvMFM;0wU~Z`Sw2JQZ?-o@09N|_Tj?+yS3B@-^SU$G#kQ!9u$vzAV zjltYHEpM7j|CLR+xOU@M)&Pf#jTb}sDhJUETu+1;WXY<Bxo8BpJ&EW$uS8MChu+bX zsju2m_yJSW_p-@NI*wccy5Z+;AcQKqWF&fX$LIzQBsoI`<9%mzz!|_b5uN>0hgujn z8lQsuXIr#!(sJf~1<S`-zcJXuzzY#i>aDEK?;%g~t(%>q59=k-%Z&RU*4G0iIz7#J zT)8#AA){fDil|I&YvZ<kJ_yc>p9OlWnH&7a8|}G(@rUTa1t3#uIpgt~RVpf!axH5a zPmO6k#sWJT_clniu`qg`0geUG8T>5E_Y35MG`f{<vUF&c)?)1PdnFB9s6dH53)hNL zi9jBG2p~(vc}4vSb7w1VBjy$bh?XB}SbeNTb{lbf_kv5-Ihr)P4*(~fK~|>DLs04n z%LhMPsFnc}<c~2P`KEp<i0IKhILCU1d1lVku=qsFj~78UjG1GZ=!A0hHB*tJ*_Is9 zt4IP(i?T7w(0!tQl1EoUNpAg1#!n=5@paNeX7>%5T<0~G4bBNF8=LOYooK4___Mk$ z^$`-;DUA2EYy1#9X&Z2A%bBD)e?(5VdJS{q%r(x^!+40-b7f&D-oyBDp4{*TMc-%q z^`u&U0-V-l9CxzB5KHuN$q~jQ8B-ewGT|Zxwxo6klWaJF@el`I`VSr|N4BR`H+hk( z2A(Yf_=FN6vA?m~iJ{hnCy^t+tax5a{6;6@K5R_<Xu{fKdVykC<mc$7`IBZ?HRFA} zy)ZMZ3Al2TGOb}dD_X7PdqrRF6&)(B=qbL13j{fUJi`Tkz!gNeL1wgm#`2Mn7EJf( z^uJktsP3g3Z2Kw85A~27qE#6en1rtwsFk$$Hp-DreyCMpk|<gUoNSUj6}o^^A0yMW z+yl@`^eAu|#t28RTn&roSby|64Lrs8O#!8+SG4qN<X&b}X@-dN=4LPBt-z^*zOs*Q zu;KlT=Ozu(4%RbVpcO1&J<qdzd^+t?u$3|E*)ey-BLkEE!2CzJBa+Ldphwz`Zl)ZW zphmOIF-sG0YGHrU61I!+;FZyBRKo0IV~mUS+U??Og2TW`f2dIFZ{guTs^!Z?r1huE zh-Eg=|HFzRyxzdg6^+W{Ci?=&sdztW7IJF3U4298FpXJkWUKB+?(ccT9+E(_4)cH+ z!+h72oHU3W=@v;V&)Y_#YM6Bd+1u2o1GF{4C5Nu)R+&{OAIem_tICig-9z1a!(-ZA z&v+j%GW5+>qPtAVJGzmhc6YaF&LN$Mm?_BvZR&i5alsB{`uPXO4<`m!`s7yc=*o(E zx@*?bxn*soyCO~Ak~#CvE_EaAbLeY>AK>Uv%31D*>GCn}T+z|)9?p<c-2EA{MqiGM zk&_3nXUG@4fkjnI7dPJ(uAH@QWA~=bTRL$YZu6#|u={<#d?&M=xwGjep4*ir_oP)n zxbA^<xXl-KhqL68(xqEwR&;c1S&K3q8`gB)zh!O5n$4RxZEjh(DioUE+*DWJ*48nr ze70MYE!U0tVlAsSZEz?1W#Ql}*>Z>cayRnaF2Brh@lD}~zv}kdwvJYMTNZAb-`MKz z8z+yt^C!s3rIpoRx|0{)h%R^aY`n1nKhBZ)qrV#F+mx;02M7NxNB&w4UJS?|%k0Xk zrS*&N2zP|rS{5$~FKV3`c6aB=iCLAi8s;s%y>s*WdUZoHyv}_(PfqyKFsR0+4-VwX zS7lbRuFAoU`Er*W)4i#Oo76G0eCAi3IVqC|{gdQ0&tNDhgVM_NxGM`}d6qfUGwECI zvjuWSmN_UiX`Ook@Fa7-Xi~wxLm!;H?({-glx|M{BI#~>p`4R#PAX06x7-7Ta+~aS z3yS27v?#~psC##jtj><{rAf0~_dt;>PdB^WfqwUFk(`$qDPkw5#3}HObwkC{??&+^ z2i(qLIV0N~9hx*X(>+j(9-E^>lTLImKs?Qy5JcU)n`CvGIsAyZchjXg5A1ipjms=^ z{BZG-Zbs0(a1*R%4ii%UsNw5wL5b|mY&@nvr7KW1HeMnlnSEF}h-lNh*qwf}{7QOU WJ#rY=`R>Y_<s2(s;68n`Ect)!$EK73 delta 35575 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 G+x&k>j2guN diff --git a/run_local.py b/run_local.py index bd6842d..7bea024 100644 --- a/run_local.py +++ b/run_local.py @@ -26,7 +26,7 @@ def GetTestParams(tid): def ShouldRunTest(tid): #return tid >= 22 - #return tid == 2 + #return tid >= 1 return True DEFAULT_SPEED_RATIO_MAP = {1.: 0.25, @@ -127,7 +127,7 @@ for test_id in range(NUM_TESTS): avg_nda_dif = (total_percentage_num_done_agents - total_base_percentage_num_done_agents) / num_tests print("\n### test_id=%d nda=%d(dif=%d) pnda=%.6f(dif=%.6f) score=%.6f(dif=%.6f) avg_nda=%.6f(dif=%.6f) avg_sc=%.6f(dif=%.6f)\n" % (test_id, num_done_agents, num_done_agents - base_num_done_agents, percentage_num_done_agents, percentage_num_done_agents - base_percentage_num_done_agents, score, score - base_score, avg_nda, avg_nda_dif, total_score / num_tests, (total_score - total_base_score) / num_tests)) - f.write("%d %d% .10f %.10f %.10f %.10f\n" % (test_id, num_done_agents, percentage_num_done_agents, score, avg_nda, avg_nda_dif)) + f.write("%d %d% .10f %.10f %d %.10f %.10f\n" % (test_id, num_done_agents, percentage_num_done_agents, score, num_done_agents - base_num_done_agents, percentage_num_done_agents - base_percentage_num_done_agents, avg_nda_dif)) f.flush() f.close() diff --git a/scores.txt b/scores.txt index d1735f3..93e5927 100644 --- a/scores.txt +++ b/scores.txt @@ -1,111 +1,71 @@ -0 106 78.5185185185 -52994.1666667134 78.5185185185 2.2222222222 -1 100 71.4285714286 -44207.9166666883 74.9735449735 0.0396825397 -2 49 40.4958677686 -49127.5833333638 63.4809859052 -2.1774017229 -3 80 100.0000000000 -12663.0000000030 72.6107394289 -1.6330512921 -4 99 63.8709677419 -98876.3333331863 70.8627850915 -1.4354732918 -5 124 94.6564885496 -45629.8333333515 74.8284023345 -1.4506806694 -6 133 76.8786127168 -71251.7500000302 75.1212895320 -0.8305586580 -7 90 66.1764705882 -47082.7500000240 74.0031871640 -0.4510035316 -8 88 73.3333333333 -39408.2500000073 73.9287589606 -0.1231142503 -9 63 41.1764705882 -78234.5833333309 70.6535301234 0.1506350832 -10 81 48.2142857143 -93231.6666665908 68.6135988135 -0.4041845564 -11 93 89.4230769231 -18525.5000000024 70.3477219893 0.0301385156 -12 66 60.0000000000 -47917.5833333604 69.5517433747 0.4474005878 -13 115 72.3270440252 -53697.9166667235 69.7499791355 0.4154434030 -14 84 68.2926829268 -61577.3333333941 69.6528260549 0.7671509702 -15 84 44.2105263158 -137849.0833331903 68.0626823212 0.6863092977 -16 47 41.9642857143 -73369.9166666747 66.5274825208 0.5934171541 -17 94 65.2777777778 -59859.8333333889 66.4580544795 0.4061285468 -18 80 43.4782608696 -69422.5000000359 65.2485916579 0.4133574791 -19 75 93.7500000000 -24955.4166666572 66.6736620750 0.8301896052 -20 117 89.3129770992 -42584.0833333417 67.7517246952 0.7179559308 -21 89 74.1666666667 -48544.2500000212 68.0433129667 0.9883518733 -22 58 52.2522522523 -64849.3333333850 52.2522522523 -2.7027027027 -23 133 81.5950920245 -61359.7500000714 66.9236721384 -1.3513513514 -24 77 96.2500000000 -23466.2499999932 76.6991147589 -1.3175675676 -25 77 40.7407407407 -106668.2499998568 67.7095212544 -1.1204508080 -26 96 96.0000000000 -30766.9999999834 73.3676170035 -1.4963606464 -27 107 74.8251748252 -49891.7500000391 73.6105433071 -1.7131676715 -28 159 85.4838709677 -79484.3333333132 75.3067329729 -1.1612097707 -29 116 77.8523489933 -41342.0833333376 75.6249349755 -0.9321659319 -30 63 45.0000000000 -78791.7499999835 72.2221644226 -0.7492268601 -31 72 45.0000000000 -101734.6666665632 69.4999479804 -0.9868041741 -32 96 81.3559322034 -29777.3333333180 70.5777647279 -0.2037202815 -33 111 80.4347826087 -50994.8333333660 71.3991828847 0.5982805632 -34 85 51.8292682927 -85673.4999999486 69.8938048391 0.3177374054 -35 60 31.5789473684 -110669.8333332141 67.1570293055 0.1822599216 -36 80 100.0000000000 -12376.6666666689 69.3465606851 0.1701092601 -37 117 70.9090909091 -58963.6666667266 69.4442188241 0.3488713708 -38 107 55.4404145078 -82089.9999999491 68.6204656290 0.2673925001 -39 56 46.2809917355 -71158.4166666919 67.3793837461 0.4361920904 -40 89 72.9508196721 -45861.3333333560 67.6726172159 0.3269533350 -41 97 59.1463414634 -69539.5000000394 67.2463034282 -0.2076870147 -42 137 90.7284768212 -66168.0833334116 68.3645021612 -0.2293329500 -43 83 69.1666666667 -56323.0833333781 68.4009641842 -0.0673935735 -44 108 90.0000000000 -53023.1666667064 69.3400526979 0.1891597703 -45 96 61.1464968153 -52345.4166667038 68.9986545362 -0.0575753900 -46 100 100.0000000000 -28655.9166666502 70.2387083547 -0.0552723744 -47 59 41.2587412587 -73483.5000000128 69.1240942356 -0.2683159598 -48 109 58.6021505376 -89732.5833332534 68.7343926172 -0.3977650302 -49 99 76.1538461538 -37966.7499999993 68.9993731007 -0.6308118835 -50 86 46.2365591398 -102455.3333332078 68.2144484813 -0.5905206320 -51 157 95.7317073171 -57933.9166667299 69.1316904425 -0.6114870175 -52 102 64.5569620253 -64526.8333334077 68.9841185581 -0.7346771055 -53 100 76.3358778626 -50002.1666667060 69.2138610363 -0.7355734078 -54 80 64.5161290323 -58572.0000000626 69.0715055211 -0.6399695215 -55 85 54.4871794872 -90309.4166665866 68.6425547554 -0.7719764511 -56 32 40.0000000000 -38966.8333333342 67.8241960481 -1.2142056954 -57 112 62.5698324022 -86876.2499999231 67.6782415024 -1.1649594478 -58 43 43.0000000000 -65179.5000000446 67.0112620023 -1.1605010844 -59 55 48.6725663717 -66837.1666667170 66.5286647489 -1.1765382007 -60 80 100.0000000000 -13154.3333333361 67.3869041143 -1.1463705545 -61 45 56.2500000000 -46214.0000000229 67.1084815114 -1.2739612906 -62 65 60.7476635514 -32065.0833333149 66.9533396099 -1.2200944436 -63 50 31.2500000000 -123192.4166665087 66.1032600954 -1.1166398140 -64 98 98.0000000000 -31738.7499999803 66.8450447444 -0.9743923764 -65 115 63.1868131868 -82612.8333332802 66.7619031181 -0.9897096326 -66 121 68.7500000000 -88025.5833332582 66.8060830488 -0.9424635600 -67 125 99.2063492063 -32734.8333333157 67.5104366609 -0.9392284998 -68 65 63.7254901961 -52030.4166667080 67.4299058850 -0.8983855071 -69 104 75.3623188406 -70565.6666667117 67.5951644883 -0.8494759057 -70 91 77.7777777778 -30848.3333333199 67.8029729228 -0.7449252898 -71 58 48.7394957983 -58469.4166667139 67.4217033803 -0.7468335067 -72 75 62.5000000000 -52436.5000000436 67.3251993924 -0.6178106275 -73 67 50.3759398496 -43178.5000000146 66.9992520935 -0.7505219037 -74 56 31.4606741573 -80463.5833333191 66.3287128872 -0.6409614947 -75 100 100.0000000000 -23030.3333333288 66.9522552411 -0.6290918374 -76 104 96.2962962963 -25798.3333333225 67.4857832603 -0.6344888208 -77 127 76.0479041916 -63685.7500000835 67.6386782769 -0.6445444631 -78 100 100.0000000000 -26668.6666666557 68.2064207633 -0.6332366655 -79 99 99.0000000000 -35319.3333333249 68.7373445433 -0.5016291368 -80 53 53.0000000000 -54447.8333333684 68.4706098900 -0.4422794904 -81 90 81.8181818182 -53478.2500000406 68.6930694221 -0.4349081656 -82 72 46.1538461538 -67439.8333333807 68.3235739587 -0.3542182040 -83 89 79.4642857143 -49547.8333333713 68.5032628580 -0.3485050072 -84 104 73.2394366197 -45276.8333333596 68.5784402193 -0.3765077223 -85 75 93.7500000000 -26804.4999999886 68.9717458409 -0.3315622891 -86 76 95.0000000000 -35835.1666666628 69.3721805202 -0.3841536385 -87 54 67.5000000000 -29709.9166666537 69.3438141487 -0.1889391894 -88 63 41.4473684211 -96082.2499999295 68.9274492871 -0.3530477169 -89 144 77.8378378378 -77835.3333333143 69.0584844128 -0.3558049643 -90 108 58.0645161290 -93165.1666665567 68.8991515392 -0.3818155827 -91 109 68.9873417722 -92862.9999998706 68.9004113996 -0.3582778917 -92 165 83.7563451777 -73850.5833333622 69.1096499036 -0.3818297081 -93 112 77.7777777778 -77321.6666666580 69.2300405685 -0.3668814559 -94 109 88.6178861789 -51253.0000000381 69.4956274946 -0.3729927802 -95 117 61.5789473684 -76918.4166666489 69.3886453308 -0.3252780841 -96 112 75.1677852349 -44968.4166666938 69.4657005295 -0.3567352264 -97 84 46.9273743017 -134604.5833331629 69.1691436054 -0.3814444586 -98 81 49.0909090909 -109069.8333332032 68.9083873130 -0.2899105478 -99 74 45.3987730061 -97883.7499999059 68.6069820014 -0.2861937460 -100 80 100.0000000000 -21479.2500000000 69.0043619761 -0.2667482555 -101 105 72.4137931034 -47613.3333333678 69.0469798652 -0.2375518333 -102 91 91.0000000000 -32946.4999999819 69.3180048051 -0.2222734156 -103 82 75.9259259259 -47043.2500000287 69.3985892090 -0.2986052213 -104 128 68.4491978610 -111117.9166664922 69.3871507591 -0.1725927752 -105 181 92.3469387755 -67885.1666667449 69.6604815688 -0.1766119574 -106 116 71.1656441718 -55325.6666667173 69.6781893641 -0.2250574465 -107 135 93.1034482759 -48175.2500000327 69.9505760956 -0.1823442685 -108 135 68.1818181818 -79761.2499999593 69.9302455449 -0.1860535356 -109 60 60.0000000000 -55615.5000000359 69.8174018455 -0.2407574727 -110 69 86.2500000000 -41840.6666666809 70.0020377798 -0.2240073887 +0 107 79.2592592593 -52253.3333333783 79.2592592593 0.7407407407 +1 98 70.0000000000 -43813.6666666879 74.6296296296 -0.3439153439 +2 57 47.1074380165 -46015.0833333573 65.4555657586 1.9745798534 +3 80 100.0000000000 -12641.1666666695 74.0916743189 1.4809348900 +4 97 62.5806451613 -94266.6666665390 71.7894684874 0.9266833959 +5 120 91.6030534351 -49427.9166666963 75.0917326454 0.2633303108 +6 134 77.4566473988 -69347.5833333812 75.4295776101 0.3082880781 +7 77 56.6176470588 -47386.2500000265 73.0780862912 -0.9251008728 +8 78 65.0000000000 -43703.3333333540 72.1805211478 -1.7482378129 +9 66 43.1372549020 -77183.6666666561 69.2761945232 -1.3773356002 +10 86 51.1904761905 -93239.4999999266 67.6320383111 -0.9815605023 +11 94 90.3846153846 -17857.5833333366 69.5280864006 -0.8196355887 +12 65 59.0909090909 -50743.5833333633 68.7252266075 -0.8265167672 +13 121 76.1006289308 -54317.4166667216 69.2520410592 -0.4979380763 +14 73 59.3495934959 -70854.1666666939 68.5918778883 -1.0609481666 +15 78 41.0526315789 -144834.5833332693 66.8706749940 -1.1920073272 +16 39 34.8214285714 -84546.9166666405 64.9854252044 -1.5420573164 +17 90 62.5000000000 -60058.3333333910 64.8473460264 -1.6107084531 +18 86 46.7391304348 -65792.9166667310 63.8942820479 -1.3543096100 +19 70 87.5000000000 -29605.7499999869 65.0745679455 -1.5990941295 +20 117 89.3129770992 -41680.7500000037 66.2287779052 -1.5229467900 +21 86 71.6666666667 -47557.5000000121 66.4759546671 -1.5673582996 +22 59 53.1531531532 -60402.3333333834 65.8967024273 -1.4600426822 +23 140 85.8895705521 -60829.0000000624 66.7297385992 -1.2202709651 +24 78 97.5000000000 -22534.4166666619 67.9605490552 -1.1214601265 +25 73 38.6243386243 -110503.9999998534 66.8322332694 -1.1597271261 +26 100 100.0000000000 -30430.6666666492 68.0606690743 -0.9686261214 +27 114 79.7202797203 -47854.1666666946 68.4770837402 -0.7592071566 +28 157 84.4086021505 -80125.0833333066 69.0264464440 -0.7701058345 +29 115 77.1812080537 -42055.4166666740 69.2982718310 -0.7668070047 +30 65 46.4285714286 -74360.7500000019 68.5605395599 -0.6959883455 +31 73 45.6250000000 -105455.8333332199 67.8438039487 -0.6547074597 +32 94 79.6610169492 -29424.5833333177 68.2019013123 -0.6862289081 +33 108 78.2608695652 -52800.6666667034 68.4977533198 -0.7299843238 +34 94 57.3170731707 -82580.5833332968 68.1783053155 -0.5523332038 +35 55 28.9473684211 -111816.4999998949 67.0885570685 -0.6100900300 +36 80 100.0000000000 -13770.9166666695 67.9780555261 -0.5936011102 +37 115 69.6969696970 -61363.2500000610 68.0232901095 -0.6098779550 +38 111 57.5129533679 -81642.9999999582 67.7537942956 -0.5410980367 +39 45 37.1900826446 -78943.8333333228 66.9897015043 -0.7548433130 +40 88 72.1311475410 -44856.1666666890 67.1151026272 -0.7564245037 +41 98 59.7560975610 -71466.9166666873 66.9398882209 -0.7238963942 +42 137 90.7284768212 -70315.1666667072 67.4931112116 -0.7070615943 +43 73 60.8333333333 -60773.0833333870 67.3417526234 -0.8803859520 +44 103 85.8333333333 -53733.9166667133 67.7526766392 -0.9534144123 +45 106 67.5159235669 -48753.3333333658 67.7475298333 -0.7942222131 +46 100 100.0000000000 -28320.2499999840 68.4337526028 -0.7773238682 +47 64 44.7552447552 -73679.7500000149 67.9404503560 -0.6882857981 +48 112 60.2150537634 -90551.3333332425 67.7827892010 -0.6413227568 +49 101 77.6923076923 -37641.6666666650 67.9809795708 -0.5977270709 +50 87 46.7741935484 -105831.9999998672 67.5651602371 -0.5754650811 +51 160 97.5609756098 -58274.7500000625 68.1420028404 -0.5292202085 +52 109 68.9873417722 -64424.4166667400 68.1579526315 -0.4356428508 +53 104 79.3893129771 -48585.2500000365 68.3659407861 -0.3710302959 +54 83 66.9354838710 -57931.6666667261 68.3399324785 -0.3202960208 +55 90 57.6923076923 -84169.8333332827 68.1497963216 -0.2573420167 +56 41 51.2500000000 -37359.4166666658 67.8533086669 -0.0554588234 +57 113 63.1284916201 -86557.7499999206 67.7718463040 -0.0448705814 +58 46 46.0000000000 -60018.7500000442 67.4028319599 0.0067373946 +59 49 43.3628318584 -69878.8333333615 67.0021652915 -0.0818704705 +60 80 100.0000000000 -13421.6666666696 67.5431134015 -0.0805283317 +61 50 62.5000000000 -44936.7500000187 67.4617728628 0.0215769640 +62 63 58.8785046729 -31723.6666666487 67.3255305105 -0.0084347160 +63 51 31.8750000000 -120561.6666665172 66.7716159713 0.0014627014 +64 95 95.0000000000 -36285.5833333243 67.2058988025 -0.0447136479 +65 115 63.1868131868 -82509.1666666177 67.1450035659 -0.0440361683 +66 115 65.3409090909 -93240.4999998991 67.1180767827 -0.0942608660 +67 126 100.0000000000 -31547.9166666512 67.6016344771 -0.0812033416 +68 66 64.7058823529 -55811.0833333807 67.5596670550 -0.0658178996 +69 107 77.5362318841 -70951.0833333741 67.7021894097 -0.0338217432 +70 88 75.2136752137 -31255.4999999870 67.8079849844 -0.0694595013 diff --git a/tmp-scores.txt b/tmp-scores.txt index 8e791b1..8c327ce 100644 --- a/tmp-scores.txt +++ b/tmp-scores.txt @@ -1,6 +1,23 @@ -0 107 79.2592592593 -52253.3333333783 79.2592592593 0.7407407407 -1 98 70.0000000000 -43813.6666666879 74.6296296296 -0.3439153439 -2 57 47.1074380165 -46015.0833333573 65.4555657586 1.9745798534 -3 80 100.0000000000 -12641.1666666695 74.0916743189 1.4809348900 -4 97 62.5806451613 -94266.6666665390 71.7894684874 0.9266833959 -5 120 91.6030534351 -49427.9166666963 75.0917326454 0.2633303108 +0 102 75.5555555556 -51384.6666667085 75.5555555556 -3.7037037037 +1 101 72.1428571429 -44279.0833333557 73.8492063492 -0.7804232804 +2 62 51.2396694215 -45595.1666666892 66.3126940400 0.8571282814 +3 80 100.0000000000 -12318.5833333360 74.7345205300 0.6428462110 +4 97 62.5806451613 -94641.2499998699 72.3037454562 0.5142769688 +5 126 96.1832061069 -49405.1666666975 76.2836555647 1.1919229193 +6 139 80.3468208092 -68151.1666667239 76.8641077425 1.4345301323 +7 81 59.5588235294 -49230.0833333614 74.7009472158 1.6228609246 +8 82 68.3333333333 -42990.5833333507 73.9934345622 1.8129134145 +9 61 39.8692810458 -81413.9166666491 70.5810192106 1.3048246874 +10 88 52.3809523810 -89825.7499999358 68.9264676806 1.2944293695 +11 94 90.3846153846 -18878.1666666677 70.7146466559 1.1865602554 +12 66 60.0000000000 -50541.7500000279 69.8904430670 1.1652164595 +13 126 79.2452830189 -51728.7500000456 70.5586459207 1.3066048615 +14 82 66.6666666667 -62608.2500000501 70.2991806371 1.7073027488 +15 75 39.4736842105 -149457.8333333194 68.3725871105 1.5019121165 +16 52 46.4285714286 -74806.8333333342 67.0817626586 2.0963374542 +17 92 63.8888888889 -59564.4166667197 66.9043807825 2.0570347561 +18 83 45.1086956522 -69024.5000000381 65.7572394598 1.8629574120 +19 71 88.7500000000 -29238.3333333200 66.9068774869 1.8323095414 +20 119 90.8396946565 -42166.5833333397 68.0465354473 1.8177575421 +21 87 72.5000000000 -49046.5000000158 68.2489656543 1.7730109872 +22 58 52.2522522523 -62205.1666667190 67.5534563759 1.6567539486 -- GitLab