From cf035243f6afcb39a34d659afbca6dba1d625c85 Mon Sep 17 00:00:00 2001 From: didericis Date: Thu, 11 Jun 2026 16:46:53 -0400 Subject: [PATCH] Verify Remark 5.8 on genuine bite treads Bites arise when the inner outerplanar graph O has a bridge: the bridge edge is traversed twice by the outer-face walk, so its medial vertex is adjacent to four annular vertices. - check_remark58_bite.py: a minimal bite tread (outer 4-cycle + interior bridge u-w) restricts to Kempe-balanced on all colourings (outer face). - check_remark58_bite_rich.py: O = triangle abc + pendant bridge a-d gives one bite plus three singleton down teeth in the bite's inner-gap face; every restriction is Kempe-balanced (the three gap singletons are a rainbow in every global colouring). Update Remark 5.8's verification note: the bite case, including singletons in the bite-gap face, is now confirmed. Co-Authored-By: Claude Opus 4.8 --- .../experiments/check_remark58_bite.py | 116 +++++++++++++++ .../experiments/check_remark58_bite_rich.py | 132 ++++++++++++++++++ .../paper.aux | 4 +- .../paper.fdb_latexmk | 6 +- .../paper.log | 50 +++---- .../paper.pdf | Bin 277087 -> 277538 bytes .../paper.tex | 14 +- 7 files changed, 286 insertions(+), 36 deletions(-) create mode 100644 papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_remark58_bite.py create mode 100644 papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_remark58_bite_rich.py diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_remark58_bite.py b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_remark58_bite.py new file mode 100644 index 0000000..371d896 --- /dev/null +++ b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_remark58_bite.py @@ -0,0 +1,116 @@ +"""Directly test Remark 5.8 on a genuine tire piece that contains a BITE. + +A bite arises when the inner outerplanar graph O has a bridge: the bridge edge +is traversed twice by the outer-face walk, so it borders two tread triangles and +its medial vertex is adjacent to four annular medial vertices. + +Minimal construction. Outer 4-cycle o0,o1,o2,o3; two interior vertices u,w +joined by a bridge u-w (V_in = {u,w}). Triangulate the disk so that u-w lies in +two tread triangles: + + (o0,o1,u) (o0,u,o3) (o1,w,u) (o1,o2,w) (o2,o3,w) (o3,u,w) + +Cap the outer cycle with an apex N (the bridge bounds no inner hole, so no inner +cap is needed). The result G is a closed plane triangulation; M(G) is 4-regular. + +Edge classification (by endpoints): annular = one endpoint outer & one inner; +up tooth = both endpoints outer (outer-cycle edge); down tooth = both endpoints +inner (here only the bridge u-w). The bridge's medial vertex is the bite apex. + +Remark 5.8 predicts every proper 3-colouring of M(G) restricts to a +Kempe-balanced colouring. Here the only non-trivial condition is the outer face +(the four up apexes), since the single bite contributes no singleton down teeth. +""" + +from __future__ import annotations + +import networkx as nx + +from check_remark58_bitefree import ekey, medial_graph, proper_3_colorings + +PAIRS = ((0, 1), (0, 2), (1, 2)) + +OUTER = ["o0", "o1", "o2", "o3"] +INNER = ["u", "w"] + +TREAD_TRIANGLES = [ + ("o0", "o1", "u"), + ("o0", "u", "o3"), + ("o1", "w", "u"), + ("o1", "o2", "w"), + ("o2", "o3", "w"), + ("o3", "u", "w"), +] + + +def build(): + g = nx.Graph() + for tri in TREAD_TRIANGLES: + a, b, c = tri + g.add_edges_from([(a, b), (b, c), (a, c)]) + # outer cap + for i in range(4): + g.add_edges_from([("N", OUTER[i]), ("N", OUTER[(i + 1) % 4])]) + return g + + +def classify_tread_edges(g): + out = set(OUTER) + inn = set(INNER) + tread_edges = set() + for tri in TREAD_TRIANGLES: + a, b, c = tri + tread_edges |= {ekey(a, b), ekey(b, c), ekey(a, c)} + annular, up, down = [], [], [] + for e in tread_edges: + a, b = e + ao, bo = a in out, b in out + ai, bi = a in inn, b in inn + if (ao and bi) or (ai and bo): + annular.append(e) + elif ao and bo: + up.append(e) + elif ai and bi: + down.append(e) + return annular, up, down + + +def run(): + g = build() + assert nx.check_planarity(g)[0] + M = medial_graph(g) + annular, up, down = classify_tread_edges(g) + annular_set = set(annular) + + # confirm there is a bite: a down edge whose medial vertex has 4 annular nbrs + bites = [e for e in down if sum(1 for nb in M.neighbors(e) if nb in annular_set) == 4] + print(f"tread: annular={len(annular)} up={len(up)} down={len(down)} " + f"bite apexes={len(bites)} (bite edge: {bites})") + + colorings = proper_3_colorings(M, limit=20000) + balanced = 0 + bad = [] + for col in colorings: + ok = all( + sum(1 for e in up if col[e] in pair) % 2 == 0 + for pair in PAIRS + ) + if ok: + balanced += 1 + else: + bad.append(col) + + print(f"|V(G)|={g.number_of_nodes()} |M(G)|={M.number_of_nodes()} " + f"colourings tested={len(colorings)}") + print(f" outer-face (up-apex) balanced={balanced} UNBALANCED={len(bad)}") + if bad: + print(f" first unbalanced up colours: {[bad[0][e] for e in up]}") + print() + print("Remark 5.8 holds on this bite tread" + if not bad else + "Remark 5.8 FAILS on this bite tread") + return len(bad) + + +if __name__ == "__main__": + run() diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_remark58_bite_rich.py b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_remark58_bite_rich.py new file mode 100644 index 0000000..8d605bd --- /dev/null +++ b/papers/medial_tire_decompositions_of_plane_triangulations/experiments/check_remark58_bite_rich.py @@ -0,0 +1,132 @@ +"""Test Remark 5.8 on a bite tread that also has singleton down teeth in the +bite's inner-gap face -- the subtle case of the condition. + +Inner outerplanar graph O = triangle (a,b,c) plus a pendant bridge a-d. Its +outer-face walk is the cyclic sequence W = [d, a, b, c, a]: the bridge a-d is +traversed twice (-> a bite), the triangle edges a-b, b-c, c-a once each (-> three +singleton down teeth, all sitting in the bite's inner-gap face). + +We triangulate the annulus between an outer m-cycle and W by the lattice-path +method, searching interleavings for one giving a simple closed triangulation +after capping the outer cycle with an apex N. Then we test Remark 5.8: every +proper 3-colouring of M(G) restricts to a Kempe-balanced colouring, i.e. + + * the up apexes (outer edges) are even per colour pair, and + * the three singleton down apexes (a-b, b-c, c-a), which share the bite-gap + face, are even per colour pair (equivalently: a rainbow). +""" + +from __future__ import annotations + +import itertools + +import networkx as nx + +from check_remark58_bitefree import ekey, medial_graph, proper_3_colorings + +PAIRS = ((0, 1), (0, 2), (1, 2)) +INNER_WALK = ["d", "a", "b", "c", "a"] # bridge a-d traversed twice +SINGLETON_DOWN = [ekey("a", "b"), ekey("b", "c"), ekey("c", "a")] +BITE_EDGE = ekey("a", "d") + + +def build_tread(m: int, path: str): + """Build the annular triangulation for a given lattice path (m 'O', L 'I').""" + outer = [f"o{t}" for t in range(m)] + W = INNER_WALK + L = len(W) + g = nx.Graph() + g.add_edge(outer[0], W[0]) # anchor + i = j = 0 + tread_triangles = [] + for mv in path: + if mv == "O": + tri = (outer[i % m], W[j % L], outer[(i + 1) % m]) + i += 1 + else: + tri = (outer[i % m], W[j % L], W[(j + 1) % L]) + j += 1 + a, b, c = tri + g.add_edges_from([(a, b), (b, c), (a, c)]) + tread_triangles.append(tri) + if (i, j) != (m, L): + return None + return g, outer, tread_triangles + + +def cap_and_validate(g, outer): + """Cap the outer cycle with apex N; require a simple closed triangulation.""" + h = g.copy() + for t in range(len(outer)): + h.add_edges_from([("N", outer[t]), ("N", outer[(t + 1) % len(outer)])]) + if not nx.check_planarity(h)[0]: + return None + V, E = h.number_of_nodes(), h.number_of_edges() + if E != 3 * V - 6: # maximal planar == triangulation + return None + return h + + +def find_construction(m: int): + L = len(INNER_WALK) + for combo in itertools.combinations(range(m + L), L): + path = "".join("I" if t in combo else "O" for t in range(m + L)) + built = build_tread(m, path) + if built is None: + continue + g, outer, tris = built + h = cap_and_validate(g, outer) + if h is not None: + return h, outer, tris, path + return None + + +def run(): + for m in (4, 5, 6, 7): + found = find_construction(m) + if found: + break + if not found: + print("no valid bite-with-singletons triangulation found") + return 1 + h, outer, tris, path = found + M = medial_graph(h) + + annular = set() + for tri in tris: + a, b, c = tri + for e in (ekey(a, b), ekey(b, c), ekey(a, c)): + x, y = e + xo, yo = x in outer, y in outer + if (xo and not yo) or (yo and not xo): + annular.add(e) + + n_bite_nbrs = sum(1 for nb in M.neighbors(BITE_EDGE) if nb in annular) + up = [ekey(outer[t], outer[(t + 1) % len(outer)]) for t in range(len(outer))] + up = [e for e in up if e in M] + + print(f"m={len(outer)} path={path} |V(G)|={h.number_of_nodes()} " + f"|M(G)|={M.number_of_nodes()}") + print(f"bite edge {BITE_EDGE}: annular neighbours={n_bite_nbrs} (4 => bite)") + print(f"up apexes={len(up)} singleton down apexes={SINGLETON_DOWN}") + + colorings = proper_3_colorings(M, limit=50000) + bad_outer = bad_bitegap = 0 + for col in colorings: + if any(sum(1 for e in up if col[e] in p) % 2 for p in PAIRS): + bad_outer += 1 + if any(sum(1 for e in SINGLETON_DOWN if col[e] in p) % 2 for p in PAIRS): + bad_bitegap += 1 + + print(f"colourings tested={len(colorings)}") + print(f" outer face unbalanced: {bad_outer}") + print(f" bite-gap face (3 singletons) unbalanced: {bad_bitegap}") + print() + ok = (bad_outer == 0 and bad_bitegap == 0) + print("Remark 5.8 holds on this bite-with-singletons tread" + if ok else "Remark 5.8 FAILS on this bite-with-singletons tread") + return 0 if ok else 1 + + +if __name__ == "__main__": + run() diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.aux b/papers/medial_tire_decompositions_of_plane_triangulations/paper.aux index 2a1025b..08b9e87 100644 --- a/papers/medial_tire_decompositions_of_plane_triangulations/paper.aux +++ b/papers/medial_tire_decompositions_of_plane_triangulations/paper.aux @@ -46,5 +46,5 @@ \newlabel{tocindent1}{17.77782pt} \newlabel{tocindent2}{29.38873pt} \newlabel{tocindent3}{0pt} -\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{10}{}\protected@file@percent } -\gdef \@abspage@last{10} +\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{11}{}\protected@file@percent } +\gdef \@abspage@last{11} diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.fdb_latexmk b/papers/medial_tire_decompositions_of_plane_triangulations/paper.fdb_latexmk index 03043cf..09ca62f 100644 --- a/papers/medial_tire_decompositions_of_plane_triangulations/paper.fdb_latexmk +++ b/papers/medial_tire_decompositions_of_plane_triangulations/paper.fdb_latexmk @@ -1,5 +1,5 @@ # Fdb version 3 -["pdflatex"] 1781209574 "paper.tex" "paper.pdf" "paper" 1781209575 +["pdflatex"] 1781210675 "paper.tex" "paper.pdf" "paper" 1781210676 "/usr/local/texlive/2022/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" "/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df "" "/usr/local/texlive/2022/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm" 1246382020 988 bdf658c3bfc2d96d3c8b02cfc1c94c20 "" @@ -132,8 +132,8 @@ "/usr/local/texlive/2022/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1647878959 4410336 7d30a02e9fa9a16d7d1f8d037ba69641 "" "/usr/local/texlive/2022/texmf-var/web2c/pdftex/pdflatex.fmt" 1665017617 2826443 7e98410c533054b636c6470db83a27bc "" "/usr/local/texlive/2022/texmf.cnf" 1647878952 577 209b46be99c9075fd74d4c0369380e8c "" - "paper.aux" 1781209575 4206 a817291c83280f23be785ea9b9789717 "pdflatex" - "paper.tex" 1781209541 40737 e5d86b8964b20788119dc708cc9cd8ef "" + "paper.aux" 1781210676 4206 870862ca1c6762f39fd7ed9def109a09 "pdflatex" + "paper.tex" 1781210650 40922 403b0b9df57192dbf02362b0b06705c3 "" (generated) "paper.aux" "paper.log" diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.log b/papers/medial_tire_decompositions_of_plane_triangulations/paper.log index d5a7d5c..cecc7f4 100644 --- a/papers/medial_tire_decompositions_of_plane_triangulations/paper.log +++ b/papers/medial_tire_decompositions_of_plane_triangulations/paper.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 11 JUN 2026 16:26 +This is pdfTeX, Version 3.141592653-2.6-1.40.24 (TeX Live 2022) (preloaded format=pdflatex 2022.10.5) 11 JUN 2026 16:44 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -506,7 +506,7 @@ LaTeX Warning: `h' float specifier changed to `ht'. LaTeX Warning: `h' float specifier changed to `ht'. -[4] [5] [6] [7] [8] [9] [10] (./paper.aux) ) +[4] [5] [6] [7] [8] [9] [10] [11] (./paper.aux) ) Here is how much of TeX's memory you used: 14419 strings out of 478268 283755 string characters out of 5846347 @@ -515,30 +515,30 @@ Here is how much of TeX's memory you used: 477048 words of font info for 58 fonts, out of 8000000 for 9000 1302 hyphenation exceptions out of 8191 84i,8n,89p,736b,838s stack positions out of 10000i,1000n,20000p,200000b,200000s - -Output written on paper.pdf (10 pages, 277087 bytes). + +Output written on paper.pdf (11 pages, 277538 bytes). PDF statistics: - 135 PDF objects out of 1000 (max. 8388607) - 84 compressed objects within 1 object stream + 138 PDF objects out of 1000 (max. 8388607) + 86 compressed objects within 1 object stream 0 named destinations out of 1000 (max. 500000) 13 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/papers/medial_tire_decompositions_of_plane_triangulations/paper.pdf b/papers/medial_tire_decompositions_of_plane_triangulations/paper.pdf index 772bc32c3756e35fbdaed019cab431e66261d72d..61e577f9b2f0c988fee99d6c10111d5b9a194e8d 100644 GIT binary patch delta 12473 zcmajFb99|i_b!@bM~!XUwvEQN8aE9Zd&jnRnxwJq9ox2z#&)CA@Autv?;rP!asHcH z&zx(Fcg?ltGv4icwESnZTI?7oZr)@yJ38Q`{$~6-4+e1Br0z+R8LeTjWPlmLuv#gI z%NC>2#{>03n6BBKIg6PvX~Q+}0vT( zL*(Ta2CNgds`y6-?4ctx{ww9r*g@JMPMfxlDD}4J=i_1n?=s@=;?au=(roi++HIi7 z=bz1|tL=Bs$z&aH%~t1oV%v6SZs66nkk9J|@UFkY+R^0WZnD9S5kqw0V2XTM0)B1MWpg*uvtc{UiiCasJ)rnmPaq8Ei)w9QsZBicT@Zh4bm+!+zW*W1cY`d?4 z_@1e~jJm}4MWeT7t@H+>mvJAwmVVn+W%f?W37J_Vu?D>%+GOgyPdff1nvK9H`ot%| zEj;qz50)vlk-v~au?anC9qC_K{2AZ1g=gj-C#Miw^H5rKFL~M}H5Q+!h|os%ZE+>ELU~;+Fx$++u*_GLh`dsD;Q0ocR@{EA~Ax~ zGAyOLfH`MxdT5Qcuy6DU9d7y`SQ#?ZTAdq2+R6jZ#r=_~6M@=iiZR(D)#Js5=*%&j zDZ~uyU3wQzn4(J`clAO6!>$iYC5!TOHCpS2Tl zcnNFsy&Qj_l8Wo^x$JulJ3!r1;yk5v_ur$j|%&TG)RuwT9w^v1lG zj2mtCef!4va;P87!uQ#bQ1&&-vcWE~LX*Z)oM~nr<2}$Cj`aO)<_D^euEI$-1-+QL z371wlsqhTvshbulay~xrtL$6%@>XK&D3H1N)j!P46D)&@r#EbISCry##|eIU*7W@H ze(D*5a@2DT^Fa^3S_phqa@;8HYY)oK40=2cE|4mhcHBrZ-C3~Rf!jJ4tG9`sU>Ej0 z$SPX$4zIQQJF1|XDFQ20B%-S^fP1i0hjeBC&U2~G)%XU#*Omoj(*G;gR33#a?4dO+ ztFfiiNhYd2)mxB|1zaIM)q=E(;qw7Zp)A9GCKbO6LK|UPt2AVtWp~z?ADBY=>h|z* zQ9!`s?+5k!D(XoWc!OENFkN@?oA}*!itb!v8OO`2UT&zvl z|5DP9z*BJu!RG%*U7B1bqnz_Goqj#ORDZ9ulFj#CJzEYKmLa%DVu(u46Ffx&%Vi2z zHIpaX5qlXaH>v44cjbJA1MO+g@jQF4CjGnJC2ra+M0jxN)=zV?2vezX*R*#LOV=*{lb4#)X8l2{5#;?={xhdn$O;T` ze_=jDIG;kGYQo40TKrY?SpNt)6TNPcq@~&&nzl)YDwLzLM?f2@(N^H=N>j+gl0sB8 zg9G_c0Bv&~kZ(W!f%-!ihy$!-y&3+iazFeR16Zl@V(wrD(n6D`Uw1Y0S=NGB>oIXX z9H85H+`Ql+oFVEH3D)K|#s?R07FPKeVqaeXI_-giRMT-u-?&p9PR(MbC%TLD7*MHQ z5^b!^5fH{i|JX%*k##Xld00Clv55uP_2|?z1nIh*#8Q%64?x$%tmWZ{+XqjE9(0_NxB-*YtfO!#|pSc0JQos&JguQsmat8<-?AZzqs%D`s>*>zJ&KiH74s*%5vGyWT4z_Xo zkVoU~MA{qb1b=WHOtDH{e(F3;vi8ld!g#I$+35QekMWTgWbu`);7krXa{mNly4t_} z9AO1)2Ze&kJ{A!hSz>4vKCv~r%de2HF@E0%B?dMqourE!jG-SI@pc}9O(eA7Kp3Q2=K7cIR7 zc2i)HK_L*=nY&mF4?kXy;HM*I1&SOY6=z+u%Y?lkg;ko(0x3a1aWx>XKYb$-e2aO; zSy?KhL>0wl(lAw9;??K4oO{^Ad&2F(Rt|7iRy+|o8cE|ih65z6kMI#73Qu;nse2H+6({Hy1st7(C)#a&J{N|{Va&SI8zPEH zow@fj!75#z9#7i0?ubw&Co4*!F3NIOSol~G6OZ34Cc{g98t2PuoCy;#!&o^-PEYxo zs4DVRmoM7#^P~qT!^&N435+AKw=?`wXTE%7*tFE3AZ(<3m*G?|;Q0yAP%C2o?s|p; zyiW~fv;BH8B%2wgS)VXghK#$Trk)Jf{F3eh@9wMqq)qRc;nqYSuRVj?X7(Y?+LdMb z3u$mUSa{HKZ`0-vN}<=4Or2Yw$M@XS9K~+FWJ|^IEd93E_kw%0#?*BX4-3k z{BvG!{l8l41Qt&$@D%V@A=<0ZH&=PvReKn18%m=ZVUKHgrJSM6vV>UwLKyHMY{E?Z zRrbsh$YUb)MJZ__x?sSt3g48`+O}FHEvre9YkyY4>W_$sfs1kj@TAUfyN>>^%ux4# z@k>uY8BPb^9o>9H1BZ3>=193ha5qX1aN$HxJWGWU{hyDflc%s&zlrs-aefQnqY2e@ zY>g%9IP7Q7@HuA(++SsAY5CClr#OeHPr#YXp%zV`lyM)<&E5cJ&oFPi_hlgrZ@_gF z;GDRE$P0GN0hDkwL!B2poi<7$n^zy>x_NKijxM5Tii|x0;EU6-(5_N@!IF0iwWZI` zRkUx&(wv#J;sW0<4zRvF0aTm$+t~OvwEF<{S|*8MC9iHyObo+z)uB3$Jr7u#H-T|` z6i*Gevuc7N1W9!$wxnsBc{f)^dK>DC1Y3XmMHFxYZa!zyJi?JX-M~X=kFYw7JA>ul z+slpJ@7Fr%fm!*D5f&}-#+pj&{74l^IPmcvG2DbD2StmDs8V=Fr zBwN!BXAfdU?=aWZ`g18U9AJYV@nA#E97OS8i+W;K5&^iXj%xbsX9GTa13#xxBv-f6 z_5HMOxWE6*gHk_Hv3onq-p|QW-P5h2tp9!%uR!v5G)-mTwI+k&FudpIez<& zz|EEHn~n+K;bQ-PW)YL*jb>!vQ^|_#g`zh4r^2H}ajdzA`YU4DK^m4N;z zrLAA5|6eF*`bZAPs~;t{Ia2Ca5J5fh5T!p{+DCbSUXS~W4Ob=&-wNjYB79xk8q5q! z)~;ixqPbX2k88a^wLjX;LnopR7HdSiH!h{BlSn^1u$fwc{tstoI*!1#kNwk{X%5-@ z*JYt~EZe+RnW$B(VQGCf3T~2$3*|oo^y}{9cLy6O!pKPGz^(YBuD=fL8irJUUtBiZ zZ*-fxEW33^S7I&qyDC2~BHVc^^Z@YLSzx9Yw#U@Wd$V@Hkk&l;XZsGoX2CCY&so)B zXimZw-m?t-lKb);@@)m;ZwAc8o3YD=Nn;V#w6aw6Uq@J4%P1SCrN}e z5JfA+loy?4m#L1Ydn;~(oI|F|=GL64{S&sfkH#gi0ur01{@_xV_beU?vDWc)tFt_O z1>;x&^7Lffy>z(Eu8uW%stQ)I_{{bg5F67HCRhP3cOxaO&}ie(Ez^O`Eb^j>JX2YG zjTv34OCFh?xWzK;ooYT9OL= z*(ky(MTY-=Ramz9AB z0Fy3Xhw~aTEOP%H?w8$`c1h`N^c#M-Uoz+i;({Qd$!W~;sa*J1&z>rd#8V=xzTICy zpOT}w$%AN4ts>aPj4=t3%2_7=^7ThB)0;dYvFY($DWY7qb6^)# zx}Bl%?K%%`q@YUJ-0+wag7_)AB(Uhm_XOct<^}2<9hlvkw&Pfs6@gFnu%DtpCIo!8 zbEANKsIXimcJ{`)%5QjMdj$nsSaTAZiiv9HSrgj+DTyv zBS+>D1QVGHLQk8@maAFxssk&(*CkiC+jsKp+FVd)pTr0aw;s`iweeJ+J@aFkB>_%R zCBt^plw9tn+&e%#tCfIPcAID*VZ1T%mUk=YGbUlLY<9^@QEjHOTlP&~@*X^4Oc4?y z9i|FkBoM+xq+mDf2|dgVWfPT(rO{Fpg?!)tQ(bWU*hTv4&_ySHP?HZ?F`_ma*{aXE-pDotzy zn9R|$F(~3}`=a5$d@-ood1&Q=3|)uQt>s4S{KkF=$E${qgZ0c?Bk@LBDdBs^uu@PF z!Q9`>aud+s2BCnPhu>Cjmx|^RDuguxw?kd;`u`XRn>1y*_v5z=K zF@Q$TO1vx7&vCpTlwJfRTW%nG!Gs=-E+W!(&&PCfin@J>-q1aimKY+czm*>|$sgV@ zWLrh|Um;M4YwGs%D_s-TMo5$v;+%$nVkIdQgoG33tk54Y5+-TCJFYFiI`2a{64oLK zt+H6bBtGk8)|Yb24J;Q{4Xy3pqpIAne3g(mm#6PgN09;wu1NsNp?Pz2dWU#~dgp4G zAyDp5SGb$8Dh&_uhSS(?;?LDn2y94*v4-(uuX-B&BF{Md0^#VCf0C(ex)BDe=I#)Drhx%lbR*Mu-ChoZTh$bQv+ zedV+Xu-oOGjM7_DZ+dwavX7f)SVvq;2<0DzsR=dRo~Zq&~j0^m_tr2U{*FG zWF_8MA;ApaAFy3|iKFtsMd+PcyVwa5qoc2jPwawBPky|);?~l@y(s6UtXx4NgrNZ9rdRdCT~TTNJ9%~N%$BV2~_>UzKL@bjha>}J9U#OyaPH>2Irc+0jM zI&+H)lH_->ZhS~4C+w9>=Au?$pg~lw{3sNhqtE^wEHIP9r}o{~81iupAU?uUz66V` zh!q_=MjsChRD;OPI~BE0{o0{!x?t?l+xQ}4ZH-t^&4tKG=Bzz045Eg&a`q_%VY>NX znkTsc5bKwJ^0{=GM~*0PyWb9{t91{#uE}N>$+2b`b}YhRQT6R zw<&swv#t-zYGJ9`EAGhAWY(VQVHB#)?UtJ4JfMGeuq^XXl-43$96Id$m!Rspz@zg= z-jEcq3BgOi=fEpXvCEd7M9xGFx*4`cR}SKC5lWS68L@CD!>P=jxI5SOJ3m@rQd|E! zn>H;$Jsy;~OXWA(Y(sWhcR0e%ZxaZ2ax*qjx(g#l3&+1n{MH%9h7vaTAlaSmZA?Qi z_!>K03=Fl+eM(Pyehk%DwcSDRWh!(iak>M5OqX8D_J>eNPEHLHjga4_hX(%*2d7iw z=*Wu81&|Y|k^w;4zLmNy$Q8d3OLZnjo#oY_>IN6!Z({jIaS=W>i573n2TrY8)^4w; z)N0N0kT(V~0G)0IB(C@9nIBC9-hc!KB}Hl)gtck%g3hjS`sUcm#j=a9jW^z>r+6@s zU2Z?&w*&$@py?c=lo>(ntZ6j*g$-A)yq6DfaQ8VeBV0ZmP9yl^9o?%mD^h$sIJE+n zJN2O}lzXcMx)08-7Zp#E3ig`5QANgK`oZk$oXF$xCF#4KG3tDkqsgYLANG=e2?fqk z8H;Cnd8d)5uz{yA=Y2E+PpL%DQg;z>X1rlC?z*ZfZWoOjVcV=UB)OD%Q`^5#CGY90s?@L&nX?0ZIfwGXRs6 z;@8;F!mi#BNbPO+A7ryuWSa@m7Fo#TR9sPQ+0d{t4nq3NfnC{rjY@;$_`{rce|`^J z9Y^40s2Jal-o+56s3w1ny#?%*6|2+G&4zv72S3_`Z#OIt-p5Ksv1hUJ;8*hbPj*#q zEmtt_dM2`JkK3;pPfG0mwQrjU%LYz<`^ORbWMWWWt7b$Dm`;t#ez^6)3Qjlh$%GN) z09a+_L+r4=$RndF^E{gVu2NY4Sf)ez`i>SOX+D5mAc3f>iiz4O_`&{NqFqitj`J%; zBGq$Ii=IdA(L1K57vm}EpwwKt!uAp)v;DeWKGs&U9EYg-;m&v;=xDCwt0#~fWJkJI zUXjs;yf{g|P&F-W4+oh~?XIOp>Uczv@<<}1@w2~7?T^FW==!4(D4(Wp$H1WNbgh>T z0cag%6m^NkzrNO&D#hUoB|Xi7lR_ArPvWBL{D{Egof&&K{Bi=*vJBd4H>JokcR&ZF zlyKOLKvsLgdnh#yL97gTZUJRs`Uwm*Hz}tWiq!|7(0PRy6?Xlh1Vk-0Bo|r)S8LJf zaxyb3PR$9EgiUhVv6jQ}Li75z&%5!c6|UE~g@fnT{1TwX$zal6KYNFYAy;xB8u`LE zngb)o$K1(zPbWGEG(THf_vu^Iyj`_4WcC+gOr0NRc(nvN*TX3P=+ifd(qivxrki}= zlP(Ecy&UkmJ3I*e|34yLJ`lS+0JDLj5L*h0kL^DSR)f;<4j~jD2Z%fzfDM*{hGgV` zlLkz{w@jn^B zl}nKRdjG}21dFgiQHuW;2NUe}6UsvTf8$)%L)j7n*xCLI1h$`oa;5pF{tpNiXaWs@ z3Wj}vsw4a_5*GNMWt;GSSJcAI6uC0XZH4 zFu>fy0BB-R=LG;0tat#R1b~LF0hpkFVk4O67~lv6n!5YvYB>eK06Q0Ey%OTPlVD-3F#cg@yxw{E7Z$`lt5-K#rvUL~I;rMgY{mbMJKYuQ+XdXnFu7 zCpdrz`WgzyYUS~E$Ve1zFi5lbR;GHgOn^&8Yet(FD9w>P4Ml~9)z$h!*2EOvIE#*nt$c^vwJELKiEX?Gr8b9$4D}qY#^E49<;Zu}wCJwcskX+sb_!t9 zQ`i3vsEiIpuI0SGV1hrPezWmJH9}SNHi9lVA0hNyYy(25_j-C>Mxlj<%1bwj;9OIN zBGti1q`}-n^^kYqNJDHuh#h+#+e9+vnWy4Or!xt|e_2t$7oUhABmAOiR)5=L7BZ^8 zr@xTA1et)&X5<5b(i~(AePUW8L4Yqt52cMqc`o-=*G#B7xwcO#zOtt#wTE{COz_ws zHX~6JUpg`115G{iRvLc1JC_?v z@cy`7D)f2Q%rFMpAOEgNGU1T6IO(j$$M&F8a0}FGO5dDhEr(eVM$XdCq1k_5ecI~` zfP{m3DHVw^eIZ)ft>(MP`IH)iNywb~V-4PqMqolG+2I+tpyQ|o zxPP25=x%jTuZd|3&=5W>?Pcs|fE1#>FQ9&8W2#z)ZnM*5p>7)` z(S894E7k*q)r~wnm?3A}sO*$V8ySMKxBATqdsdrSe0vk}1w(r?^pJ>{L6x0C`KPP($p-xJIv%Ux?YycVLTD6)mh7mf5 z#p{LRxo$u~T)IDy(-1JhPZ?Y<+whd^a9H_=;_PX!dY)knjCq@d-%sM&-C%4O&AjcoMG=Hj*lM z3P3)5g389-Cn2h)n&@Fq&Q{>#_VG*rJ2@r!)cfzU^Ic!!^NHK(9w~;1WX(SAAR&iK z-M^ND*5k`$P5?g?GQuyULMQVf&4Jd$`FYO9@P^&6E==FH{&%HS%;a>AE@IN9N9 zqiw)f!i)eq#7bqn4PE-&;a5?A6sz7$N6MOef7xG+)YxOVnum9SgsPhKixLo_X+U!P;3Dc-C^PiGIuY&&@Bdw z+XiZvG814uG3)J3H%3}5c`p}DP;TWqdghHzpgB3BHv~ZGN{`qQ6?q9He9aZR4QbWD zW0aVntNWb$+ZZgNq!<2?;lA^0VMwlRTqdjVHwH#&DN(8+4GFt4aK`a2E{Dhbg@8y4 zrxhLp-MY)!Fd{pNPp7th2Fa+#eJY`h>|5CNju+1$Dw1NZb}9^OJA#3dV{$WgIFCs) z&k&zEj~#qUr*I z0t9k(pf=&9El^Udgbf`LQ6a|+dJd{t2yn6ohcCrMCmj}HN#*!$c4r0RMg!?`mdW3N z&s;sTc_KULWYP7~(j}QkZ9;#mjG84jH#4}wfXfGmJ3@|r>`F}@k%elGNfL&q7%l}7 zYfp`T_9t{7ek4tm(t7|mfRPq*Oi&%s5>DSlS8xm zq@xDY)p{~!L3AKK@n#aG40~biXtCt4Ux*}YFo7e|g&nA?q@ve|K>)LM*d9PTUXB`Qyu;fb%ZxNVTvz0|LBt~LWu zF>yw)@s2DztMuLil|`yD9QYktc`m83Wy-Q#C)s2(W@!nrLsU}N`xaU8Dn=FgyUpUE zc0im8I-H_=ajY@{&O&R<1dU*Bm=iS(J?mV8J+Eq2cGX4n(@KJ4T^g=MgDf-ZxcOeD zO?S^Z>dE_qWE)6NUPyu(JI1(-M5;s1SnP}2#${`!+gqOQXj9_v)hx?41Sh-?rpmg-;Z5s~$p&RWC|Q+A zis6;{iprW_Qy8(Y@v4*-xHtRIb|Skh`7}m#yAK)K&>Pps$;iIR6Y7c1lf*W=mJ<-j zV>b(DTH8eRW-u|*Q~6{tMgHC3;YoBTBBH_TP}VT~r0{o=D@xK+-7_V+o&)#}>;U}$ zMs2!5f35Y4`|VA0ruAd?t4ZV$3QuWO{V7PF!fw&9^#dswr@3OtN%4?nsG=BsT~h>z z&lUA^9(8}m%%KRy>wl4Ea!5qxUuMgRp2v-?p@dLEcu-AY6M;+5k4oykrNf4eWcERrX@<{6*%S{6_c#k1SMPm{K(Ub(Evnb*h*ItgBH5n~>0_ zTur^`NgfH7-TdNc*|DEo8XCp*VH47NQBN85?QhAQ?au74coX1?qj~?1Ku#IM)5AzAfMgH0)#nsRYRV99e0T1rfcLTB>DOydq{SBSpdaYFu-rU2u(tLb7rVB8!ebE?-dR_1z5kVP1-9@Pw90dA0w`WbhNVaYd zFJB)F-t6u+41elo;;;af!2L|$*Fon8&94uk%e=FA7_KG1S+aB*ptG3ErQLH8f}My zsf!hZqh(cAHVzbnvxWmKkt-$1d2XkTjKxW{CCVX1?7P@D{vaF@!5d=78>CO~YkAYn z6!-eFmXl(Vw6<*1QFMeu@STuL*`%9Kz#qjXD;udbN}HR2=1r{ougJTI#5qsU0olu# z#&v3S$(vdi3@~?Sew{Jo%)AMD`InJN{1~~ z7nj(bi$$q4Fy?jq74!K7&x)`J@bU53B;>ad;_t^V{PueQa@;{O=cB_y>gaWuwCx;{ zPG4WK`sW8Lva^6lAlxTeJv2YvIHV1++Z2JdeM3-p3UHa39*ki1DtmO5os*CP=v7>- zMlA^m=XhkJ`;&ajg-hdrJu+oX(kUnkYi5k>RgK9HC0O{dsaj zSY?2@==OYhJR!|ZXlTd__@j;yg}$#xv;^O^DMe{kJM#nXPgVUy`w`sH>$GZuhhz|4 z>92wUu3(SU=0s>DdoY*zfbi-)zV4i-NRFSmmOs(-XheA`KQ%G1BU72NHrLh-nJ_Jx z5UBc*-=?eFGg+7W4X&GHnG-XWn+!K@O>=#; z@vnT4`W>xWsJl2nDeFe49gdRE%9(ex(a(48FV=Z=6Mv(U7N0XjXTp`UZaVozo*dAp zni?uD>-nUzR%;aF(Pddp{<^ahaI0p>=213)8EM!runrFo(RfBzyy+ct@>B5@QUuaY z3Y`6sy-AUVb1GANSrV6Wz#cLd+WcJR6#AN-gSuG{K}H}N(hMP<{Zja2H_%bXldeO4 zwHb$>-lUOwmBE#`!}sm-;_8!6*vD632axA!LFBI&&@Ei;vRQ736D{&tu%7BOw*{57 z*wF_XrLN3FT2A{x<_mez9EL^G3Jw{P7ehwP8~)=4RorNoXM z?JpAMK3Lt_dNuXbgwHSBt)3C`nfprkZ#=%aULLKTL$6v6hr|%a#6}VlzHU5Uw4NAM zyFJee`x~Of-y;h(PphtE=Uu*Qhm)>rfPR!IaJ`L)i2n5P7x0iFcJ~GSHU&DnhZxoE zOT`mYH(QsuT+Ex%ZpFvhObkCXrFOA)VGI8LcfSeNSx<;q4_h~z|J^A4m&35uwdLej zy^UU+ZHtOvk`3W(U zbBX%ZHRa*ZV%*s>u6KCCMp<(E+db3j5yG8b*QvEjr=;Q~PP>u+CGR(@#oBqWRVNMI zKCUV5GxCZcQ(ESyWbVAkG))f9pwCA=y$%3IP`XzaR|q``(B<0_-a<^_@XS~r*8O1T zg*hI)^d7;qgsK>B*LttDF_jd|j`g=;9KFWqCxpuf>2?Q^6DaW%fCW~?*lW~%<|1+vPI=cQd^8DlD)e%_b9jqMxY5!s8|D#Ef83^%7 zONw*Kh|BOw$VhO?NJ?_cNJ;Q=uyb(A@bR+AaLb60{og~3kp4dgj*as_BtJcndWv6B z(+q3y#%GI{avTXIGmhg&LH#I2J5oJsK0KWPQXniQ!Eppnf^Md&?#zr>Fbex4c81AOyrkHDE7dBC&LVrkE7SEaUTkba!_fb^0hNfb&_L69S-r-+wlKRAo>D}{D`>o3Q;b~H$Zbc@smssy0IX&?5y z8B`#czW-^)SgEKl57Mc#)IxUrJ68_7wdPZy@7WHl%I*{Vw9$eC3D{r9pwp>PB9v z1*uWHmKWMH?ov~mn~cU`(aq-inMWY?gLuoW>!xo>aRlU`Ks*A_qzHVx{0P+4(ke0t F{|l=EmE8aU delta 12000 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