From b9068a7ac8c578dc80b17132a22132f69e525a71 Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Sat, 22 Aug 2026 15:03:47 +0200 Subject: [PATCH 01/12] added drawing for lane logic --- lanes.excalidraw.json | 2036 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2036 insertions(+) create mode 100644 lanes.excalidraw.json diff --git a/lanes.excalidraw.json b/lanes.excalidraw.json new file mode 100644 index 0000000..29e3464 --- /dev/null +++ b/lanes.excalidraw.json @@ -0,0 +1,2036 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "vscode-webview://1hn2vaam3v69jt67pr4i27hnkafotvd70l4ao9nlb18pmrffl5dm", + "elements": [ + { + "id": "kJXWwZE94uUnPMEB7mBNj", + "type": "rectangle", + "x": 532, + "y": 720, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#099268", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": { + "type": 3 + }, + "seed": 1501887283, + "version": 114, + "versionNonce": 2025849235, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "1JSj30UowPDK0YSAnfMxC" + }, + { + "id": "2QSj1FQCWLO8L7Bnxfc7d", + "type": "arrow" + } + ], + "updated": 1787318027432, + "link": null, + "locked": false + }, + { + "id": "1JSj30UowPDK0YSAnfMxC", + "type": "text", + "x": 554.1500244140625, + "y": 757, + "width": 99.699951171875, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 401001555, + "version": 66, + "versionNonce": 535140211, + "isDeleted": false, + "boundElements": [], + "updated": 1787317903380, + "link": null, + "locked": false, + "text": "STAGE A1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "kJXWwZE94uUnPMEB7mBNj", + "originalText": "STAGE A1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "biEjs6zwZ1tRsy2AWHkT4", + "type": "rectangle", + "x": 529, + "y": 1046.5, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#c2255c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": { + "type": 3 + }, + "seed": 1332603005, + "version": 347, + "versionNonce": 444484925, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "0Y-L3WsO0cxiy6g-vHRW8" + }, + { + "id": "3YP6xiFyhpZ3P8uLpkOsK", + "type": "arrow" + } + ], + "updated": 1787318013055, + "link": null, + "locked": false + }, + { + "id": "0Y-L3WsO0cxiy6g-vHRW8", + "type": "text", + "x": 550.3000259399414, + "y": 1083.5, + "width": 101.39994812011719, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": null, + "seed": 1240846557, + "version": 298, + "versionNonce": 1707986611, + "isDeleted": false, + "boundElements": [], + "updated": 1787317978734, + "link": null, + "locked": false, + "text": "STAGE B1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "biEjs6zwZ1tRsy2AWHkT4", + "originalText": "STAGE B1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Gr-BIgAf5yHdxiHMoXBIp", + "type": "arrow", + "x": 682, + "y": 769.431465625, + "width": 186, + "height": 1.431465624999987, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#099268", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": { + "type": 2 + }, + "seed": 2123814611, + "version": 71, + "versionNonce": 295443859, + "isDeleted": true, + "boundElements": [], + "updated": 1787317920320, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 186, + -1.431465624999987 + ] + ], + "startBinding": { + "elementId": "kJXWwZE94uUnPMEB7mBNj", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "fvXf0zurA5raQA7weitLO", + "type": "text", + "x": 771, + "y": 756.2157328125, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#099268", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": null, + "seed": 1376262899, + "version": 3, + "versionNonce": 1768438589, + "isDeleted": true, + "boundElements": [], + "updated": 1787317909306, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Gr-BIgAf5yHdxiHMoXBIp", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "y78zUWJMCVnp4_JpEnfJt", + "type": "arrow", + "x": 689, + "y": 973.0095953846153, + "width": 428, + "height": 16.009595384615295, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#099268", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": { + "type": 2 + }, + "seed": 2083934205, + "version": 97, + "versionNonce": 1045279741, + "isDeleted": true, + "boundElements": [], + "updated": 1787317918662, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 189, + -0.009595384615295188 + ], + [ + 428, + -16.009595384615295 + ] + ], + "startBinding": { + "elementId": "biEjs6zwZ1tRsy2AWHkT4", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "lus1GQerkoNHnSwcwSgDM", + "type": "rectangle", + "x": 778, + "y": 1051.5, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#c2255c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": { + "type": 3 + }, + "seed": 2017578653, + "version": 382, + "versionNonce": 2040243485, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "0lMQ3iWeBmJSf1i9EnaXq" + }, + { + "id": "3YP6xiFyhpZ3P8uLpkOsK", + "type": "arrow" + }, + { + "id": "kIqbCgtXKr5-2qhRSYTAa", + "type": "arrow" + }, + { + "id": "pbPM2zot1woPTSHevrENC", + "type": "arrow" + } + ], + "updated": 1787318023627, + "link": null, + "locked": false + }, + { + "id": "0lMQ3iWeBmJSf1i9EnaXq", + "type": "text", + "x": 796.5700225830078, + "y": 1088.5, + "width": 106.85995483398438, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": null, + "seed": 396882685, + "version": 333, + "versionNonce": 429522419, + "isDeleted": false, + "boundElements": [], + "updated": 1787317978734, + "link": null, + "locked": false, + "text": "STAGE B2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lus1GQerkoNHnSwcwSgDM", + "originalText": "STAGE B2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "QS8NfuYjHs2PD-MOb7fOw", + "type": "rectangle", + "x": 1121, + "y": 1053.5, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#c2255c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": { + "type": 3 + }, + "seed": 1626473245, + "version": 468, + "versionNonce": 1827077469, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "2UHpLC5QyHJ-uSF0reiOJ" + }, + { + "id": "kIqbCgtXKr5-2qhRSYTAa", + "type": "arrow" + }, + { + "id": "0CY7kgHkgaXEMGTFJiv2H", + "type": "arrow" + } + ], + "updated": 1787318071712, + "link": null, + "locked": false + }, + { + "id": "2UHpLC5QyHJ-uSF0reiOJ", + "type": "text", + "x": 1140.4900283813477, + "y": 1090.5, + "width": 105.01994323730469, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aA", + "roundness": null, + "seed": 1432196989, + "version": 422, + "versionNonce": 2031312179, + "isDeleted": false, + "boundElements": [], + "updated": 1787317978734, + "link": null, + "locked": false, + "text": "STAGE B3", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "QS8NfuYjHs2PD-MOb7fOw", + "originalText": "STAGE B3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "2YkdIJJ5Ee420pL3O0TE9", + "type": "rectangle", + "x": 772, + "y": 722.5, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#099268", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aB", + "roundness": { + "type": 3 + }, + "seed": 422066141, + "version": 168, + "versionNonce": 900070813, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "PqzVdV_6g2G5CVDqu3iLf" + }, + { + "id": "2QSj1FQCWLO8L7Bnxfc7d", + "type": "arrow" + }, + { + "id": "9BGGlSsR_we2L_UOD1-60", + "type": "arrow" + } + ], + "updated": 1787318030008, + "link": null, + "locked": false + }, + { + "id": "PqzVdV_6g2G5CVDqu3iLf", + "type": "text", + "x": 791.4200210571289, + "y": 759.5, + "width": 105.15995788574219, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aC", + "roundness": null, + "seed": 980366397, + "version": 136, + "versionNonce": 1452482077, + "isDeleted": false, + "boundElements": [], + "updated": 1787317957709, + "link": null, + "locked": false, + "text": "STAGE A2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2YkdIJJ5Ee420pL3O0TE9", + "originalText": "STAGE A2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "kYJiq7nQzqUpYCU8hYwSq", + "type": "rectangle", + "x": 1006, + "y": 721.5, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#099268", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aD", + "roundness": { + "type": 3 + }, + "seed": 1588391091, + "version": 215, + "versionNonce": 1985315581, + "isDeleted": true, + "boundElements": [], + "updated": 1787317969483, + "link": null, + "locked": false + }, + { + "id": "NfIHDvcH1M_F98NhLIkPD", + "type": "text", + "x": 1025.420021057129, + "y": 758.5, + "width": 105.15995788574219, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aE", + "roundness": null, + "seed": 1853021779, + "version": 185, + "versionNonce": 1710618451, + "isDeleted": true, + "boundElements": [], + "updated": 1787317969483, + "link": null, + "locked": false, + "text": "STAGE A2", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "kYJiq7nQzqUpYCU8hYwSq", + "originalText": "STAGE A2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YUxvyJ-7FvpZOfX1iMf6R", + "type": "arrow", + "x": 1090, + "y": 1042, + "width": 0, + "height": 0, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#c2255c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF", + "roundness": { + "type": 2 + }, + "seed": 2125327475, + "version": 36, + "versionNonce": 1265229288, + "isDeleted": true, + "boundElements": [], + "updated": 1787403270962, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "startBinding": null, + "endBinding": { + "elementId": "QS8NfuYjHs2PD-MOb7fOw", + "mode": "inside", + "fixedPoint": [ + 0.11805555555555555, + 0.08585858585858586 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "s9pF4QfQCbZb_ZIPrLqtW", + "type": "rectangle", + "x": 1119, + "y": 877.5, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aG", + "roundness": { + "type": 3 + }, + "seed": 1348075869, + "version": 543, + "versionNonce": 2070858301, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "aqezM3PLI9jlDb5aRlFZW" + }, + { + "id": "pbPM2zot1woPTSHevrENC", + "type": "arrow" + }, + { + "id": "9BGGlSsR_we2L_UOD1-60", + "type": "arrow" + }, + { + "id": "mH-YLQfngPDDspdgX_PDK", + "type": "arrow" + }, + { + "id": "PT-5wp8Y3EBqVXgW5j7s7", + "type": "arrow" + } + ], + "updated": 1787318097661, + "link": null, + "locked": false + }, + { + "id": "aqezM3PLI9jlDb5aRlFZW", + "type": "text", + "x": 1146.1000213623047, + "y": 914.5, + "width": 89.79995727539062, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aH", + "roundness": null, + "seed": 195808701, + "version": 500, + "versionNonce": 1816838515, + "isDeleted": false, + "boundElements": [], + "updated": 1787318005996, + "link": null, + "locked": false, + "text": "STAGE 3", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "s9pF4QfQCbZb_ZIPrLqtW", + "originalText": "STAGE 3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "UoiunLPIaAwLLJTJGcSj8", + "type": "rectangle", + "x": 1347, + "y": 875.5, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aI", + "roundness": { + "type": 3 + }, + "seed": 1931784787, + "version": 595, + "versionNonce": 648660125, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ZOo4SOIvzICC0CEeZGWkD" + }, + { + "id": "mH-YLQfngPDDspdgX_PDK", + "type": "arrow" + }, + { + "id": "0CY7kgHkgaXEMGTFJiv2H", + "type": "arrow" + }, + { + "id": "Q8b54GQSVn5ZBrXMwYjN7", + "type": "arrow" + } + ], + "updated": 1787318161674, + "link": null, + "locked": false + }, + { + "id": "ZOo4SOIvzICC0CEeZGWkD", + "type": "text", + "x": 1374.3300170898438, + "y": 912.5, + "width": 89.3399658203125, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aJ", + "roundness": null, + "seed": 1461776371, + "version": 553, + "versionNonce": 1775208285, + "isDeleted": false, + "boundElements": [], + "updated": 1787318010675, + "link": null, + "locked": false, + "text": "STAGE 4", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "UoiunLPIaAwLLJTJGcSj8", + "originalText": "STAGE 4", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "3YP6xiFyhpZ3P8uLpkOsK", + "type": "arrow", + "x": 673, + "y": 1096.0099, + "width": 99, + "height": 4.714285714285552, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aK", + "roundness": { + "type": 2 + }, + "seed": 437326877, + "version": 30, + "versionNonce": 599640755, + "isDeleted": false, + "boundElements": [], + "updated": 1787318017434, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 99, + 4.714285714285552 + ] + ], + "startBinding": { + "elementId": "biEjs6zwZ1tRsy2AWHkT4", + "mode": "inside", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": { + "elementId": "lus1GQerkoNHnSwcwSgDM", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "L5_dlmNwrTuvEbPORBPUd", + "type": "text", + "x": 718.5, + "y": 1085.867042857143, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aL", + "roundness": null, + "seed": 1645920083, + "version": 4, + "versionNonce": 1474276861, + "isDeleted": true, + "boundElements": [], + "updated": 1787318017434, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "3YP6xiFyhpZ3P8uLpkOsK", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "kIqbCgtXKr5-2qhRSYTAa", + "type": "arrow", + "x": 928, + "y": 1101.0702015075378, + "width": 187, + "height": 1.8793969849245968, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aM", + "roundness": { + "type": 2 + }, + "seed": 902644627, + "version": 43, + "versionNonce": 777203421, + "isDeleted": false, + "boundElements": [], + "updated": 1787318022132, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 187, + 1.8793969849245968 + ] + ], + "startBinding": { + "elementId": "lus1GQerkoNHnSwcwSgDM", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": { + "elementId": "QS8NfuYjHs2PD-MOb7fOw", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "pbPM2zot1woPTSHevrENC", + "type": "arrow", + "x": 928, + "y": 1090.0402218749998, + "width": 185, + "height": 138.9065977526643, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aN", + "roundness": { + "type": 2 + }, + "seed": 141385725, + "version": 154, + "versionNonce": 116836989, + "isDeleted": false, + "boundElements": [], + "updated": 1787318037088, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 58, + -106.04022187499982 + ], + [ + 185, + -138.9065977526643 + ] + ], + "startBinding": { + "elementId": "lus1GQerkoNHnSwcwSgDM", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": { + "elementId": "s9pF4QfQCbZb_ZIPrLqtW", + "mode": "orbit", + "fixedPoint": [ + 0.43604879120298773, + 0.5639512087970152 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "jHmSWdgaakQYjWXh9vQYT", + "type": "text", + "x": 982, + "y": 971.5, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aO", + "roundness": null, + "seed": 1990056691, + "version": 3, + "versionNonce": 753826621, + "isDeleted": true, + "boundElements": [], + "updated": 1787318026060, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "pbPM2zot1woPTSHevrENC", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "2QSj1FQCWLO8L7Bnxfc7d", + "type": "arrow", + "x": 674, + "y": 770, + "width": 92, + "height": 1.8868448979590084, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aP", + "roundness": { + "type": 2 + }, + "seed": 429377715, + "version": 42, + "versionNonce": 27387741, + "isDeleted": false, + "boundElements": [], + "updated": 1787318028532, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 92, + 1.8868448979590084 + ] + ], + "startBinding": { + "elementId": "kJXWwZE94uUnPMEB7mBNj", + "mode": "inside", + "fixedPoint": [ + 0.9861111111111112, + 0.5050505050505051 + ] + }, + "endBinding": { + "elementId": "2YkdIJJ5Ee420pL3O0TE9", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "9BGGlSsR_we2L_UOD1-60", + "type": "arrow", + "x": 922, + "y": 777.8362519230769, + "width": 190.99999999999977, + "height": 128.92471811752716, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aQ", + "roundness": { + "type": 2 + }, + "seed": 1658906749, + "version": 203, + "versionNonce": 708537139, + "isDeleted": false, + "boundElements": [], + "updated": 1787318045680, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 98, + 95.16374807692307 + ], + [ + 190.99999999999977, + 128.92471811752716 + ] + ], + "startBinding": { + "elementId": "2YkdIJJ5Ee420pL3O0TE9", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": { + "elementId": "s9pF4QfQCbZb_ZIPrLqtW", + "mode": "orbit", + "fixedPoint": [ + 0.4466096867120907, + 0.5533903132879121 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "4yGPqKFe8sSScAxXYmMkf", + "type": "text", + "x": 998, + "y": 894.5, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aR", + "roundness": null, + "seed": 1139008627, + "version": 3, + "versionNonce": 1772915133, + "isDeleted": true, + "boundElements": [], + "updated": 1787318034065, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "9BGGlSsR_we2L_UOD1-60", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "mH-YLQfngPDDspdgX_PDK", + "type": "arrow", + "x": 1269, + "y": 911.4350499058734, + "width": 72, + "height": 0.6967174852402422, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aS", + "roundness": null, + "seed": 329939571, + "version": 47, + "versionNonce": 1713150259, + "isDeleted": false, + "boundElements": [], + "updated": 1787318052060, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 72, + 0.6967174852402422 + ] + ], + "startBinding": { + "elementId": "s9pF4QfQCbZb_ZIPrLqtW", + "mode": "orbit", + "fixedPoint": [ + 1.0416666666666667, + 0.3427782818775088 + ] + }, + "endBinding": { + "elementId": "UoiunLPIaAwLLJTJGcSj8", + "mode": "orbit", + "fixedPoint": [ + -0.041666666666666664, + 0.370017852435491 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "m3wldmJ95FTUvYRlziZO6", + "type": "arrow", + "x": 1271, + "y": 1102.9, + "width": 34.33610766235961, + "height": 107.16213438008185, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aT", + "roundness": null, + "seed": 1499495581, + "version": 67, + "versionNonce": 1758870845, + "isDeleted": true, + "boundElements": [], + "updated": 1787318058697, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 34.33610766235961, + 0 + ], + [ + 34.33610766235961, + -107.16213438008185 + ] + ], + "startBinding": { + "elementId": "QS8NfuYjHs2PD-MOb7fOw", + "mode": "orbit", + "fixedPoint": [ + 1.0416666666666667, + 0.4989898989898999 + ] + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": true, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "2TsI3Pjl7_lcC6fFqx24N", + "type": "arrow", + "x": 1270.9999999999998, + "y": 1100.3297328340095, + "width": 82.04150476671725, + "height": 124.49830057891722, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aU", + "roundness": { + "type": 2 + }, + "seed": 1435226621, + "version": 252, + "versionNonce": 1944505213, + "isDeleted": true, + "boundElements": [], + "updated": 1787318070426, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 32.94267269187958, + -14.71531161812618 + ], + [ + 82.04150476671725, + -124.49830057891722 + ] + ], + "startBinding": { + "elementId": "QS8NfuYjHs2PD-MOb7fOw", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": { + "elementId": "UoiunLPIaAwLLJTJGcSj8", + "mode": "orbit", + "fixedPoint": [ + 0.2704175907174115, + 0.2704175907174086 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Fc6PFOCbk4EEcqtexyvVN", + "type": "text", + "x": 1289.4919104132787, + "y": 979.754278193718, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aV", + "roundness": null, + "seed": 714669427, + "version": 3, + "versionNonce": 763232445, + "isDeleted": true, + "boundElements": [], + "updated": 1787318064707, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2TsI3Pjl7_lcC6fFqx24N", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0CY7kgHkgaXEMGTFJiv2H", + "type": "arrow", + "x": 1270.9999999999998, + "y": 1098.2041979321864, + "width": 78.92602671772215, + "height": 167.95777592483182, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aW", + "roundness": { + "type": 2 + }, + "seed": 536727613, + "version": 139, + "versionNonce": 1741218173, + "isDeleted": false, + "boundElements": [], + "updated": 1787318074593, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 32.245955206639564, + -25.827408935863787 + ], + [ + 24.582062868999174, + -118.49083447278906 + ], + [ + 78.92602671772215, + -167.95777592483182 + ] + ], + "startBinding": { + "elementId": "QS8NfuYjHs2PD-MOb7fOw", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": { + "elementId": "UoiunLPIaAwLLJTJGcSj8", + "mode": "inside", + "fixedPoint": [ + 0.020319629984180035, + 0.5529941616904501 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "_Q5hexNevL65ps3JuY7Al", + "type": "text", + "x": 1293.7575596847232, + "y": 1013.5796626569604, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aX", + "roundness": null, + "seed": 1729036883, + "version": 3, + "versionNonce": 1854515677, + "isDeleted": true, + "boundElements": [], + "updated": 1787318074593, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0CY7kgHkgaXEMGTFJiv2H", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GVEstnXT-aB7IgjVSJBmB", + "type": "rectangle", + "x": 1344.2226257010443, + "y": 718.1474523495799, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#099268", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aY", + "roundness": { + "type": 3 + }, + "seed": 1020905107, + "version": 209, + "versionNonce": 2054503869, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "MsJkM3ZuxqgK6HjjfEsVP" + }, + { + "id": "PT-5wp8Y3EBqVXgW5j7s7", + "type": "arrow" + }, + { + "id": "w6_Fv5GP_VEFqSQMXy25N", + "type": "arrow" + } + ], + "updated": 1787318113637, + "link": null, + "locked": false + }, + { + "id": "MsJkM3ZuxqgK6HjjfEsVP", + "type": "text", + "x": 1364.7926482840521, + "y": 755.1474523495799, + "width": 102.85995483398438, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aZ", + "roundness": null, + "seed": 162102323, + "version": 183, + "versionNonce": 1325540445, + "isDeleted": false, + "boundElements": [], + "updated": 1787318095242, + "link": null, + "locked": false, + "text": "STAGE A4", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "GVEstnXT-aB7IgjVSJBmB", + "originalText": "STAGE A4", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PT-5wp8Y3EBqVXgW5j7s7", + "type": "arrow", + "x": 1262.027434892855, + "y": 880.4776558971247, + "width": 76.19519080818964, + "height": 107.98937538824498, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aa", + "roundness": { + "type": 2 + }, + "seed": 1056993565, + "version": 78, + "versionNonce": 1217971069, + "isDeleted": false, + "boundElements": [], + "updated": 1787318099622, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 25.879019762733606, + -67.47707412630587 + ], + [ + 76.19519080818964, + -107.98937538824498 + ] + ], + "startBinding": { + "elementId": "s9pF4QfQCbZb_ZIPrLqtW", + "mode": "orbit", + "fixedPoint": [ + 0.7922756161301329, + 0.792275616130132 + ] + }, + "endBinding": { + "elementId": "GVEstnXT-aB7IgjVSJBmB", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "YY0uJmi0DUNSBkwZbWstn", + "type": "text", + "x": 1283.9064546555885, + "y": 800.5005817708188, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ab", + "roundness": null, + "seed": 825573459, + "version": 3, + "versionNonce": 789400541, + "isDeleted": true, + "boundElements": [], + "updated": 1787318099622, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "PT-5wp8Y3EBqVXgW5j7s7", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Dug48Ksr7mdITJ1CSQdgJ", + "type": "rectangle", + "x": 1611.9167066751854, + "y": 718.1474523495802, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#099268", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ac", + "roundness": { + "type": 3 + }, + "seed": 1971420499, + "version": 285, + "versionNonce": 598897235, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "h3dUC5eiuAckvtZvL5Pyd" + }, + { + "id": "w6_Fv5GP_VEFqSQMXy25N", + "type": "arrow" + } + ], + "updated": 1787318114912, + "link": null, + "locked": false + }, + { + "id": "h3dUC5eiuAckvtZvL5Pyd", + "type": "text", + "x": 1632.156735056533, + "y": 755.1474523495802, + "width": 103.51994323730469, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ad", + "roundness": null, + "seed": 699161331, + "version": 263, + "versionNonce": 769574877, + "isDeleted": false, + "boundElements": [], + "updated": 1787318110835, + "link": null, + "locked": false, + "text": "STAGE A5", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Dug48Ksr7mdITJ1CSQdgJ", + "originalText": "STAGE A5", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "w6_Fv5GP_VEFqSQMXy25N", + "type": "arrow", + "x": 1488.123928442033, + "y": 770.9659740145489, + "width": 117.79277823315215, + "height": 3.14825907941929, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ae", + "roundness": { + "type": 2 + }, + "seed": 1252668573, + "version": 41, + "versionNonce": 156172467, + "isDeleted": false, + "boundElements": [], + "updated": 1787318114912, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 117.79277823315215, + -3.14825907941929 + ] + ], + "startBinding": { + "elementId": "GVEstnXT-aB7IgjVSJBmB", + "mode": "inside", + "fixedPoint": [ + 0.9993146023679773, + 0.5335204208582729 + ] + }, + "endBinding": { + "elementId": "Dug48Ksr7mdITJ1CSQdgJ", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "qO3tWw8uDrdY-GSL5hbG7", + "type": "rectangle", + "x": 1611.9167066751852, + "y": 1250.2170926328931, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "af", + "roundness": { + "type": 3 + }, + "seed": 2008474461, + "version": 330, + "versionNonce": 2001596957, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "EFDaczSk3yi8gn2b8hoI_" + }, + { + "id": "Q8b54GQSVn5ZBrXMwYjN7", + "type": "arrow" + } + ], + "updated": 1787318163603, + "link": null, + "locked": false + }, + { + "id": "EFDaczSk3yi8gn2b8hoI_", + "type": "text", + "x": 1632.626736277236, + "y": 1287.2170926328931, + "width": 102.57994079589844, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ag", + "roundness": null, + "seed": 958164925, + "version": 298, + "versionNonce": 374795869, + "isDeleted": false, + "boundElements": [], + "updated": 1787318158139, + "link": null, + "locked": false, + "text": "STAGE C5", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "qO3tWw8uDrdY-GSL5hbG7", + "originalText": "STAGE C5", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Q8b54GQSVn5ZBrXMwYjN7", + "type": "arrow", + "x": 1449.9192687785321, + "y": 980.5000000000001, + "width": 155.99743789665308, + "height": 315.1857377213224, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ah", + "roundness": { + "type": 2 + }, + "seed": 935284605, + "version": 184, + "versionNonce": 822381789, + "isDeleted": false, + "boundElements": [], + "updated": 1787318165497, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 43.73552910511489, + 239.572572673644 + ], + [ + 155.99743789665308, + 315.1857377213224 + ] + ], + "startBinding": { + "elementId": "UoiunLPIaAwLLJTJGcSj8", + "mode": "orbit", + "fixedPoint": [ + 0.6650749931999561, + 0.6650749931999554 + ] + }, + "endBinding": { + "elementId": "qO3tWw8uDrdY-GSL5hbG7", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#222430", + "lockedMultiSelections": {} + }, + "files": {} +} \ No newline at end of file -- 2.54.0 From 27548d69bbf8a25760cd72d8c4ce676bbd6236ad Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Tue, 25 Aug 2026 18:40:07 +0200 Subject: [PATCH 02/12] Created lane feature that should be backwards compatible with non-lane features --- lanes.excalidraw.json | 445 ++++++++++++-- src/classes/api/SpearheadApi.lua | 5 +- src/classes/api/SpearheadApiDoc.lua | 3 +- src/classes/spearhead_events.lua | 21 +- .../stageClasses/GlobalStageManager.lua | 547 ++++++++++++------ src/classes/stageClasses/StageLane.lua | 178 ++++++ src/classes/stageClasses/StageRepository.lua | 47 ++ .../stageClasses/Stages/BaseStage/Stage.lua | 33 +- .../stageClasses/Stages/ExtraStage.lua | 2 +- .../stageClasses/Stages/PrimaryStage.lua | 2 +- .../stageClasses/Stages/WaitingStage.lua | 14 +- src/classes/util/Util.lua | 8 + src/main.lua | 4 +- 13 files changed, 1055 insertions(+), 254 deletions(-) create mode 100644 src/classes/stageClasses/StageLane.lua create mode 100644 src/classes/stageClasses/StageRepository.lua diff --git a/lanes.excalidraw.json b/lanes.excalidraw.json index 29e3464..b9aca9c 100644 --- a/lanes.excalidraw.json +++ b/lanes.excalidraw.json @@ -406,8 +406,8 @@ "type": 3 }, "seed": 1626473245, - "version": 468, - "versionNonce": 1827077469, + "version": 469, + "versionNonce": 874232424, "isDeleted": false, "boundElements": [ { @@ -417,13 +417,9 @@ { "id": "kIqbCgtXKr5-2qhRSYTAa", "type": "arrow" - }, - { - "id": "0CY7kgHkgaXEMGTFJiv2H", - "type": "arrow" } ], - "updated": 1787318071712, + "updated": 1787406477137, "link": null, "locked": false }, @@ -633,11 +629,11 @@ "type": 2 }, "seed": 2125327475, - "version": 36, - "versionNonce": 1265229288, + "version": 40, + "versionNonce": 1013087493, "isDeleted": true, "boundElements": [], - "updated": 1787403270962, + "updated": 1787675736572, "link": null, "locked": false, "points": [ @@ -773,8 +769,8 @@ "type": 3 }, "seed": 1931784787, - "version": 595, - "versionNonce": 648660125, + "version": 597, + "versionNonce": 196807877, "isDeleted": false, "boundElements": [ { @@ -786,15 +782,15 @@ "type": "arrow" }, { - "id": "0CY7kgHkgaXEMGTFJiv2H", + "id": "Q8b54GQSVn5ZBrXMwYjN7", "type": "arrow" }, { - "id": "Q8b54GQSVn5ZBrXMwYjN7", + "id": "MwTn5dJVKPmeTHOM-q3f9", "type": "arrow" } ], - "updated": 1787318161674, + "updated": 1787675772937, "link": null, "locked": false }, @@ -1488,11 +1484,11 @@ "type": 2 }, "seed": 536727613, - "version": 139, - "versionNonce": 1741218173, - "isDeleted": false, + "version": 140, + "versionNonce": 399876888, + "isDeleted": true, "boundElements": [], - "updated": 1787318074593, + "updated": 1787406477136, "link": null, "locked": false, "points": [ @@ -1772,8 +1768,8 @@ "type": 3 }, "seed": 1971420499, - "version": 285, - "versionNonce": 598897235, + "version": 286, + "versionNonce": 142740965, "isDeleted": false, "boundElements": [ { @@ -1783,9 +1779,13 @@ { "id": "w6_Fv5GP_VEFqSQMXy25N", "type": "arrow" + }, + { + "id": "o3WprJN3wZEDcHw1DiFYr", + "type": "arrow" } ], - "updated": 1787318114912, + "updated": 1787675785325, "link": null, "locked": false }, @@ -1889,7 +1889,7 @@ "id": "qO3tWw8uDrdY-GSL5hbG7", "type": "rectangle", "x": 1611.9167066751852, - "y": 1250.2170926328931, + "y": 1206.2170926328931, "width": 144, "height": 99, "angle": 0, @@ -1907,8 +1907,8 @@ "type": 3 }, "seed": 2008474461, - "version": 330, - "versionNonce": 2001596957, + "version": 502, + "versionNonce": 72829003, "isDeleted": false, "boundElements": [ { @@ -1918,9 +1918,13 @@ { "id": "Q8b54GQSVn5ZBrXMwYjN7", "type": "arrow" + }, + { + "id": "Z4Fy52Fl_c9lXHJlrhd9g", + "type": "arrow" } ], - "updated": 1787318163603, + "updated": 1787675800613, "link": null, "locked": false }, @@ -1928,7 +1932,7 @@ "id": "EFDaczSk3yi8gn2b8hoI_", "type": "text", "x": 1632.626736277236, - "y": 1287.2170926328931, + "y": 1243.2170926328931, "width": 102.57994079589844, "height": 25, "angle": 0, @@ -1944,11 +1948,11 @@ "index": "ag", "roundness": null, "seed": 958164925, - "version": 298, - "versionNonce": 374795869, + "version": 467, + "versionNonce": 328458027, "isDeleted": false, "boundElements": [], - "updated": 1787318158139, + "updated": 1787675761637, "link": null, "locked": false, "text": "STAGE C5", @@ -1967,7 +1971,7 @@ "x": 1449.9192687785321, "y": 980.5000000000001, "width": 155.99743789665308, - "height": 315.1857377213224, + "height": 273.41807104570137, "angle": 0, "strokeColor": "#ffffff", "backgroundColor": "#1971c2", @@ -1983,11 +1987,11 @@ "type": 2 }, "seed": 935284605, - "version": 184, - "versionNonce": 822381789, + "version": 353, + "versionNonce": 667206091, "isDeleted": false, "boundElements": [], - "updated": 1787318165497, + "updated": 1787675761637, "link": null, "locked": false, "points": [ @@ -2001,7 +2005,7 @@ ], [ 155.99743789665308, - 315.1857377213224 + 273.41807104570137 ] ], "startBinding": { @@ -2022,6 +2026,377 @@ }, "startArrowhead": null, "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "oIXVKbkqP10kd7HsX3Ma8", + "type": "rectangle", + "x": 1845.5, + "y": 878, + "width": 144, + "height": 99, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e8590c", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ai", + "roundness": { + "type": 3 + }, + "seed": 1637710309, + "version": 783, + "versionNonce": 1692360869, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "7AVtQifmKK8XdbWOLnM1M" + }, + { + "id": "MwTn5dJVKPmeTHOM-q3f9", + "type": "arrow" + }, + { + "id": "o3WprJN3wZEDcHw1DiFYr", + "type": "arrow" + }, + { + "id": "Z4Fy52Fl_c9lXHJlrhd9g", + "type": "arrow" + } + ], + "updated": 1787675805417, + "link": null, + "locked": false + }, + { + "id": "7AVtQifmKK8XdbWOLnM1M", + "type": "text", + "x": 1872.2800216674805, + "y": 915, + "width": 90.43995666503906, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#96f2d7", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aj", + "roundness": null, + "seed": 1576990021, + "version": 739, + "versionNonce": 761448939, + "isDeleted": false, + "boundElements": [], + "updated": 1787675780472, + "link": null, + "locked": false, + "text": "STAGE 6", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oIXVKbkqP10kd7HsX3Ma8", + "originalText": "STAGE 6", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "MwTn5dJVKPmeTHOM-q3f9", + "type": "arrow", + "x": 1497, + "y": 925.0522131170663, + "width": 342.5, + "height": 2.4153737658673435, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ak", + "roundness": { + "type": 2 + }, + "seed": 1633560229, + "version": 99, + "versionNonce": 1709724811, + "isDeleted": false, + "boundElements": null, + "updated": 1787675780472, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 342.5, + 2.4153737658673435 + ] + ], + "startBinding": { + "elementId": "UoiunLPIaAwLLJTJGcSj8", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": { + "elementId": "oIXVKbkqP10kd7HsX3Ma8", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "o3WprJN3wZEDcHw1DiFYr", + "type": "arrow", + "x": 1755.5, + "y": 765.5, + "width": 84.00000000000023, + "height": 141.54545454545473, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "al", + "roundness": { + "type": 2 + }, + "seed": 68654021, + "version": 179, + "versionNonce": 1367219755, + "isDeleted": false, + "boundElements": [], + "updated": 1787675789610, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 43, + 33 + ], + [ + 42, + 132 + ], + [ + 84.00000000000023, + 141.54545454545473 + ] + ], + "startBinding": { + "elementId": "Dug48Ksr7mdITJ1CSQdgJ", + "mode": "inside", + "fixedPoint": [ + 0.9971062036445457, + 0.47830856212545203 + ] + }, + "endBinding": { + "elementId": "oIXVKbkqP10kd7HsX3Ma8", + "mode": "orbit", + "fixedPoint": [ + 0.45884773662551637, + 0.45884773662551726 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "GPK9crZA0GMljhRqF5HDa", + "type": "text", + "x": 1794.2073421171517, + "y": 835.5194758205485, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "am", + "roundness": null, + "seed": 1055479941, + "version": 3, + "versionNonce": 1276059851, + "isDeleted": true, + "boundElements": null, + "updated": 1787675789610, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "o3WprJN3wZEDcHw1DiFYr", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "v_3ygDgE5RD8LQhGEvhTX", + "type": "arrow", + "x": 1662.1960283823262, + "y": 1200.2170926328931, + "width": 128.30397161767382, + "height": 194.71709263289313, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "an", + "roundness": { + "type": 2 + }, + "seed": 1602252997, + "version": 261, + "versionNonce": 1283832069, + "isDeleted": true, + "boundElements": null, + "updated": 1787675799132, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 128.30397161767382, + -194.71709263289313 + ] + ], + "startBinding": { + "elementId": "qO3tWw8uDrdY-GSL5hbG7", + "mode": "orbit", + "fixedPoint": [ + 0.2207233413264886, + 0.22072334132648888 + ] + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "fixedSegments": null, + "startIsSpecial": null, + "endIsSpecial": null + }, + { + "id": "Z4Fy52Fl_c9lXHJlrhd9g", + "type": "arrow", + "x": 1761.9167066751852, + "y": 1248.0538669619218, + "width": 78.55616398479242, + "height": 286.26754389891505, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ao", + "roundness": { + "type": 2 + }, + "seed": 1569002603, + "version": 382, + "versionNonce": 2105101093, + "isDeleted": false, + "boundElements": null, + "updated": 1787675810843, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 28.583293324814804, + -36.55386696192181 + ], + [ + 4.583293324814804, + -269.5538669619218 + ], + [ + 78.55616398479242, + -286.26754389891505 + ] + ], + "startBinding": { + "elementId": "qO3tWw8uDrdY-GSL5hbG7", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "endBinding": { + "elementId": "oIXVKbkqP10kd7HsX3Ma8", + "mode": "orbit", + "fixedPoint": [ + 0.24597691208358835, + 0.7540230879164157 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", "elbowed": false } ], diff --git a/src/classes/api/SpearheadApi.lua b/src/classes/api/SpearheadApi.lua index 4cbc90b..58da472 100644 --- a/src/classes/api/SpearheadApi.lua +++ b/src/classes/api/SpearheadApi.lua @@ -10,7 +10,6 @@ local MissionCompleteListeners = {} ---@class SpearheadAPIInternal ---@field notifyMissionComplete fun(zone_name: string) - ---@type FullSpearheadAPI SpearheadAPI = { Stages = { @@ -25,12 +24,12 @@ SpearheadAPI = { getCurrentStage = function() return GlobalStageManager.getCurrentStage() or nil end, - isStageComplete = function(stageNumber) + isStageComplete = function(stageNumber, stageLaneIdentifier) if type(stageNumber) ~= "number" then return false, "stageNumber " .. stageNumber .. " is not a valid number" end - local isComplete = GlobalStageManager.isStageComplete(stageNumber) + local isComplete = GlobalStageManager.isStageComplete(stageNumber, stageLaneIdentifier) if isComplete == nil then return nil, "no stage found with number " .. stageNumber end diff --git a/src/classes/api/SpearheadApiDoc.lua b/src/classes/api/SpearheadApiDoc.lua index ac35da3..9344d7d 100644 --- a/src/classes/api/SpearheadApiDoc.lua +++ b/src/classes/api/SpearheadApiDoc.lua @@ -6,7 +6,7 @@ SpearheadAPI = SpearheadAPI ---@class SpearheadStagesAPI ---@field changeStage fun(stageNumber: number): boolean, string @Changes the active stage of spearhead.
All other stages will change based on the normal logic. (CAP, BLUE etc.) ---@field getCurrentStage fun(): number | nil @Returns the current stange number
Returns nil when the stagenumber was not set before ever, which means Spearhead was not started. ----@field isStageComplete fun(stageNumber: number): boolean | nil, string @returns whether a stage (by index) is complete.
@param stageNumber number
@return boolean | nil
@return string +---@field isStageComplete fun(stageNumber: number, stageLaneIdentifier: string?): boolean | nil, string @returns whether a stage (by index) is complete.
@param stageNumber number
@param stageLaneIdentifier string? nil for default lane
@return boolean | nil
@return string ---@class OnMissionCompleteListener ---@field onMissionComplete fun(self: OnMissionCompleteListener, zone_name: string) @Called when a mission is completed. @return void @@ -14,4 +14,3 @@ SpearheadAPI = SpearheadAPI ---@class MissionAPI ---@field addOnMissionCompleteListener fun(listener: OnMissionCompleteListener) @Adds a listener to the mission.
@param listener OnMissionCompleteListener
@return void - diff --git a/src/classes/spearhead_events.lua b/src/classes/spearhead_events.lua index f3f19fd..efc707b 100644 --- a/src/classes/spearhead_events.lua +++ b/src/classes/spearhead_events.lua @@ -29,7 +29,7 @@ do end ---@class OnStageChangedListener - ---@field OnStageNumberChanged fun(self:OnStageChangedListener, number:integer) + ---@field OnStageNumberChanged fun(self:OnStageChangedListener, number:integer, laneIdentifier:string?) do -- STAGE NUMBER CHANGED local OnStageNumberChangedListeners = {} @@ -37,17 +37,11 @@ do ---Add a stage zone number changed listener ---@param listener OnStageChangedListener object with function OnStageNumberChanged(self, number) SpearheadEvents.AddStageNumberChangedListener = function(listener) - table.insert(OnStageNumberChangedListeners, listener) - end - - ---Add a stage zone number changed listener - ---@param handler function function(number) - SpearheadEvents.AddStageNumberChangedHandler = function(handler) - if type(handler) ~= "function" then - warn("Event handler not of type function, did you mean to use listener?") + if type(listener) ~= "table" or type(listener.OnStageNumberChanged) ~= "function" then + warn("Event handler not of type table/object with function OnStageNumberChanged(self, number)") return end - table.insert(OnStageNumberChangedHandlers, handler) + table.insert(OnStageNumberChangedListeners, listener) end ---@class OnStageNumberChangeCompleteListener @@ -64,14 +58,15 @@ do end ---@param newStageNumber number - SpearheadEvents.PublishStageNumberChanged = function(newStageNumber) + ---@param laneIdentifier string? + SpearheadEvents.PublishStageNumberChanged = function(newStageNumber, laneIdentifier) pcall(function () Persistence.SetActiveStage(newStageNumber) end) for _, callable in pairs(OnStageNumberChangedListeners) do local succ, err = pcall(function() - callable:OnStageNumberChanged(newStageNumber) + callable:OnStageNumberChanged(newStageNumber, laneIdentifier) end) if err then logError(err) @@ -79,7 +74,7 @@ do end for _, callable in pairs(OnStageNumberChangedHandlers) do - local succ, err = pcall(callable, newStageNumber) + local succ, err = pcall(callable, newStageNumber, laneIdentifier) if err then logError(err) end diff --git a/src/classes/stageClasses/GlobalStageManager.lua b/src/classes/stageClasses/GlobalStageManager.lua index b8b372c..744c5cb 100644 --- a/src/classes/stageClasses/GlobalStageManager.lua +++ b/src/classes/stageClasses/GlobalStageManager.lua @@ -8,17 +8,8 @@ local ExtraStage = require("classes.stageClasses.Stages.ExtraStage") local PrimaryStage = require("classes.stageClasses.Stages.PrimaryStage") local WaitingStage = require("classes.stageClasses.Stages.WaitingStage") local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper") - -local StagesByName = {} - ----@type table> -local StagesByIndex = {} - ----@type table> -local SideStageByIndex = {} - ----@type table> -local WaitingStagesByIndex = {} +local StageRepository = require("classes.stageClasses.StageRepository") +local StageLane = require("classes.stageClasses.StageLane") local currentStage = -99 @@ -26,25 +17,37 @@ local currentStage = -99 ---@field private database Database ---@field private logger Logger ---@field private stageConfig StageConfig +---@field private _stageRepository StageRepository ---@field private _missionCommandsHelper MissionCommandsHelper local GlobalStageManager = {} GlobalStageManager.__index = GlobalStageManager GlobalStageManager.getCurrentStage = function() return currentStage end +---@type GlobalStageManager +local singletonInstance = nil + ---comment ---@param database Database ---@param stageConfig StageConfig ---@param logLevel LogLevel ---@param spawnManager SpawnManager ----@return nil +---@return GlobalStageManager function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnManager) + + if singletonInstance ~= nil then + return singletonInstance + end + local logger = Logger.new("StageManager", logLevel) logger:info("Using Stage Log Level: " .. logLevel) local self = setmetatable({}, GlobalStageManager) + singletonInstance = self + self.database = database self.stageConfig = stageConfig self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() + self._stageRepository = StageRepository.new() self.logger = logger if stageConfig.isAutoStages ~= true then @@ -55,161 +58,222 @@ function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnMa for _, stageName in pairs(database:getStagezoneNames()) do logger:debug("Found stage zone with name: " .. stageName) + + local parseResult = self:ParseStageName(stageName) + if parseResult.isValid == false then + logger:warn("Stage zone with name " .. stageName .. " is not valid: " .. parseResult.invalidReason) + else + local initData = { + stageZoneName = parseResult.stageZoneName, + stageNumber = parseResult.orderNumber, + stageDisplayName = parseResult.stageDisplayName, + stageLaneIdentifier = parseResult.stageLaneIdentifier + } - if Util.startswith(stageName, "missionstage", true) then - local valid = true - local split = Util.split_string(stageName, "_") - if Util.tableLength(split) < 2 then - MissionEditorWarnings.Add("Stage zone with name " .. stageName .. " does not have a order number or valid format") - valid = false - end + if parseResult.stageType == "PrimaryStage" then + local stage = PrimaryStage.New(database, stageConfig, logger, initData, spawnManager) - if Util.tableLength(split) < 3 then - MissionEditorWarnings.Add("Stage zone with name " .. stageName .. " does not have a stage name") - end - - local orderNumber = nil - local isSideStage = false - if valid == true then - local orderNumberString = string.lower(split[2]) - if Util.startswith(orderNumberString, "x") == true then - isSideStage = true - - orderNumberString = string.gsub(orderNumberString, "x", "") - orderNumber = tonumber(orderNumberString) - else - orderNumber = tonumber(split[2]) - end - - if orderNumber == nil then - MissionEditorWarnings.Add("Stage zone with name " .. stageName .. " does not have a valid order number : " .. split[2]) - valid = false - end - end - - local stageDisplayName = split[3] - local stagelogger = Logger.new(stageName, logLevel) - if valid == true and orderNumber then - - ---@type StageInitData - local initData = { - stageDisplayName = stageDisplayName, - stageNumber = orderNumber, - stageZoneName = stageName, - } - - if isSideStage == true then - local stage = ExtraStage.New(database, stageConfig, stagelogger, initData, spawnManager) - stage:AddStageCompleteListener(self) - - if SideStageByIndex[tostring(orderNumber)] == nil then SideStageByIndex[tostring(orderNumber)] = {} end - table.insert(SideStageByIndex[tostring(orderNumber)], stage) - else - local stage = PrimaryStage.New(database, stageConfig, stagelogger, initData, spawnManager) - stage:AddStageCompleteListener(self) - - if StagesByIndex[tostring(orderNumber)] == nil then StagesByIndex[tostring(orderNumber)] = {} end - table.insert(StagesByIndex[tostring(orderNumber)], stage) - end + stage:AddStageCompleteListener(self) + self._stageRepository:AddStage(stage) + elseif parseResult.stageType == "ExtraStage" then + local stage = ExtraStage.New(database, stageConfig, logger, initData, spawnManager) + stage:AddStageCompleteListener(self) + self._stageRepository:AddStage(stage) + elseif parseResult.stageType == "WaitingStage" then + local waitingStage = WaitingStage.New(database, stageConfig, logger, initData, parseResult.waitingStageSeconds, spawnManager) + waitingStage:AddStageCompleteListener(self) + self._stageRepository:AddStage(waitingStage) end end - if Util.startswith(stageName, "waitingstage", true) then - local valid = true - - local split = Util.split_string(stageName, "_") - - if Util.tableLength(split) < 3 then - MissionEditorWarnings.Add("Stage zone with name " .. stageName .. " does not have a order number or valid format") - valid = false - end - - if valid == true then - local stageIndexString = split[2] - local stageIndex = tonumber(stageIndexString) - - if not stageIndex then - MissionEditorWarnings.Add("Stage zone with name " .. stageName .. " does not have a valid order number") - valid = false - end - - local waitingSecondsString = split[3] - local waitingSeconds = tonumber(waitingSecondsString) - if not waitingSeconds then - MissionEditorWarnings.Add("Waiting Stage zone with name " .. stageName .. " does not have a valid amount of seconds parameter") - valid = false - end - - if valid == true then - local stagelogger = Logger.new(stageName, logLevel) - - ---@type WaitingStageInitData - local initData = { - stageDisplayName = "Waiting Stage " .. stageIndex, - stageNumber = stageIndex or -99, - stageZoneName = stageName, - waitingSeconds = waitingSeconds --[[@as integer]] - } - local waitingStage = WaitingStage.New(database, stageConfig, stagelogger, initData, spawnManager) - - if WaitingStagesByIndex[tostring(stageIndex)] == nil then - WaitingStagesByIndex[tostring(stageIndex)] = {} - end - table.insert(WaitingStagesByIndex[tostring(stageIndex)], waitingStage) - - waitingStage:AddStageCompleteListener(self) - end - end - end end + singletonInstance = self return self end +---@class StageNameParseResult +---@field isValid boolean +---@field orderNumber integer +---@field stageLaneIdentifier string? +---@field stageDisplayName string +---@field stageZoneName string +---@field stageType StageType +---@field invalidReason string? +---@field waitingStageSeconds integer? + +---@param self GlobalStageManager +---@param stageName string +---@return StageNameParseResult +function GlobalStageManager:ParseStageName(stageName) + + local split = Util.split_string(stageName, "_") + + if Util.tableLength(split) < 3 then + return { isValid = false, invalidReason = "Stage zone with name " .. stageName .. " does not have a order number or valid format" } + end + + local typePart = string.lower(split[1]) + + if typePart == "missionstage" then + + local orderNumberString = string.lower(split[2]) + ---@type StageType + local stageType = "PrimaryStage" + if Util.endsWith(orderNumberString, "x", true) == true then + stageType = "ExtraStage" + orderNumberString = orderNumberString:sub(1, -1) + end + local stageLaneIdentifier = nil + local first = orderNumberString:sub(1, 1) + if tonumber(first) == nil then -- first character is the lane identifier only if it's not a number + stageLaneIdentifier = string.lower(first) + + orderNumberString = orderNumberString:sub(2) + end + + local orderNumber = tonumber(orderNumberString) + if orderNumber == nil then + return { isValid = false, invalidReason = "Stage zone with name " .. stageName .. " does not have a valid order number : " .. orderNumberString } + end + + local stageDisplayName = split[3] + ---@type StageNameParseResult + local result = { + isValid = true, + orderNumber = orderNumber, + stageLaneIdentifier = stageLaneIdentifier, + stageDisplayName = stageDisplayName, + stageZoneName = stageName, + stageType = stageType + } + return result + elseif typePart == "waitingstage" then + + local stageType = "WaitingStage" + local orderNumberString = split[2] + local orderNumber = tonumber(orderNumberString) + if orderNumber == nil then + return { isValid = false, invalidReason = "Waiting Stage zone with name " .. stageName .. " does not have a valid order number : " .. orderNumberString } + end + + local waitingSecondsString = split[3] + local waitingSeconds = tonumber(waitingSecondsString) + if waitingSeconds == nil then + return { isValid = false, invalidReason = "Waiting Stage zone with name " .. stageName .. " does not have a valid amount of seconds parameter : " .. waitingSecondsString } + end + + local stageDisplayName = "Waiting Stage " .. orderNumber + + ---@type StageNameParseResult + local result = { + isValid = true, + orderNumber = orderNumber, + stageLaneIdentifier = nil, + stageDisplayName = stageDisplayName, + stageZoneName = stageName, + stageType = stageType, + waitingStageSeconds = waitingSeconds + } + return result + + end + return { isValid = false, invalidReason = "Stage zone with name " .. stageName .. " has an unrecognized type: " .. typePart } +end + +---@param stage Stage function GlobalStageManager:OnStageComplete(stage) self.logger:debug("Receiving stage complete event from: " .. stage.zoneName) - local anyIncomplete = false - self.logger:debug("Checking stages for index: " .. tostring(currentStage)) - for index, stage in pairs(StagesByIndex[tostring(currentStage)]) do - if stage:IsComplete() == false then - anyIncomplete = true - self.logger:debug("Need to wait for Stage " .. stage.zoneName .. " to be completed") - else - self.logger:debug("Stage verified to be completed: " .. stage.zoneName) - end + local stageIndex = stage:GetStageIndex() + local laneIdentifier = stage:GetStageLaneIdentifier() + + local stageLane = self._stageRepository:getStageLane(laneIdentifier) + if not stageLane or not stageLane:IsCurrentStageIndexComplete() then + self.logger:debug("Stage lane " .. (laneIdentifier or "default") .. " is not complete for stage index " .. stageIndex) + return end - if anyIncomplete == false and self.stageConfig.isAutoStages == true then - -- CHECK WAITING STAGES - local nextStage = currentStage + 1 - - if WaitingStagesByIndex[tostring(nextStage)] then - for _, waitingStage in pairs(WaitingStagesByIndex[tostring(nextStage)]) do - if waitingStage:IsActive() == false then - waitingStage:ActivateStage() + local nextStageIndex = stageIndex + 1 + + Events.PublishStageNumberChanged(nextStageIndex, laneIdentifier) + stageLane:SetActiveStageIndex(nextStageIndex) + + if stageLane:IsDefaultStageLane() then + -- COMPLETION IN THE DEFAULT LANE + + -- 1. Check if any lane is at status "BetweenChapters" and the next chapter start is "next stage index" + + local allLanes = self._stageRepository:getAllStageLanes() + for _, lane in ipairs(allLanes) do + if lane:GetStageLaneIdentifier() ~= StageLane.DefaultLaneKey and lane:GetStageLaneState() == "InChapter" then + local nextChapterStart = lane:GetNextChapterStart() + if nextChapterStart == nextStageIndex then + self.logger:debug("Lane " .. (lane:GetStageLaneIdentifier() or "default") .. " is at chapter start for next stage index " .. nextStageIndex) + Events.PublishStageNumberChanged(nextStageIndex, lane:GetStageLaneIdentifier()) + lane:SetActiveStageIndex(nextStageIndex) end end end - - local anyWaiting = false - if WaitingStagesByIndex[tostring(nextStage)] then - for _, waitingStage in pairs(WaitingStagesByIndex[tostring(nextStage)]) do - if waitingStage:IsComplete() == false then - anyWaiting = true + else + -- COMPLETION IN A SIDE LANE + + -- 1. Check if the default lane is at status "BetweenChapters" + local defaultStageLane = self._stageRepository:getStageLane(StageLane.DefaultLaneKey) + if defaultStageLane and defaultStageLane:GetStageLaneState() == "BetweenChapters" then + local nextChapterStart = defaultStageLane:GetNextChapterStart() + if nextChapterStart == nextStageIndex then + + -- 2. Check if all side lanes are at or beyond the next chapter starts + local allLanes = self._stageRepository:getAllStageLanes() + local allSideLanesReady = true + for _, lane in ipairs(allLanes) do + if lane:GetStageLaneIdentifier() ~= StageLane.DefaultLaneKey then + -- Check if the lane is at or beyond the next chapter starts when "InChapter" eq "Active" + if lane:GetStageLaneState() == "InChapter" and lane:GetActiveStageIndex() < nextStageIndex then + allSideLanesReady = false + self.logger:debug("Lane " .. (lane:GetStageLaneIdentifier() or "default") .. " is not ready for next stage index " .. nextStageIndex) + break + + -- When in between chapters, check if the next chapter start is less than the next stage index, meaning there is still stages to be completed before the main lane can be activated again + elseif lane:GetStageLaneState() == "BetweenChapters" then + local nextChapter = lane:GetNextChapterStart() + if nextChapter and nextChapter < nextStageIndex then + allSideLanesReady = false + self.logger:debug("Lane " .. (lane:GetStageLaneIdentifier() or "default") .. " is not ready for next stage index " .. nextStageIndex) + break + end + end + end end + + if allSideLanesReady then + self.logger:debug("All side lanes are ready for next stage index " .. nextStageIndex .. ", activating default lane") + Events.PublishStageNumberChanged(nextStageIndex, nil) + defaultStageLane:SetActiveStageIndex(nextStageIndex) + else + self.logger:debug("Not all side lanes are ready for next stage index " .. nextStageIndex .. ", default lane will not be activated") + end + end end - - if anyWaiting == false then - local newStageNumber = currentStage + 1 - self.logger:debug("Setting next stage to: " .. tostring(newStageNumber)) - Events.PublishStageNumberChanged(newStageNumber) - end end end +---@param stageNumber number +---@param stageLaneIdentifier string? +---@return boolean? +function GlobalStageManager:IsStageComplete(stageNumber, stageLaneIdentifier) + local stageLane = self._stageRepository:getStageLane(stageLaneIdentifier) + if not stageLane then + self.logger:warn("Stage lane " .. (stageLaneIdentifier or "default") .. " does not exist") + return nil + end + + return stageLane:IsStageIndexComplete(stageNumber) +end + ---@public function GlobalStageManager:OnStageNumberChanged(stageNumber) self.logger:debug("Stage number changed to: " .. tostring(stageNumber)) @@ -252,67 +316,176 @@ function GlobalStageManager:UpdateDrawings(stageNumber) end -GlobalStageManager.printFullOverview = function () +function GlobalStageManager:PrintMermaidStage() + local lanes = self._stageRepository:getAllStageLanes() - local logger = Logger.new("StageOverview", "INFO") - logger:info("Stage overview:") - - local max = 0 - local lines = {} - for stageIndex, stages in pairs(StagesByIndex) do + local nodes = {} + local edges = {} + local stageIndicesByLane = {} -- Track all stage indices per lane + local mainLaneId = "default" + + -- Build nodes and collect all stage indices per lane + for _, lane in ipairs(lanes) do + local laneId = lane:GetStageLaneIdentifier() or "default" + local stageIndices = lane:GetAllStageIndices() + stageIndicesByLane[laneId] = stageIndices - local totalStrike = 0 - local totalbai = 0 - local totaldead = 0 - local totalMissions = 0 - local totalCas = 0 - - for _, stage in pairs(stages) do + -- Create nodes for each stage index in this lane + for _, stageIndex in ipairs(stageIndices) do + local stages = lane:GetStagesAtIndex(stageIndex) - local strike, dead, bai, cas = stage:GetStageStats() - - totalStrike = totalStrike + strike - totalbai = totalbai + bai - totaldead = totaldead + dead - totalCas = totalCas + cas - totalMissions = totalMissions + strike + dead + bai + cas - end - - local index = tonumber(stageIndex) - if index then - if index > max then - max = index + if stages then + for _, stage in ipairs(stages) do + local nodeId = laneId .. "_" .. stageIndex + local stageType = stage:GetStageType() + local label = stage.stageName or stage.zoneName + + -- Different node shapes for different stage types + local nodeShape = "[" + local nodeEnd = "]" + if stageType == "ExtraStage" then + nodeShape = "([" + nodeEnd = "])" + elseif stageType == "WaitingStage" then + nodeShape = "[[" + nodeEnd = "]]" + end + + nodes[nodeId] = string.format(' %s%s"%s (S%d)"%s', + nodeId, nodeShape, label, stageIndex, nodeEnd) + end end - lines[index] ="Stage# " .. tostring(stageIndex).. " | " .. totalStrike .. " strikes | " .. totaldead .. " dead | " .. totalbai .. " BAI | " .. totalCas .. " CAS | Total:" .. totalMissions - else - logger:warn("Stage index is not a number: " .. stageIndex) end end - - for i = 1, max do - if lines[i] then - logger:info(lines[i]) + + -- Add edges for sequential stages within the same lane + for laneId, stageIndices in pairs(stageIndicesByLane) do + for i = 1, #stageIndices - 1 do + local fromIdx = stageIndices[i] + local toIdx = stageIndices[i + 1] + local fromNodeId = laneId .. "_" .. fromIdx + local toNodeId = laneId .. "_" .. toIdx + + -- Check if this is a chapter boundary (gap) + local isChapter = false + for _, lane in ipairs(lanes) do + local normalizedLaneId = lane:GetStageLaneIdentifier() or "default" + if normalizedLaneId == laneId then + isChapter = lane:IsChapterStart(toIdx) + break + end + end + + local label = isChapter and "|chapter|" or "" + table.insert(edges, string.format(' %s -->%s %s', fromNodeId, label, toNodeId)) end end - + + -- Get main lane reference + local mainStageLane = nil + for _, lane in ipairs(lanes) do + if lane:IsDefaultStageLane() then + mainStageLane = lane + break + end + end + + -- Add dependencies from DEFAULT lane to SIDE lanes at chapter starts + -- Side lanes activate when main reaches a chapter start index for that side lane + if mainStageLane then + for _, lane in ipairs(lanes) do + if lane:IsDefaultStageLane() == false then + local sideId = lane:GetStageLaneIdentifier() + local sideIndices = stageIndicesByLane[sideId] + + -- For each stage in the side lane + for _, stageIdx in ipairs(sideIndices) do + -- Check if this is a chapter start in the side lane + if lane:IsChapterStart(stageIdx) then + local fromNodeId = mainLaneId .. "_" .. stageIdx + local toNodeId = sideId .. "_" .. stageIdx + -- Side lane activates when main lane reaches this chapter start + table.insert(edges, string.format(' %s -->|unlock| %s', fromNodeId, toNodeId)) + end + end + end + end + end + + -- Add dependencies from SIDE lanes gating the MAIN lane at chapter boundaries + -- Main cannot advance to the next chapter until ALL side lanes are at or above that chapter index + if mainStageLane then + local mainIndices = stageIndicesByLane[mainLaneId] + + -- For each chapter start in main lane (skip first one) + for i = 2, #mainIndices do + local nextIdx = mainIndices[i] + + -- Check if nextIdx is a chapter start (there's a gap before it) + if mainStageLane:IsChapterStart(nextIdx) then + -- Before main can progress to nextIdx, all side lanes must be at >= nextIdx + for _, lane in ipairs(lanes) do + if lane:IsDefaultStageLane() == false then + local sideId = lane:GetStageLaneIdentifier() + local sideIndices = stageIndicesByLane[sideId] + + -- Find the appropriate gate node for this side lane + -- Use first stage >= nextIdx if it exists, otherwise use the highest stage + local gateStageIdx = nil + + for _, idx in ipairs(sideIndices) do + if idx >= nextIdx then + gateStageIdx = idx + break + end + end + + -- If no stage >= nextIdx, use the highest stage in this lane + if gateStageIdx == nil and #sideIndices > 0 then + gateStageIdx = sideIndices[#sideIndices] + end + + if gateStageIdx then + local fromNodeId = sideId .. "_" .. gateStageIdx + local toNodeId = mainLaneId .. "_" .. nextIdx + table.insert(edges, string.format(' %s -->|gate| %s', fromNodeId, toNodeId)) + end + end + end + end + end + end + + -- Build complete Mermaid diagram + local diagramLines = {"graph TD"} + for _, nodeStr in pairs(nodes) do + table.insert(diagramLines, nodeStr) + end + for _, edgeStr in pairs(edges) do + table.insert(diagramLines, edgeStr) + end + + -- Print as single multi-line message + local diagram = "========== STAGE FLOW DIAGRAM ==========\n" .. table.concat(diagramLines, "\n") .. "\n========== END DIAGRAM ==========" + self.logger:info(diagram) end ---comment ---@param stageNumber number +---@param stageLaneIdentifier string? nil for default lan ---@return boolean | nil -GlobalStageManager.isStageComplete = function (stageNumber) - - local stageIndex = tostring(stageNumber) - - if StagesByIndex[stageIndex] == nil then return nil end +GlobalStageManager.isStageComplete = function (stageNumber, stageLaneIdentifier) - for _, stage in ipairs(StagesByIndex[stageIndex]) do - if stage:IsComplete() == false then - return false - end + if singletonInstance == nil then + Logger.new("StageManager", "INFO"):warn("GlobalStageManager.isStageComplete called before GlobalStageManager was initialized. Returning nil") + return nil end - return true + if stageLaneIdentifier then + stageLaneIdentifier = string.lower(stageLaneIdentifier) + end + + return singletonInstance:IsStageComplete(stageNumber, stageLaneIdentifier) end return GlobalStageManager diff --git a/src/classes/stageClasses/StageLane.lua b/src/classes/stageClasses/StageLane.lua new file mode 100644 index 0000000..c8a6441 --- /dev/null +++ b/src/classes/stageClasses/StageLane.lua @@ -0,0 +1,178 @@ + + +---@class StageLane +---@field private _isDefaultStageLane boolean +---@field private _stageLaneIdentifier string +---@field private _activeStageIndex number +---@field private _stagesInLaneByIndex table> +---@field private _chapterStarts table? +---@field private _stageLaneState StageLaneState +---@field private _maxStageIndex number +local StageLane = {} +StageLane.__index = StageLane + +---@alias StageLaneState +---| "InChapter" +---| "BetweenChapters" +---| "Completed" + +StageLane.DefaultLaneKey = nil + +function StageLane.New(laneIdentifier) + + if not laneIdentifier then + laneIdentifier = StageLane.DefaultLaneKey + end + + local self = setmetatable({}, { __index = StageLane }) --[[@as StageLane]] + self._isDefaultStageLane = laneIdentifier == StageLane.DefaultLaneKey + self._stageLaneIdentifier = laneIdentifier + self._activeStageIndex = nil + self._stagesInLaneByIndex = {} + self._chapterStarts = nil + self._stageLaneState = "BetweenChapters" + return self +end + +---@param stage Stage +function StageLane:AddStage(stage) + local stageIndex = stage:GetStageIndex() + if not self._stagesInLaneByIndex[stageIndex] then + self._stagesInLaneByIndex[stageIndex] = {} + end + + if not self._maxStageIndex or stageIndex > self._maxStageIndex then + self._maxStageIndex = stageIndex + end + + table.insert(self._stagesInLaneByIndex[stageIndex], stage) +end + +---@param stageNumber number +---@return boolean? +function StageLane:IsStageIndexComplete(stageNumber) + local stages = self._stagesInLaneByIndex[stageNumber] + if not stages then + return nil + end + + for _, stage in ipairs(stages) do + if not stage:IsComplete() then + return false + end + end + + return true +end + +---@return boolean +function StageLane:IsCurrentStageIndexComplete() + return self:IsStageIndexComplete(self._activeStageIndex) == true +end + +---@return string? +function StageLane:GetStageLaneIdentifier() + return self._stageLaneIdentifier +end + +---@return boolean +function StageLane:IsDefaultStageLane() + return self._isDefaultStageLane +end + +---@return number +function StageLane:GetActiveStageIndex() + return self._activeStageIndex +end + +---@param stageNumber number +function StageLane:SetActiveStageIndex(stageNumber) + + if self._stagesInLaneByIndex[stageNumber] == nil then + self._stageLaneState = "BetweenChapters" -- stage number is not in this lane, so we are between chapters + elseif stageNumber > self._maxStageIndex then + self._stageLaneState = "Completed" -- stage number is beyond the max stage index + else + self._stageLaneState = "InChapter" + end + + self._activeStageIndex = stageNumber +end + +---@return StageLaneState +function StageLane:GetStageLaneState() + return self._stageLaneState +end + +--- Checks if the given stage number is a chapter start.
+--- Chapter starts are the first StageIndex after a gap in stage numbers.
+--- For example, if the stage numbers are 1, 2, 3, 5, 6, 7, then stage number 5 is a chapter start because there is a gap between 3 and 5.
+---@param stageNumber number +function StageLane:IsChapterStart(stageNumber) + + if self._chapterStarts == nil then + self:FillChapterStarts() + end + + return self._chapterStarts[tostring(stageNumber)] == true +end + +--- fills chapter starts, chapter starts are where there's a gap in between stage numbers. +--- The first stage in a lane is always a chapter start. +---@private +function StageLane:FillChapterStarts() + + local previousIndex = nil + local stageIndices = {} + for stageIndex, _ in pairs(self._stagesInLaneByIndex) do + table.insert(stageIndices, tonumber(stageIndex)) + end + table.sort(stageIndices) + + self._chapterStarts = self._chapterStarts or {} + for _, stageIndex in ipairs(stageIndices) do + if previousIndex == nil then + -- First stage is always a chapter start + self._chapterStarts[tostring(stageIndex)] = true + elseif stageIndex > previousIndex + 1 then + -- Gap before this stage means it's a chapter start + self._chapterStarts[tostring(stageIndex)] = true + else + -- Consecutive stage, not a chapter start + self._chapterStarts[tostring(stageIndex)] = false + end + previousIndex = stageIndex + end +end + +---@return Array +function StageLane:GetAllStageIndices() + local indices = {} + for stageIndex, _ in pairs(self._stagesInLaneByIndex) do + table.insert(indices, tonumber(stageIndex)) + end + table.sort(indices) + return indices +end + +---@param stageIndex number +---@return Array? +function StageLane:GetStagesAtIndex(stageIndex) + return self._stagesInLaneByIndex[stageIndex] +end + +---@return number? +function StageLane:GetNextChapterStart() + if self._chapterStarts == nil then + self:FillChapterStarts() + end + + for stageIndex, _ in pairs(self._stagesInLaneByIndex) do + if tonumber(stageIndex) > self._activeStageIndex and self._chapterStarts[tostring(stageIndex)] == true then + return tonumber(stageIndex) + end + end + return nil +end + +return StageLane diff --git a/src/classes/stageClasses/StageRepository.lua b/src/classes/stageClasses/StageRepository.lua new file mode 100644 index 0000000..05ac679 --- /dev/null +++ b/src/classes/stageClasses/StageRepository.lua @@ -0,0 +1,47 @@ +local StageLane = require("classes.stageClasses.StageLane") + +---@class StageRepository +---@field private StageLanes table +local StageRepository = {} +StageRepository.__index = StageRepository + +---@return StageRepository +function StageRepository.new() + local self = setmetatable({}, StageRepository) + self.StageLanes = {} + self.StageLanes[tostring(StageLane.DefaultLaneKey)] = StageLane.New(StageLane.DefaultLaneKey) + return self +end + + +---@param laneName string? `nil` for default lane +---@return StageLane? +function StageRepository:getStageLane(laneName) + if not laneName then + laneName = StageLane.DefaultLaneKey + end + return self.StageLanes[tostring(laneName)] +end + +---@return Array +function StageRepository:getAllStageLanes() + local lanes = {} + for _, lane in pairs(self.StageLanes) do + table.insert(lanes, lane) + end + return lanes +end + +---@param stage Stage +function StageRepository:AddStage(stage) + + local stageLaneIdentifier = stage:GetStageLaneIdentifier() or StageLane.DefaultLaneKey + + if self.StageLanes[tostring(stageLaneIdentifier)] == nil then + self.StageLanes[tostring(stageLaneIdentifier)] = StageLane.New(stageLaneIdentifier) + end + + self.StageLanes[tostring(stageLaneIdentifier)]:AddStage(stage) +end + +return StageRepository \ No newline at end of file diff --git a/src/classes/stageClasses/Stages/BaseStage/Stage.lua b/src/classes/stageClasses/Stages/BaseStage/Stage.lua index 9ce9183..2eda558 100644 --- a/src/classes/stageClasses/Stages/BaseStage/Stage.lua +++ b/src/classes/stageClasses/Stages/BaseStage/Stage.lua @@ -19,6 +19,11 @@ local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelpe ---| "BLUE" ---| "GRAY" +---@alias StageType +---| "PrimaryStage" +---| "ExtraStage" +---| "WaitingStage" + --- @class StageData --- @field stageBriefing string? --- @field missionsByCode table @@ -33,9 +38,11 @@ local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelpe --- @field supplyHubs Array --- @class StageInitData +--- @field type StageType --- @field stageZoneName string --- @field stageNumber integer --- @field stageDisplayName string +--- @field stageLaneIdentifier string? --- @class StageCompleteListener @@ -45,6 +52,8 @@ local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelpe --- @field zoneName string --- @field stageName string? --- @field stageNumber number +--- @field protected _stageLaneIdentifier string? +--- @field protected _stageType StageType --- @field protected _currentStageState CurrentStageState --- @field protected _missionCommandsHelper MissionCommandsHelper --- @field protected _missionPriority MissionPriority @@ -86,15 +95,22 @@ Stage.StageColors = { ---@param initData StageInitData ---@param missionPriority MissionPriority ---@param spawnManager SpawnManager +---@param stageType StageType ---@return Stage -function Stage:superNew(database, stageConfig, logger, initData, missionPriority, spawnManager) +function Stage:superNew(database, stageConfig, logger, initData, stageType, missionPriority, spawnManager) logger:debug("[BaseStage] Initiating stage with name: " .. initData.stageZoneName) self._currentStageState = Stage.CurrentStageState.INACTIVE self.zoneName = initData.stageZoneName self.stageNumber = initData.stageNumber + if initData.stageLaneIdentifier then + self._stageLaneIdentifier = string.lower(initData.stageLaneIdentifier) + else + self._stageLaneIdentifier = nil + end self.stageName = initData.stageDisplayName self._currentStageState = Stage.CurrentStageState.INACTIVE + self._stageType = stageType self.OnPostStageComplete = nil self.OnPostBlueActivated = nil @@ -298,6 +314,21 @@ function Stage:IsActive() return self._currentStageState == Stage.CurrentStageState.ACTIVE end +---@return StageType +function Stage:GetStageType() + return self._stageType +end + +---@return string? +function Stage:GetStageLaneIdentifier() + return self._stageLaneIdentifier +end + +---@return number +function Stage:GetStageIndex() + return self.stageNumber +end + ---comment function Stage:CheckAndUpdateSelf() self._logger:debug("Checking on Stage: " .. self.zoneName) diff --git a/src/classes/stageClasses/Stages/ExtraStage.lua b/src/classes/stageClasses/Stages/ExtraStage.lua index 175dd9f..c43ffa8 100644 --- a/src/classes/stageClasses/Stages/ExtraStage.lua +++ b/src/classes/stageClasses/Stages/ExtraStage.lua @@ -19,7 +19,7 @@ function ExtraStage.New(database, stageConfig, logger, initData, spawnManager) setmetatable(ExtraStage, Stage) local self = setmetatable({}, { __index = ExtraStage }) --[[@as ExtraStage]] - self:superNew(database, stageConfig, logger, initData, "secondary", spawnManager) + self:superNew(database, stageConfig, logger, initData, "ExtraStage", "secondary", spawnManager) self.OnPostBlueActivated = function (selfStage) diff --git a/src/classes/stageClasses/Stages/PrimaryStage.lua b/src/classes/stageClasses/Stages/PrimaryStage.lua index cde2148..79dc0bf 100644 --- a/src/classes/stageClasses/Stages/PrimaryStage.lua +++ b/src/classes/stageClasses/Stages/PrimaryStage.lua @@ -18,7 +18,7 @@ function PrimaryStage.New(database, stageConfig, logger, initData, spawnManager) setmetatable(PrimaryStage, Stage) local self = setmetatable({}, { __index = PrimaryStage }) --[[@as PrimaryStage]] - self:superNew(database, stageConfig, logger, initData, "primary", spawnManager) + self:superNew(database, stageConfig, logger, initData, "PrimaryStage", "primary", spawnManager) return self end diff --git a/src/classes/stageClasses/Stages/WaitingStage.lua b/src/classes/stageClasses/Stages/WaitingStage.lua index 13a79a0..a803a8a 100644 --- a/src/classes/stageClasses/Stages/WaitingStage.lua +++ b/src/classes/stageClasses/Stages/WaitingStage.lua @@ -4,28 +4,24 @@ local Stage = require("classes.stageClasses.Stages.BaseStage.Stage") ---@field private _waitTimeSeconds integer ---@field private _startTime number local WaitingStage = {} - WaitingStage.__index = WaitingStage ----@class WaitingStageInitData : StageInitData ----@field waitingSeconds integer -local WaitingStageInitData = {} - ---comment ---@param database Database ---@param stageConfig StageConfig ---@param logger any ----@param initData WaitingStageInitData +---@param initData StageInitData ---@param spawnManager SpawnManager +---@param waitingSeconds integer ---@return WaitingStage -function WaitingStage.New(database, stageConfig, logger, initData, spawnManager) +function WaitingStage.New(database, stageConfig, logger, initData, waitingSeconds, spawnManager) setmetatable(WaitingStage, Stage) local self = setmetatable({}, { __index = WaitingStage }) --[[@as WaitingStage]] - self:superNew(database, stageConfig, logger, initData, "none", spawnManager) + self:superNew(database, stageConfig, logger, initData, "WaitingStage", "none", spawnManager) self._waitTimeSeconds = 5 - if initData.waitingSeconds and initData.waitingSeconds > 5 then self._waitTimeSeconds = initData.waitingSeconds end + if waitingSeconds and waitingSeconds > 5 then self._waitTimeSeconds = waitingSeconds end self._startTime = nil self.CheckContinuousAsync = function (selfA, time) diff --git a/src/classes/util/Util.lua b/src/classes/util/Util.lua index f825790..f8366c4 100644 --- a/src/classes/util/Util.lua +++ b/src/classes/util/Util.lua @@ -128,6 +128,14 @@ do -- INIT UTIL return str:find('^' .. findable) ~= nil end + UTIL.endsWith = function(str, findable, ignoreCase) + if ignoreCase == true then + return string.lower(str):find(string.lower(findable) .. '$') ~= nil + end + + return str:find(findable .. '$') ~= nil + end + ---comment ---@param str string ---@param findable string diff --git a/src/main.lua b/src/main.lua index 4d361f1..b775078 100644 --- a/src/main.lua +++ b/src/main.lua @@ -54,7 +54,7 @@ local detectionLogger = Logger.new("DetectionManager", defaultLogLevel) local detectionManager = DetectionManager.New(detectionLogger) GlobalCapManager.start(databaseManager, capConfig, detectionManager, stageConfig, defaultLogLevel, spawnManager) -GlobalStageManager.NewAndStart(databaseManager, stageConfig, defaultLogLevel, spawnManager) +local globalStageManager = GlobalStageManager.NewAndStart(databaseManager, stageConfig, defaultLogLevel, spawnManager) GlobalFleetManager.start(databaseManager) local SetStageDelayed = function(number, time) @@ -70,5 +70,5 @@ standardLogger:info("Spearhead Initialisation duration: " .. tostring(duration) local missionEditorWarningsLogger = Logger.new("MissionEditorWarnings", defaultLogLevel) MissionEditorWarnings.WriteAll(missionEditorWarningsLogger) -GlobalStageManager:printFullOverview() +globalStageManager:PrintMermaidStage() -- 2.54.0 From 51bed1082236dded2322db3d9ce48c2f0ed2b7b7 Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Sun, 30 Aug 2026 14:12:43 +0200 Subject: [PATCH 03/12] wip --- RELEASENOTES.md | 10 +++- config.lua | 3 + src/classes/capClasses/CapAirbase.lua | 7 ++- src/classes/capClasses/airGroups/AirGroup.lua | 28 ++++++++++ src/classes/configuration/GlobalConfig.lua | 7 +++ src/classes/fleetClasses/FleetGroup.lua | 4 +- src/classes/persistence/Persistence.lua | 19 ++++--- src/classes/spearhead_events.lua | 8 +-- .../stageClasses/GlobalStageManager.lua | 55 ++++++++++++++++--- src/classes/stageClasses/StageRepository.lua | 13 +++++ .../stageClasses/Stages/BaseStage/Stage.lua | 26 ++++++++- .../stageClasses/Stages/ExtraStage.lua | 7 ++- .../stageClasses/drawings/CustomDrawing.lua | 30 ++++++++++ .../drawings/helper/DrawingHelper.lua | 2 +- .../missions/baseMissions/Mission.lua | 5 ++ src/main.lua | 39 ++++++------- 16 files changed, 214 insertions(+), 49 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index effc01c..5e31f9c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,11 +5,19 @@ ### New Features +- Issue + +- Issue: #35 + Creating Lane option for stages. + Additionally to the primary stage lane, stages can now be created in different lanes. + These lanes can be used to create different stage progression flows and create different "side-stories". + #40 + ### Bug Fixes ## [0.13.0] 2026-08 -A good first release that finally has all major bugs fixed that were caused by the migration from both the underlying script transpiler and the migration to Gitea.
+A good first release that finally has all major bugs fixed that were caused by the migration from both the underlying script transpiler and the migration to Gitea. ### Breaking Changes diff --git a/config.lua b/config.lua index f429a7f..14af0b5 100644 --- a/config.lua +++ b/config.lua @@ -4,6 +4,9 @@ SpearheadConfig = { ---DEBUG LOGGING debugEnabled = false, -- default false + --- DEBUG MENU + debugMenuEnabled = false, -- default false + --- The time briefings should be displayed by default. --- Players can always "Clear Messages" through the F10 menu, so setting it to a high value can be briefingMessageDuration = 60, --default 60 diff --git a/src/classes/capClasses/CapAirbase.lua b/src/classes/capClasses/CapAirbase.lua index a906f28..80390a3 100644 --- a/src/classes/capClasses/CapAirbase.lua +++ b/src/classes/capClasses/CapAirbase.lua @@ -392,9 +392,12 @@ function CapBase:CheckAndScheduleIntercept() end end end - end -function CapBase:OnStageNumberChanged(number) + +function CapBase:OnStageNumberChanged(number, laneIdentifier) + -- only react on "main" lane changes, ignore other lanes for now + if laneIdentifier ~= nil then return end + self.activeStage = number if self:IsBaseActiveWhenStageIsActive(number) == true then diff --git a/src/classes/capClasses/airGroups/AirGroup.lua b/src/classes/capClasses/airGroups/AirGroup.lua index ea5a5ce..83c1586 100644 --- a/src/classes/capClasses/airGroups/AirGroup.lua +++ b/src/classes/capClasses/airGroups/AirGroup.lua @@ -2,6 +2,9 @@ local SpearheadEvents = require("classes.spearhead_events") local RTBMission = require("classes.capClasses.taskings.RTB") local Util = require("classes.util.Util") local DcsUtil = require("classes.util.DcsUtil") +local GlobalConfig = require("classes.configuration.GlobalConfig") +local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") +local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelper") ---@class AirGroup : OnUnitLostListener ---@field protected _logger Logger @@ -12,9 +15,12 @@ local DcsUtil = require("classes.util.DcsUtil") ---@field protected _config CapConfig ---@field protected _checkLivenessNumber number ---@field protected _spawnManager SpawnManager +---@field protected _routeDrawing CustomDrawing? local AirGroup = {} AirGroup.__index = AirGroup +local globalConfig = GlobalConfig.New() + ---@param logger Logger ---@param groupName string ---@param groupType AirGroupType @@ -28,6 +34,7 @@ function AirGroup:New(groupName, groupType, config, logger, spawnManager) self._config = config self._logger = logger self._spawnManager = spawnManager + self._routeDrawing = nil local group = Group.getByName(self._groupName) if group then @@ -92,6 +99,27 @@ function AirGroup:SetMissionPrivate(mission) if group and mission then group:getController():setTask(mission) self._logger:debug("mission - Task set for group: " .. self._groupName) + + if globalConfig:isDebugMenuEnabled() == true then + -- draw the mission route for debugging purposes + if self._routeDrawing then + self._routeDrawing:Remove() + end + + local points = {} + if mission and mission.params and mission.params.route and mission.params.route.points then + for _, wp in pairs(mission.params.route.points) do + if wp.x and wp.y then + table.insert(points, { x = wp.x, y = wp.y }) + end + end + end + + local colorString = DrawingHelper.ColorTableToColorString({ 1, 0, 0, 1 }) + self._routeDrawing = CustomDrawing.FromPoints(points, colorString, 5, 2) + self._routeDrawing:Draw() + end + end end diff --git a/src/classes/configuration/GlobalConfig.lua b/src/classes/configuration/GlobalConfig.lua index c794984..d4c19d8 100644 --- a/src/classes/configuration/GlobalConfig.lua +++ b/src/classes/configuration/GlobalConfig.lua @@ -6,6 +6,7 @@ local briefingMessageTime = nil ---@class GlobalConfig ---@field private _briefingTime number ---@field private _debugEnabled boolean +---@field private _debugMenuEnabled boolean local GlobalConfig = {} GlobalConfig.__index = GlobalConfig; @@ -27,6 +28,8 @@ function GlobalConfig.New() self._debugEnabled = false end + self._debugMenuEnabled = SpearheadConfig.debugMenuEnabled == true + end return self @@ -40,6 +43,10 @@ function GlobalConfig:isDebugEnabled() return self._debugEnabled or false end +---@return boolean +function GlobalConfig:isDebugMenuEnabled() + return self._debugMenuEnabled or false +end return GlobalConfig diff --git a/src/classes/fleetClasses/FleetGroup.lua b/src/classes/fleetClasses/FleetGroup.lua index 2e703dc..48d7671 100644 --- a/src/classes/fleetClasses/FleetGroup.lua +++ b/src/classes/fleetClasses/FleetGroup.lua @@ -127,7 +127,9 @@ function FleetGroup:new(fleetGroupName, database, logger) end end - o.OnStageNumberChanged = function(self, number) + o.OnStageNumberChanged = function(self, number, laneIdentifier) + -- only react on "main" lane changes, ignore other lanes for now + if laneIdentifier ~= nil then return end local targetZone = self.targetZonePerStage[tostring(number)] if targetZone and targetZone ~= self.currentTargetZone then local points = self.pointsPerZone[targetZone] diff --git a/src/classes/persistence/Persistence.lua b/src/classes/persistence/Persistence.lua index 02e179e..7e3331d 100644 --- a/src/classes/persistence/Persistence.lua +++ b/src/classes/persistence/Persistence.lua @@ -13,7 +13,7 @@ do ---@field unitsStates table ---@field random_missions table ---@field deliveredKilos table - ---@field activeStage integer|nil + ---@field activeStageInStageLane table ---@class UnitState ---@field isDead boolean @@ -33,7 +33,7 @@ do unitsStates = {}, random_missions = {}, deliveredKilos = {}, - activeStage = nil + activeStageInStageLane = {} } local logger = {} @@ -230,9 +230,11 @@ do end ---Sets the stage in the persistence table + ---@param stageLane string? ---@param stageNumber number - Persistence.SetActiveStage = function(stageNumber) - tables.activeStage = stageNumber + Persistence.SetActiveStage = function(stageLane, stageNumber) + stageLane = stageLane or "nil" + tables.activeStageInStageLane[stageLane] = stageNumber Persistence._updateRequired = true end @@ -256,12 +258,11 @@ do end ---Get the active stage as in the persistance file + ---@param stageLane string? ---@return integer|nil - Persistence.GetActiveStage = function() - if tables.activeStage then - return tables.activeStage - end - return nil + Persistence.GetActiveStage = function(stageLane) + stageLane = stageLane or "nil" + return tables.activeStageInStageLane[stageLane] end ---comment diff --git a/src/classes/spearhead_events.lua b/src/classes/spearhead_events.lua index efc707b..6b05b14 100644 --- a/src/classes/spearhead_events.lua +++ b/src/classes/spearhead_events.lua @@ -45,13 +45,13 @@ do end ---@class OnStageNumberChangeCompleteListener - ---@field OnStageNumberChangeComplete fun(self:OnStageNumberChangeCompleteListener, number:integer) + ---@field OnStageNumberChangeComplete fun(self:OnStageNumberChangeCompleteListener, number:integer, laneIdentifier:string?) local OnStageNumberChangeCompleteListeners = {} ---@param listener OnStageNumberChangeCompleteListener SpearheadEvents.AddStageNumberChangeCompleteListener = function(listener) if type(listener) ~= "table" or type(listener.OnStageNumberChangeComplete) ~= "function" then - warn("Event handler not of type table/object with function OnStageNumberChangeComplete(self, number)") + warn("Event handler not of type table/object with function OnStageNumberChangeComplete(self, number, laneIdentifier)") return end table.insert(OnStageNumberChangeCompleteListeners, listener) @@ -61,7 +61,7 @@ do ---@param laneIdentifier string? SpearheadEvents.PublishStageNumberChanged = function(newStageNumber, laneIdentifier) pcall(function () - Persistence.SetActiveStage(newStageNumber) + Persistence.SetActiveStage(laneIdentifier, newStageNumber) end) for _, callable in pairs(OnStageNumberChangedListeners) do @@ -82,7 +82,7 @@ do for _, callable in pairs(OnStageNumberChangeCompleteListeners) do local succ, err = pcall(function() - callable:OnStageNumberChangeComplete(newStageNumber) + callable:OnStageNumberChangeComplete(newStageNumber, laneIdentifier) end) if err then logError(err) diff --git a/src/classes/stageClasses/GlobalStageManager.lua b/src/classes/stageClasses/GlobalStageManager.lua index 744c5cb..b93c768 100644 --- a/src/classes/stageClasses/GlobalStageManager.lua +++ b/src/classes/stageClasses/GlobalStageManager.lua @@ -3,13 +3,14 @@ local Util = require("classes.util.Util") local DcsUtil = require("classes.util.DcsUtil") local Logger = require("classes.util.Logger") local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") - +local PersistenceConfig = require("classes.configuration.PersistenceConfig") local ExtraStage = require("classes.stageClasses.Stages.ExtraStage") local PrimaryStage = require("classes.stageClasses.Stages.PrimaryStage") local WaitingStage = require("classes.stageClasses.Stages.WaitingStage") local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper") local StageRepository = require("classes.stageClasses.StageRepository") local StageLane = require("classes.stageClasses.StageLane") +local Persistence = require("classes.persistence.Persistence") local currentStage = -99 @@ -33,7 +34,7 @@ local singletonInstance = nil ---@param logLevel LogLevel ---@param spawnManager SpawnManager ---@return GlobalStageManager -function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnManager) +function GlobalStageManager.new(database, stageConfig, logLevel, spawnManager) if singletonInstance ~= nil then return singletonInstance @@ -47,7 +48,7 @@ function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnMa self.database = database self.stageConfig = stageConfig self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() - self._stageRepository = StageRepository.new() + self._stageRepository = StageRepository.getInstance() self.logger = logger if stageConfig.isAutoStages ~= true then @@ -92,6 +93,38 @@ function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnMa return self end +function GlobalStageManager:Start() + self.logger:info("Starting GlobalStageManager") + + local startingStage = self.stageConfig.startingStage or 1 + local persistenceConfig = PersistenceConfig.new() + if persistenceConfig:isEnabled() == true then + self.logger:info("Persistence is enabled, loading stage state from persistence") + + local stageLanes = self._stageRepository:getAllStageLanes() + for _, stageLane in pairs(stageLanes) do + + local stageLaneIdentifier = stageLane:GetStageLaneIdentifier() + local persistedStage = Persistence.GetActiveStage(stageLaneIdentifier) + if persistedStage then + self.logger:info("Loaded persisted stage " .. persistedStage .. " for lane " .. (stageLaneIdentifier or "default")) + stageLane:SetActiveStageIndex(persistedStage) + Events.PublishStageNumberChanged(persistedStage, stageLaneIdentifier) + else + stageLane:SetActiveStageIndex(startingStage) + Events.PublishStageNumberChanged(startingStage, stageLaneIdentifier) + end + end + else + self.logger:info("Persistence is disabled, starting at stage " .. startingStage) + local stageLanes = self._stageRepository:getAllStageLanes() + for _, stageLane in pairs(stageLanes) do + stageLane:SetActiveStageIndex(startingStage) + Events.PublishStageNumberChanged(startingStage, stageLane:GetStageLaneIdentifier()) + end + end +end + ---@class StageNameParseResult ---@field isValid boolean ---@field orderNumber integer @@ -204,10 +237,9 @@ function GlobalStageManager:OnStageComplete(stage) -- COMPLETION IN THE DEFAULT LANE -- 1. Check if any lane is at status "BetweenChapters" and the next chapter start is "next stage index" - local allLanes = self._stageRepository:getAllStageLanes() for _, lane in ipairs(allLanes) do - if lane:GetStageLaneIdentifier() ~= StageLane.DefaultLaneKey and lane:GetStageLaneState() == "InChapter" then + if lane:GetStageLaneIdentifier() ~= StageLane.DefaultLaneKey and lane:GetStageLaneState() == "BetweenChapters" then local nextChapterStart = lane:GetNextChapterStart() if nextChapterStart == nextStageIndex then self.logger:debug("Lane " .. (lane:GetStageLaneIdentifier() or "default") .. " is at chapter start for next stage index " .. nextStageIndex) @@ -275,14 +307,19 @@ function GlobalStageManager:IsStageComplete(stageNumber, stageLaneIdentifier) end ---@public -function GlobalStageManager:OnStageNumberChanged(stageNumber) +function GlobalStageManager:OnStageNumberChanged(stageNumber, stageLaneIdentifier) + + -- only react on "main" lane changes, ignore other lanes for now + if stageLaneIdentifier ~= nil then return end + self.logger:debug("Stage number changed to: " .. tostring(stageNumber)) - currentStage = stageNumber - self:UpdateDrawings(stageNumber) end -function GlobalStageManager:OnStageNumberChangeComplete(stageNumber) +function GlobalStageManager:OnStageNumberChangeComplete(stageNumber, stageLaneIdentifier) + -- only react on "main" lane changes, ignore other lanes for now + if stageLaneIdentifier ~= nil then return end + self.logger:debug("Stage number change complete to: " .. tostring(stageNumber)) local groups = {} diff --git a/src/classes/stageClasses/StageRepository.lua b/src/classes/stageClasses/StageRepository.lua index 05ac679..31f8840 100644 --- a/src/classes/stageClasses/StageRepository.lua +++ b/src/classes/stageClasses/StageRepository.lua @@ -5,14 +5,27 @@ local StageLane = require("classes.stageClasses.StageLane") local StageRepository = {} StageRepository.__index = StageRepository +local instance = nil + +---@private ---@return StageRepository function StageRepository.new() local self = setmetatable({}, StageRepository) self.StageLanes = {} self.StageLanes[tostring(StageLane.DefaultLaneKey)] = StageLane.New(StageLane.DefaultLaneKey) + instance = self return self end +---@return StageRepository +StageRepository.getInstance = function() + if instance == nil then + instance = StageRepository.new() + end + + return instance +end + ---@param laneName string? `nil` for default lane ---@return StageLane? diff --git a/src/classes/stageClasses/Stages/BaseStage/Stage.lua b/src/classes/stageClasses/Stages/BaseStage/Stage.lua index 2eda558..d3f41e2 100644 --- a/src/classes/stageClasses/Stages/BaseStage/Stage.lua +++ b/src/classes/stageClasses/Stages/BaseStage/Stage.lua @@ -329,6 +329,23 @@ function Stage:GetStageIndex() return self.stageNumber end +---@return string +function Stage:GetStageName() + return self.stageName +end + +function Stage:GetMissions() + local missions = {} + for _, mission in pairs(self._db.missions) do + table.insert(missions, mission) + end + + for _, sam in pairs(self._db.sams) do + table.insert(missions, sam) + end + return missions +end + ---comment function Stage:CheckAndUpdateSelf() self._logger:debug("Checking on Stage: " .. self.zoneName) @@ -389,7 +406,7 @@ function Stage:IsMissionComplete(missionName) return mission:getState() == "COMPLETED" end ----private use only +-- private usage only function Stage:NotifyComplete() self._logger:info("Stage complete: " .. (self.stageName or self.stageNumber or "unknown")) @@ -514,7 +531,12 @@ end ---comment ---@param self Stage ---@param number integer -function Stage:OnStageNumberChanged(number) +---@param stageLaneIdentifier string? +function Stage:OnStageNumberChanged(number, stageLaneIdentifier) + + if stageLaneIdentifier ~= self._stageLaneIdentifier then + return + end if self._activeStage == number then --only activate once for a stage return diff --git a/src/classes/stageClasses/Stages/ExtraStage.lua b/src/classes/stageClasses/Stages/ExtraStage.lua index c43ffa8..b4cd633 100644 --- a/src/classes/stageClasses/Stages/ExtraStage.lua +++ b/src/classes/stageClasses/Stages/ExtraStage.lua @@ -36,7 +36,12 @@ end ---comment ---@param self ExtraStage ---@param number integer -function ExtraStage:OnStageNumberChanged(number) +---@param stageLaneIdentifier string? +function ExtraStage:OnStageNumberChanged(number, stageLaneIdentifier) + + if stageLaneIdentifier ~= self._stageLaneIdentifier then + return + end if self._activeStage == number then --only activate once for a stage return diff --git a/src/classes/stageClasses/drawings/CustomDrawing.lua b/src/classes/stageClasses/drawings/CustomDrawing.lua index 55fc646..71ba0a6 100644 --- a/src/classes/stageClasses/drawings/CustomDrawing.lua +++ b/src/classes/stageClasses/drawings/CustomDrawing.lua @@ -33,6 +33,36 @@ function CustomDrawing.New(drawingObject) return self end +---@param points Array +---@param colorString string +---@param lineStyle LineType +---@param lineThickness number +---@return CustomDrawing? +function CustomDrawing.FromPoints(points, colorString, lineStyle, lineThickness) + if points == nil or #points < 3 then + drawingLogger:warn("CustomDrawing.FromPoints called with nil or less than 3 points") + return nil + end + + ---@type FreeLine + local drawingObject = { + mapX = 0, + mapY = 0, + points = points, + lineMode = "free", + name = "custom_drawing_" .. tostring(math.random(1000000)), + primitiveType = "Polygon", + polygonMode = "free", + visible = true, + style = DrawingHelper.ToLineStyleString(lineStyle), + colorString = colorString, + thickness = lineThickness, + closed = false + } + + return CustomDrawing.New(drawingObject) +end + ---@param zone SpearheadTriggerZone ---@param colorString string ---@param fillColorString string diff --git a/src/classes/stageClasses/drawings/helper/DrawingHelper.lua b/src/classes/stageClasses/drawings/helper/DrawingHelper.lua index 8432890..a3b7472 100644 --- a/src/classes/stageClasses/drawings/helper/DrawingHelper.lua +++ b/src/classes/stageClasses/drawings/helper/DrawingHelper.lua @@ -266,7 +266,7 @@ function DrawingHelper.ColorToColorTable(hexStr) return { r, g , b , a } end ----@param rgba table +---@param rgba table { r, g, b, a } ---@return string function DrawingHelper.ColorTableToColorString(rgba) if rgba == nil or #rgba < 4 or rgba[1] == nil or rgba[2] == nil or rgba[3] == nil or rgba[4] == nil then diff --git a/src/classes/stageClasses/missions/baseMissions/Mission.lua b/src/classes/stageClasses/missions/baseMissions/Mission.lua index 54b1afc..f5272b7 100644 --- a/src/classes/stageClasses/missions/baseMissions/Mission.lua +++ b/src/classes/stageClasses/missions/baseMissions/Mission.lua @@ -126,6 +126,11 @@ function Mission:NotifyMissionComplete() end +function Mission:ForceMissionComplete() + self._state = "COMPLETED" + self:NotifyMissionComplete() +end + function Mission:MarkMissionAreaToGroup(groupId) end ---endregion diff --git a/src/main.lua b/src/main.lua index b775078..56e3f69 100644 --- a/src/main.lua +++ b/src/main.lua @@ -5,9 +5,11 @@ local DcsUtil = require("classes.util.DcsUtil") local Database = require("classes.spearhead_db") local SpearheadEvents = require("classes.spearhead_events") local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper") +local GlobalConfig = require("classes.configuration.GlobalConfig") local CapConfig = require("classes.configuration.CapConfig") local StageConfig = require("classes.configuration.StageConfig") local Persistence = require("classes.persistence.Persistence") +local PersistenceConfig = require("classes.configuration.PersistenceConfig") local SpawnManager = require("classes.helpers.SpawnManager") local DetectionManager = require("classes.capClasses.detection.DetectionManager") local GlobalCapManager = require("classes.capClasses.GlobalCapManager") @@ -33,19 +35,11 @@ MissionCommandsHelper.getOrCreate() -- initiate local capConfig = CapConfig:new(); local stageConfig = StageConfig:getInstance(); -local startingStage = stageConfig.startingStage or 1 -if SpearheadConfig and SpearheadConfig.Persistence and SpearheadConfig.Persistence.enabled == true then - standardLogger:info("Persistence enabled") +local persistenceConfig = PersistenceConfig.new() + +if persistenceConfig and persistenceConfig:isEnabled() == true then local persistenceLogger = Logger.new("Persistence", defaultLogLevel) Persistence.Init(persistenceLogger) - - local persistanceStage = Persistence.GetActiveStage() - if persistanceStage then - standardLogger:info("Persistance activated and using persistant active stage: " .. persistanceStage) - startingStage = persistanceStage - end -else - standardLogger:info("Persistence disabled") end local spawnLogger = Logger.new("SpawnManager", defaultLogLevel) @@ -54,16 +48,9 @@ local detectionLogger = Logger.new("DetectionManager", defaultLogLevel) local detectionManager = DetectionManager.New(detectionLogger) GlobalCapManager.start(databaseManager, capConfig, detectionManager, stageConfig, defaultLogLevel, spawnManager) -local globalStageManager = GlobalStageManager.NewAndStart(databaseManager, stageConfig, defaultLogLevel, spawnManager) +local globalStageManager = GlobalStageManager.new(databaseManager, stageConfig, defaultLogLevel, spawnManager) GlobalFleetManager.start(databaseManager) -local SetStageDelayed = function(number, time) - SpearheadEvents.PublishStageNumberChanged(number) - return nil -end - -timer.scheduleFunction(SetStageDelayed, startingStage, timer.getTime() + 3) - env.info(startTime .. "ms / " .. timer.getTime() * 1000 .. "ms") local duration = (timer.getTime() * 1000) - startTime standardLogger:info("Spearhead Initialisation duration: " .. tostring(duration) .. "ms") @@ -72,3 +59,17 @@ local missionEditorWarningsLogger = Logger.new("MissionEditorWarnings", defaultL MissionEditorWarnings.WriteAll(missionEditorWarningsLogger) globalStageManager:PrintMermaidStage() +local startDelayed = function() + globalStageManager:Start() + return nil +end + +timer.scheduleFunction(startDelayed, nil, timer.getTime() + 5) -- delay start by 5 seconds so every deleted item it first removed entirely + +local globalConfig = GlobalConfig.New() +if globalConfig and globalConfig:isDebugMenuEnabled() == true then + local DebugMenu = require("classes.debug.DebugMenu") + local debugMenu = DebugMenu.new() + debugMenu:RegisterMenus() +end + -- 2.54.0 From c10c743fe8a50fdc87d928bcec3ecaa171025af2 Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Sun, 30 Aug 2026 14:13:05 +0200 Subject: [PATCH 04/12] wip --- .../configuration/PersistenceConfig.lua | 31 +++++++ src/classes/debug/DebugMenu.lua | 80 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 src/classes/configuration/PersistenceConfig.lua create mode 100644 src/classes/debug/DebugMenu.lua diff --git a/src/classes/configuration/PersistenceConfig.lua b/src/classes/configuration/PersistenceConfig.lua new file mode 100644 index 0000000..67c722d --- /dev/null +++ b/src/classes/configuration/PersistenceConfig.lua @@ -0,0 +1,31 @@ + +---@class PersistenceConfig +---@field private _enabled boolean +---@field private directory string? +---@field private fileName string? +local PersistenceConfig = {} + +function PersistenceConfig.new() + local self = setmetatable({}, { __index = PersistenceConfig }) + + if not SpearheadConfig then SpearheadConfig = {} end + if not SpearheadConfig.Persistence then SpearheadConfig.Persistence = {} end + self._enabled = SpearheadConfig.Persistence.enabled == true + self.directory = SpearheadConfig.Persistence.directory + self.fileName = SpearheadConfig.Persistence.fileName + return self +end + +function PersistenceConfig:isEnabled() + return self._enabled == true +end + +function PersistenceConfig:getDirectory() + return self.directory +end + +function PersistenceConfig:getFileName() + return self.fileName +end + +return PersistenceConfig \ No newline at end of file diff --git a/src/classes/debug/DebugMenu.lua b/src/classes/debug/DebugMenu.lua new file mode 100644 index 0000000..564679d --- /dev/null +++ b/src/classes/debug/DebugMenu.lua @@ -0,0 +1,80 @@ +local Logger = require("classes.util.Logger") +local Util = require("classes.util.Util") +local StageRepository = require("classes.stageClasses.StageRepository") + +---@class DebugMenu +---@field private _logger Logger +---@field private _stageRepository StageRepository +local DebugMenu = {} +DebugMenu.__index = DebugMenu + +function DebugMenu.new() + local self = setmetatable({}, DebugMenu) + self._logger = Logger.new("DebugMenu") + self._stageRepository = StageRepository.getInstance() + return self +end + +local menuName = "Spearhead Debug" +local debugMenuPath = { [1] = menuName } +function DebugMenu:RegisterMenus() + + missionCommands.addSubMenu(menuName, {}) + + local refresh = function(params) + local selfA = params.self + selfA:RefreshMenu() + end + missionCommands.addCommand("Refresh Menu", debugMenuPath, refresh, { self = self }) + + self:AddStageOptions() + +end + +function DebugMenu:RefreshMenu() + + missionCommands.removeItem(debugMenuPath) + self:RegisterMenus() +end + +function DebugMenu:AddStageOptions() + local stageMenuTable = missionCommands.addSubMenu("Stages", debugMenuPath) + + local stageLanes = self._stageRepository:getAllStageLanes() + for _, stageLane in pairs(stageLanes) do + + local stages = stageLane:GetStagesAtIndex(stageLane:GetActiveStageIndex()) + if stages then + for _, stage in pairs(stages) do + local stageLaneId = stageLane:GetStageLaneIdentifier() or "" + local stageIndex = stage:GetStageIndex() + local stageName = stage:GetStageName() + + local stageMenuName = stageLaneId .. stageIndex .. "_" .. stageName + local currentStageMenuTable = missionCommands.addSubMenu(stageMenuName, stageMenuTable) + + ---@class CompleteStageParams + ---@field self DebugMenu + ---@field stage Stage + + ---@param params CompleteStageParams + local completeStage = function(params) + local stageA = params.stage + local missions = stageA:GetMissions() + for _, mission in pairs(missions) do + mission:ForceMissionComplete() + end + end + + ---@type CompleteStageParams + local params = { self = self, stage = stage } + missionCommands.addCommand("Complete Stage", currentStageMenuTable, completeStage, params) + + end + else + self._logger:info("No stages found for lane: " .. (stageLane:GetStageLaneIdentifier() or "default") .. " at index: " .. (stageLane:GetActiveStageIndex() or "nil")) + end + end +end + +return DebugMenu \ No newline at end of file -- 2.54.0 From 4de9e91efd89064249a0fc697c52dfa2a383fd6c Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Tue, 1 Sep 2026 09:02:56 +0200 Subject: [PATCH 05/12] Resolved first comments and made StageDrawings explicit classes that now also follow lane identifiers --- src/classes/persistence/Persistence.lua | 23 +++-- src/classes/spearhead_db.lua | 20 ++-- src/classes/spearhead_events.lua | 4 +- .../stageClasses/GlobalStageManager.lua | 25 +++-- .../stageClasses/drawings/CustomDrawing.lua | 43 +++------ .../stageClasses/drawings/StageDrawing.lua | 93 +++++++++++++++++++ 6 files changed, 151 insertions(+), 57 deletions(-) create mode 100644 src/classes/stageClasses/drawings/StageDrawing.lua diff --git a/src/classes/persistence/Persistence.lua b/src/classes/persistence/Persistence.lua index 7e3331d..bc24cbe 100644 --- a/src/classes/persistence/Persistence.lua +++ b/src/classes/persistence/Persistence.lua @@ -33,6 +33,7 @@ do unitsStates = {}, random_missions = {}, deliveredKilos = {}, + activeStage = nil, -- Backwards compatibility for previous version without lanes activeStageInStageLane = {} } @@ -238,6 +239,21 @@ do Persistence._updateRequired = true end + ---Get the active stage as in the persistance file + ---@param stageLane string? + ---@return integer|nil + Persistence.GetActiveStage = function(stageLane) + stageLane = stageLane or "nil" + + -- backwards compatibility for previous versions without stage lanes + if stageLane == "nil" and tables.activeStageInStageLane[stageLane] == nil then + tables.activeStageInStageLane[stageLane] = tables.activeStage + tables.activeStage = nil -- Clear the old activeStage so it's not used or confused later + end + + return tables.activeStageInStageLane[stageLane] + end + ---comment ---@param missionName string ---@param pickedZone string @@ -257,13 +273,6 @@ do return tables.random_missions[string.lower(missionName)] end - ---Get the active stage as in the persistance file - ---@param stageLane string? - ---@return integer|nil - Persistence.GetActiveStage = function(stageLane) - stageLane = stageLane or "nil" - return tables.activeStageInStageLane[stageLane] - end ---comment ---@param zoneName string diff --git a/src/classes/spearhead_db.lua b/src/classes/spearhead_db.lua index d36fcfc..296e453 100644 --- a/src/classes/spearhead_db.lua +++ b/src/classes/spearhead_db.lua @@ -2,7 +2,7 @@ local Util = require("classes.util.Util") local DcsUtil = require("classes.util.DcsUtil") local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") local MizGroupsManager = require("classes.helpers.MizGroupsManager") -local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") +local StageDrawing = require("classes.stageClasses.drawings.StageDrawing") ---@class DatabaseTables @@ -27,7 +27,7 @@ local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") ---@field MissionZoneData table ---@field FarpZoneData table ---@field missionCodes table ----@field CustomDrawings Array +---@field StageDrawings Array ---@class CapRoute ---@field zones Array @@ -107,7 +107,7 @@ function Database.New(Logger) FarpZoneData = {}, missionCodes = {}, SupplyHubZones = {}, - CustomDrawings = {} + StageDrawings = {} } Database.__index = Database @@ -231,8 +231,10 @@ function Database.New(Logger) for key, layer_object in pairs(layer.objects) do if Util.startswith(layer_object.name, "drawing_", true) then local object = layer_object --[[@as DrawingObject]] - local customDrawing = CustomDrawing.New(object) - table.insert(self._tables.CustomDrawings, customDrawing) + local stageDrawing = StageDrawing.New(object) + if stageDrawing then + table.insert(self._tables.StageDrawings, stageDrawing) + end end end end @@ -621,12 +623,12 @@ function Database:loadBlueSamUnits() end end ----@return Array -function Database:getCustomDrawings() - if self._tables.CustomDrawings == nil then +---@return Array +function Database:getStageDrawings() + if self._tables.StageDrawings == nil then return {} end - return self._tables.CustomDrawings + return self._tables.StageDrawings end ---Loads all units, data and briefings diff --git a/src/classes/spearhead_events.lua b/src/classes/spearhead_events.lua index 6b05b14..92ec417 100644 --- a/src/classes/spearhead_events.lua +++ b/src/classes/spearhead_events.lua @@ -35,10 +35,10 @@ do local OnStageNumberChangedListeners = {} local OnStageNumberChangedHandlers = {} ---Add a stage zone number changed listener - ---@param listener OnStageChangedListener object with function OnStageNumberChanged(self, number) + ---@param listener OnStageChangedListener object with function OnStageNumberChanged(self, number, stageLaneIdentifier) SpearheadEvents.AddStageNumberChangedListener = function(listener) if type(listener) ~= "table" or type(listener.OnStageNumberChanged) ~= "function" then - warn("Event handler not of type table/object with function OnStageNumberChanged(self, number)") + warn("Event handler not of type table/object with function OnStageNumberChanged(self, number, stageLaneIdentifier)") return end table.insert(OnStageNumberChangedListeners, listener) diff --git a/src/classes/stageClasses/GlobalStageManager.lua b/src/classes/stageClasses/GlobalStageManager.lua index b93c768..f6e36c1 100644 --- a/src/classes/stageClasses/GlobalStageManager.lua +++ b/src/classes/stageClasses/GlobalStageManager.lua @@ -337,17 +337,24 @@ function GlobalStageManager:OnStageNumberChangeComplete(stageNumber, stageLaneId end ---@private -function GlobalStageManager:UpdateDrawings(stageNumber) +---@param stageNumber number +---@param stageLaneIdentifier string? +function GlobalStageManager:UpdateDrawings(stageNumber, stageLaneIdentifier) self.logger:debug("Updating custom drawings for stage number: " .. tostring(stageNumber)) - local drawings = self.database:getCustomDrawings() + local drawings = self.database:getStageDrawings() for _, drawing in pairs(drawings) do - local startStage, stopStage = drawing:GetStartAndStop() - if stageNumber >= startStage and stageNumber < stopStage then - self.logger:debug("Drawing " .. drawing:GetName() .. " is active for stage number: " .. tostring(stageNumber)) - drawing:Draw() - else - self.logger:debug("Drawing " .. drawing:GetName() .. " is not active for stage number: " .. tostring(stageNumber)) - drawing:Remove() + local startStage = drawing:GetStartingStage() + local stopStage = drawing:GetRemoveAtStage() + local laneIdentifier = drawing:GetStageLaneIdentifier() + + if laneIdentifier == stageLaneIdentifier then + if stageNumber >= startStage and stageNumber < stopStage then + self.logger:debug("Drawing " .. drawing:GetName() .. " is active for stage number: " .. tostring(stageNumber)) + drawing:Draw() + else + self.logger:debug("Drawing " .. drawing:GetName() .. " is not active for stage number: " .. tostring(stageNumber)) + drawing:Remove() + end end end end diff --git a/src/classes/stageClasses/drawings/CustomDrawing.lua b/src/classes/stageClasses/drawings/CustomDrawing.lua index 71ba0a6..077d770 100644 --- a/src/classes/stageClasses/drawings/CustomDrawing.lua +++ b/src/classes/stageClasses/drawings/CustomDrawing.lua @@ -1,35 +1,25 @@ - local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelper") local Util = require("classes.util.Util") local Logger = require("classes.util.Logger") - - +local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") local drawingLogger = Logger.new("CustomDrawing") + ---@class CustomDrawing ----@field private _id integer? ----@field private _drawingObject DrawingObject ----@field private _startingStage number ----@field private _removeAtStage number ----@field private _logger Logger +---@field protected _id integer? +---@field protected _name string? +---@field protected _drawingObject DrawingObject local CustomDrawing = {} CustomDrawing.__index = CustomDrawing - +---@protected ---@param drawingObject DrawingObject ----@return CustomDrawing +---@return CustomDrawing? function CustomDrawing.New(drawingObject) local self = setmetatable({}, CustomDrawing) self._drawingObject = drawingObject self._id = nil -- initiate ID as nil, when drawn it will be set to the ID returned by DrawingHelper.Draw - self._logger = drawingLogger - - local name = drawingObject.name - local split = Util.split_string(name or "", "_") - local secondPart = split[2] or "1" - local splitPart = Util.split_string(secondPart, ":") - self._startingStage = tonumber(splitPart[1]) or 1 - self._removeAtStage = tonumber(splitPart[2]) or math.huge + self._name = drawingObject.name return self end @@ -95,7 +85,6 @@ function CustomDrawing.FromZone(zone, colorString, fillColorString, lineStyle, l end if zone.zone_type == "Polygon" then - ---@type Free local drawingObject = { mapX = 0, @@ -110,7 +99,7 @@ function CustomDrawing.FromZone(zone, colorString, fillColorString, lineStyle, l fillColorString = fillColorString, thickness = lineThickness, } - + return CustomDrawing.New(drawingObject) end end @@ -120,25 +109,19 @@ function CustomDrawing:GetName() return self._drawingObject.name end ----@return number start ----@return number stop -function CustomDrawing:GetStartAndStop() - return self._startingStage, self._removeAtStage -end - function CustomDrawing:Draw() - self._logger:debug("Drawing custom drawing with ID " .. tostring(self._id)) + drawingLogger:debug("Drawing custom drawing with ID " .. tostring(self._id)) if self._id ~= nil then DrawingHelper.Remove(self._id) end - self._id = DrawingHelper.Draw(self._drawingObject, self._logger) + self._id = DrawingHelper.Draw(self._drawingObject) end function CustomDrawing:Remove() if self._id ~= nil then - self._logger:debug("Removing custom drawing with ID " .. tostring(self._id)) + drawingLogger:debug("Removing custom drawing with ID " .. tostring(self._id)) DrawingHelper.Remove(self._id) self._id = nil end @@ -149,4 +132,4 @@ function CustomDrawing:UpdateDrawingObject(updateFunc) self._drawingObject = updateFunc(self._drawingObject) end -return CustomDrawing \ No newline at end of file +return CustomDrawing diff --git a/src/classes/stageClasses/drawings/StageDrawing.lua b/src/classes/stageClasses/drawings/StageDrawing.lua new file mode 100644 index 0000000..ed0bb47 --- /dev/null +++ b/src/classes/stageClasses/drawings/StageDrawing.lua @@ -0,0 +1,93 @@ +local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") +local Util = require("classes.util.Util") +local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") +---@class StageDrawing : CustomDrawing +---@field private _startingStage number +---@field private _removeAtStage number +---@field private _stageLaneIdentifier string? +local StageDrawing = {} +StageDrawing.__index = StageDrawing +setmetatable(StageDrawing, CustomDrawing) + + +---@param drawingObject DrawingObject +---@return StageDrawing? +function StageDrawing.New(drawingObject) + + local super = CustomDrawing.New(drawingObject) + if not super then + return nil + end + local self = setmetatable(super, StageDrawing) --[[@as StageDrawing]] + + local split = Util.split_string(self._name or "", "_") + local secondPart = split[2] or "1" + local splitPart = Util.split_string(secondPart, ":") + if tonumber(splitPart[1]) == nil then + local laneIdentifier = string.sub(splitPart[1], 1, 1) + if tonumber(laneIdentifier) == nil then + self._stageLaneIdentifier = laneIdentifier + end + local startNumber = string.sub(splitPart[1], 2) + local startNumberVal = tonumber(startNumber) + if startNumberVal == nil then + MissionEditorWarnings.Add("Start number for " .. + self._name .. " is not a valid number: " .. tostring(startNumber)) + return nil + end + self._startingStage = startNumberVal + else + local startNumber = tonumber(splitPart[1]) + if startNumber == nil then + MissionEditorWarnings.Add("Start number for " .. + self._name .. " is not a valid number: " .. tostring(splitPart[1])) + return nil + end + self._startingStage = startNumber + end + + if tonumber(splitPart[2]) == nil then + local laneIdentifier = string.sub(splitPart[2], 1, 1) + if tonumber(laneIdentifier) == nil then + if self._stageLaneIdentifier and self._stageLaneIdentifier ~= laneIdentifier then + MissionEditorWarnings.Add("Lane identifiers do not match for " .. + self._name .. + ": " .. + self._stageLaneIdentifier .. + " vs " .. laneIdentifier .. ". Will only use stage " .. self._stageLaneIdentifier) + end + end + local stopNumber = string.sub(splitPart[2], 2) + local stopNumberVal = tonumber(stopNumber) + if stopNumberVal == nil then + MissionEditorWarnings.Add("Stop number for " .. + self._name .. " is not a valid number: " .. tostring(stopNumber)) + return nil + end + self._removeAtStage = stopNumberVal + else + local stopNumber = tonumber(splitPart[2]) + if stopNumber == nil then + MissionEditorWarnings.Add("Stop number for " .. + self._name .. " is not a valid number: " .. tostring(splitPart[2])) + return nil + end + self._removeAtStage = stopNumber + end + + return self +end + +function StageDrawing:GetStageLaneIdentifier() + return self._stageLaneIdentifier +end + +function StageDrawing:GetStartingStage() + return self._startingStage +end + +function StageDrawing:GetRemoveAtStage() + return self._removeAtStage +end + +return StageDrawing \ No newline at end of file -- 2.54.0 From 368310d0268e7b6bee56e905af8cf05bfc07ce81 Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Tue, 1 Sep 2026 12:34:22 +0200 Subject: [PATCH 06/12] wrote documentation for lanes --- .docs/web/img/lanes.png | Bin 0 -> 228086 bytes .docs/web/js/components/header.js | 3 +- .docs/web/pages/advanced/lanes.html | 125 +++++++ .docs/web/style/style.css | 3 +- lanes.excalidraw.json | 557 +++++++++++++++++++++++++++- 5 files changed, 677 insertions(+), 11 deletions(-) create mode 100644 .docs/web/img/lanes.png create mode 100644 .docs/web/pages/advanced/lanes.html diff --git a/.docs/web/img/lanes.png b/.docs/web/img/lanes.png new file mode 100644 index 0000000000000000000000000000000000000000..f17eb376b30e0fd5b6c1a457c41f8b472b198dfd GIT binary patch literal 228086 zcmb4rcRba5{6EJoNmQuRQD#}8Y)+6rxJaFP0nEm#g z)W#J5_3wHGwc$$X#=yD$|M;i5VU0fP`mCI~>_7gE`Rr?$X07$+AEvCBz`l)+;Vc)f>2n3H~9gktqq7D z=Jq~v_yVEk;$Qw{C9{))CY}WD|J(0_(CuIWRe?7$JD)!$lt8)jZ*a2z*gpt;nvz~w z@6*l0oI42k04dyN#ulwX|KL)Z3Cy38)=(Lp;IC5qHhk+_^bx9$s=N3>N!u<2z4&K} z61Yq?FYf)ozqLIgit^*d|MSmHC&Bp})@ZFxkQP8QQRctgB8K>ZNb0ULkpzmM01S{I zYZTlPc=$n0anfR&>u6T^($ekvIT>P^>XIU!%mP|gq-OoggEX7J=|2dm`-7%%{MV9b zIx0W_N7gIS1}n5RD*xy6`;s9F=va|Cg{K6Ki42B9nEq?4ZLVxlPf6PV0|I0_MyW;= zw9DQ{f!og!R{9^fhyQ+dFDtTT>XrcES-lir9p-=Q`JZ)%z)=Jhp8f>CD|H(Z(se#PGyaN*Qp7?#y?v(BSckLmv`5G@!!3Q+g6#)Sf>ge7rO(1?CX$s+d zn@0ntzfBTi2B?6;amxa5o&*#0jXx{;E|CJ$-)0H=3D5w&-<2#WOJbTu;505L z`rdu{hg;so3-oEK~*Jp?&4P6O zwIv_ohXx(f+zWJh&ow{%bDdhsgO|1*Hm!wt3*4-|qJg1flt}e0`RBvSR4LC|68!nj zh5loM6lTqxp5w|MR{tFKU$5P=qT5`;^nx8TamH zlIz}@9lD4Pru^*sYGd|O@GB{M1GB|1uT$Jt6Rboe2FeQFK1U~0w*SHDRjJ@Di_XPm zXXrF-gxuoUp=4-9gmX-@_)<8sX(n>xcd1atfY0r-*?F?w_vbu%8;&CARUgeopBtuC zg(lGc$u{qU5L9)BmU-uQ?Yz)kA(;Ovlzqr&zV~`aCC#X?iPnFF=A1T_x56Ra(~if2MdFe4kzq(%Nn?GX1Dk<>$TS2S-JL!7BN^%eX6`*f_LUR^zi~j7 z|HT-D)ydUG{Wki2ii-O>hdcJ4JS%6;c+q3Kwq7;N@wt)Hwi>AQV{RSXy}1_5Q?TONkcmj;9Xx2b0UO*@mO6kq z)5d-G1Q4`V^;E*aUDDk&o%b2AqM60-2&&|-OVk@v-uK!#*)fmh%v1clw7No(E-NYH z;Z2KdGC_e0qpI=9rC^cwrtyy27Ii9;@RjF$;(q%?enS12r_a!G&4s#+m$dfUNv4;U z3c8o#3I%w4ez4btNX^69_l26vZW$xOgYpsyJxP>VvbVl6d7!_df&{$UODQG4uCl9p~)3~RlkXP5Z<1S3~!Xi_)5G9RA{ zXQ8X)FbN`4(#BkenQw9z5xNHe$W{s=8^Fel>#*(}T*n7uB7QSvgG@C295wZRqcb&@ z)Z6h=&Q^(L(e-Ga9k01CY`Un3C&d}9p**sb)WD-LozmN2ukzwVFFWf?5p8v?I_0}l z@#^bVDxN)sOGw?q7tafZrlPsC=9lw@{5a~))_7@2H-BGpHRS6c^MB_!P4W(7hZxyN zTtj;Su}3t&YheOpwsS*||4HZ|@_&Jh{_LGl>|?mofJPu+R+5=lIL|gGAe^H#XjYS) z>oo4Vt@i2I*D3c*$V>z-@}0qQV|5`~mh(!=2CXR#@uJD)6U(i=`Pt=yGd*7V;@n(W z!P(i}xs6DYlkDe&?Abz-EM(Nn?!23o6EJ?np=8G%fh|ejLSs(CX(Vk z=J{6CZ_)_n(`bH7#H1XIK3_0n-V^k-WtrZ!#+!sb5{$`Tk~j!rLmbe9)5@)2OI&Q6*1|dD1CwYR>N3 z_8ULXq}m&Ga$&=lR7;KZb+rmzq;d9VO2@^&<{Riz|Ft?^{+7GqdyuUX9#H7Iy%{fD zYWf`aU});-cuUCF)0?70OOO|n+$>PK2)q|mVm)-x7oARt`~#dJq`-Qqup%e-q7TdI z*IF;2q$B!EO}fQKzsF0JPSlm4W)}x~80In5oU;@0E~91fRwj4t>wN=IG7~OVZqg>6 z8?GpY5mCjH>Gm6imY$wncoOaHMbQbFH;KS3Lji`|VF2xCKyFiBt#g}l{!manNdq=z zyp>v*>Oe*#dhIk(YCdU$p3;4ZGo!5W4AbTt&OfG(ss_z*Y0QsWYnR5@9W(C}nPBke z#feUwk;Y;8Z0`uYh&`b_ACar2PW_zI996Dy%Ua0Nw_5OpO*8b#yf=JiVlZgJY+gxj zGe+NG+zF2RGw|pj)WDqbi7y|?QZ}jFPP!3BkRJ8nQLp&Gsh+^e(mF|J&!Tm$rk3U0 za%uSTYD($YoTJq5A{t?5>8^!OQE+3HUw64F&Kozz-DX-z{2NoT=SxR#uE}EoZ*zw# z3$m)bl-gN5(ukg`I6i;cJd%LO5LntfyGdY0_Mh7(VvD*Rxih~GG`3yEa-Qju)bG?8 zPc41%IkDIwdHC6^cB2W_uDCh2+h4M{DjHe>-7u!U^WL=!c?(%l$WG(FIE}dZ>8wRp zTOsoT8YLSH&s@=rg~LT@TTD^AIT5cE?)gqAFl^ul^O*#D2 zwOwN=8bS9WD#iJuhUEhA8qL|%&f4EBE9~mzdR*9of|{m#=FBByM=%sLb<6Yl<+8EA zwSC5v>%6+cS-Vz}dihgVRaNTbfDO+JG2bqZ)v~Cwp9)#ZupW`VEr)eps4w~0VPpb8 z8q>SX3G;Y`RIB>Ll`cXdZJs5ER14YEGghF4ReI@5*tY+vET(fR2tk+J<}Loy`D3#X z1E;xM>`*BmZbd4S$E2vtmV!yS*EJ6LMWD1?b|q;&Ux;s}lLx1wY-1j8cV*p(VvqMC zR*la>RBb7phvGZ{YcA2xv)7g2*%ntcN+|X)In~**Xx`$*l~C}v1{(cF!qxE6q`$zI zZ8tA-?f^`6nO!b&hh=XA@lD-yutGTB---is@6GnHB`do;Q`X1c;p6L+THn7{>l9kc$?2NA zJS!qK;Pzp5_4luDvRHK&(*?aqmcc@U)~Hj_6D9Pd|0- z_?CVWKM2c{3!L0~IOi`Y`&b*DPg~>$z@09io0o@_QWsZSFPgmUH2!8OXC96Vzh5T6St^KL;790p-R{PzTN%MfGtTy_u#%Mv-wy0C|#vkm~D7kBRm0+wWHIFZwBU*y@>wJ+;;h^s{h z^YG0m!Iw&K!9wY!-WbQ})Hnb`Z0jp*4d&GXHtgc)KlA#rYiYQ7_Bl?^g?GE~tyORIjj?hGSfUjnc z0&mX0MtfI&=h{si2@Jb9lXe5@2N6ktwk4VQsp%`RIRsVGC`AfcJ&_8ueZA&MnelH0 zVdOwC<4XaMYk%!bpZi(KS9bpGi!PyxldI4dM=QT#;oeCEFlK@)&-e?lqu`j;y&XSm z;W1_Z)3ZAR72p{$5vKwP#(OC0%{COxP=V$Df${%Q1D*t6)uCgMQ{{vls6O=;ODT2k z0Anp@Ou7C+N{${v!=&5RBko*}(ahai|3AlYJzs#5EF~0QoG?CjLiR2w*;t!avAw@e zs=!E;`tI2#nQ*clact|PTWCrZu<1kheAinq&&EL-HSOVr(=ZE?6#r-j&?*B&YNmR-KYHPldhAj@~%o4 zBANCM4}nDznfL@{u3UF{FaT9MeEi9wO|5SeCIME`x$xy$ge)acjp7hYHdpsR&X#Ay zTf@?xJ4BeSmx$-0+|Lto5>5|9vjvYAKaLZdNx4gKuGcuBB&ta=AaqsqN?_i616Cs) zOku}E=69Gp%=9ifcGFB|7(tC1Js8w9OEY=5C=C6gul%l@N4pJE+u>*WfUoVRp!mFi zL@@pXv1Q|M64b9Gu6}t^?hA{1prrP}7t!Gh{-Mo{DOeVNY6EqdqkHsdlOkbI%C3So zM(-b^GJlI}bko6d&NV%Wqms|W_}w}L$eCvh3MEN* z7fR01O^^w%&5LwqQa;W8XgVXsIpIcjP|Y^w?WY_@6&;_0Z37KGIk7i5;pkw&9=SP^ zLWG?LNPMIQJ0ybNzNfRjG{UP`zqj-YzCOgS0eiZ=6hR9%%@gr-&rq>)Ty@f*h7?)o zh=}{J_E@F+>fXuORS(PB3m)qY(uAH~j& zK22E~2p5l@?GdtzdJ$i4*tg!HbjM)u*HTRX2~?3R9Y3g@{h1PSi2HhQ`*HuECb?=E zmYSJp6mmqO=UUuM1j?(|g)TtGEX3{zH9fxD8a938{YT3OQbG%ojozm{u`x3R?Xn|6 z9n{)JaI6PcE!l(gOQD-Zs|N25Ph9It2Jhx9+@+#a-xLwa-bwB&A`~_`H*(x3u7VTmUMIJ&!6_B5e*7fW1$8Alf za4DX>CRzLH<}RjSkGzug<>+8pLDd7KuEmxRgo}aKZzWYZ)Bracvt#Wn7h-~j{pY?8 zONYdKch%4;T`6+A53-co4lJ5#6;NjNWFhwdH#eraBDnDZ>p^P;@y4RLXlPdOZV zL0v~Ya!vFGv`Lb$xhBi6>Muj{y}*8Q32<9#ZOGe4 zih^sRtJ!rI&Aw~rx~%{V3As7-7}cF?;VyS_ar5IMJ-dfWN1itk(<#G) zG&81=JkaCvLoy|XYq*x;;d?H%p7jXswO{qoDQlW1c~;K?VAzyjAVXg(B+6-f{MoZI z)|v+j)LOTra=Tm>LZfp_mv%~d^9(m27DN#s{@Obvd1112L~gkdRtMj39_OPtP>3yh zPV^FKsxS!FYrW7B#MI8hrMbeG2A)sn zN9P_=ShQy47fjt$ES;b^*uy!Aa@5utYq<6gNaw`Va+t&@BxLDFT(@0qPZy!7S8Qg_DPyGy219sVN-gc zd#}mx-duRu_;!r-SlL6?~tNQryIu4H`p^iH^fafl23Xr zl|6DQMdZaFb6Co$Nefh&Tv!6htIwS7&cwsP*6!`MpYIyGh4$4&-p zg}ZzV8VRY}l8Qt)Z1UxZBw7=WjdOQr5Jon85Kfm<;VVmsp6D{lR(W3dgOar%m#Z~8L#tPjl5Mc6Ls8lYEJBzI+bw2PWf%uE=&ej|W=y zbf^AOZrR&tMriIHKA8|nBpZDPF{_~5mo$573}e;S_cOK>-o8AoPwH_rtu;5DYYRx6JznH!-jL57Qj zEURZQw`Jw7jLF=Nca@x&{|vRYwHKPPeLC;eiLyQt@DX(;eqtx!lemWV-u` zJQ8oY2R>0-z9_>ZF=Xs%;{FYY(9{<4W7BVqF)GTxn&qiGrzQSs*0QePx?8z9Q7cVl zA=ZzazxpvX&DGN?i2rCKmlvOQD{q;eP{2$NeJm)K<#|8)O#Yg^^pqS=8J{>$%fwo} z*EctfHw%2FNT-H;1Cy?HUE^t&#^vdKnJO^~=KCkiwi^ZHki5e!Bm=-3ga@T-k4CeT zpUjJ&orL=6W)F^lE_n_q`n)ncg}sq(a22?qBX3K4H=T}fu`fi3GiU4qozaX_+~OSQ zh*>VImRwl)==>8C(7J9HooBD^ke4Zx+&jMvud|!#5bw(rH+RF~F!pa;B;D=9L&;D4 zwo0Y{^>Y|kSZZ{+4;_ednSk$X59O$#&u^M4p3*RAPI1xto%hMnBWx8YwkA`M2%lkL zlp}e;a>(dYq@1A{BEU zG%9xH^YNrixSFqMj;zOISa@pH)u1A$RNQ@oSW7Vv>n4XWIz5w=&rVb?Dktk%&@E&aBaLr>Ab?_w^e+YXW!x3Pw!))lG*XZ;vB`%tDyaptfg< z=(Z86PmOS`*Qj2!lP;+Tsbi0IUAd#H*QqZpwKhdDo`=eBoXy{O+Ze6n7IeX+RGe-9 zBF{vFl6&8yf%y+FpN|Aq9&o=C%)F5`lV#yvldDp*6(~KZF73o-h$EEK{0Z>pa(3;> zijloxUAP8jy=dS2+X&*>Aw~Ju^keGs$&+%UG+&J@38p%HDuIiVc3dcD`2wBf5-x5L zYq7$ou`2ST;MkjP^c0RY-ZfMva+m{_qL6-6LEPkrRR^Y5E+1uJNp0iYQBW^A=M|_j z_Oq}ElX9OMo8&#Xl412D1c{};T%!<@b+2wRWfJ;y(v>J;JeFiRpt-vS9HR(rhAcnn z?KbQCja7uN=wIolB`@7#Ib+&I=o+%sGM!y@S$+`_7JJ7X^ORxw^+G{5XbO*wD zyhq9616P%5om9tMqkzsf%}ikDz3hI4V`CnLEs5BMV~Wa$>gjBL@YPG!s#UM%##ohR z@bk=tMg|Y5`kH>fPm$BBj!dLcGP^*gd{>> z1zUN+t-?m7SG77ROR3XRd*pSlm|Yh;R9Gx6v0UzKzRFbCI}QE`$1MXD6iguBK^h46 z{TCs{MR6+|@UKUMT2dW9O6_1bG)EaR+c`GxS?8jcRjosJ@(!e6?<0KK`3x8WOLRdy z{SX(^gaV5D<4yMP^5I$spqbO!lvqJygipH1{yeQ9aV`|K%uP4qm$u>FG zN~82wOnVp&O{aLhx#xUi!r!^wu_@&ftDSMv+Pb%z#9S=l;553=xa=e63pjXs)87s$ zVd}ji3o&7Oxf-44vH96>?XYZqqMzyag52E-t(#!2mo|UuLxny@tjEOI&fcJ^4Bv3u zN?%OXA)}>VCr6NlSP#|sBt=C^29_K`nZwW+q(@C>6?vBNE#M>txMf?~Cltd>54+Q? zNRJZSN|;-L+4u+F_Q;SfSN5Ls<6|}PYb#wL7sw_YMdO!Cu$FKW<=$L5^JI1!XzT#Y)#bt68Wx!TfnTC^AjubHRk{h47`vJyDz5I>((W~Xm1Y1=rD zT2_vm6f-aEu%$jIb2loVC%s(Y^8{9;?>QGvTiv^oW50H=$YMegJxsA~KBk?=eymPx zB@F4vtgWwZW8O<_fHr8u-fk5Hh#x?zo$^$8p}BP7v$n@%fZJ4`W%>3%6<$cybV>4B zS;ZyENkZCgu~?vU#9kWz6(Ak<>eJ%gZIyBq2ZLMr(9);yu8QLxLHtX(7<9jZsMQ3k0mnH%+qVT-iqarGTWy7O$&72_uJ zXWHNkLfG3;A|ewh^h}D~Y~#WytH_Ym&TNBkh1j9y$KGS3!z$&UEyvKE?4)j?}C{Jl}zq$!*=LnOeW;dJy7C(js zZn(F+L?Wp4o1h3A%!n|T&%BDH5`1OYUoPE9Lw$B-I?RQys397dVS*$1z%FbI*oQA? zVRQy|&f3%hoN8B_zkeSBh6SteE!Zg^U_*o{g`8uEZe0^~>w>LbJ$@@ErtcL3 zqov5ofeG0Y@^_9@gtZ(#yV(cl$5&6dj&a%I4HscWiQH|Lq>;zVbo6V=RcW#2JKYj! zr=NaPVejzXL?!Jf+1>{PrOCiIu|tpjRH*V={?TX*KtZ{_FhInJ1CU&NU8-$T6Go~9 z?9?*AuOKpn`5t-~yHOl%UIT4G)b`g1J}RV(2LffH!dl`g4YzJ5so!@Ku-jVWI4Dyi zis|nBV=RnVvIkA0NM94Bh-X?Cwt1FvShH7|N<^`2jVkx%&r;WV57G>n@D-r5!}qV{ zKPE%4?Y(nkw z_x-P!6qLG9IonnZm+|KwJl&0CUh6{XW;e5>aDg}W@78-c zJ+=8gSC?O3Q42Yc$`u+GhMg2!5(+J`m2@rs7&ZFNoITHHEF8Zw@Xgg_CYXgu$q(<2 zhfBq4+P4XtI=tzC6*uvA94}^2y1TzjqPevE2CbnMtY=I1BZq6wsTVb&)CGHF2tFPk zW9B!ZMan_N6GeRW+J`p{)AR@;JUPQv^P+ld>u;WP=RL})mErvBJNuPjsNa!27|C#v z%N%_%>$-?0M~C2u)#Dp)4l%O+*}U<}{Dx8v{zXi~URyd%Mq|1=P2kq%gp8)?XO3(O zuwhMWA`iP~Yb6iG0moNiVuORPt+vhpK>Rgm$7#@PwhlM^Fm!{vL#((^pRe|0)m8}; zxDBU+H3gT7j84eovfdHyyqHnp{X4;-#3&?8bxbU0O*MTv?1EPeGQ_z(kKE-EV<3n8 zpe{9)bV@^NHp#5n`%(b5N%3p2quB;ByrhNWferVSzt7ROR>xRHP~@pl8RB47o6OkI8l)bELW zo3ueTU6Eg%PT?EHk08mvHxlG~t)mgCEPGDXtmxY{WBC;O^)QBaHGQw!#pqe@@4LUx z@W(lanw9w@3+cZNEw{<4d)JIZt%*ljKUK&Q5QPnR`7twCCBjK00iH%Yg=L*6v8_F) z>J|%v=r=*AH^~WsUbNTpE34(WQ^_XXF*o$=>F8<6rI%p|Gqcb5mY98n;2&T`IANXu%p^U6NL6*k{9qaz`MT4RG zKi*m?(1ylK3rmOcD78mcVFqiTA%&p>GEp@#&u(+cxm`O=Z-H-TEiSeGra56;wo@-}$ zIe2c!doR3^oDDx9Ldy{g4+d7#cP)xpN*pV+^5fdpggERvD-|0kV6g+eD;k^#4}y3&Tmj$qQ8698ujeDpC{56Y>;P4(u0}YD;z1q`JGG z+EhOgVdP-M<5#ixIwbdqmC`ncV5?b+#W-*9hTQF7-Xr?!@7U%2bfs}4n*&XuPe}DFv9ti9qCY$eF~TlN?$CU z{*vD3o2^^()rihLcUTd7>25n*%(4bMTcxqF#RTC}6DM{KMd!#NQ0f9W?eC(uI(Ntd z>cD}Rb;s$%3e8Mp<$+m4O2`v}&H7OtmgMDNzuWrG!lqsFto8m&4tem57_Uuw5$<$% z_K`ytsKADN6%cVTaAFPba|5W@9n%=!pgA7{Pg_d}-XfK(H~DYP!bq5vXy?jFyFgcb zZymsnDCe|J7uGtMzjH%vQNWQ$IVufXbrp87FLsHRs_F&{y3w&X28^LK7jVli8y7=4SH>o%+k-;FL2Z(i}Ao=BiR zIa{l@Spwb6m4q{4cIqP~Y1!@c(@ojjLr31)m%8kbSB$dhaqKcvs{1jT%q`^xAJAtZ zaWltWyN$s^iE#BBUrxjYI<}x39Ak2unl~E4!F1nyT~?e%WzmEUp9{UxH~L3Gmc-_oqo z=-A0suXY?vd~68z~ES&wu^hGf!TUaSlkSL=J! zVvE2K$CyqtGcpj&g!Nzz+TT!m&V2Fb)i&0M79KOw0E%fCV=O{>LIpNbj1{^|&x#-Fr$L{+P2R;)fn!5rq+ zogYEOx$l#FOLne_4@}EcVFzx;&G5fYzOgv~oN?W>&<`vct56XXL{7Jq(p+#{>>h|V zrogXk3WS@vW}h_$Gxy*%Mxyl#C;R5^@cIP%0b?`wbI@%g;xtp%S2o#)mZY=*Mn%B{ zMj%djOSP~Dwb+~C`*VSZayDm&G%H}#+_w|lOp=NjX0$8dBKXobptOYYl7cVVgDMWC zXFqE4@T2dYqaoi9%JX%K3ofYZ(frRzyl^Bi@xB=1r(2+3r)i+X)LT zX#W!xo-XfP(}@ha#tY@#CFWhQ6Z}-K9KZOGE>p=BE(#{^UsyFW*hSsXVDUl9p{)e# z=N_A*5xcz$#VrG+SPZN_pQ&MfkPMM}eyH&iHT50YzdpTBw!y^#}kdHh3D z!f!KNEJQdQX3R%D^6P38xP;67#k+WoWa>n>~ucB#Hei!)4yv0E`?sunlc3 zh1gr%fhPCz4z}=aFHhOT7eqb)@5`E5yZ~&?q3KkjAjF!P@t<=r|C;nQ-3MVgfo$oh z1VV1*v)D(||Ksf4tyB^J!H()-R^{|tSCrA*;hGJ~Fu{a15}jZcs@dLdV~(WFnZATn zF5xa1=DNln*T3na9_%%A*1Sl~ndGO^;gBY(D&E%`R

^sMDdE=i~H@Q`RO~J&q*QHv~K>TcIPh3G}S;PlK;S`p(ZNdnYHJg=+cPy zQAi8Wf}4H#3*Os*<2`x<6*nkv==m%3mI%43dNBBPhOX^|8rQZ#12?URXQ_wEV%o@&Eb-T&ZM3|^ zip4g8e;^oaa^~@`lYUIA%2mq7MpZlFujxHVJnBwVYEgRjzzMmZ2BoVmCrO40rUl=k z%|?C|9KUf7bXk0TjkZW6e!v5x`;v%ykX0@{Y3?jJPSzj~ueTGw8L z{k-K)gAwEnx=_QCVf+;&8CPIQTfehp{AI3X3Dcnhxy}OXNKD_PF`4bna6?aj7Q-fh(5Jdt4zIXG2gaM2ZG#T@|}aLz#grrWTGWAvsTBp##BLBMgCFuDF!eUOlv}AN>;KgxmAmA|@0-i7iNe z<$iuYrf02&?ba8~h`<4y7mq(od+@hH3+%|gY%w_Fl4hTg2cU9%l2QTV4*}z8l*nMaRYKlHP2=J$uU>-)ZuOj3|LVN1z2)o3%u5-Dv^>mTxC za@LB(aCG3WlEqwr9oofk(#1F8(7WTNU;i-(yyKoi z#WT0S`7}R*a%8B%%D^@fItf!T>)%BtHp|fX<#&(r=3GNOrB_~TPw-Dh8Rti%|Ld0Y zZkl%;5fpwC(X}*Oi^C0cFT!5YW+=mQwjOt45`OQcenr6mh(g)Rnwl|BuM{qWLZ??z*HyMZmc-_)hD2KhU_ zI7r^61j@2!mCo+j3QPdneS|diXwYXYF70_{)7jWKGaPJnTh#oY9+l9P?*D;D9lx$w zhCV&vux|%Up(Ee*mI&}B7%Dk0hu-Dk8wRBzOS(eq)_L}Krz$=!!3Sl)o$ZLk5RV1OYh+* zb^c}NCZbWD2G{o7h-`c@2CJ|y3mC3g8Y_{!exv8<(j(s@c0axswtR0_)ymdAJ2%e7nCR@!r<9^QV7umvpu4b9Z=fgX2Z%g4AYu7slw~l}#n2aeK%MI zeoXkwH1z%t1r4AqoTCD}|Y9zODYX--;8Hb%1@5Gx7b)V#$vcj$jv`OZR+A11+ zPWkAdsJxo0yc82*Aay-M0ejq0wPfWPe4q0S_MBJ|@_g9hEgj<%l6}p~tMI1G#x4b4 z*mKA&eCCZXqr`jBh=-jEs}M=V31!L3zA(oF!skQx2Jod8LnW_A<;IrQ9kG@$N7+`p z^w}z8$J^qXHYlTe{j=jDD82-fSQPrPJmP4Or58?SUAl-w+uP`pZ9 z;{naSDh4aTharx^J>lnB>WakY3e}u~d&3=Bp}*$~Pv@O?%NRf|byffV zzLeO}TsQ~M{*>r~G43$O6tYeiX}9X{&!__e$$^opky>3O*E`0dr|e&xU0O`zwf2^K zp?bg7!dC-(ai!*s)p%>vYJJ7I(?&kOo)0sP1}%=~c_CEFzA49I?O*Y`rE32iwij=9 zn5O4#3!zNxW0aWbJU6ddHkUUgTP)=uXE;u-uh%fk5AAE_R zv6o$ZK3s`0!6apS&logr%*d~W4r^3wBrR#kuUa?yEE#OTXExTceMdrbo4Hzj)@gjo zBTsTo8jWtO#P->_CbJ$7Hul1;r9{`=>$L0=91L=`!C2~!o398~+sMyH82u>F8RPe1 zHZPW*_&lH5x6y<{$d1NH4BO|$@-&-IKjUtj_m}}@A`yV*7-2~^a&K0-f-Bq4ja_@U z&AIs8hgxG@VXY}}tsfGchiKZuApxum6M4Oh8SNx0J^S5WBg@*CO+=N=KnRYQ_+DTmT{o+!$K5pKdRSj9q>+>X4d&& zUtxtUKy^Yv6(5{W^Rw@%pLt_+4lAkJn&njp0&c%1qO5wT*glS8>h$2UpS{?qP*C6( zcllD3Y_(!n0e*5=^-Pe{lO#aR)V&7xzm^P|ox8sA+Men^LG;kRXa+C`;Yy}fUJO@& zH>l0QaTTa?n0j69eLu!6>fscHS>3u$|>7IJz^m^&M*n_EL6P~eb?fwrm zE}ywhleRxbmH!yl2(EXWnCTwMq^bBa#B!jE;=uZcDIZHw)=HRvlnKWzgI6$joPt$H($fNwU)0{pxBgxA;u3@|EeB zXD0E9PHS0(UFv|z3dR-gJv`VcsLy_-rK7cd%B^!R{SHkxvK2cBh<}=KgWvI*H^}$> zoUID=!6_}RfMBBSNyj&JGgVQtTGG7Bq9V*zdvVfpyc(6_#_qSeFEl^5h;e|F#L@EW z!s@|mxL(7Gv$}Q6m(2Y~eAb)KE&W9a?q^taUN-fHbQCoU%+T{R+f6rEq&+a}-T!dD z0N~nTb?g}Q{DsK7ddkf&xFF6CuKCq{8LXp z+0SFIK9%=}5HZnL{20;?g~%q|=qAICio1nI;|%8pm*-DPjA9@Bs;{IehN{=m&CgBz zb+5H${Ts7hDQsPCx+oY~5p9U%#y)gwO_VFX->8Ot#i+F|9>WlP8_WPiox;x_ zXNqgoM&3FPA2FD9v1Gg`_;*OwJ~>tu-V>mTQ7o)hr#3~uT&tFPRoYbqJ0-)C6X|+h z!2aq}x(rpQc-*w<89txtr3Ur7J}0@-5S_~>4I!4yHGR74-<0e6OtsdJ*O%m-yG*Jg zkzU{@dfic`wZY(O$mKYL%=7cPH)>GZ3=H!?#I~r>G>%ZB{&8@F$&X#g3tI@OH7?hmcOiTscgE3+`K^nI&v_% z`HIQY>Gh!YqDDfU0e>FEAQgbi1Hb(SkIF1CwOXAPZ*5Dwt836US}e_YvqKKJ!ki*> zuk_HxbKdSD zg-UYkx{8L-%$S62X83u5IgPchF;teyQo8-!FJ6Vi-6dYA;VJhqDdc9a^V%sWBVKcU z(l*RRs%A|%mUmc9;y%$U)~t2nHFLOAykg#?9K0=J>~Kw9WVhwmQ;{h)(zy@RtX$I4 zx6^RikXk65F>W)q_kIaEqGp;3TmKfTJAONuWCX&+Xnh(k)!yaELlJwsouj(GWjMZz zZfYt{_g<^)C^9d4j;^8{v$hk|nOTr>uIysD*Sj}(xe#1R0SQeY`=g+M{*Dt~uWLPF zb~@q6g$GGqVc^kdARm`>9x}n6|-V-1<5MWVauuBwk{@p$*b+Ufj8H6rrkoE z;Va@|pG>^v44krzsCiYdric)6078LkoX7|UmYTVqmR#~7qw!ak3%x=_$~W!b z;XSyF8i48P6pcMz6q|!rc-_8;)udwAcb?TvRS1Zy^jnyqp3{fZR;r)etNJ!qkWIJt9)lt8O_j4X;SVBP#s)@EE&}Hsc9Xb zM^^4xI;J+(XT93B`aE3BTS$@+^U)Wn#G(o0sB+>5?JjY#8>?nvA5L}*dHk+e&D>c3 zRW+gH3p)fUjz=!|p-iWb2NM*1miIJC{-xD- z9=C<381Szn6)uwYOdkB*qBeWGfzD3K40~I=zIB>1KLSSS_~A64Pn(i{kpLFXF|{8v z{rxh&c2@j5rlRz$c#sGg2Y3_Oak*uWnf?LK#;5l1yd`Yk>cp`8dZme#+(vH^{7hed zz!fXXD6c?n^Pr2USnl{#pc8}8$ko_zXH9ZfVh>UlqO)0WO=bS>x-Z=NqoGh-mMa&q zDNaP$i6PWgljs@a;1x8%bWLL+?j}E<%1oVdmmej#TO817SnvMjlT9lDGf(8$woVv; zhfNU}T={vPG!vr=W4q>|r1R`qj(=l-*1z?APH6#P&1ll<^QpTT2)a^#8y?~3FuTL% z!c|XkCg+w)kDe}|zgPqFr@yFJQsVJl#&g5EaRl%CVg4MFI674!2Ve=}eg{SFi;pxc z8LD*^rNq1#3BM}R<7PsrKJ>qWoZjsG>Tm{G7bc;CoCG4QKcZ|w+MQ#JkO?S0z9{mv z5#Ap?g8Otp5@AjklV2cN@zYZfIrFsaMNGaUXbI%7;<*4%%&u%YvwUr9-W@bIHLGsg zMVC7wqVx5Cu7-qk#dfwrix3RO$Rd=umd&auSEJ{8OpPrfm;Uow##493y37U_9mf{lc1~o z2-bAwVVvw-dHC%UTfGNUc>w(8XFOu1d6JZ}b@RbxMoFH$%GBkR+jj;4ZZ9}Qa2=D6h}!)32DK9Pa~dL6<83Ou7v*N%#PI-V+cst?uWhKP>7 zH5%gu_w*ZYx77r9wPu)V8Z*0xy1uXBI)?#Sgm02MYvc%itl$2>bmY^0x+iE|cofEzFg>g1$BazL4h z>Ca`GG=-McQ>|d0u8A*aqWsp+HEhg;b_f0y!wF}EXBXmEYJ1A?&Ha|cH7t#V;q_j< zy0as^N49Q7exM8l150|Dd;89SQ|#l2O)Bg;h#M|a^@YJ9#kHXef7`yCEBCRfw+Av< zpmG%b`DsQds+)Dpt`X`_v%k+eE9SMszQTPkP?DivZ~~ z=s>5aFm{2d1EZ?3>6d(g#G=XR0LGkVj_N6&!O^lITZ~MoPc6FmXFW5A)E}&|ocLZz zC+Vhf!y@TMxgGg-yNEFj3`s^ch=xi9X7bX;X!nD}P`txHYX30mwB?A~t6*|&CT9bPwBc|dg<9ih=Eat(^ z&V~}DqwF_bhpZ7o2c8UJ3&HeCKkT)iL|OtS-=$n$A1*4ta*g>t4AkXRp>U~(acAes zt5tR0{k<7p+xDgnyaKt&cx9j4kK)Y1-^c%|SN4UOLy8~u%&)g}yekob41nfb!qk+7 zD0E=JQ?1X}AFsF}CRZZLIQDSDKyk#qMQm7?Sp*6uR@{%B-#Kapu6x3puRWAn&-j0I zy>~p-|NB24sYpc>$(EU&vK{NCY(hqMl9YXHj*(ReMMlOUyJS1|NcK2K$ljced5nXD zWBi^+^y>BbzJLF?ol`u=^|&6_ykGan1BDEt0cM9#PRtn6b83*nX_dqD1vu36gOVRG z!<%IKnATwK`a8;~SX2~!RX7l=|)yLtr6zM4hD1fP?$5Ho1Fi_r-&vV{9tp)H#(YB6) zz?9y0EM$P0@(NPI(`=sxv*Z==4Lw_W`ICGDoYyIHw9OtpwDlsR@ticc9%V+7CzFZ; zCczpb(RQ5}H|IqED)#UzTuQC8^{(^Fd z0}UDIDJqN4E!U%ZrTxM|#%RARh{FTcDXA_CO&5umZ*qDkYF-9}?o9w0(> zDgcT~da2gxhWXLQwoCp$2mxCQS=FOBTyDp8qb70N^LL&Cs+!b50XB}LiC^0fV++pu z4=@6Nr(+Y8ZziK|Cn#gC_1q>@p}65W@&3l%gm1A43;wAk^}gPscnDZJ4nTmUt72er z$2ZVjc&J4CCFyrSThJ=A~v?vzi7&GM`zKXZ2AIkxik=gm>~}nNZ6|yNvr= z-!yRyPcA=$ohAyu)4lto&IRQgMwXlK=w~_r*uCuHT%CrgP2KBbkLg0}49ym=&zY?V zebrz@6ujr;TwwdF*JK4)er~hhBeX0)I1_Penh1O$3J}#YFx(Q*rM6K^Y-#dF2IL!E zHSKzV4PTc+KP!?HAy{E{F!xV0RbAWlnm(KEd6G)wBj!a4_v>nt2T6K~s=)pgNN6bW zw--vuBRmKAQ*M8Jnl$E`UPD%T4^U`_yapISWNWOgFX2xT;@{*%HUQIzIjQ<&Hzw^z zkzr^NK3*v}7d#=qH(_tG`V?r$zLjy4X@p97)O&1q7udpfQJH=KHoJm9inbjRKp5SJ zvcL8>FfW$f;klPI#Bn~Qbw$KkW3xhQMa{3_<2k2#D^4G*SMbw3jzS}Uv|r#q#VZh| zQ9LonGPi@2z`Wqu^le_ClB7+-`5O$tqXw8gsfZy>t1PL|WBwntNiQY4tjhSU8KyNY zCbGBhP55ee%cby;MZ7j8zC}T`fsO$wh2n+yy2N&nFSRrIy?+7V4VFaxRoOCF2CK=k zp%jG4fn#6JxiH@3Pk{!JMGA#(Rf0paLC)zH-4Bw+4_c+Q~L=4Lu`9J%Iiaw{eQ ze?XB8$#LTU*tOeH0`dn&xQx519)dzOvL0Q$`<8%&TWYP59q5qvpbEf;B=4^O3%;7- zB#;>7#7EIDFR7>k4qL`--UM;!V-^WeHsqP2S!_xTy(MGDPk?y0J##a`0H~tiO>(L( zU`NkK*i0&ACK{gA*TpB_GLs_i&h!@(vg-?-wM+gy#>+}npJKVyVcK(C6V6w+HwHCK^Ie4-Axn)7a?1kDd z|IRc4r0;S7ll&m#PG;aeM&BYz(M&&Voc7}FM1ZJQQaTxNOw{`qhrNC^zM;x|-xk+<)FqvX{i*fU__fSrH}XsQ#6&5m{{7l=;(0b3fqek3`i-y_ zT5oF1Xp}<#CscdJmMRDU12j`tJK6b$=pF&mCiJhvNpce#z9!P;om%zz8DhFdG(yOc zu!?hP*SU**nVjh(>tKUdWc+IJ0jqVN0r7J3mynh+u!JoaH;sF?UD_B7C%iYTNdPMB zJ-c}$W2v!gJI&Ep5p6tV8faeDAtqx6v4_!H6ekk)Yl!m0ch4)hduq!)#xa>ZZrDO# z{MCP!DE~srr0Zm4#Fu8^Pz)ojRIf?b`PIYswmKsJ#aEam0m>?+K5nWs-+oM^6+ty$ zZ9Pz11S_GSA=Y8aGEf3I zZb0aJe0E-%d7t%Vo&%2`A0mUrU>CoZCjxNC68oDm0+F{et^=mK0==7+h{kCeUky7( z2;*;u->0bSYicd1EnQmwvWuG&v%8C)U+HGpHESEn_+#iC!!3`oCWC^l^TQ{gRQ+oF zO$+?c zS7z-o9`KY>=Waa6^2}Rek>yHX&i#(#G3`#Owt!pp?+ceLa!z3&{$S!0#M1Gb0{jR@ zxPi?r2Jd$T>Qhx11^X{&$xltpvB7%A=ddA5A{2RKf~lIEn{C`?csO|xSYJ`ORGeD( zI5zE8D2&^`nRxT^#r+bF)!z%zutAhBRhY7w3fVF1ow)|oalFr!o{p0Wa7OXR-xz!T zn?M~Xx)9g`xOt#iCn^1SC5>A2_iG*7c?oiqTXALjH{oN|^FMcS^K#2>$*T8D|98&; zSh)(Ye%>XzlU_gG&-~EEM}Fj|Bb2|5?J|Y?KxKUicl`>{FOJmHV)XAD03j7%C}8x* z=TJDD_g_k}e}Tpg>q;G`KK(G zW`PZ5vXQr9o}L0Y#;D`FQv-2oB`2Dt|HY41>ZR1i47-B~a5sN{l&${=ah|r!Z-D!$ zdyp}^O@MXFdY@EB_aB@u{{Oc~OK;ufO#A96u{zpre{~;-u7}U%zb%!nuDpn1>p9r3 z9eC(&azXJWvCi$aJQSuJ=c8ji-}w0ST!drA`n~YStewZ-RXL{&wgTfre^-iV;8*j?P4zjN)R)(+SMbpn^aqiX!q#gPNsY35B|nf&P>!HJ}g zTYr-O0KtTO|MCfrNcDCP{c8)&sf?P7fXkJc8Yw8g)W&00#{Q?Ef3g+-!Z!h|E{M4l>6;b{8tF`FQ9RMj)DO8 zcf$sLO2X$7fNBQt8uvcUw3%Uiw@Tc1!{{a}Teg!asOaTcrfS2iT$l|XaedxY- z6AvHu&l2pN`0{(jy5y%C$-bieQ~%PM{%{Nc`a&s+OAY)*3G+isen+BI0AlM;vUQADu*Fzx6?vo5_KYXo9$AWi))!EdDQiQtEAjZ@^0c!yD(> zN+SjU2-CoO13=D3x(!~vmIpua0U$6yufyr!vQ^la6Zki~gn!>f9Up#7sk`#O(=5O5 z_lqg@GX8xW@Rt4o;m99a2LPD4c=GapmhvyW=~QMzx85MX)&2=y;&h@V=OG}tn~|U6 z0rM)?@D_IaN;(rU55R})G)m&k(#`6c|4pKKl=yJlgENFX-yUE4}1 z{Ri+L$Je+?G_fsN7W|#_JYg6RI7n{a9sXFLRBM@(LLkwP|I%CgH53z-#vY3efb(bqGIph_Kx;UywAtY;6Z`cw0edaD z(nW3J|7^7XfS@gjci6ft={QcJT=4atKa|w|cv_!$xR%oKmjCM4dn};_rE`~LKwJfl zrwZ`b`11dFOFtPTpx-(^enCL1$lsCB>Hk{Bziim41;x)~v=Y}G45M0??M{!eIYzAL z|8|1Zltbw=i3R!CHeT-EuT~i8m)L=O-hQIJ%e-b6{%f-SFFv#opIUy$BOhK|C;tPw zZ&<(s0QbaC$R=PUK%eDAzQ+&eLJDZh+p4qI#yJW8CVP)B0M-&CCH(llnKj{vS75^^ z01|XtO-w}9E}iBN5tKLfmZkD_exv679}yG3|8waE8=|q!}+^GHQTyMN^(QoMno_KL+pj!WroR8@6Qa%Lxbe&;uYzfRxUi zOe6j#3;U1YPC?B6kIzYF=Wn%z{th_-WR?sBFk)$0|0N~|yihUWi~nnd|J~+52)Yn9 zSn`KYxP(&lg=XXOCo$Oo2FUgT$@n`?L1{1?Q<;1p*CEF12K1 ziF>Eq&HwJ0DV?h~V;pW9AOTlz#sc&{P?R4sZk#T%KQLeY2jp;~b^m+Gb+4z%l6(;# zJDu13txWzRguhPJ3aFjQ14I_tZ!tj9pke6W3m5{27{BCGdvLm%_-Q9=z$WoQi2ic| z%fA@Ef93war?6O9du{;)$Yi09fNP4D1DgusgTDRqch6audu`jQJ`dzd@IRuWLTgFW z_1jE^4E}D1tNeqMd5Zr&T`5r)g??y*p^9}5enR}u{x%CH{P?$z#qW?m9t^MPA1>lG zy|*n0f9&6*i^Lz#_}>C7q$nW*kF7nuQj)fe@n2u@|9+}czxSL2jlY}E`j<|fJRmGT z9()4s12hojY#-?Sg{aRWH10EL)1I?MePHQ*oDi+H(hPp^KL`s2~8m-O?xecaJY zOo+x|OT?HkRGX>wRx5iSUAFuZypD^bRkTmOvk1UCp{}}b%<&5!%|MSz)b;`$zmiX_em48j;2lb#@XpfL`V-Sb7aIx zf4R>MJ>3h@@WG~T&$+`Q9Xlj)m?VJVIbnQpP$n>A@(6bXoN>~4w8e2`6-{ta$?9cW z&~48-+Ae-pX|=KyM6v~_KFj*8)(D|kIVXxhOjt~JWo7hN$tq}9TX(~%K7$7sP9@J# zlfg?C$TDO}jv`aOd;hfR27p>zyEyquG2dgu$GXP^9}VGnr~KnvPYi}+Zf4%QEEhP&w)Gh!?{Sayf1bseBhffk z!bhLm>v207^uuL&xUG( zmZ??;AHeQ1;22tb#dfxb{~lfjCI}@|mWR@r5KB(*`(b(CRLI*RI7(p(bY?CqK7Sd{Az{$E+uo`F zk_qriJoRhj%k8s6c)4kTd^ZgGAY|x)2@!$9MAQ(n)Jjhr7J)vjom4kRBOwi2}s7$-=Z-8Qp8 ztslj)wQC>*`X2gIvJwi>U;>?9t`4Y5LS_5Mu=?H<@VF-bR>BohXGZq9Ezu+|Y^>1^ z%6%2ibpgOVNP28g$NijAHsn6xCj4U}@iR908cf(su)P?4Yp=gePWq#|pCXgD8PmG= z5xyUX1GE>_l*h+oU@*S>ul2|fQ+@=W9M1p%5q)!))D=6< z1Z7C?9Mli8@-7VbNgN&OS;!@;rFh52AgVTK`UfkzcbgcGoJ*{QeCPNFGbS?n$JKXv zc(_)EKNQ<{4BuUD^WE45KfP+`rXkTc(G*wV3K_^Qlm}^RYxLH+WUA$YBNloOo^^O^ z(b<+-OA)f1Sh_5Hz<9G&A-1|${xO4k=al^ z*T`mOku#0dsG4AH6T8o?5=(4^_lW0O*6MdqM|swhocYZ8bvFR_?_ps3KVyCB>unIE zGf$_``!Pd?7pmeUS(xpkwE~~sIYZ>+0mqR_^sa_a5iaqmNVl12f(@=cgL3%J_T1(#o&>Vdu>LPvK;5FPfbFTD-0oIj(b;Rg1D7-vZzEFfbeH60 z*wi~e-k5ZnkiZy}t_bBM>BV5)Y*#kxjIv||#_--DrwM`|P>GqOOrP;7> z^JcW^e*2GR*25;_neps~crqkEGHcmYSxTvhX2k6|q=Rn6HFwKnMfJLhNvD#SDSTH! z0=YGzHeA>4HOG{sGMtMwBak?8+t-13QFHy<3MntO81j|%Xi%?_ed%^{DWVEZylS+$ zTyg~R2y?-Gk{0n)=>VvJM?Z*cv3;0LwB}=qc3tsWSb^BmVZeUlt{jIo`PECjlsU3Y zlUmWV-`QfjI4u3-DwUEXEpg`BznPT)Z~%j}sEzdRZ+KsBBqx&$P#^e@X~Szb$MhH$ z!#|*i7X&_B(apZ$r#W(`+&ab5dGuNsx(X5-hSePAk{(Eab#`y$UwOG8U=U%R#a7nI zh2i4oa$(C{&gim&w2QP_Phw&qBMF0^624C+2AGAmETMEI`(I13_ke=dJ`tWV=Ipf% z?u)=t0 zFT1GJfpcC|QLf|ayJnfyZ9N;aqHMq=vW_higeM{@_3CBb?JF5TV=SVOX*wNh!z=x9 z(nz)sds?nqvA7L>^KlM|^W(0#Yh@PQbz=3;vuh@*xkjVi>=+__itMe>%C*9so2M~Ryn3zAh)4Y)9CoMoSJT5h zH{>`BG6>Vs!v)Jf;o+j*RvKo|wn#EKtp)TMBY9oC9AEEhS@fWjSeGUzx|od=o= z<>P63tFMSBxgGG1^jUiwm%esxxp}B-F5dWTl@p$)K|8{gTj){$>cMjjyx zi(Gj4py&T|GVTIt`#uXN^%D#GJd_+K7qxYzsCXc|3p;X#jk-A#ts3q0&Pa>TZiI^( z&h}xeJ+b(TwTc@ww__pJFjm{=iFzXC1A}_o5qhbKZraZ6Djtr^lo>Hte*CjZR}XN4 z#whUXGjEzfze4&gph(hwif==S%}81sCkxTs*q!F0Oa3(?aflq%xF3ryrFT%bce}bA z+xNvkQJu71fIRRcQIj%IKPQ?vT#mz7t7fxRx)rUYIE#lP#gxQjS4JIqEKyYwgOe8M z@$CHf;@vhIHSD&}vn8vCKWy8A%O`m3G40zBE!90qipi{K0Kb}(@TptgHgvVFRj9>L z+Oj%$q}ujC5DPB0$5ybzZMRlDgUf790o+(TR0at5=*4B2uOfG~wd$C-frZPt3-o}O zJ9*W#K_MFnZot}g@Ilj6q{QBq zl^J1wc!Ru%+W=?hzewbS@R_{w%s9|ExdLOvzEvtwf}~N?8Yt_e#dKp=_O-h;JZz!G zPK@>Aup6ucwulEKyJX4yTTQN`m|*!%X{=9?U!m$VTv9FQrqAhobBd#Lnq33@is~@SBPtLWLM*0cr^cu z)a1dX7xtrWb*mTwNA_(E*e3r_dCHtdC2(vrxI(*MyF(g#H}=+2P2AUNdmFT6@vGBd z((D7ivgJI~C&rW9=oH|V)91;T?_ax8#K#3= zQ+w#jYpLo;_higR3MC}jS`94v&%>Jq$a~Bu1q`6@JaQa;pvc?q+2%tcbHCU#$)XM8 zys*Gb)fIn>lpDXdxzc3up5Ss`B25W3}<&i!6OHk#IxuI-uI&qx3*%j&o20+w~2vVAF2&C~cL}x_UT+V$dnfgN^*3S*>c43CoEceG z`-ar~eoS;$W^$2E5|c<>FJl?8GRI{aR92 zP*(|fJMU^WkGdWc1_{RRUX};z8j1ShycUz*DuNRt`E!w0xD-{BdYmL_r5n$E5XUkQ z!2n>qe%>f6b*0uTnmg3MWavF5ZMUi9C4PI95GNEjuJ>T#LF54i)Y~<-Sg2d*C{HDM zeD4=52~n_Zr3tF{>8JTe6xQv*M~QGfj6>QUv9!4!dSSfs^Sk!XO z@=W(f+0PPDjQ03w=S40si`?wZcUS)r%+)zB9$Q?lX3;Z|f{bTv!H;PUuty~}DIxE# zBYY3-T`4LYi=&@A2ahRsqU7!PB6r8=jMrX==T<-M^p-#h6=swcWEAuD6|d%IK}1+0 zbGg?u$KP1SZ81ZIR$xFbi8tc-HO;-n6=d43eq2Qe5RpWxTnd31 z{sk_@TOdBRC|tWo#1B2+d@FDy$6ym=)a|RvaHUmk%#{GP6uX*ct7WM`S201J&V;PI zil>K0*2_}4W7WWzG#e76k$~7VvPFNf>Vv@x^p-7#ZG9sYOr^$M#t*7Sf#V+lDzy|b zwht(E+~F%ZA6{le+8qJrT-PFRG+AxyFYtOiI4mZ)jyM6no^aGtq&8-0n1%E9Ve?hm zRb2$lwp9+KAwM{2-0QY-(;6|>!i~-7Y(?<8^<}{;6-@M?r9K80h6cm+)dy}9N2F>4 z9Po^q2@J5-1p%tj@3X5{$MC=$R|(9-FVZukEPsw{vj=J)?iLTnjrf`(Y6ZH_HIl2^ z{gWM$0mzWF{(Th=U&|OZcG*B0^_N;GCXRlHsO3tAI8Dcs=Ah5n+wrk(&n4V(8GXE% zFyz?5zWPWvqT58GrenW-rP;yeeaFkyXwn*($-UOV2A*?H(L44>$@QbGZ!49STiT~X zioAvA?mxz2(qbM@6l|n?z-|;9!B!>Il7V+tRvxdcjEmWI?XWUavNlz+G|u9>geZ#^@m>CU6d%%uKzF^C*3y+x(l9>GAB2NDc3b%M-@WgNa$SZZvoINUU3pYi?N?LlHx+LGpanAk!z;%k2!HHVceV zRkKMk2bjvq3E#!t7^u$TAJt%4Q9jHa70jw}&roBtPr=T)7{-z%XLV&XCEV3f-!Qs! znC5D0cyzGpTfZA}w8psojBC~QrMvIaxx&*1%I`99N3ZT>;~b61@inopGJc^Gyy!BX_+>?SMca*TcDU9rw0S426!OC6Bjdq-wwvn>ak$$Z z-lu6^MTvvMLxXLRK8Fv~OuUq!HkHGL8Y6o9bVOCj6fCUgy$abRne3Z0AiD2H^atVHIjk`C_CsMF#V_y(9dxV%6 zZF=F9e8JPD9Uc2MzLB0HTFH#kY04os?UJy&7m+GeNqB9?{WG#M+`<2x5&rs(DbWDS zenbD65Gh61eLtquXm{OS8$wYTjXUVhC<`a5D@@HKZXQg07MEW2Kxl70O2(vsKZ}Mq4kckV)bqQBC2gbqh*+5jNEBrVDWdQn z{ryR%(n$`6OEqXiKbgLrJYz~o(KuL~sopP`Po_FED~!ufYJF-plEKZJXyM-a%Ko(l zET-?i`@_b3JFEJ7FEBrD?g7~$qc@czw{b$8aA~{S^P9_WT^fWy5!lMu+1Xx@ORxf0 zii5XU(uM7S(w~gI8kMz2%R<^zRt6M9k_0WuQH3)8MLEKnGlDt73rd(NJ?t=#vO8KZ z?h`ttTPhayuEckI}}T5@z2N#?%cD@BWwWqjUj(}t6K z1AK<#je#I+d9v0KUNHKc1l_TKa5Nt@D3G`~Q&Buq=&_L=NP)z9|`5iAPYf@@VF$RA-8&To9#xw^>OJCPus#aFmF6Iik^-N{3F6 zL_}rnLuNxN+@4tF@5`r{N_Lt@4bZnJK2KZ=e?Tl>M_m8Bbk%md#xi2*jIF zLJW6cF=*Yhk*l3Ye)Pb5%$1SxpT+O~*2X^G<}T~ZeDjuJ_I!b@qdL^qxrRJ}%^ow5 zeVW`r_r~vsI-@ZhgO-#C80=f%n<u6(k! z_6Dt)ih<*>!^=)7xCjyyb`?EVseSN`asQjTe(G9pXMs-nq-XZ?7G1Qx!kPPkCRmVb zX5;rr^Hqn3jWg;76K3M3*7Bf?4DCS5clV_z8b|GZj9WdiG(51#NKfgPm=C_ZMcir( z%f)<9*P$n)E0L{=5&GwGM<&{t^D5knC-AEDKL!w&3?$fYZ*fE!G&xf9K}gD2YPOlg zC4!PCG?_ybN<#ZM*5NI9b;iRl`ck{#)UKb!S2WGL&eqyQoDg;?>yFdztbol_U8tFg zy2BY3N25urr<}APbKlptW)#w$KU5A1XVxLIM-Job}@6&U#G#I~Zf*n7Q$Es+67 zPo!N9n0GRsgyn+aM_040t0VKXN+BJMB5@XzKac!YFMKQbzT1)=b8(t@TFrudJ} zpg~^r(jAapwW)|>)SW3B6{S_JiRVVelMW(um30w3+kis`Y)drDB`K=Q#BBY>V2q%f0&fLUbkd==IfX zWRs)uwtV#~F#QNwDf1I%x=NQH6U(1)J*7sblB)p>`OS60JwBsI-_;A(UG9sjFR6)l zSg06eOpCT@js?`EmHX~x`+6#|g;7*QQq0c~adJ}V-y&FIJ(h($IiLXK*Q`DT1n=jc z1^?JVB>a=^!(ml#`eUIjljaT&)^(hDYjELHild~>%xvLgKUcTor@k8-D3~he<;Dgg zafc`rYh1mGeouP?f#pL!mu&er8CAr$QoOCluC*4X?rT!fBOL6|_w8-6W^eY=RoRNS zhAfKI6UD0fHIpdrc*>0@+BjUfC0g$IiNA6JViUP)?C68mD~evRixdfUSp9WKx759& zJ%FzBSWhAw6{R2?K{nU(hAf=Yh~fQY)%;f;;55Wav#Vl) z)ckj!2XAR!>SP$MYb*XT*u2$J_8=9Z14!W5Mf|H6J+Tcxq5FBZy&((Fw&UtRAVP0G z#TN{RVe+_%TsT)`k<_-*!v~8=Bjnjivoo{((lLG4v&nEVwA-x{GqVlYfGM2pns2zV zo!$YL%CeeEsd1p}L9khui$h*fW+|G1KR_lvXTq{`NM6tU)pI@br1US&yaAixxz6wS z^5jM=jV^zG?6EQnCHvyQVq1+{-<=JLl#HJFREZV(#TdeCD_sUfk!?jR{n$2;lVF2~ zZ!YVI&(?+teUZi>R0W8oA&Cgf9oE?Nc! z;Z)^AcNO~Lv-`9cZGKG4#5bv5cMDZ9U+CXp!QL<>jY>gVO)jj>PjaG`$7d4n2Z_4#;S(vWdl9v%7k2>IP#X7P)=nBKa>t=v8A(Om8|jM3?A%hy(mX zT%s8nDy_5qgOtLJLEVmGjY=bXBQN8j4BL1R^5cV(NZ`*hx3CG6ZeJh+(LP4nZ2l0L zX!nvHDtS{U0$Hnlop2!obYq{tzo^}Y9raE`E$)tt>BlT*)yf_EC*K&URJiO%9hPMo zL07z`6-R5dvn}X2`J#*JgtwhcdNJgiL@o0d%^@(`<@t2Ca7i*B7vD=|>GPMOJFD%! z6Scw&*)_MXvTJX@16c}slzeeU-rswuo}uh@b!u8=dm!#m$=qqVP{dV{_(*N#)F5tQV8yp$bVo4Niv=(Zw+f#zbT0^5UAiI z0U%;hRRV$m?cS7%Ji{N#IISPfGFlg`xK=0{7jFD?ajkY`pB3*DlVbJF<6gFSX?U1% znF84S&VE;yyW9Eldwz5+(B2Mz$vdEsEe&$5{|tB@u#(UIETbNA@-UyA6)dc0eT7BT zW;7J#;z6XJk9mKIeufJm(!0q>)VPpjMSQXM#_N@l5E$mALV0PQTCG6HrrFOiWt1D$hs2%y$B`V zdKsOqgc@2G2y*1K(hCVIs&nWPlNIG(5SxpqHgL34q}*s4b-4UJgLPqxe#1g#$h0vw zPP%#a#!f-CVw_;CC~w_HJ_TyEIMTi@tVyzJnSa{*<*XBl!)34(U-|hE12{y?&6jt) zm5htmr;hFuM_e3=8j(icS`t_lWC80ZQ5sd7d+F)(?npC@o}Be(P_6ZiRzV@Sc9cMH z2&lK);JHxK_QQ}NJ2;74RYl!0*zUQWgO3G$$a1S?I)^c_?9kZU=;WcRqd6hWiE(xq z;nTMxj;)SLaV7DH`FXWa?j$(wrUdN%c|HPhZ|CrNGbZZ~3z|I%sU`1Pco*W~UgsRZUfaz%mLx2Zcy|-xiK?8UJ+W$!<-#M`v~m0ZMS-5S6OWJiCpdYDW6x1 z`WqR^CoMVH5hupcJ-dumN0;SNrCgVk_c)*FXd7AS8%=evtWDKwoQV+1c}ZjKxyTr@ zKK3SZ6#d;^W6(=FXRr9VA^LIOHz7OI@ZGU)!7+)rA5$KD2ZD`gY22n@XqoE2NdaIA z%$y0SnEcmCG7dv4$Ur^|A#qWAOFv%wa#OKiV1X>VYu6Svv(#AOhOxOX zjdQU^U5gtiYszYWw%Ne19+E#+!jduV!N3|wUsXHWxIowObPYs|lA>A!=kSKiwYJ1_ ztOSY2hQxg6OdNo2fEOC3+z5CP=b4i0Zo(WQiH&uIzD4|lHlS}UA0|T-#LMro@TFiv z1b!J*OK9*PPNXPV8?Z7-jWSiyQ<}$imcJU{%X>^RU z%?t5XtKy{Pa3hbnnu5$FkAMqnJ*Ep$AE8m?j7I51>4^(Yk?b zdX+3I=gzfyW4gcms|lR+{YJ|Lu$y1=SvE!kLtMl=bjw@X>!$a2)+2q5m|F|K-C+~3 zA`C}uz7u#CTVuTRfT1ONL{V=Xtc)lLKwWPHM>+)Xnnf($sDHgkbO?agS?%3}E3ugz5as?j{eg zHU(jZ)Daf!9Vqb|^0dZ_Q|zp7iJR(fVOv`NZYNUe*$tc74SQo}qiH(UB zF~ZTOx2h5RS@`T$(4($^jYPOr(gftsdjopX73lX2$b3l%yk#NmEk?L@4NA3Esf^W+ zkNsB9n4WC$&nq7( z$4qZWQR`WYZ7y)@GSAT`r8SPzS^yzS1x8fNTzRg-$S!L|TW7l!>3o--bln4i8hv1G8oo>1!)td7yJv_t9QZAh zk|5}JW8B01N{W-&WV*f96@N-L@u3a#VH8=PUn4g;9Jm*{exxlH*p4JQJIpUPW%j;H z)21f1CXVcD#yQu_D0$_cWd;~Cpz0ucUYmu_w}vQ3haR=|FXX;_{LEW@C`4i0BTah@ zhDnUQhqZvS4br>(gC4KeJC{(s(l=zq^^(nx(vsJu+GUz^6i5VecBD{?&5-;sdA@85 zJM(@nSnew1BkIX#(v%|fn9n%)R$R&*PHt-Ir6y#htW1p&fbN zh^F-t=z;KyLfVwVAktRbjeD6MYf~jztR-)cRSe}3cX3(~E!HgLnG-s$mNG5BV99U> zb^#(;@9uhTdN^pzc6~o|iwI(_a!40hXHz6Jf5mV_+PvN_EV-yZ(>Ca)`)zM9De$w z{N3J7=Z1Or%;|MO`mU-7oh0FMjfp9J#aXbWcKO}$_YnYF*p(uh3ulvON-JEg@koyOfX+Ic9ctX$A zTM}6@VDppKB?~GNDwu$SIC^p%-?};iXdMuiGJ;quPmhzMU0h;p~RT4 zJ7#i-G843K@vrD;M|^Z!X`Sv8r=3h{NkSfcpAwkB%!u0qCQ zK`!=Xeis$r4?aue+q0eVpO3}|P4-p*Ejl{yI@>2(wWtmecl6mzlfJT4f)MLi_=X1U zRsBlaXR=7LYVlj#=Wi~KCTmo9z#qs~q01zHo4D}BQGcj0~a zB*W>q#$9>&<5J$lLo!#zh<8Id#$UsU+$S(&4~Fd1{V?SDB-^8N28K7$gO#X9P|uAq z*}-^3Rh5-HZK8*dAU~VWFEf!9Zha!_bZ+&4i5=02kPCVWZi8U`WKi|Xb z8YzlK*LbTxbMhs|m^I6%oT0YnvzmtsYFcib`UuQl`>B@Z7w?Jxk}Z2{T`G&R9uwtpxWo84x4tNxX<;a$bDG%tN&ibf;wm-Ql&4z4`MywLbwW_&`)U zUx>CfZhMzEX66^UPtIjPYbeAkGi@C%{en3=FR{jP1pY|NkA7bp$k_3Hzw=f@S+V4o zQNwU>q|(yZXfN(2f)M>M>}L=-v3QzRC69Z&KGAx#)PwyK z)an{4#%cB02tY~MDynYq1ar+bW01(Q@sjQ`|HIe;Mtv3w+mkAQO_1MK3|=m*gsPx_ z;$PngRJvnLKQJ?xHW_M9ptLmfE542&vI?sU7ZwLwU)gd&?X3(!a(vSlNUzMd#`S)% zp9+1ObZfK8XmK;sde*xV(jnKQ&u*(yFVhcuwOQLe<; zYsQG!F`jr3jgdF%gLN96bACvLdbjaPlaDZ6KNy6l6lR1qTpk@!7JrcGoKnbmAXYnP z-gTR})mnVRwT$;?QJ}@hxiRj)GD89)eUpXLpP0g*nGAsy7mzX#wR+bjHrY zZ#ZnD$CPzDqCvX4BZ%!D~63ep1!CQb$T$Y^=x0iTO9V2@q3j~k#In#NF&CX zh6eRSc17(aOL`DOp@o$fy)8xyrL4doBZLXe6_e^$K!c9x1hNvCxGKjV^K_mi_2zL1 zHm~TX6hcf%Zoz!1J@-4=;Lif^7Ke0a?ni|ib?1mo2|;J}`efI*Gvw$N6g4JA2C)oP zPhvb?!z(7$A%*pk<3$D8VN(A5Tbv}q%z}gO-&P714KZ{~#a9(yZWNRgQ{)W8ynY)) z%{oT|PTYG^NGs98gCQSZAZnI(PS7Kyh`&IPvL$(xK-5X37m>(AY9SepDV&V)30udj z&RWv&_$V+Javdfa@`Pl1y7He1!T3xBT)qPcjrv3Ou9&-xT6Nuj`3?opBA??r5eABf)Pyg*`^7U?akC=t|T3+f0s3oD#d=v~U>YuW5be$65rs_cAY|=30igj0(;F)TGU*h>T(c!uom;#NtAC$H0{f z?nLIj22tcKtg@`#64)zeNYCV`*oY+4i^rsuw1RA+M2+pFTbVL$Nhh~C(Al4TVDl!( z!I{O;a~q6$fvzd4PS&YLtUf#vmD(3&oE~eq_NFgp`)I)cGf1WEaoLoNfG&|O?W`$> z=>4TYxNmYlvYDiZm91KS#}lpvQOmJ6YxjXHZZ$hWQDWBzd9dNHXL0Cqmyzus(22=a zpN;fTD<|@#AF5hb(}s_wf$0C|hqw7vJ21z2CEGSJEo~FYFXSo4N#)f-2e;+A2+)O> z%}ej)a9?^A6%3}#CS4$rSEOzH2+L5IWSAv2k;Ei!(4M-uhF+5A^~d2MPr?~Mf6OUZ zis!^Hn@fPscoWFZPi6rc6UbXug<{G`Z^1lO%obqsYP9}*=`tz z(si!;;kz_5_7h0-#}2HZDFHMpyRtJ*gpiS)k-f8JkKg@}-uL(Uynpoac%J9J=J)zu*L^?jDY0+G zpG+8dJm2gl@)RaDDU?02D8whSpL8a-Miz88M%ei{gkZ!ps`=!60_~aMwSm{HbD5GS4@?RFzk$Lc~kMQeo z3c>GoDQ#U0%7W|{NJXyy_)36L#@%g76rmycGJf4fM8saJYo}W{emrSJ_Bc}9T({SF z>FtQ-=vNk=f{(MDTzuELrG*iKaPzdc&X+N)m(zHgB=0QvS52?B)xB{x4-6GmeL zU=}(#T_9vO1NV~&Z69N$V7+#Zy@Tl_T{Oog=-{-JL?+I6RueC*jdYKfn5xCvP;B*$ zXk0CtSjJIQ+KVWPHOcI_aVHusE>dk37r-9Gyp{*WQzAQ;`8a+1sk!%Dv5)OkDhpFN#2}gSG|Kiz>_F)IO{R47gd;a6;&x>)$=B=l)i=OOylFR z!jP!AY`qaxerg#$Y1&~w`9WwXu*)FpXVHdsoXE&ueuu~m#RTNIJsI-kc8l<&`q?<7 z2;2!?GHMyRI_GOFpc;9x*4}#c)lJ%zcjfJ36qX<3RTDEBWcvEaQn2o9l=?mb$f?2S zA+#6FFN(~WYYAohlbLs`QvfA{azD(Ui1_@3e)NJ;)IYB-SJTvsBnI3xrPIru3bj>r zQw0+ib?2>LMUjMV08PuD`)uE*$u=Ki@lt|&hDy)zYlB$Om2IY9Yxz?)OSoSdrqk~2 z8!cPlORlfwU3gxnIIr^kh*O+*HdnGAHD0{dqe(9|_ECk!lSA+9l{Mq(m<-F?pWO5v zZK9WMTyz(fH`iV-`2J%2>gr-jv$&%bniEWJ0LW${C+YY{9?Gml9~sOW?9>8}=Zfj6 zQ1vJ2=-rezPHCnhFhgDZQ`90*vV1q4wCTAEVX|U9iF!(BryrBw<0&~!YjibCb%ppk zi;)z`8A>wys0D*>u-8+m?4}64duC*)h1#4k%kI@SJ7L-qSI_SSMd$hE zsK+R7`Pp+>=Xgwtya`^eEGRn_tWinpc79m@8OaXk+$Z3x{hZ2Phg^WtR1dc*eSbF3 zlH5V(W=#{bSlbSe29Vd1;X%#y6RHu|nL5NS)zSrh*SAhlZjYWQ2=9 zNN=(iEG8=asuKJ)uYKRW%&GBQO0ZkM-X!y2k@%c49*o?)wO1HP0LzZQY=3-CGZ;>}En{&9({wy_hSZ?z+2Z7$KlyTZH`+b^tBw8qru<#sHWE`_6iz?Q{; zijgw(Cwt_MAWAJl!fEju8)aM?9$oom`z9jTw^XX@w9ZOZTA)qS(Mq?W?JsT!wVXFX zuN|cI*m-JcFT@(O9((3oRG|uMmMCs|aEAjB^Xf1f%pdGPB!Mps(XTr`GVoJm^LewY z+?DfDSZf+ndp=Y5C}a$B%nO5`O_?li=flV4y#*!vxCe`xlxplxw;?O-^)@fso4kM; zLj)SA<>YhpL=xx9TFAqR`N)^QDivkuUdYaTBH15_*>40BkVsrP`08BqMVwaIEKN1@ zNBY913Im3r^*L6F%x=0EihEd63d7-TsxjUT>nrc)-l}^1?ytu^`jzfqGM1=H8M-Ph z>WtV*n$7YTsSM;IqYAOZ{YY}JJwZ89oMSyIBcB`ZcwzOE)e)Z49|u@+%vo|zL0Z5a zA1YGo2Rg{Ck*bUs5q~fq%UVYJzKF!|!~LkI7cs_u)(Fi{x-q98%1#&UXWC`Bt_e+L))xTkoG0? z*AIERM@={H3+gS<>s?~twyN`wGk23YUq!m}p1bLItrc|>87e;J!VDS3mr$BF7p)v0 z?S#pkWsZD;9af+vBNvvKBNP^W0dG2EnF6fL#MaiL^ zPpWy}Csql5{&Y$wXeN(0=rK0=ac*$?*ejjBl#1Ws#jg^@p!*$TlHBuuzgAK`bfu|> zOVZT-5gGc}Re?({Aq9fRB(Ms_0bp@qo0xFarCdKm9Jk)WL93#>ETZF zTQ^sDJuT^UV~<2W3aj&+2>{dT9#l==-z2|%y!;_FB2-)XUiLHlw4f)-2^^%c--VK> zS6^g{*r|@Bf;@Elg0hlV;X?H(jB#yf%ZTC+hFE@cJ-VL*$)GQJuTae7vas{hHZXR0 z=9^={Y`ed86d^zFs2MH&FD90c zuDeWzx_(@>Nh^+&UJD!*k1nq{CVGJ6H3SE|@Ka@W4>5u-a)nhdma5I+AhH5K;YDUz z+^CF7X!mf3f%eZ3UM|7^S%}qfjUM&yy!BS*+BtXIk57dQhdx_=M4rZ{5g>)?hLgs& zAXLp`Pg)7jsk@zTL#SH(tS3eoC;GomN*?p%Z~t;1v--}KlLiNuxVbiWa*an{|C)Ed z@y}302R7p+J_d;_iITS5H$iu(sC<^FwHRa~8-__S>$L?M`q@qP(N236+l>>g31!Ch zJ!GO-@1rL`^U5wk?9SEKjd0xT$^S#*b@2NU9xm3-Wh0>}batlN{BZ83Q zrO#d~4k|=$@|wqqj?y_AdC|rwnY+b!l;jeSt9rA$eigshcuu{TF8ya?lHO#SE%pA9 z+wd*C@-F|8zP8-;sO?32^LVGpx12spR5Wn-8+W*-g5vFgg}z7d`k8bdG1{qOX}VPn z(^U=R`BX1XI|d5&v6CfQvDlhQzXY#(F5B=S{RSU~)fCR&56oCzQvd%n#7;+%l%Hi@ zVefVbaAH54fYu;<7~E(Qb#*5DW9< zeKEFEnSB%@_#Q{B?W%hPxz^@cNSe*3g&40 zh=juISk9}{4ZuWH#_W~og;LrGmX*De-AZRM1SVXK3FR~xj|1h>h%%m z)KD|T{=UE<&{Jtwq|d8=6*0Hd8YQijXD*Z3h@vMb&U~Xq)&+;qeKKa) zW~>|DOIcHiEfTS#y{|0*s_FfVxvy(9bwZB!-ZAr;DrEBaH3bi0AK&%9h$Wk!?p(C_ zWK0qwF2`R#t^s02YT{-r z+m(p+Y~%9-UaM1&{To$UzY}z7ECT*jy*Io-!MmEY^!lT6X&niQ*oEGe-(!P(Z$(!| z;bjx^9@oQLv4*}&j&3I*4{NzbbcJdWWAyq;Vfp3z)YFiTbA@1Zp0BUG@}zqioOORk zdNWgRGlNC%2^7dehy@5O9b_1yh>d~K(ZPX5#Nm&Sv2-vYm>mL}`^_`-9{EMSujgqP z?fSxM*R9cr&>FwDL?0J;naq^cJJacqqTX&dD8N6zwa|ta$J=XrCx`9(^1F9-b zWF?LN79jw3(PO{(XUSnRG{J@f+uJK^4kMZjOde9q=WBJw>0A5)tNQkBn(%|Fg$j`0 z0O-;bYLt8;BEtrf8l0s4LAx-k|D?Ez@K%1A9pI@F~3C~F8cCtes*iHw;2v<>gB-}|97^Opn@VA zJoc&oNC(0x$}k?woH$jIq=uqVDXeRNqc<-V=dD;q5nuXSqLb-9o@8muW5hH5w?nBg zNDo_?og8t#CGGV>+@#Ar8Iom-zxONP9k)<`SiGc`5xx(L2>H|q)g#B!sgGqFGgw(W z7l;EpT103$yduWfmN~M&RFve#rKSgqSNK#P`Tu7;l3eH~&qoYNkJ0Yk!4vONZ!#Oe z<*o`FP@{2gnIrGN%5z{RK31X1efb|x2X_}iw$#4kIXiwPFN?+FTgCeK_*+)J)Xn++1@B|xdCGI;F$FtsoW`~%-`^7KL{EAfIy8ooNwXaPsZqDVU~K9d|M5MR@0 z7Ccv*NrpCJoZI&Vu-XIDBuMsnA%;8(S0uCou505Z-PVI`20TAGQ|qy&a{ivN`^GofHt}wt&S?E;{AHC$;(LTvHWXP@&{6I;D*ei(9NTDP!}kr86qyL+ zrRZaBoP-yMR83eF75)(=+QY~iM?Nex(S7g3^{1?Xphi6G7wjWZN>YpumN&7zB0=Ki zOip{a>_tpkd(s{KSenE4&((wh(2|pxZ_%j?`L-E+a{2d$1#CoTMMjk4u^N$z*Kim{{r%GFU(vKYAqka` zHeif=T`r$(`%*dP$%`u|m$m-uzR zYO?`G^c&Jk$)zM9V#+7X~=*p#L)x1RFc)CYjgb zJBf_$geP30%M`3I69wuZRnUl1w6;?WT zYRV~eqFM@=+YaOQf915FIYQv=5bDAk!{;d1X~ZxqSOzxPr;ZW1u`+9bMPgApT*3a; zd2mkaRe03kXX){mZ&t*jgw&r?4kaBu`Q_bXhzElX+qoeh@Ds9}*Pa5c3T9q~< zE0+7_H3OXU>ngixcRB^l{|?m?SE0NmGQp~*8yM90r+NvHk<2<+k~mDr(h>a-*mAFv zAq?#^jXC>&+S3vw&5D$yg}n);+N3hq-#l;4`W!1YTCvsiDeZZ`efGcy|Np@J{cui- zTw%oCOAZ!)h*h#*Io0+)Q(bCBXUZjF_%92J{{+ag+zl@F394!SihW;geqD zHN_5`lMSsojn!xV5-ozrfD$&t7=^5SC{iL3T0Vy!a-4d7<%cOny+LI0Xzsla)MV(^ zXOcoz&obJ~V-K%6$AZsip(k{p5IZCV#Y&fvK1Y$}dkm3+KJNjJWEkqsI=u409;jf^ z?1VGaY=MqrxV!Ed?KzD}R}Qcqc(^k(lUmZ8lMfbqj2`RzoR?Kj)v)580^SU^i+O@c z7YC+p0b}vwYWmUlh4Fj=jy}3awc)U^8RR8h+gGxzcY%b*V_i2+>4avNgZLyU&u&aO``v zBfaF+cu$fYLabOR;ib4VcQ!kD{|ZZV>zTtg3-FFy6IiDTWR(kWhY{Uk^~uoIEC02V z`v@GcldD=;X>b(m;(pC@;8Ru+l1+vU*O)QPWl(I?b?TdA;N6cm4hXZf1NGC(0F}&c z<8GcR50b24pdG+)ro_lnST6;=8sGic9FV5p4~e9lesE`;?4LQXW)14x^FYiU@Hw7e z8Ju)M+b{8(8P=OoD=KI9w0~C{j{Wf&R4NPTcW8^salh~uJWRrnh7z6;+bQk=8xedy zTgm%ygfIH}B^n>eyc#>5{*S~(V6PJ6s7*>n4A5|{7T=E=z< zO7(is_*jS9B&wJP{6Q27_%bN&{B*o3+sG*cL!Ev>1Wqa6 zo^5fcuVk=U+v>~k;}TzFQk}9!uZ)i3^e@AqcL;NxU1N9`kyaG*m<+y(}#D z@}$NW0uCj7(>60_cDJrByg*R}YO#Vj=AfK_pl(>FGBNs(X+MWgS{B^7sb-L$`UP?L zP)!wJ!~Vi$Xa5U|fvv@npo7)@xI&*Qk)fwCyj*d z=}AX7eL0UEDkm2OlKs~>g{ngh9<02P+I1mgE3{pBBDY$qp%VVnBKquSA52^!*!t1fpT}K9E#w@A zpvP1Qve}rhvc=5|6~%v*<_ixhXEXH0?N_1u4zvH9ToNc9kF#k;oG&m`zhT4pf(#wx zkk09Zhov8e97&iZh8Rg^Rv0<`)yQX^<5-fDbtOB8ioC>I#l7X*s;ySgW`jFD`5K+7_kdipRxA2^u;{u)fk>Qz`6 z&F4xVKx5w)Hl2$dxU@VpVXh)7ewoz&&;-HLqC!agsm&TDo+r-kU2Wd6sTQOi5C}Mm zEdCHp!|cSBqP7{zn!Q?Qa&g~4Ce?_ssP2CV#$|U+G(xg6AuEi4Pd*m>?KmNt-SHtB z^JlT&e2GTCK!7$<4S#Z|dC1X#3>dvX3Kn7sNR?t=Wa*73MFPB9@_L!RhjIrtu8H&! z6zM&Ggy!5t&vtR1b(I4diY>+3^8ngN8ojaMGUXyoNJVA>22A@fmhmpClyj za(mpP>Fi3yDjgUARt6UBgn&vm>E=>MaB|Fc4i5LO&89~XOObt`j(0nk>J0tj7$Zoi zeQ-t^x*{yYkstJj9syb2Hy;u-hgl(C9iu5Kl+V@iE_b%=>3hj;Q)=XTs@hNXLo|jJ zPdL;JSf@X|WPD!Jb(+q|%|_>qfPJ|T0;zJNGnk;vK9LifNfCAGkhcC~u2^PL4Aod{ zfqQ3!5DoX2v7ypN6}jhao)X0mvuZpk=|`AZ^%ptAEWI&{qNF_3A@; zDzuo~b?+-V;~0Kk(&vhb9@EwbmT>q733P-OxfHS2ZIUtKU7pQJ7Z?LRJZa&J2vP&+ zl(S6p-@hlP=s_oLs`aZoft~1|0oy-&1j=8K3C6y9{);XkA z1fT;fRCjKjdnMo$@LxF*QOGcBPcT#HFbe18#zm2Qko~{avXWx1=bA-Xs~#monYB#} zKS5jtrMR*M+q}Bu_+V8tAA#vuT&!+!V*fMINIO@oFe%wS;sa%}-EK`!Q|fO3ggd3Z zd06P3e=k~stIzwXP&L^K_ zZE;e|1D82?6yX$gE>GLe-BzCLhH9#Hjsm?sMOlW>RSE3s^)Pxve^K$X3+g^oM_ zBJI+2(?zn$nPI)C>+-ci$X{seHAt^0B!vDgDKEOyTquUn23`av(voa!tq83UH0Ga& zQ$Z-wL?^WG3kD|%(luxntqPE#y2tadKN!0No0IyLAV|w| z%UKca#(idYohbHy3j=>*rs#cig)^0h#cSmEZRHzahe9{}Pp|kGBR~ZN$@Kl=j{%;& zGn(Re_eu_&MumPYIY#!j!pLzy|#B9{ynO2ITp#zHybvitM6?9r9{7e+89L207J0W%y8 zWMtTA+EsFhKj{hFa2ycUw;+hD`Dm)46-B(3%KyP;_-1tHe`*m(obkkSR}3=DZqL_> zk{d2A4AU};X4W%%#kKGuO~`;zqhRF-R?^`&aLsGPg6ik0$+un*amb?esa&)pAk4In zmbzvL5?)lHuE!jNW4sY$SKboq9XpegL)mdXe&@FjU?NawF1#JeI|(OA%fpC?Dg0by zXuDskWmwP|)le4wGby<5nZyT(TzW#m{cO3sMz4wDfvoQFVP(Tw^1aEA$7?x%et^m& zoHX%$pCT4~4(Kq|o5^~MgOB~VuMU$XrB?gt{0&d(^|DC){l>0|q-4qlx#}ZK<|}V! zD8#lrm$Z4|kP*PdTIm*}6GiORQ6@wGblvHAk)>Yt_s&2GCh~*ykIf7sX_#|Q3w2>6 zQi-QbRvSk-MAI}C4>E_{T^OiS%kDx9$x7?{wWFr-Vf);pETR7mcaktihQZ;K6`YfV366|? zY^7S8La*hX3jgl5##GlJ$098t1Rkd-SSoc4j>e3l4ep z>^knL(yfuw#%kU)i*#QkoyRJ@K*N8GjPM4LYRV6L)A&vBHe%Mcr>D4x<%!td=(=Xg zPI}&eK>5)Kph~MiZ~yp$`!!iP@bvms-`fO0C(#i0CJlDjG9G-$sl2CbV1jS!LPgx+ z*q09!J*@`IlrH`i!nn?Qo*U?TdkVdSbij9{ny zDW572h|2T-VoUJ=g)Bgm$-2F;hWQwWgD9rr_k9JH_!et3t&e< zQpC$Fpu>?DY|c7Co*))yd3&PuY=Ij675nRZ6XL9()_~q{?exH1(epY2e`3Kg#@y2a z2HfuKhN`DrckAn7zoq5-?mAn;nD+ZXK*3rU0Mf~v3)5x*(ZC!Y^l9DPJTLEW8wOE? zB|Y){&<$phQ6SwS;01Z~LsiW(S;3z=_S|%LBe)6q=mmdHONpvZ+Znh6S>SfR?M`~` z?r(U&g~#3oM$_`Y8w-E3o4A8O>TeGn5V4=2a&J>Qq@*LFiPrxO}1jO}F z2xgr*8bZ^DB(}q&fIOiS%M`f zYF=r|zWpU>;)xK(C~0UPlmnebC`o>To}b6E03Fis{bEy+sT9oL)6xEkGi!+I`4#J$ z{xi{_k~5R1pXjxBPr7hbLlLhC-`3-qvI;cKhz8Wh7&U(TMBSYx<$@61*uOKJoRQFo zPg7je(lJRn<%IORb|j<&!}cViAG4z+ZLsDYrwSZ^?{XqIo$dUqkEdxw)@eGEp`BKm zhF`YrS8mEo31yHHXq3H=B9jDj$xz9{S({QRLskbv81w`Ilme}&dTq&-Xmrl`Ys7D; zZe~JX12gH1PsgdnX~8bgVy(9q_Vu{$jp@2!RC-5~6ct1om=xwNzVfcl3G_ziblsQB z`qM}s6oUT*MO)dU85&HxN_~&UUC8nQ2~6;oJxFEO;nO|kI=UeX0M{_;bcUX@{7$Jo zeh(<6C0zt=ya%>b^v1H@qk`s7tnG z!;*U+Ry@;Bn9h%Po?#`pQEBy-CEFNQmMyPwVDyqkJ;+p)zJM4DMy>YSe?W#fDdJJ2 z#&zyULJn)3&{H}mYmeN^q@cA%U`Moo2*;!2kfy@R(r*xIEvN42F7z~f!IhO?>IR!KR{z391 zVvzj#_8XPmH02@K+E9Zfzoze+*5Hx|MWW*422opW4=h224gY-vbIF1Qc)}g(Tx;HM zQ}|yNr&TNtiD&#Ags!L0s24*qcnE^+yb~7@R<|$-?9F*D8vlXJ6qnwfHL9%Rncl_{M?v!TP3lz(g)aXetq@O zipR*fk!E3-Xp(1}jJfpN=q%=QTUvvE^={SmHxv1egu^k(fkCPp6V9phTDM#@OO?-T7 zy?+^9(kz()w%CU+B@h+GLnxtD>?w#EF9nERTtzD4uzx@dB6fR$NJHJ^Y$W5<4<8Px zfhb@?0bD6g=e&8Jf6p{%8Fot3yYz33m*&Un%`gB)Q-QT|f&6t!lHZ-`;m5t8fvJc@ z7idL=#6(qJT05h9dUNCP>o`CG<~f5Z@nu)6%-AEo{J z{)I6vsaJrIHeV44LUIY18tRbox}RRt7!c3_8JsE~aqY6blIP97e1? zh~LFX?Ov@Ys(6q8?nsVM^1jbSW~03NQSyp4S!C;3aZ!T0L`IW@Na-mHU{{@T^e&X_ z{kG{A*7=2?e=9k+_WBc#0>pAiULdV`(Axt89?m?{*wHH&Qj-O#M>{-%sk z;|~Gz93Buw2Jiv1X{Fpf*cTbFKs%UooX)(|;}K2BoPd_`!6Z%NWyJ8~?Ofund>b!e zY{&GXyrpIT8}N>x%|MBBwB!hFMoAFdVOJGwOL5C(QV3PXBjK12yjN;oKAdX2Hm(IC zy&W88zV)b}n#QACUefjj=%WFO<}28)-qG&NeJV{S3QKz~AH*^cyR=c*S8xl^AbN95 z^=wBwn@Zb5Xt0Q$<+=-<;srCPivnn8R@U3A>3-;q9#)9~vMc+T_RW69_V7~YW!JLX z@7WUautQ*v#PcGyDVr`|x8Rup@CZ44yDV_#V*c~DeB09b8J@|das1-g1GaXY$}V@7#MMMk zjL^5d)}!WGu=zko3jE;%7})f_;~f;id0E(>vbFGg?s|fa;UkJ6+1D0<|5j2Nfb;UX z7pIS*80Qo(b9_xEh=VyYC5Z7c5aE@vYNnWR^Ctjn^AhqrKI>AJA z;Do|*S>~}raJX+<>M;8)ey*t1Oald1+?XYwoBhqEiO1o%i+9zjww}ZH+1C>4!QDqr z4fg;G4%h|PI^5<54$Rr!09zu1)2poH>Iq8=1MOZ_! zi5`)rr^I@dIT9)NM9DJ)y5j2$a%1IxV_^vKDS$Ug zdB%Dnc4u~DX--9M>ZQ2M=?V6{n?iue1)6K#NFU+&rbp>eBZ!CqeUgkm9yvCpaPWU8 z5O!X8Lnpmk>q^pq$Js&lf&QYGi6d}SKWc0t6atYDS8^og*6&w?Jdey$J?#gfW;B>k zj-ERwoN|XOAM=8kj#$`MIi55P;=d~ENSD#SboTTLuxj*W478#JK z$}m}&jt9+0EJNYCcbz`qiG_Rtl~fuK@E_C#`X&2hNAURb1eFdMv6%}{g9>FT$hom!PnlxCMslrlH}NaLIrFxw-Q@ynC^sts?s|F@%zw7 ztYi?$+Vc_$?lmv~-GxP3y^x$*!@3-Ap=rM55f>Ov6h)4{uA7R<8#mu@)#P>aSJX8} zCix=GMGjkb2e%d^rD5*N+_0dv?s;#m^ zZcr83qw+2dGI=zc%B6A7N10{2ooXN*VThHrx?7dL$i`nd1_Bq=pzp^Of$8b`M?MuB zn~tBD9ru(f-_yLBA6z#bfoJ})=>({BY`05yH2MB4X;C}0pAABGw=|AlnP5i8z(MbGO#05V9H_Sz3{D|EU1e?m_@lR)oc8yccdKBe;LSs z9aOYpq?_`JxgFhd@2i@ER^{qz_>#82sHy4oAMl0hV!%x$S zluhci-xAXc!LH>nUytmIoEP8xMSA07WXbMUp#Ng3@hzgmVMTKqBE!$R4tJ+3OUo2+ z{}ci%h=HqGo*ySDwC%7YI&u)QsPU3hqt7xT(;K@`?pLc>m@fkTT|k7lAiwsOo#XSr+=2;f^ z(`F^SM=Z#VRBScx%2qQE>z?VmdQig>3y|&kJVhzp<=v~l4QC5wz00qe>#~JBrDdin z2#XxK@bHCjCI!{UKRRR1CEe!<>QsWb&VJxGJJ)_1a0OOABoxaUw9HncRyk?W%NfdZ z8x8Z8>=bV{s5=+|^D3#Q6Gup&eOcEP`%DkF@Z5OB7rC}=Bpp!m@2pcU7S_PK78sLr zD^JFercFPoKiZ$qDxT;UKkqm8GrKt6qL0d5!kMi4!oxF>6+JBAq@#5^)%iY-=o+!d z59N6Y)F3pEBkh6*^>4rox87c>u|sA)CNZu9L65_8##vx<#)I8JJxzqdczkgEctyjtw8znzj# zV)v9G|5<=852O=xJd)KCED#0oq?07T%IZ}V> zHgyzL&6iw|^12)T8D3?CD!xCUR0o6ae~3=#cUuOW%!YXm4O5`jKZIoQGdseVQ$sF# zH>;ts%1NB}fJntgNr0NZTRL|Sup&v=RahTK>td4Lmv<6o;8`jHRlChW*&-3eJZH$mrR-)Cw176+p3t5jzHf6>(rR0bctijga@4{G~r z{icZ-%5})WqPL;FHwETc6f{Ie{1_4v|Wweq0Sarhq>MO8C8guT`E)K%J*rgEgS; z1VETAPR)a_jkg$+#^1vur0DaPhC~C$bC~)DxDq_yYmwr`9#xH2^TJEJ0W z3`ESlMAh0;Y06EBtg)uf=1`-kQ{H<(EGQ#6dQmedc}pQQ=uE9;H2fGVk?6D;V|WAB z+-n)X?Y^*d6HGy7`V*((mU~Vt>Sn9p?^gTdI2l$3ew>lLjJs%zy0dSQ2P)14V@V;z zRCxJXzl;B-ZN=}VpOrt1jF>Et?z440lZs4>d;B2L({D?y8~(TrfWjDhaP6BB+_P6D z|Fe7me-fWQl&R=jk~}__J$QjKV$ao%k#$Un%^dbOC%q=+eN~knMgecVfE3cFKvMOwbfl8!gdoISJ`is0c zZBJOXUTGS0?gf~r%f`+Z0TaVY+wCcX8maxk&7y0AD@|^*=T`5pMTBxhF1d!Vg2t;m zPCQKUE;sJ$M_y>$39Py$&Rdu{mkZ`>@Y6`D5|A`MX+j7VF)@it+W|Bz*Hu_4q@`XE z1rgXM_3%N#kxNvc{T}D$K!9^nI>CAi7S|VAbj3b+SnCCG13N)1Wudo0BB9_H>d+_a>R@ zfYjY!LV=DH#-4tnrpv|TU}Xhz-lqIV1J1l297$GELQsPe+Sf8TSC1r z@_@7g*80@@6ZB+tm@^p)VB+YXBQ|gc17$W9i>YL{_4d-fBNgh(XdAt{YRy4WH zl2?X#!oRVA4IM47B~^KP{z>8LK^yW)&&?pZ#5df2f0Ni-ws=N{nm#?g`M`N95b7vF z!hk09K~w_q>txrI>t-xw^I`&2(7lyCNi75 zcXb=t3Hem6>#^lsS{Fe0GnPjGqE6L`vICvJTQ+aI&*fB zwZ~`}pY7zihP&8wFt0aA1?w{i;TF-leyWhy%+#q)!d}}ylz0g&eX#KUgYU^gWoByh z+cYzmx=eU0p}f{m04Qqg>*g+SAkBCpMscE?aQd@d!^1QDb}6*@?^GR^2dC z&%G4dpeaG;u`~UcIP)dAR+Qb=YVX4roZ^F)NZe_Ersk&X`SK_#zhY?G4BrpW1S8`> z1x_r)M?NJvpmKl1@qKkF-s?kp`F)02M_fG0fT}g=?)J46YC6^Dp6mCG-AnbHqV9{r zV*Lf`UB8THyjoswVO@5mhEY&rnB(u*8man#cFgK>B>^%+s z>pR}&1QGuIh?ZnYRTsz0O&M+eix)jDRjg0YFm6MI|K5PaMoxMO4-=;cFN}X;GyJNR z#vdyI5f*9zvcI@k>!kle@Q%4?+l{2h&-3bxqbcCHOJLK=!j@>iv-|ull?y+M6y}bW zR{J5_?TY{u0~_wvJ$Qw}+y0R-a9o6Tkf}eufYNd@xw0d^80r2WPO8gKBJV7Q2%`7A7z8=`BACul9e-R^L-Cj z##jB&h$%J3BT-kLpRk&_wEnTTeyVA{(I>~Ivb*z*!vlNnPBy*b*aD&BDieGzfdTeX zPaJYtyHz~Yc$!!$csx!0!u%^Ds}VsN=cT`wqO^nw)afn?TQJ9>HG9fyMXZc{tS{^a znBxG!r;DNTq}$d6UM91BAM!Os1;?mE&<+y~)AsKxHot&08@u9rmF;Fj<8L=_FH7Wf z=AJgpaZn_>cy7=m7XkJ^G`)CWddEbL>s`%ux=wxe2Y->dJLTQ_yB3@ZFiR%l{KCqO ziO2!d7*$(5)%l4&GU+G~Vezi8PoL9RvuRE(_l^~79zZc^hp-(el!A)4YL z7wj@!;k2`RA9`?)F!to z;>)DW@YS~x&#>a?(UnS`fR=$@jHBipZ!(i-r)0efGp^?p!2HBfLM39clIM2!MH!Zz z)h6HN(%q>y!l2UPygB*c%WM4F5Ip^aL7+eNr9DM(_Gf`f3)QSYF<^@sH5U^+|BjMY zwzL1?r!R4sHK*V;+B^4$%zNl=8S^2!*eag2CF)UoN;vD#Fwk>e`|5FuAd66o^D5PO zx)A@fys*9+0lZjk@@o8?-`aL^rG zxfGC3NE_LN$|QW`=KS+V13NZv^K1>~o;R(aCS|<`boAt2XKW|izwJokQw6ozMZ!Yg zxXaJZ&3^i|@RT0Rm3{&oYPLVGGoGS71=Ul|p-mK=oxk=cWd6Jc*a_P6#MwYGL8TZ; zh1R^hM$R7sVR5s1s-PWLs1DP#l!KdT1bi<~c;0t=X6}>TNK4B0ihqGlknHW`gLn8$WO z>tcDQXc+cgnDg2`+_7p-2e4L;mlE;A1347G=LY@0W}_Aggg-TR-nMd?Gir?_0?zKMrv>WDci%cs!OXtLL$M98OBr}oAM zZl-Os+V0NZy5u$AyQdRgKd=!m-c9D;wq5JBUZE+2m@reV{N1VbS&nsO_zSt z#p#8p?`6{~!-X}rJdp+LoI=eTWml2}^y!MDn-1p!K>UgzvHfn*`js#IA^%!Qa$XGx zT+5h+^$ic(E8Q)fJ^dehjv}q?PreMQKJLytbcm@%jF*1UA5FUkdrWox*_nzjHSe>GSw8AcqBU_=))9&G6>~8UECQ?hNPir)jvsL8fLp z^nE$qjI$2WfQc6JA+bI>x;(I(HEp{$**YV&z z_d*iGEPtvVhi_aWwlQ5!hn}v0$H8g=3u)45@-`-DnjuaTqs*7~@>v@$QxpIW23#(A zB{SFE)JyL&RHcgzw_J87DAVb?BUD#eIU@}ABzAMAyTI48Hl$y#SL}VLuM73sun(`F zSo6|PTFPkNlj*p15pZP!KIGNzY+|}R*1j|8{;@yZga{Qj4Fb`jz(K7`Pj;!5H0nL{ zSci+f`G)VBk`;r!6Mry8&UYqyAirr@9Nx%8FhnfSaC!P$=h^3sT%?-2V!advW{04I zgCTL}iW+0QELl%6*Kf`_+OALquMCZ8?&=gztPWDfW%^HBQM3Nxv9~gKkHhk)*R8*+O5U${?_U6Or{`1TGolh<$r~(Ka#BzKZSD<^g72s2uJo~L zB@pjU93UHT2|d?J4)Z-5r`cZuU%D@V>elv)^Ty>e}Vfx7e7 zq(Q+8;dZ@q1mLEDev)*~v~QVe z&bDucYR=1ty<)feZ3~f6l;cUCs$&7y7!_=4WBkFO%cF%Dsr8f8P4g#&6HD_axI8+7 zj!szSeENNeCI>GQSS}Q^4JnxV%Lz)qi{X+!;=$$^6?^ODoBHd)@E{d>mq1E$bVXf@ zRI;O0imO7&^h+WZzOJ{lH7eXA%S84MAT2T~VMl4$o$740_j8>g1FS;XGhTFJE39(I zdrLaLbbLz9yUw_n2eUxa2PRRo$B))yuh z?$+f%eNWb}KPkU@Yr|H)D*?RAC75%|Eb%ZTStFz7Bw_CW;VN82ndj#G!~7`|e~V02 z+!HZFMBK}cTRkTf@h0%~IEL+2Dqu;NS^DN**UW?9C*ZF7jN3tEiqAiTucls9^%2hj zwlz9wbc_kq8d8Xbt0QaoA56FxN=~k*F5jk}J~6)5%oqDmN>5~@hKV@*80ZQ0ox*7Q3SkTwG=AI@MrnzVdh$rE zUs#Ok*(uK!y|t(_Qs~E7_PU1$oFUr1lg#7UV71j5f92yxNkZNCMaH8TRX##Vj{Y)$ znYXHK5yF8q3=0oOTwK`bJlBSVJyW@tB^a-F^9z^WaUZPofr&moBqBlNdJf-KlBRAP zq)sZdSi&@YCer}D!^2&je>@P&0b6NwFi>1?O1X7wy16kOc9xF}R_=??!BKjD+Wb^DB{c7ECZL3v_Pfw zQ6I%lToG8YsBUhHi+>Qq=*sue`8Ngaj%peeQAGLK!e4rL#3R$@dBlWe78ARIRSlNa2*zXc+v}0G=lF1vHh-_tl9|o zsg7%UcjkQgOCl^X*NfknQwuhN&V>W1nm_{|AJK1x52OXvwDg=fgsu97tI+ILbS3;( zd9Ozxm^9XhPiN11DEpncNO)!She@-g+bMwrXlI8^0 zwD|%I0t|8(XgHhPiUeB)zSUn0oRTCaLN86D1ofA}XeR!R7QfD6#uGr}|HsvH$5Z`& zpW8KV$haAmY*&TcBBR7bCA%oe$dxiewrsAEict2}CnK9|!nI{bGPAer?Dc!z7kxh8 z->W~m?s(qMInO!gIr~_^zC=zrt@6-qONPNqCyF%-st})b?O;3e?u(jE%Ofv~ww;0B z*OI1k@oUnLZb03@0dXziO~}7_iJWM5AQw2ZScjYY%>31hQ)bB)6Px|TTa(T!zWSE* z*zEJwqg(8V(?OjumY2FU_|_mF!;3I@FZE)=@$Dc>g*DYfyTci(8T^=e4=UO?6o0BT z*h+!GIFCgkTa+}1g70l9trzl6N|r|Qy1G|vBj@gG>8tqZ=W@19^vZSwWz-1`dp}-b zlPDMP9Mq<6n0(puWd@~r43|NUglvq#?fDY&&*3O=^~iG$MSi>#n`h>_8NU^nq;xSq zR8NdhI{?C9=M`Vr?|n;oqSE9^!FyO9a^T$o1b{-IC5sDLhdUJ6v)gA;=0AFeN%yN{ z#Fsvuc`^*4U5!8qB3~XhwWk2FNg$uBD=@J6FivgS5i1qBSaPbs>^_rl{I3U<@WrjU zhbbyfEfad434t@Cqk7${7jvq!P3^i?a_ z!2>YfFE3@eXE7|;k+8cX*xcZ?ta$iz)WCw1#)AZ}u_DmxN3Y*tUZ|zHtWepHpJ`hE zQ?e>-qe5D}N!YXKpk}QK0V?>0&8<5BT}2Ip9l7X<7;-K!MI|f0M@8RfVNt&4(syOc z^5iC}OpI3v7D!{a0^B)1ROh2I*+H@?El4&EpvB&Gt0DdRO@h9XQEZ6v3Fu*$P`C87 zQE0kjM^ki-hgMUxv#R?dR?KKsb zX`N&pA$@^!_A`AUU~(9C~V2ltoS(j7j2vj`RA@2 z)Zv1R2xl%`UyaW>EPz$G7MsSy`;~Kw4k`QZUgK`MmC-wAXzdiZEU_|}baTLr`^|3z z?F?Hu%QCP`u1!x)Rvx98hi}4@J!%4h)M=ncAgwiI^^T&!{&Z-U*{p9t>zJFYTRS-lrAb;wu-8Ky?)$0FyBM zXCGQio`sll%P+e9YT5^9f<8sGN_Z+r^OJXbW0=5?8UqO+PP?7Jx7&DQP~#Ga7cd6s zVYynWIKM&EcZaD(+~}Mqu6mfguIh9Oi2YKl$Efw1<_=nhO!m4JS-(08Qs%;wPh3T|rz_!3Q){hM<)|S>W1NxF zh~PnQ3yc8N#ms!=g;3)u!jf4JU_bxL`e!sE@&2KyEDxR@`2v7X8B7q|8hANqqg(mq z((&|QdP=i0GD@IW$;-k|FC$q zQtoT|k?tvN=@k{`dHyP7+>4Ss#cu)9*cY zGGJVwII!1Eul)E#S1lmo+*0dx8MBbXiW>P(W)IkiG)7wg&M{Y}-Oo|2@5;I)w$`aG z?uH78S#U(=PEzgXrj(v6RO^lS^WA`|7p3idZHIxZ%$)P#aKD*=QfN%7$YBSLZf*#? z#Iu`aZ(c!+qJErc7Q)=2OuNf|NP+WZVF43Xx>8UcFmL3s<5m`wcG6Z|xWfA~X|227 zW_o&yNL^~;eWrFV%HukB=9{&&|5(d5+TSW36Lrzx15JStZAy(aSelEbWzexftpTp3 z+J&G$>x9-4qP$0RnHK4m7l;uc+EUyYwY;!|Q<^qt>_K~Hft-g)Y;C-dxpps&ziQsApSh)hYaaRDbQsS|?` z_#&nf77qz3T|DvdJ5!1e?Ayt+(u_BU`Rm0udT$KN^V>DTqI*gn%YvqA<Lq=6gX<}X?MmF~^pLh96HB6_>nxM6Z= zJ?s(&&+-9`PdMYU-ThYLI@!8=bgp_BCg$#mtx9nl@tbCCqabh`0NVNbeL4Se_Id6F zjQT4$JqCmPubei&56eEz%h=u}%CMZ&2i4zL0^+XGL!^ZsYuUJaec%M$TAzumKblb> z2`4rmOd-Zj5mYV3c$|!Kwa*7dNVVRH>t8Nqa4ui{eAj zvhMY1xupd2<#?upZpMimch`eG{}`)xJbEVUO*>SC9};VQeNEeW0bu1nQM|LPSUQku zKu1F+UhzTM*M$xlH*Jvqxi>x45;#B8J2FJsb|>#jWW2fLGH13sB1yM1tR*kmnq4s5 zTc;e2+$qvFy~$nt!dUEY9b=~;d z=`2Y`-)}Vq0_}Eej}TL-2uKj?;_)@p7CD&y;DjR@_ehpcD;ys zapj~9pO-O%t4No5toRLkcZsj?_|$UNDc))FVH*eCMtS;0FAlWyB8&Hqv}rbj<`d^2 zkHtR!s?#iPj!bF=%Dqu9{;-!^`QzQiCI~oI1O_pcd7$!a4W$s}id_{vt@!V*Aa>3o zgQ>c#W*lVsUR=-r6`5JC5v^U#2aCTghfRf_nTcLuyZUsRNqbq=3+F-Y|0xz1mQRcp z!E6Ocg!&V?Q@3C!?JF&ep0lxHMIx1p-WkCfyZX2u{g^WzB&SZLxL&uTJr_W;;Sy_EW;+uz#AE%0^lyb4Iky3wcAg|p!g)-$$ z-nG!`b8hhKP}#S>>sj$(WApvb%VWwbH8%gWOd*V*m~kD~Vr_HRTM`gv0Bd!FyMr6c(^!;5W`AT%mYt_~P-APnEG@E2Jdyi_XIgpQz|6^UGEfR2~Fx zNviHo-tQvoLhr6=*;kKOcA#C3CrgNGtyjD(UGd&uUV3PHA#m_+3Xix_qYU>}TMfPJ zE^RmNMs`g8w&I%L^hYI&GbW9@^L;VKGiU$Q6eGMPUt1A!T3ev&4n5i6ZxT84U$F<+ zCG9Q#V@r`ZS}Uy0JHj4?!dj4{@K|CG`h<%^8)n7p3CFo8#D0^=Tq4n$Avt@#KuOpl zh{Z(O>;=XHJtB22e~d$7TUFLiI%6;X)4cZF+m*YM8JmhA7VZoDB4-rk>-pFfJM6xS z!TLR3wieOrlnvXDjd+en>+u~#f!T?GixawgKEW4rhGm|z!FHp%mFYNiN6fQZZvbNZ4Ng3KO-uvPU`MG%VYlZVm$gzxVYc>*l>9T&Ie9F=( zg^uCSp_laDddh+GBD>VvM)n(1*?gUpt%Z+mCb^r>`dKkaMG=x(tT@nH|9G~)6D+;V zLQ>oR|LBVoeHEwTYG!y{D-138oolvZ?J5#4D)DTW@y^pM_Dg{{zm2fnYb^8@*?#T# z;|>9Ki@GnhR=8eS<5A~w*p0im;HL1pqHBn{Tc|Y?^r~}nbM&jOM7jalO9GK(z>9&=c@KF;=f;=tfBjL1x}W~dxRz=0 z{BRH#iZs7nE=kK6j+t>%j$YBDSAMi~gL3czqsUmgl0}b2u}IXe-4L#V2xUkcgKSW! znzc?cI&COhH8N_wnDlNQ6`j3TysPyKTNP&tCXhQ|=~;y5tYT&ug~x>f!!X9+!St`E z!CS$eydj;$mdX=FJ!>v4R&JB9R?4R~n6v;OTyY7sZJ@cqfm)h^wlAEM@^tgvqjo9! zxML!j*|$nFbf%*G^m8@gO^Nu^&*fR7#O>R>&uvsqcX2Rzi{$SxcPDgqW)H54ws48c!>QXladk1})NIkzW%dpA8~f2)RigM}gQq>ZhuGlRssL@zgRbK@(R zsm=`XG>EQv>r0=eI0-N94mim~OFz;x;iNvrcInPw1up7^bx7qK9)!mk3oVv&7JGIq z+CRcgnOa;L0<%yRKQo#N^&|d3NlpqfZnpFvc)kmtoA{h2?7J51# z)J{+gf5Hx-##;RfE+fBVPc7xw&F@z&rX0?N9SEscT+}fa{>V^op%j=CW8M9~Bnxhd zD@+aWweO94B#uS;^KYKaCwsMLrDc{;zG3IRF)v8#rCj#8*#*%1Te%w|Jzjsj z8eh!Qd+x_yX_kIXgQ^MsH94~AVIqU=#nu)B3HIAev9aYkOQ25DtPZ53+k$j-90%>4 z=tYqgE2TX)klqx>Pl5Lw%~G5@F}x&H#xF#9@@`ULzdDu0l0~;NDMo%;YAd@y7b}#< zG2uo@VK_(fRASsv2ip>7dbZYRJ~{Tf(I%uQha&pV^X|nrztU2g``(K%*O@$x7oaiH z)QNd1#$n%rrg=R{@j+atcShh>F`4IO=3MzGw~naKp-OkL2vn&f;t#RU}y#jb_IBq9#Qv-4@54vnB4zxk~*oX;Ip-a}Nao6^`C=i}wF(aa-%T%{%7WB6hE5i~eidaj@sVRbHc zO;ciqe@m+mBp>b(($Jyg&cMd7w8dTE6}HQG9t7G<4rM8yTNT;#W_q1m;+l8b4X4=R zUE>C~xN{9FrB1!9l4P#neEKz6U3Lt0NZ&ulwTlWrR?4luZd9D(TY47YRl(>f$>8Z6 zW;M{)-7lnlRy*;%n@5!Hog-fW{1rDf{j0=?*1>I7%4Iugc;P-r|BC&DP5Rcn{mb-T zMRCf&b4Cn{yeCu~9^3HoDEYU1)`qRZQICS|Ucq_GTxj`UHwBPtQyA=6d~)Es5p$I<(Hh|TxoXiEh%bbj|48y+ z+wiT#P33RC7ausv`a}4)H=j|J z%P)FuocyJ8OGS$+>Wt_MHItR9FOvPVw1?h|{eimW@diT0DLiNPCguu2iM)x=u~spX zA$wa^XX93@5Cbi0l<=Y$lS-Rt5d6CLK&9@*X~&EvVH%>p$<$!HfofibI)9I#D%Vh8k!lpE~I)}RntjH;}d?H zeB(P`+4z={qvQEEt2!(@zE0iZ?o%gA)%(zaoK#-dW$_MvT&Q}2+breNQ|So5uW#Yk zkZ2D${T(cj#Wuo^nD3B}C4T##OC0|SVUj%~vNz%|8szVvG_a6^h6a#C_bNb*^)!H| z_a8xOB#9nl8(Ad=PD>?b+5fY(y82E-ngGAwBy-q|-{^M_J_-!{tSE}bLQ?8n$Ja41 zSS0aT!n#&i04bPu*}!GSYa?DHqWw#}_(J9-MJAcjQ9V#7i8G}s-2HjIFC{C_^p@Ks z^Ob6tml|=z9oTW&yTSj8IJ^U5$Vz&#hwaZJyHwFDo;s$bV`)7f;e};|1BH7k+8a-n zY(^Kr94PmNt7LT>uR3;$5UWAbcbmEdSJV{ zWC~x-6RD0yUapg@Extgy`?orspmc+#k!>5Nsq0t!%vqWHa{m*_s1xd22ET_9&GS%H zk45b~ttevg9E}sy6d#RI|hFL<&M5UY1m*u#Kw-s6~CAPl% zXSJ4{9ZdRisDzJ$?S7&e5^lA^8L;ir(6g{^6a;)ao&Vka^k|P^XZdHLE|#t_2BPmL z_Xb$+EhhYmlGsskmmv*WF)Sz?7RH-#a^7*yHWHh5cQz6A^K$sUPo+CXwQZuh>q*SU zw^?P;J(7CzLrAzh%W`o36q)T%?Cna6dSutfQ?C@qD3?t0<7L3i7Tq(cpgCh2DERlG zm7^#sa`fQ)ei`a1|JTM*rOo06x8pITStuW(brF5aeVzCJ7(paqo)0&lL`zLM&2Jer7*75#T^4szLqw065cRDtzmQ1}j zXs^$+B{MJEu6hS@2VEUdYlhIC$c66t$FumX>x;WDH7G)$u8u_v(e**YM};h?K8@ZYXN>Demy@C`GKUe9Uqf2z6v^v+&1XW>{HR# z)@V>#S=qs2ylY6Z(cSK7yhr?I4@GQ&($wSusmV=M)aju8Ud+|(MW$PJ10=)Y z9h_{YU3||dFO}QfC62cE^{Rg|Tr@asxiaT4Qxr73P{5|-*LROo^xTfrcxY(V;@p?_ zZXifJ!wk!;!%eEwe^CTj&i+u+H|gx-KzH-qS9|jn5xVF>O zbk*g{rTW*{7!fe}VJvaL`$6mHn&*f~QV}Odub@=)cbB)BF%{gU%lX4R|=O8O{T2kc2mv?r{ zAH4r$x7fKZ7*jF0=q|(A_}$AybRwOXhkPz2aAmxch}!8s#Mej$SY*+25nOa9w@ER@U+GW2~h^NqG5RTJupsH##h%iJ;X z7i61s&lL>xm{zf%emF0bEWDD2!iWtBbaz|Q+p(%m|J-lNTSC(lL8xSl}kJZjMM!HLYhW2e6cT^j7S&%sSz(P2iKm$ zntMrx+$RGxuom#8{mTvDeW>N4rguzC0G^wm`nI~6|M;R0MKEvRG5*&YiQ{!yy;qXh z-E_{dTy^I^%W}0n$;p~+s&f6@c9rPu*Poc$SNT9w&Iu@n2RsI{peps(-A#?kAHfA; zeJ@zi*Bxk?rKQ+`RE>8GoT1FtBmjxZ3dG!kI7yf0!g<$$G`PC18qExUEI%F zS4yD@lq_Ojz(dwLBZ`(fKs!aO7R=j;OING$2Q+8kKc@@5#50i@dK@V@eXJm$1Xptp zZd)c%B7G!pO>x+O&Q}VPaJUChN&R85*?9Y&lclwUbqpJ?n7MAHSnE4AkhQQ156Rj{ zEhB;4&jOt0S+czI3c+mya#jD+uI=!~95RIKKS1+)Mg&Wq5zvG!`DDbFkNBh;IQ}CD zbz#OFhhmh1-Kv+D5-z+u$XEm8g=pIj8`y$W)gOFK#aKfcEJbfyhE_`fUBiRJJ z{9(s}E?x&{b3hJ}+sg0DNomy>@~ydZ+s^vjLaw z&*Pf^A^iiOO+4K?wK#EL8U}+=!EKh%W1~TJdH8n14&(SCfU$-hkym#$U_qeR7<4>m zi#xuPs>&U=slNhU&;lP4fPxb?ip76CafN*e}UK*uEX@&8)n5bW4Z zcp463&16LNimZL|>W^`#uPOM5LK=!2fXogww=!rs3DQ*5jgDaDL|?=8Kcqb`XiH}K zRnS7Wvb`m2O%B@!UyLP&QB;C1rfuC#Ki|q>h2YSDz@H%?t;C>;@;^5KfiZDE;R@%$ zI121n{Xn{c_H@J)mD#%nPl%fIZ$VFIZ4(Ty$>hSw0*>^PKST!MMApcHww?@bTA$-J zx1JoBY3y@7AoGlAkT*BuIOr^Vk}xz1%p-*A%MvW*)+goPh)v1jO#uBogyn_@WNa!x zl|BcjN5IRF9h~Y z6SG~Z<-0>3H^Kwo^WdilIz~~$5$rN7_rb( zt|EIe=>pk%5V}Hc4;lK<9_!r5^E9S9Hy!@~oaivw=fi%22ShFk1D$?&K$g9h0X^y~ zxHrIb=s|weZ}f%?kWL7k9d)9=Y+X~8+xPA-nhNV6cSyYt%4Ul2+4-i*-KjA~#b0=l zyEBS$r;{fWloqV*Z?vSDL?JWty1#@t%BkL%NT~e%;>Z_Z$zo;<{0R1@4d=Ft2IKd` z=9n7^j$)v;M7kZdJ^qP_GrBZ=X2$RwbO345c+eDfv9=(w;sMi!$eAt|_O!w02=&YV zJtbcEV}V$?R~elMJC{9|@k-D3N5WdLK6bZ-X-v@{wG|=cdT+dJD{Os+E#Am|f_iD= zPc1!t$2nCy%`Pp@Qndql0}2Qx2wS`y>!|q5f4ASPUE=0;LZ%;EuYtC8u93{iaQ%8) zOWB7dIws}!gL?Rr2zfS75sc6T5vaO7Dq4FXpf_HVyG{Sn^v~0eT%otExXnR^9NtKv zh`8>w5gp(L z9JXjSB;DKUFd;UbM(OZ;DZImB#4lgb&GsT~Z-$9cYa(sI%g{3A!Shk8xqK2fzf@X` zB__61nEfQu-&D0{_9eTn2QdgVYLoYeRyjA!iQ_);%NgcWzVoK!emUqQ?ROjR{y(A< z)PTih*4*^cdZr%Grq5=7Y2ibqR#;YiPC|MhQbYJ!DP;JYD#=vtIvv9FVScWGYWPdaP-E=|`?)$T9k~bT z?m{7PviiV881>VqBr{1 z2Qw{cM}CRx=iR37*xllVI1>Mrtc^-COv}yl8}Z5)72^;k%=Y2aG+9A5jWc=YZ!MYK z;pq3_lF-*p5JM7VmE9;8xTi&H`W8|@`#dg_YiCqP%&2B7Id@wk0=98 z{n;=wh4&wUlFql9#)ag_pAPytt5+85;fo7H0n+B}Uf-f*gc?WwADCL~_zl6zc-YSQ z`UE(0Q?%RKQN|%?K;m21)RuNnp^`!AEUk`+DezW&!m2^7^FdEFY(G*5R#_TraI6&; zgUGpJ4cGH4JU?s+8sW9+x06#%@I{3+S|4OY{wsCSyhPVZt=+9OrXx+Kc@US6GYx~3 zC^@FwKF}{DwR6)E48|ICFnGzdx0o2a;Jp6Jd`d_jk3ooWx=D~GoppC5^=4W|=kE^s zi)W^&+pec6r@rOmFMU1Evb#Z=Qd%s%(=NR!nz-Kksczbo z-CHv?*Z0CK(*H^To1bX&`D%;<`T7N}sD%p!(>9Y!Yh=DQrK_8Be|F!k7j@M5Q&l7p%zWl%alJV=nDDJqTkE%M~SS>dLpZ;O8(Pk{pdskxU*)*9yiv}$PN0= zsU?6;cnbQZXrkkEP!{^$S$ei1Y*nmB2c?l7yEr>MNyi*Eg4y}W&wM}Iy!Aw-JpU6T zRiz7xX$EP#*!5F=VLd_HQ8{{Yg|-v<;KaJUkQ~%hJ7#ZZ9 zCt{8&6yko3`+YT<|dM}bo1O;~OE`{LZ%BaQ-_ zyH7XDZ#>f0$qqzDlOvbEQvAAvGmkaex&rgy+i)_kzTDHHXw#7 zz`#Fr#VaCnRKFl75&a)Xx|wn5oncBBqE)XY+t?)K$PcCh!A6AuX}Umj%G3&54Dfd? zkU7ReQO4+WC85{KU-z>6dN?gx6-2j9K9I58Cvd*tm=*tfPzC}l0?=fQFdIyyqzu&d z)I7~m3I7v5bv^jsc}n2^1D>VYesyz=Nph;ZIMaG38BnCGAVp~bfuoD~tO%3ma#Pmj zW)SxhvKiXUIkjJz#=vzfl2qX2Ip%IAVFdC8n1t4E#QyAH+TS5%-R6iJ;XuYo+)N5; zF^ayRK%bbS8CqM|2;bsWs8^gXN$cc5@cJA(j#l)ESsX<#j@;0HG^u6`K{7@L+!9Q5 zAO#vH1Mk0s1>@6K&^;6^@(7aAu8rq%ON3x9K|=(ca)%O>GdI?OZJq#V9GVtRt zm7ci%GeKAhBoM}dhzMxsws>Lj_ve)h)ionJSl^IIRVMMI-5!29vMf7n0kLw-F&$DW zL4t*Ns3Wb?X6e(~DY&(8N8jC&_Lp8?cee^sns-TKQ-p(d@`S=0m%Y8mwvbi>!hv42 zL*iA(6pX&B7M2gySqwe<$o(h>pidDr`Jp{tpJzH^2Sr6LAk;&Eo5TRN0p?xP4y7*D zI9Q2$K*QJwNP|Y1J*&N!c(FuYv`I8=#p{#2tH`OKVFYNO0cQT-P_a@?9+x#@l*N)p z7K?uK>)(Unj}1Q4g)LevHqnXOfR3qu8I#ao53L9L<2dEiPL(1MC>|W>HA|M~qo-R5 zIlbhYB3&&5*TaT@wSPm4gx42S*c#L{(MUF+BX{7Z07YWCdMZ2zfk|~(A1js*I-Eb8 zZGtg#-8RZu`u{qOkhFLPrIPgf@jf(iPw5#m2yrO=o5y0Mevwl>QMFfEs+4zswBh{L^{$x?Qql{~DO*9c z`CN-2LdOFJx+Od-PC(*g-CemJ`kT8hHIj*5dj(w)>L(#*z`AcjX$}Ku4Nd|L0syEr z=5Sl^l7;^XwzT76r&6^qUiLm^QAszG z#QW6=M`I{+tQ^K4X(HE5&SP)EwQ@V6U5T!|@D{>NH{h&{(%GqaDk%@59>wm>cG;^* zNE#FCBR>cL2sAzd0C~~G@mD>8UkkGqjBH9;i1)~Sqf%~%nkhnmWVvp|2mI(~cP{Kp zIPR}p{}w(;>T>UCXMI22w@xhz{&s;Uz7FKdDe+Gk- zQL|#OC77)zmaRWRF0QNF52c&Nn!=U%;+zN{nrFaDwklV?K8ev3d&n|}!hkhK5r3k? z0?v#Vy)XK6nb%T9iW(`|T2q!Pz-?5_e(r`S%`N}?{BJlk; z#Ae+sCAoi6idFiQz^|&{?G?N!&6%A{Rcx`-^6&IEqO4AP?{Zy_06^8z)K6Mx=oLNu zc0+z%yO{Z8M%Q`aglX1h;pNTRkm4rmMr|arSdKn>dHl#1Ab9zs{KTog;2y4k*4T{J zD5u(ZiNsm;J_K|Qk6@-$84hN}h&KcwM~b z&y>0H%jd3bdSh62^7{qa%0w@?-hE&{#Qome)$#+aXJQIg& zto%D`v=2{bHbuka7Ojr|GwY0T-c^C8O0nOP3NLjwiml~si0yZN>a3%$-@dl6vXee( zbuspP(W~*t&mL;GUydM}??;X&-Y1>Dl)bb*Sy9@z;Mx{pp((TdNJ+u4Guy%sw#nNt zsjT^H`O&CAqGGKOfQ|Rz(1fw@r3YoRgMy*7kJtbz089?#W6T%VRZL0a_qm;=Oti`Fg`?cqvDQqqzd|1D~KVaPWvdJ~|MWZpo zb#ir!A=OgJa&M)q#qoygtaG0#iX&bR%nWz-4}5V3m+=N6Y*wam&hbg5AYag|DA`!f z#n@Y>riv0itr0?}`v8Y#nc#LbpY`zFb%f5H743@am$y+=xFhksjb6kLf)#pK7&j5h z(vZqiZ+U!Oh1%1J-Q^9k2;z&}tnU#g zB3*fRoFA-;vW;(KbcwO%iW&j37{5wI)yYA1O7Yz4a;?@S(}rAk&_UbYZ_}*P)LwCSVZmW<^$mP=t|Vl3mH+X0)bADMW@klaiWXb2*%oT3&E$YxJL-+_{{0(BdIHiv#H|V?I0W-B_uxnD zaQ(h+F_sULw`?Dvy9%9Xeq~teE$FPqdtOu9%MQS;LrEQU)sxX4@7L1ya5J8k>Da8P&^ zX?Ej#gXTh+_IRILFF2H?&7=pY^I{eOlyE=LlRG&d7uIah{z*KDub;a)}_GEK4hDzIKR6tP#wLd9t3fE#GBvr>{w*zkR@H zM&1oS06VGv4im%G(;4QpS&_Ycy2VySYWL|F%c(btldYd5*8m*#RT6KazV1|UyvJ?m z|5*8=fV}`~Ue8`ld4k6~LjSNa3%CR=&CWoK4sOdpasIMp`TIL#dmQWRZ~9}$#1p{W z&t_FtBvmmA6<=#Qcr!{zA5+ka-rHk10h%@i zSPsLT!MiyhiX^U296#Q?oQ^z@r0|~?0}zOCc&~|0U-`EPqckKd+L$Pq!#o6570MUjRuf+b_cqWv(^#v1ndv^gaU$Roj5Z$duoZ26wdX`8 zT4**DVP7|6fWGiC+3a7Qz^f4dh&+btA%FTrs!y2urA_;!q$Col@2bI|Qvt|A@M5(3 zAz3Kl@?G_IcGmcR_Nb?`X9*F_v0<yuI?aWbAtM&77oG31)>PhS&FvoCKbZsxd9~5-;RW7DLRah1P z>Ot+=Wq2>ilMiMjddn9HM^_3H)+w<_w%Fd;9&5*`k)>&2Rv=cSz~z&YE#vW*8`MaS zI8Fh_GT>y>^!xTVp53AFKRr!pbA#As!Jn-%7Z zyBvZ*1UpnNQjzG(x;9DH*_6*6>$#A$6t%o-K`A2O5f0?myDF*+6r7ysGB+l$o_Rh@ zn~Iug6o<>X)n$GF*wAO#%LNywAImddHme?89qQsKZj}T;p5lDxgj~I{AKmPOm+D7I zgXfFfZ(BM-;RA#rftHx$@ztJsvOG!h_$of_EBSyjvAeK^Uk;ORZchxNludGVYhV!s z!m&cuABQ(zE8VfS@;M@sV>oAc@m59O-dvt?S)*)fBDB8wC75%DsdiUQwy%O5qr8gv z(Lzh)eKa z;mc-k9p3fs{kk`3wuvF~Ch!g}2DUj~?9lGy^YIPBhNki83A@m4)*BNHo_~X|;D$#K zFZ1}8xbW%Dh?4};Ds7P56+AdTb1@<=8p2&ybi!Iuq0oM%Gi8pb!eoDBMLG3rOP=D) zRadZ=3N)MU-lP&Gg#XW&zH+wty{&{D0&fD4)f0gISGIMt#KmTPlskX5 zn-y^Y92$pN(WFdr!D8J}^&bxJx={QR%}*>&*-1(SRSp}6iPe#xipUkts+ac;4>EsK zb%O9~bue?8pb`_ojA`ntJs2K;-K);z04&VD9cfy+I^P%k2BAndTLLe339;%DHu&Ap z>$sQzAppF)3y(h|A2&OwY`XvR zOsc{r;cc8K+3(_?iksu4D6XdAb8#o3Q_TX!FPsN>A!CwcEe~s3!vdV-(#4XJD=HWU zW~a*!C8R!#>0V`U-LFPL3XFLfjOT@YUpe=S^8JdpnrTJ^>cHB=Ob4Hbk&=XT(O!j& zDVhFAajSwfPSg|HGCg-ATZr}H0H34%+_e077ONsNnF}xp1S%tfdBA(i zI?Yo^Nk|^FNgnJ-ndlp0XJ)=m=9b|s>HhEGntQWxXaY5uU&Q6RcsXb%Zb4Ks(+~pD zUkpq`@c^aZ5z@HW!M$5~3)Nus@mGPWkk9Q=@W(F2r9vgw5_|o>1RukBAwFNiT|}Oa zq}UXev5Guo*`Ztr4c#^pFMA^{5(rlRe4HG-<#C+x6@$HZHftisAP9$e;g-$Yza!@q zqyLGmi1(bESOYYHeM;1G2o8W?ia)>`UV=jPn{KLo+~Hkjh;`K%&vU(?5)+7*f0!xu zT}$H8F8mE8{5Ev}F>Vv__2q0d_r=b&g*V)^J%>jcbu&)X-YLcGvY71XDPU9LI>`*l zh+sB2Q$1weZx2JqdKC$~U4=&kYuJh!Fox-z$ywonkg`_sK-#VIveIt&E5tt_6On*Z zH~a}Wq=i_Ory?aFVi_7fAtE@8!R5!My%3+W#L}GPHg_W8qGd&^56x#TP>TP=9sUp? zhKefp23FXVZw%4{Pa{4<4B>Dhtf>bncLiEsJr8d{#h;&V_7;*R`5*dZ-7q>t(?=u$ zz7eLxiUjlbR?<^M5o}1L%5y8n{9g|1a}Cv=cV3$U)_or7=WGhgr(w;~0@_{NqivnM zon;k)cSpx#4U2WQD*ElZN|m8CfQ3|aB%(e9{3lO0wYC0%fAZ1H=?7-eW*9F9@LxAv zrVqd&ASCJ|2F0AKs6cirJSt$^VQg3$iJW1dEbYI_Xf<## z=S67)I8Ce|F2j{-Y>?p-9XrPX7O~biF$~%v@d_sf`vNut6lriSJBt&k>87GK`&Id* zS2TG{I1Z%68+?YWz23ftyDWmoe$=q`K5Uum@Nfyz?koJt<>9q$mOmLmZxE%)YOz`A zszzY$^UOVF;WijpqeU4T>#7_T>qmbe+U?1l))q%pZY}e@GF`VN*rZq=H*E;4EL)%@ z@Ptnlt>t7mLvOTkng2G9lSOD7RIZJZpC{PkN2kHa7R_= zKX+#9me*r1xm-J(*jE*^YMmWt=egI7Z`r}tai4%^04BqK|A;awVD@%+;ce!o^B$^* z^PvZ*#l-bc#atBRcF>PJkZF_bS?M~%I=db`pRR-jp)XEaUQty&q)Nh1sMYiFWk_Uu zFW^|!QosznZv|-1H=AtRe*V(R17R~wGj6sw)>S^OWLyI{Qovh3FQC_sAD_K{tz6CM zG6CUXIrv{XgV*I&i}#{~-o(fxABrSA1@Yd9g!Ud?tpi;jYNd01p~OU`vh2xr(n~nu zhX=a^SPQ$!N`)+2n$UC{k2aH=cM!42^yPeUqRC-5AywI>u_piI=SRY~$00lpVR0od zCB#LjP7@?FF?NIsj~n8iZ!v`Q1qB`#RV6QTZVc*TGSaB7R3i z2~ULfrGu?3DSh~GbT$Vxif4i^-yJ6Bf1J78TOi&T8`f5k(0(Xiispss{8lNwnk|pC zgntNj`I<4+Ea3P+SVHd5r(()LFCq@gI#`UA7rI z#eqZ^kYO1}E@oD5a*;d`=4pWbb<{OxwDEe*qLuQ>63JUV zRX*Ipy;6kV`EjB{pX6&(=@dIW%Y7aZgg%qtd-SsdG)Tfy(`UdXwb=JNspCRWLdxYom zm~;HWO=PR5Nl>E>pPQvXl!v;Dv>RNkMOoDwOl^J@}q#K3Cqdoqa_{h1v+R*kRiYLWTio42XA z+W{mK7vmno$#Ti;;xdS92+#w{R)Zxm%iB%Q1V6I>4D5jG#GHWF>tWi?^?9r}jlgR_TG~`X8Q+aeO&yBH`vgj^Mg9C~3+y&G zyeN6U(_F162&N&Zr}$Xe!1YDD@jJ3H&$MK)B&w2tokNKNXJ-X4E=FT=%!W(SM|TI~ zJ(qaL2}edC0jw*L4EQS8-Dan!Gq~Cv2=vUJ{dIBfZsT=>=fE)nDDO&k7GLbn^*GZK zQ{cgt#1K3vN7N}IjdRj%PmY*-=%LKzIx+rS9N>xmJo+aCOIT1AJ}|T4klKh~RdA+T z5V;H@#&Ff(1}9L{nCAjT=+=I6`R-&F1mik1rCn0965wc~Oa7y+P zlC^A!Ns%-d%xQ77ShBC9A|XqbkzK2O$f8DqoAz`dEQ&vWH{b>i1I*E?a1 zO$U~(1cLW4#{-TgyNOVZ>E+%x!hP*Eq4S!T#2Vgzkk1c;&u?d zt-n|O^FV|iC1u=R?Dw-`8rb)`$v`k!Nq)-1&46CF?`rVWyZL3IT5yHm9{51di<#%F z{(S|n%{Ei#nnUqiN7t{tAMuJ22J7u$q&Rg8$GV}NOMx47bYcp$=oL;ZRo2BGeYv;M z510Sgt{jiUp9apHCfk0uGi8O*&qet`J&4aW;TS&_Rac`ZB^t9^zy=#w)6439wf}`U z$-{r~1yuR;4ag!lLjH^Gk58~Y%fAAXV0Am|r#NC+0QIJ9UxWU^wK%ITCsJgl}t#Mxw ztehU+e~cDp`8_{m)vru0_$S=a(kL7`tLEaE`Z?m+#B6Hhp@5xBU=)8jVBzg~hUi3w z-5KASc8VxU9V!Spj%~llGGxMbW13uNo%|;N0d!fLM-F@UICn>OQnI8fR6QOos?R(O zVBq7s{olk6^hMOtZ&#dHE~m{8_4#Szam)GsXRSkyP;Jt?37AUI=mchvt-ZBbXCK?_ zFW3dL(0XZ3O3~Qtvd*iyk@Y);OC+{tsETp*dGEkwIBYvg$_|9b-O$7gj>kqU+vl^B2WvH%) z&8hVU>=o(A0$0A;*OcV}RXjz+Pq^q9pB-}*Son0^dW^j4&%O{Ekd_0AajFb@9=)YK zdB+`ncaHBRt)Fw4u&R5;pr_JT18Y!rQgv@XN`+X5uccAfQ)H)nzP6Sr7rLfEZc0`k zabh!Y@NoJt9mSTnr__d?S@)*)4;%FyMf*`3Z&D3(bZw0XcG#FncHTZ#h3h47q2tN( zFSJ{z%a;kH)xe4lA8f#cx0|kyjo_q&(|KKa7}zbEf&0TSfod8<2{Fh{w=u812MEbE zpZCYj2Cg-CMIFQ3(u5nHxvlZ8`)0Z+xl4-R_j(o})Pju!E5>I5T1ty2V`msirTv_L z2--XKF;UkE#!jnhrpktRSLMcry;vx^CB|o#z?HKQ>W3N)uohmzW+PA`vHc4dCJEDO zq#xhq_bmC z-GghREz)TnS%QH}an|oj_B85!2>WdJQ*kt=?!%gi8!9(oJRz)-((YH`iJj$$7mxC^ z!`5X5rMn2|it(M9xIFdo=}>L~N1s^KSzd|hnBBL_@Jq(EAzq)ROVWq^v|F3!dA>>W=GldEVExJ(xLGB_c3P0 z(AvT0j2X5cJ4HK1qw2DKLhM&_lpe$)4~GpHJMCtR5jcHW(-da-E4|;0ZASc!dQkxH zb~3kIxIwC5`n(rW<4Vgy2zMF7eS~|Avwbv@!gPtJ+VyFt@tU1Ul4QJt?=WuvC3piG zUet#3B;Xc$hZ7d6y@}u6AO8;7L7tv7Az;zNv-?%8@WOn%F_Y<@0T0PW&4%>M#X?ZA z(w9#14fhAP`PHHkjO#v6$kN&&F|?|7_fy(tiaerU;zn+>bC@1A$7V#;4cggOU3*$b z54e?8l2(6^qZGr+7*g-DSPyzi9mP+Q{)yt@4p(IRwp!w79d0(~n8zU3p{@%8vP{Uu zng!L4>)%J#^DMv1zEe)F59d^T5KEu!vQ8rjTA%$Xvm3O9)-#7TC?o&oTtXtCg3t>& zA^J(!!$(@9aswtkH1=+Ndrlq}#Axw#( zB@iqjp!Qdua#}z#W|!hFQ9*uzrb=Ud5a<XC`*JoA=8RdL=Zr~?g zs;%PgtPc6csqx+QX(t!9Eq@-Eud}C-(2imuT;b0`jM~PU*Kbc1whve+J)u&0tJfB9 zAyYt+J9QB5{%2f*f?Fwj9X53|LC`c17F&A@bBntlF1DETIBMs#{?tJGT}RX%B|Z%4 za?wX2yYrFGr-ul8Ec%>x_Dw4kAV%a#HL-R1Yfs`%Jx5Bo)@Scn@-p&othEc_Qy+N) zC`eJB4h*ZIY2Yu~2zcON@z+6`cQFc45ivfm!Mu*l3((%~^R=46S9cAM#LIGCc*xQa za4aVzyQ|oH=1K=MJJd~Q-j2Uc@&51F> zS_#uUZY898iCHlHGbFIIP=Dd=p$@HAL*JX@^5XUrGTJoo$rD+rg{z+HsqrM1en;yz5QP>_s|2 zSkGka5FmLgggiRHKi#apRWoeIVyvg967yOAkehZNPpYAapuiA}K$-`-MLT)Y@@p*U zxGMuE-Ck$A;6Gydp1I)9r&5>ERmK#;F{!F@`K24lI3&2E3Z!yvZ(g-A=K4xxuG#q zo4RG1sZ?1@06pOBU5$h*+wLjukHusZTq1g-CyDp$tO)=EFL;fF7fE6icNNZ7CXnqI z>3e%c;v^7G-k7zt`AWCiHSGHJ`Je_3#IFt^NNU>8ittrVi2l?ZNV}cj_}85Y@AUk+ zuXV{LH7^z~PcXF61L2El)OM%)JY>G6{)Dj_GvcW=NDw{vVO;fli{Mxo2z<+Zv_nR9 zw;1C-*tAJojNWPG^=0dVMl8O zwTPH%#C2DsMvP08njGdy%|mSao3dPq`~eT4hohe;ev$9*p(K-MYEcGeqdn{?JUk$C zNfs1nrndXd^|%|*I3nOtp5yWiVqQDD4g;Gf9Ydp3d`X&oe0$~esFKED@-LsL_8d`5 z(gsg{`RB8kUCmnP)sKcpaCG|7bp5|}-4Tzfs~C2NQ_A0hT=5*mh?!NWanoaLMaIW2 z2?Sc1lh2Y_WS7m%19OuDBntr;O=TKXwrCotmnv^ORRKFeb1iqMugP|sPqRq79sU`F z4Q+S%;f}92V=xxfJA-d6_t{y1ej{qu)RhlI10+UFa#_oX4r)Qpm9+ZZ>fmD21VWo{$D%CL&hwNGreHZh*kLl^?gfs$;u*O$ zoW{nJCK4NP1*_;h#{nff(t-jMGI!IDI!4Mw?#Vhd?9s^=i;feQCx$yF2n#3qo`%*Z zbGnV-)}G8wXBVi7uKS0tsIb1<|*+2BM;gPFC1ESqoU^|D^(Wp~cKtl6y(LN+#vlpU&EZ=!PSc?of)K=QZ zbBkx7HVC6B9_{Tt-1l_tq=sNndDfeMrMm?)%bpbVgRu6KUX(se5P-KjGI23*&l+oZlreff_cJ9&3wXb0|HdXTnw-(Wz#hCimdT+k$J z&4lRvqT=i7Yt9Q1^)BpaILz3J?Enk-XTb_;TQSB421@g5vr4@uLl(UD`k$U7pp)87 zUzSO9rtjIFsdK%bcyEy;Vbz-9!Nr>xdqX7S!|yQ5-KvL>0|Ewoq2n;P{wLx+$$!*& zgBE_|<>oK+IkgLQ#B1yV-L|`0w5oY&QLJEi!8%UxVlDzt*9h58OSuRdZ5G~H{AxNN z|8AW4fQz3X^x>EA8*LTngRf%}(jENiFTK9j(Z=fVE?6EO|6qEn8w$^C-Z%X=gz!@N zvo?xf?FoW`EB|^o+f4pu@{p9@96RVvukXk?@*6u@|MB_(HU=zAnd^9t!(Uhdm9O82BYd=(y4U){$MP1#?rprU_*&^|)> zVPSor;!Q5-h%a#V`V9?=+?WFwe`9^HFt1inpev-T+3}3pvg+SUf>*hT!a?{#7?E-E zi(0ERra6Tkqp77%5K5G8Xf-KvA*L_vX(c&+=K2okcDCmb}N0Fd=2-S2M$Cu9fDK zkXSi<*S}&_NQc@}hvb#i5C1jV5VBZx4an7*>UbpUCNE(0?8YF`eHC10kIzRLTOD;e z|Nfe3)`MTE)y}<9Y^?KMyoZ3n#Q_EJcxe~tT&_Tzj1y+2`=`g=dVuz>IFSu>{6i=S zf-iIK+wt%x=GEg)rT5TMxE!ruFnwJi$s1iCs?32AEI!wJI3R9$=BhjLhH%odF0_RNmTJm%bRt&meMJmB7E z(79lLF1zWalD5ARW(ilMC;+ocya)Pv!owrRrUon2d++Y;oZ)ZWni#%1rG zM{w^K`H+S2yfK-^pCZ5myk*Sv_omg&s)~NgcrRoeT7QkhM}B09e18g{2wPe-+T?Y# z?9nEMiS1VHEU}Ktaw`Ao=L5#7u_;tNtJI|`^cBJ(CTnvcJeBhLSl!I6&nibAS5kV) zqzMXTYkeL-cPzMx_=(C|lr-stjz#h8z%xyDJ&vJ~D*OmpuNk03?Bsm|erc^+cOkK= z@V z!+KMZBpXO&Hj&&(egGSN1n4ut*nHBU&(pWIDThJkfk`f2iFpN!3VVJnFXdCvi&nRH zOmG{ZbnFPjAomkEWPg?_twC3r{*jmdt8jdl!S-@!}Y_j7Dy)KQP%O|E4wX z^EJH;+YFSJakHJ^0z{Eh09d20*U5H2A3$W-xUXT((hx7GPb_@Wh-M;U9xQR$wr{St zd}`oKC<4%H^1GKOv^6y*4#Ol;mudYFlcv=Ik-wprkm4ANm}66+rtHpR&$QLw6~cvD zD~5J-@z{C~$7L5-Rtcx)W|tc~^|BxAH*&%wZY(Ihw09+|+P@4+A3H#%&iWs(2_s1lMj|7u7lI+EL2x<5*CS!#LH&7Y#22TtCqfSeD<0%6QA_QSnd8 z6wUf(l1s9^M>d+?7zy52P_F^U17%RS*`@m$wth3>h>T-V^q=GVIEmWTe6K$%ok3IoS%J?ijHSx*P!WWEIaaUG=8K%`*mJ1fP3TXaZQ09XYmteIQbLW^l_gy zw9F4zK2LDtYQ>@7x%sbh3$1b@p3JpeM@lcJsGyWaBzjM!|yWq-6g7Z;M?Ud2l7vUpy} zLsS`vj*w*qc=n8+N7f65mcTVvnKHX`59R|BsqwK+swYp(zSp6HAnQ=TTfDf!$`m)9 zI_sh@Mne&(ndAQP+OJYTioQu1MbEoW;9n{q32rVFC#Jk|v;C&MC+5KxOboBrq5ao` z$5Tt6^TIp%Cs*Ss$oZ+$dm*-8k);!UBK+(*+bM95p@^!`eDEdvC2uVEFK-i`Dzez_ zMOUTfkY9ocpmDj*CEAzXBWm;UufFaFNyg)6l6>rEcAM}1t$EN3Av2Mf4T6!e`TiF~ z;J*_y6dsIgE?f;%QzIysnIW@)TS8c5%-Uuf9^|vz%TwsP`)XiF<+1jk#yNr*60cX) z>6ezm5B~WZ)Sw0I)1cc4x|t9S>A&?$A^D)`|tZ`z1V4xF+t?X^8(+`ZcEfNes2s zwD>-hM*a|dwHm{_*_8Vgy16y?Hgent_5heZnj^uDxe?at~M2rg;o4 zUF=8W-0KSF){yjj_cHNI-cvLCfD{KLI@g4n5@II>hqG>1uFGp_*$)Etg}cl|4Tty! zzwh^jwm|;*9uKcxdp}AjroAt~C}izSU0&fO@b5tDYkbsH>nNXH-wD}{vl%FR zmlfn8=Ew^kV#B+p;n?5A>zmi`pm0yu!|6kzx1T0L=S0+E4>;=_A&JyEv&bdo!_An2N zU{SGX(v+db^>!p5XWgo!Q29>7qX?%OcKkN~A>lQL!h7*@_9FA7tnyRqAnU;*`nU2I zL@%7QzNTCpI>Yh+^^ZBgY=QCD@^w&DDG4OHTh6WF))NG9XtvLqw$H7A>$S|Fp}JHY zRQfCP`tLw`=02Dl^W?XzHeS@Pa(2B3%Jo?5l;~EK@)2|u@N$$b%!9(;%~HO{H~M(k z_Vw>J(^@z7TOXYBetyZqw(LG=6>=+c`A=s#*sZAKR)(>L-qhsT`WqKC2-(;2eSVq0 zk>CoEQPw9-kGp5J_Ye>N{<9*E{26rt;;rE&w3(EjycfFx3*Z9rcl6p6U#q3lE-E<4 z#{t3JT`QXPSV_L0T%wQ z-oe`rUyS|0BP83Y@?(H%GS0OR1`)^kFQ$YpZ7TBi-77Sp!RN?OBRw3cB4jp73Rxlj z4rPR%ss;65=!~<2uc$a zDiPX_c1OdCHGa<>r9s4E;{?>1cC1$QZXNf0JOJn9}6rB>Vio02|8r+i2 zpNKOC&1-7hzj2Fo%t^RNuMO*b4|#Y2c*wP?r2dVtUd6n=EB({6{9=!mr!bq+vTw~6 z{ki0h;IFtAXh=**yz|7>AW+fVrT8fTE=o1LVQ(BLfb=-ss3IRbPye2bD%yfs)4hI$ z%~C5xI@pIfB#1q6;o@^-}r>}RzTrBb%N?-0z20FY?i9=Q3P4&Ez<&6FlYBBrJCc~Xw>iDecZ`d z0Eti7+4})&dB@)7oqFkp#f1$v_G9VJ)VHeF#+6!Uva;PTN?HD*EGcu056FLg^*z^m z{%c+3^pXcCl@@kgC6`~1NHejtrM2q;s0fwHRrco<*I(i+1^JmUI}lyif|5FDl~SUD zpEo?KiE$Z)^R0wHLp{P2GZ)+W9WdiWT*B@0Jr*!{YgR4NuN1-z8h{MeNa5yLL3cGl zEVJWGCM2r#2juQ!V-MWk`aKlKCE|AOc-*h=1e}Ks0&_IHZyJyOn<#n6VQNK!;G5DK zxZCSKzuFN@zTE6|`A9%iTHY>Dn4HKyug8+&zbc6-<0gu(>kIdE=-)RsZ~S=w%}_$v znqb>mUT2byGPYD5i9D%&*DA*wW>Gqe{eXMqeWdl-!RZaHc9R>$e6zs{$Jss(eRy5) zYT%alb-m@`gTHF%{njGr!SH~BdBEUD_fn!c=Fq5F0|_Y*6g@cNv3c~LB2YSiAFn~ljLJyr@t{v%Sub~pJb(H=Q`S^ zRpMx{$zulqpJ=~c2KmtJ4$9+aGJHTcdpKnO{Aj0V?8tR}@AdA&eM1L(VG3_TXU^=p zx@7BUrzs@im?R6`s%t9zH>Vsphd%a$W{?%v?Q7Jdhf_uwz`IZ$aiD(aoWo{D&DIru zS~T()!{M@meUlSA`*NmJGO|Okk{G~px`qB+iWW{Qi2;KXMY3#V5(*Cx3vB-!r^Iso z@(T6A>^dRLyGC4@A?g6LGmruG&iT{DqKMI}?7U(S$q**-dZGH-o?ma+f_cUs!D{Ss z@(|yx>%%0)Df}Tacn=!3EUV% z5fsZJ6F~dlPN3*d1RT@ELD^m(9>BJFUEv(Y-?etFO+BGViB(M7+E`WIud7N zfGu&1%Z{eZjtAZDkz=<`uZ&L^d(Z_ebF9kL|mSc_jroJ~Jfl8yf(sQ$axX zj5_1m`+?7tjW6)sWe%z6?<5H#EJrbh_0b`#Hw3B3_(-_IqV=Z;YdtWE0_bDF_+G!U z8R`)Oz2xl=O*Y?%;pBNGy{Q~dQ6Og)R|HnVwJvy95$|KZEpZ4Y1u^U8&L9bK0p59@ z%_qf~vsw5JCd+<<^o|NOU6b9cdMJ?l?dds;gw(H3)5T!Hh=gFp#3R@AfvbAEer&+e zAR3*2f5j~A;U<{Zu+JPK7DCSfk`Yv=4wz#N*IdNzulnTrR2R0hC*tEB(tPv6M~g$t(%F%9@lkpWlO<@6zqw?+Yi}Rz^?cG( zF=+iYxf7HK+^IRCJm&5J-;bQYXWl!*%`z`c8Shod5;wFTv#=YYo5Bxjf2udGi8AIj zh&{`TYAf7Vir#9q{#LZ*z~WhDu3$>OWsY9+Y;(C#e;ENZsN*GXjQFY4`;JUFl7A(S z&?nx|X1`SFf>{)V4-G|W<15ff#;|j@ddo*1^k|)9DyFS6D&*)sk1Eo3K~&rNN^pf2 z`)NG~p|hGInttElxJmcGFDwB3Z8uUDUQk-}StDlq^Wo!{F z*3#BUysv1`Gpu@R9rP*_cGmbaDXUp&R{t$--6VccI0!p5^S0%(hU`*LBXT%k{Ec@R z_Jc1&{7u0OKzXY6to~|g$%y50u@=%Gwsu0jEW76mYYG6cyFieV@*_b+({K)#O@xu< zMKD=BE}bwy&;loFbTSpAfA%ul7OePFv#~t9RbBWE z3+)pD4&h+?a}|)4W`$P&c@qdHG0cu}@#L)<2PTtVHNuPKw(5oLyk&2v86@U?Xs<*@ zF_5cTE;OiiDbCZ(p@k|53ZOIjt@rNR2hpA054%E7xz4ecg4U7G0iRrSo~=y`G5V2x zir%)b_m<_+<;J8$h5o>?MRz!;$4j&G%wi=OR!c1eg>L1-4ncT$Nv;noifcITWou^RZwl)6&D@`S5}}Gz3zw z&TR)ApSrTep(8wru|K%qg>bZ=N4)rtyh7_+ITa5)+c85-$!;Ds#j>S~nzV$PZ>tp0 zi@=hOOaB#GZ^OF+o1|fvd`$3G-F68Aq|5h%Y>BwVB`9{*yRr%1mk$KgFDDXvGUQ?J z^JEfK*X!`P_I2=)__-c>S41fsJpd4onOut+WW!7(gILRT*FWtL9l-W>qaz8{d>#5b z9|2m%<>+jatOQs_?Qe_Ncv1h2-StNHjvq5hjosyoJGMzQZ_S|Z;HJvyX#f*?EaepH zZrnCD9!Ivpa_u>vXO}|B(t@A~k+`KE zx^E#?65U@l9fOmI@2a(*eS?L3SGz6H`UP#Kr&o>2?<8UKD#`oq48Py;Lmc4djUUp& z8+dkJY;-bzAKJg_tb8eg{hQO+|aSBo0#wZ{02Xfplr=(c!2^BpZE-5Yf73@Ejdq<|I8~PS54k`(Q3O= zXAD3(^tS~HgyF=t>Y`Q_I)j8Z%w&keXSSIt{RLNtv<3Tm`?J+`qQ0^HgHv*61wPQH z2n}F88K#>%Ht>6G)`WxFxw$a9uz&6?569<=*7K`=|CGv|8%m%vEqd)CBK3Z;QKPdD zUgeMNj}eIX5$^qCCV=HzFV=3F8dT^+q1Ay#h#&FNEP7)!P! zj6FTZCnMgxb^9QUrSQe|pUU};c^91quwU~gR&tDo7_3&8TtvpK8*yn}q7^dy3$<67 zJ`9=JnZS8$;Chga>D+Qk^emlmZf7~(+`}#=M3JY@DQ<}T?03nHj~kn}Ya^ zBb(V~QR;PtFEp0PM|)ne)c|}HNck(cuWnGB!C)w8F6{R?GTc`gvOLeIl3ssTA#d9H zZA8t_AX7UB-x)mJHA0NjW;L0?K^3?#fy?q{p_M))%Bs-xtDW84sR8HTE9XDmaJs)r zF7PkmY<{9e35ady3|&HB>TkQ2936Hn<%@9)CP}|ZsW8xTlKv5eSfu|Y59!O3deDz) zdwEP+u@)iR*htORJ|&7@jg9qm6zl(FC*!MiIN*OX7U{|?!^+5&=4QPBhH;nE=SV8g zYPg~M}njgwdDpIQ=)c-epjEfK?P~$se7|QW~+X@V2;_@lbNaG$Dz#K*J7eF zIMejtNgxm~5+1VNmhrM&*yX&g%%eZN79=gF9QJ7wCkDG~y~I`p2}MbZ=Uy$I+pZeM zj!hRfT$_zzD>7TZ^!|-$q!08_d!d?^ONo*n4MK~jg&3Z`g&2?wxKQOJws7r+!%sgK z-WGa3agm+l^WHn8!NP`i%14@1IxFh{UfTgP%!Dst+!N|9gC)edBYJDL9!u1 z(@5R9uSTvgHl`TAxrD%z|Dx$35R=<0&i{8rE-@u^6@pDg?uv$Mt|Xp{*5BqsNp7qa zuvOCNYS-*ZYTTL*QqQEudh2cV5f}dV2|OnlQhW3$jB7&lE^Rw;C|0sR*RDzcea%5Q zs?krqf66YBE(C|hcjCo=G%xUd&MQb|=@N8uQ&?0WVe!jS&4iZCUuGA7K$CTsryfGE z;5_GE<|ElU?}u4zK*4t)e8E`i=G8$jgd7ooJSl4=60_5g_^v^7CQ;2wMzJE}z=6`- zGs54ET@W(SB>im_0;Cn^UK@4RJ4g8eaan+r9PjCXUGqt6KT!qRMZS+A)%Y)=dx#@> zxq7M&Y2+m`Kk5lmL)AK(B)}2L^$&Z{RO=G3k4b0VD&G#+q1J44WQYY5M;Ijuo14~kH_bTh0 zRU9+_HpvmA7ul!u+O=+op&KL~#5zW_c~XqTnF19A(^%@b=UfvxI>=CKByf3Fy3QeS zl5X@tUE4KQvBZJ0U>FKU5!TfeLbmDby{X~6iwTbEE z3-PuYjtl=F9zh<%vQU%UFL3Fq*DpNkwW-K@a|M@aCZR%qE`0fkkC#J?qZln=@=?NB zuB0IINH20=P_xlt0h_r%J0*LD{qV3`TKyHy3#nT$HXz$j$m@Ql_^*QY9nFw{{_n;J z`+>x!QG@W;aK($~zgOQcg-kYEurbshy(K8W1>%b4Hgw(|?`JnXj3zsHd*glD(PDMi zVjKO2i1)hJzEV1*DxcahGJ*Kh9{Ce15Od#JwEP`P z(g(7Kl7gbna?>oss@>4ou`K)Q&~5w|Uxzw6+sxz~%K8pK@As1bHr5w*b)IK^7FhR` zfK3lM+#AJm4)CIR#LCpQTp~yzeco3RjC}j7RoOWn@Y(^>coy~>mqj=|fCdi~A6+6b z)S}OFhs(m3a_nHjF6_GDujhTMOZ7N~SeThJbWib_LBH&PVux{ zuy`;b73KJKe-=p*DquL+Rnr$d-2{u8H@7*6ATnT4;ao}g%*DuMUr+8+`YCb_`%e@# zjqBJ6OaP>~^|_qD!BVGs!3-el`w$^)Qvbd|z7b)V#7;Ep>*d_WuW9F%; z$R^Le5_IciGZ|!>RksI0*$sl-+}Gs;z6#&}Rsvb)JGfcz#!)bzcwa%=PJT-S6bluI zZPnyx);WHjAAZMAjr9OWWMo56A2ZkcthQTI3_9YmjSp#%@g8%IZT(`Y#po0q<`xd(-$| zTa3og`}+oqPUT->o_I>8-PwGK? zNqxm3Am)oPW5Vc|n~&IqyFjlYI`-xJaLX7-=A)V%rN31ww7!;IUZ-Y$*T(9V9L`uX zr&nNufD8Nk{ert5^nCk{=hEBh%c^OAg&wHBnSh(m<$2f8m)e_M*+YVNJ=5>=7Z%^7 z^8AOO7{lEd3z^m**L|_BKKIfj=7(ikd(A-$;pE19_hjca)c6d=DWedjqL7kIwQm^Q zgo;>Si@DGHN(C%JLC@v+GE?c3AVaEAOn~lFX7>*xSsBfoK$WK7)0NOduRq@nef?`k z#CCurTZqK)QHt~lj(;`k3CIo*a(-a}D5vMbgDP%mK!fUoI2fZ`I=P0e*;d&(O;qWqjj^mx`j#6eLeD)R((qOa45NzJnQIX;3m(q@$ocjtGulRncZR5h)60 zlLL%}ICd1`dsH|#>L0N;hC)x0v+8x$5}1{%jvuZKcS7Ee-~4Z@|$>UM(*7^yAOSK#fWuA}0wbOCaiB1G|bA_L=MbSKx)L z?El2v9zuOU(^#riDKt!J!Mg)+{JA73_4;Bh;ZkJD`E`!w^8N|Gx}ymRt2)dC=0rnW zJ4L;ecJr=TDOg+eM*G~)hZ~+9&@6zH>64Fg)P1|o;If>{E=jds?jh^UZ_GM=0G??7 z^$9RrIxdsp_UGk8erlDoG-?Y*4)`Lz@|iME4|Z2Y-QWYFE%<3Hm$(4x;&c7J^25%A zo17E{hR$k}e4a^9?K|x{v8b@dNZXXL*m#vA*_ka_nZp8aOkCD|a{UUj(%N`p4SebAP#Fbj^WL3^MLoi!w+`1b6+MRik1TXwJJ{+twC?0df@Udlk zEiE&R>Z~aGjk!!p^veFRDUba6ftjF*hq#VyNS6KESXvr(kEi(V+xW>NsKkglP z-M_e@NcD|+i};@8M4}}NYpQ{lBt@Xf#NB2m=nlZcEZO@SV0omtcmrfL^tlYm~ z_7Qs3O=X>fIddi<7yOR#-4^^Yi6UJmQDEM(ME(5gWC#HIk4zxX)?qHfH%j_ev*S)? ziB@zw)$62Q#Mu-fvi>#|L*q-MJc>Y4BTYa+BWBdbrD}qJr=J>IjTn44OG zfgel>fmc(rI<*MxK+1vGj+f(izh$W;1r;Sd{?Xl^w{{63#`lETaE2_=hU*U!hMn&l z_x%Ycm}ob;JBg8CIMNq)!pr|1-SJO$I=UIJYO+IRmf)hzbM40gpPgzb&- z2I=%?*=$hLMlX?Sx*@>lW@F%SKW`)FLl_Gl;hxb(160y1Y}z;EzQx$)_LZi=Q&<_VjmklS6(Ufm$6;y(!0{i{%e1{4^XnYC`V0j1QEXe^DLc zV`mI6`2M9Nghb;yBX5D>h>*|F->{sF$a*lvIglg^L|5Ucs(u;XFD6K=m0H%O29k&O zxoXk(4!$}ZXIeKMAs#am;U3;2di?Aur4Hq7s1DLdl}&Fzo$jgt?rWWDWSJ@84*|*z z%8dvx-2YDtdH7#-y-7Ei2-tRWNMj(y7~Q2D>0xVD5ne3cBB9uMF4AN@n9?F$=o+Yg z{c(RRzIEcAHzT)VYLprqqcT$*akESKyirk?E`|W_; zh`*w)cKI~+9c>snPVm?AlZ@t?Oo3e5{K;DgO>Ly#V3 z7qtFJsaQqY6bBK|IjcE@{a2VY`MiR5YL6P#X6vmH@5d^hQK`t?Q@K z^!^JiD4n?Fb0bFKuM;N0N^2@vnmK@%ucgj*HmJhAjBqRnj8$FjX!@s5 zA1bVG#;*FIanSl*vja}TK5h7*y*ibjXIF*Hj-I!o?T{@TbP&Uz4--JGWE_w{I*{qb z+R8p(rzr=Xy4wbO1l}~Q2?Ipm!~pf1GqzS;u+^9I76~}zH#v3I&FbDpwz%GIciV`j zJQ0O`Y}8++m9Z#bnRdGW{eB1zH@>WypsBjt8@U=uU%DAVBPmK%skwl{`|EVH_J9C& zmNanOfp5JyLEFy&!0Fn3VM~I_Ez)RGMS}@|6pqhYFr~UOXL?>F`A<0-IG*yw`muZR z?^l$%{J+^gKy~@gWjIxZ)_}j6+%0*Snf0Mg=JJ$N$JQj&e)+?*;j;dREePp80tY$` zVoyDZP1(7=L$Rlu&tBNm3Fde3QW&zqb<0sCL6xa#w|~B%+WBA$(O!%k{>H1SdBi_( zL=QEoO!%HgDwUakAz&jPt?Ut4^0=Zb$3}-daWpD?84z*fCWk#X(KEqfD4NW!>?*%p$c z^MkIg6>&eo@na3&DTE=ds1P15mQYMvXM`!;yDr~C>d1m8I&J#?mJ_US}>FX{3y^SIxK*#{Vou0_ym8rE35ku>SkZm^<6JxkO zEYCWHq%vP%QWWdWo2R9{cT{L^6|HJ+LVPGtrq9U>Be(AVq~3R+)xgD8tOZQ%h{&Oq zPvlP|EnJF>jajGTkOr%0VGR>}q-CKf^5zZ$$n1YV1pjzPo`>XUF zEfay-cYV=cgWA`}<=r2}FEu>7py222X)#zgdxE)i)nR*#qY&<}>Mh59)Zt`8Ps685 zhtpouWc!x3vqw>8epzK`V>Z<99!aZ7#_$VwKsmEr2L#L)eDfC^gBTuEu+|wTQ8wSm zUZHB}=(E6hImiA66HAY2HS3^w+x=;Nzrpb5r z>v8d(57Yc7VW5XZ2lMUn*$Z|0gW8{+5WX4Dyy;b4y;{>AUAP{dt*!@@jWQYGUPdnJ zcyhyRl~Bt{Y;h&USY1kqYPgDSNm4{Fpkp;mZPG!b5=^NSbky4IQ@oSzIn19FR6Fh~ zgKa>WsMBPHpZ33rY%0^5l_$Mq=#kUOm+=#{&NaidzQs%Brd6v$J@&p4J~Pw0cmK8K z8PTXFp701H!JXCjfb@6mo`{E@L?+s`0Z_L7O7o$?&9!j2PZ1*KF?quQn_ z{pLB1+s(66TdyT&7oZ3xHU-srxqmAh0z>9*zS0-|gQt=OJH;S1zZiztwqF35f0ipm zgVFt_wjg+3gz5yD81Dz>75iFWEJku=G z|5j7z&FrNweqP$;&1G_=TUjairP2zA?9vytBmU}c$o>yV8tI_)-F8Wo<^+ z31Ck|p+}%vtqYb>KYTRH?8I^(eb{Qa+vD26l1dd+)fQvz9wE&1~F)D=(5#vrD0CmL4TG+{Jr;qCv38ZidQr*3+ z^0NlXg^=ia_-Nq($u9QY`^w8h2R=CW=p6tYhHQkks&D?#l1&WRUVCi8rpzs?w2*P2 zy3Hj;j}mU9WkPB8%dO3?wJTsl8Hhz|`k*HtuD;QWkC}hjid`!@wG&pG9E{AC>|ytjS|pOGRwIV#p$yW#ahd@5?vvkkDsa(QqeX? z4tnS%bVO<5DMq%Be5bX<3EB4bFZR2C8ETJQ0tibDx`ZB&UE9sydpSvWC8QP93YrF=dHhw{QwiP+nugM-Fcq{Nl(;XhVo zL&KePK)5zd$^b4VDHGbtUwqbBwrI+hF-7jZu%4Q-wqUXzDYnd<@^3|ZhYwfvr6ev= zsm^kdsE&ldR<~de_aSYZZ%JK1uFp`%hadSSSmJJMH81-F41%K4Zn8QU8)4Ads;vxmuCL0$qCa&3 zCrPi2I9#lSQi(LG@_Euq&l4WBdX6&guC53%A!CE6t;xwR{YxD z2^X7!b4N%=FE~VcwJ@Z}QPow=|Jc`_Bk$fCoRa{uSA@L?5TmeNqu=w|LfMIfozx_& zF5{mXx6@GrHRkAgSxV^~>;q{v&39z4 ztE07p9&REaff6QUs{@<=uv)qKvotLCb$fdc96k(wW#KEArXl!smhd%}5QULTge{l? zdiyYesD1Ld2)?aQR(yWgGcK@ZcvL zn=g$#xBFN_oQ$=+cMQeuLbL~xbj#xEO zK%ipb^X_mckAQkE)U;IoOknp!LMn-HW$@T457FTb*+CKjV~e|XR`j18spubCa42;A z1UHUT=`S%mIZd{iQ~Ign))qK6ytSN^pedMjM7_}F$Wfp98X0VC!s<(=Mzk+Wne1sh z1_|-r$FKF}^&D+*Aw*Gx^qhDg@aUUt&hN%kJ%)Yf?=~vH#1E70`K(^1f_vzC2bv2f z{t|92EYJ4*k(d4wsjhM}cfQ5R8eP-jLorCZGzPDmiTMOG*>>767L)SS-IxEGZ+$#- zHYM1|>aKs*&O<3@wrva8rlb*7|DI#q@hc?q!uS=N-s*T#a-s?@Ej;L0!mNjPgh?zC zg*>>3+9KK@K`An5ZZG?Pe7$)*lWf@Z023bPZvd2)?>?UnW z_I(?becu|{bxzs0j3v9WO!mT%8N>H}2G#j|zrWw>{BefN^W4jIUH5fg%llo1E9_NM;g@%^ls5wm73iLxd1FeHx7z`z z+wwOG{8sJM(d(TOb2#hJHm_&ezPCgzCggViyBD$nkld+OoRel0!b?F3y(q?-VHObl zNadBg)@~UKgjUZb1XM4z-^0_?Ian-Nx`bgC!H%G3=N-oa{Nw(8w^KB}5t_8RG}2RK zto61dJ+-isH7mZag0~2{(ZE-|b`B@uHML#GKj%efq*=!&j+2;(n~gN1H;e+sM-G>g_8?wCSwK+WrTt6`b@I!GLPfM& zF|Qb0gi7twN>;O{acT$ZA??Kvw}(YdiFb6z<7(#SEd`pgivoILKi~9Vo6tzFLq_-o zBfVIwgo7+H7EG-(5TLcwqVLu8B>?T082B*=6fHI54CSI`++Wo>qo+;LFNjlb1(EUw zN$#41;2u8EVe(Y$^H@876HjS!c5vnT^`KXi?b&FZ^X^H7-In?2EGwc#s|Kfyc3`I)BQFeh=v z!fLtwFpq$BR!z;0PDRZQ1JcOpP@ezyHyBgQ@%Y-nBZaygXv{KyIaAc!(}P7 z|E9+9%-!aSL5z*nFa17%I!H-iOAJ2hhfUS38nMkni)>sn-SDlH(lB>lVjQrD@<>PE zF&|z*-nv&Gw(&kVCzb}W&f3CR0u|FS@{g5OvG~N*6awbz;DGxA^RVtU9P#Pq+)SMj#OUp9HTKasf5Bw$=IhSDSkhFYQD~bLTFLUi1TJDb?gQ8RfMTta*R!HJ z|7Mp%>I7Ew(?d~`5vWjx;n2lX)U!ioD{5n))*L5}L<|O(1~?Vv7>@-6_sU%BxFp$i z+qK>urmwHa(XGyLu*2)w+54eEP4)r8*@D3?FZl-Iyh}|2=H{RJdf*74b!7U-gj9gO z@XU{u!uiR`NBoA(60TGo%o#LLXU5$68*tAMwTy0U`E{wXID)#012#aYih|KVe&bT* zc)OpiG5hW3U4CCrE#a`C}A+m%@L5Z_P%(L^*~Ka?nX8EDeP&@3S~ z@MUY*JzsVpS!?OC>+(RqZK4NVExN13_1Q>J|9k{-w!E@Vu+4PiNQvQ_6aWSf4N18b9q_xc_>^Bfx=iXk@^xV*`PY~bXBW6E`Z}BOq zb4mb&HK1r>EN*c&S1}>0AV|qq!uPRoz{95NQKz)kosHaf^+ z-*bYoaHw4OtsPaLv*?=802Q0~uAs+wl_Und8-AMk!)r$e&A;tpZ}cp#CcZC|4XG?( ziHBnx zOk912y;ljJV`svVNc?3kg{Hl-I{lcZt^@Sy$syRRP9&p9e>qYp%2m@SOc&j?MUqlD zTDI7WAG+z!!yz$W<4{}97vKpH4eL!g=z^q{-@9s6lCp36WK}ge&X;x8I=AviT&xW1 z;v(8CV#k!%r8W>HsonFrQ*Y@|@jTs1}yBQy*_%ji3MF6dQL5N9r3H^OVCC zIuBK5`ha|qYeAy-8C6geb54<;jD{R4l=k0BD`{DFRA*)7!E|@jxsd$vu>Q9@&!Ep_#3dNM(5;o&8AG{U$ zqIePIi?J!*?1s6@*;Q+@COVUT&e;0ZlOl^Ggz4{(=gt2O8 zg9^5*v7T2~TBe?8TmltJo@Xor6i_2c({%;uh2zVyNLRlOKa*jS8{x@(#KqyEn01{0 z+q@JRNo)7TI)TRmJy3G1#`_)S09Vx{* z|9tNzY0Y5yMa@x$N*>R?`^IK6OfvokMygRNW=W;~>)tUNN}S|HPVx;{of1}9xX?tV z`2jbW27AhAH47OSXu4mn8mrm73-LGQ0=#OsRZy%W(YaquKyV#KZ@*t-4S{H)2UBc$-0@U_3+v)g0Ng~ zg{Pp@cn}ho22ppm>w~4POl84?s!4cU;3A~`ySom3n0N$ZQ9gfAo@K3NLJ6o|1jSRt z)~2v;$-t|y*`3`T^($w|1NnMXtb(Z_j zuD?#5xj)3dWhWjCuJ%YX=nQ)dmnSkN9qwT_J>4q7iC*Py#nd?U$er5i64mYH9e6{) z1nQ*H)0%aXZ>a8_$(yS$t%DcT)188u!8wKeHWat`LoKm}r&Mr0 zSjP;MhMV#6N4U9$9j@QZQ`a|9s}ZZvT~dFeJ5BQOv)U&W+B@UAl45EO4h zc6M#}mCo{Z{umq!8Bv$2KpG2g_5<8q#vF6G(gGG4C*$oa8y_+LjzdYM^TSoKNwbMw z?q_T-gBT(xP}vYq_XlB1J@}XZ*|B6Q%wNZ>8h9h#KlTP`l{4RiGsiKqN%moH&4hV_ zDD1WTj1N(+Ox#|*-BkEKiBN((WE~Ldd~7Y+PgElv+99M@>?APinb8r`64zM2Mm)R0 zbAgMEPKg9^p6NLiayXZz<@erxo`Ur&HRej6t*v%uLFrwkchx^yhA#4+>Qk$k%7d{3 zmU_Zy&tMZP=+3~8jFISs$%>4wZIcb%@ekqi zJD4r4O5w#|#W`)WvR#;^{r&_%O$g}#Ga--c0P*Ej4Ao$z3<;FjilpW%fS?Z3V;f&C zlX)!CCxbvRZ0o3Nxw3*F&2PpKM{0OncF=ZX|ALseB+|WwbZ;ehSv^7Y#cj@}{&T}R z6$sh6FoXg!GzWLXe5r~Fk&1Vdxy~mQA)6FI3Xawfb9A^CikvYQcKGH}lenllC^{Hx zyUuGWhrrg>b%~+4K@DngdRYcQ$`wp=|L=BKM8F&ZzKI=V=?KN2<-Opw^;9bLjEmi} zrP$Bz%lFm)!MqRbtwv5{PJeGoO2mJboQOcZU}hKl7H%1JeU9*sA?#%0_>(O=?Bq@% zX~JCAjIA_WOg()>c~1L|N~&qohx5ReIy;30ysngUAK5UGT!ol8QJ{LGOdRdyC70eQ zQ|F7}t-rF;TH^It0o@cVx}u)y$2pyOrb(bot5!3D=a82QcTv`P^91s_zsp06DmxBA zvYtKLR(;CM{{)0Pp37h~?%w{H7)Q9uRC&FFWR-NCaBwxvlaub%z`5a4g-@~={(74# z`S}j{_A5jST^mB|YC}Nn5+CnIWo1R11E*v#D>ej4`p{9HRI^Pomy|LP)#x=XOGf4x zzxL9e8yxY-_4$M$NX$!G$t~Jr#Cc?FS)7|U^R8oT18VbY4p(=Y%B6sN5j}A5X>3)` z(1Zwa{I?7bROyjmljR~QUuF%vf_#%Yf5cJ*Be^rK$T#tXA!jvfg%2J?22nI+dxnUA zW*nD4CW`p*mR6QKY^G#*PCh+f$Ba+hT{AryEbeQgxGMv?nyp&3*mb|vw);7gbxo?| zl1F`sbz2|#Fvcbf;&P~I<_g(dHr%I-CO3uy9$`pIrKb#zYl^ab`K+lM9Y<_g!=Fj? zBrs#gs)(vwhruzB6PidD*bbj~{E?k4b`bDrN^q5%z=(iBykT^exL z-x1Z_%Od`0vf|NI4)aS**!Oi_=jDQqj9wm&92Mrh*-kQPylC0&XCE8j= zxkvfTbp1nm))Aw1o@yj$*rjGe5tEuXY_0dZ9l%Nzi&1otE7brNwell!nVOgq=X|vY zXt%6?0%2Hdt>;l!&%OIVnw?kQv6wwLlJ!@{vWQ>Etn&!&vmbV8^(Yn6ONtnyyU|-M zxQIb^m^<1PR-8FK3C{TnWrC${ljJax4LLhJ7bC`yGn|=!-S2~!Fqe)~aIZpyFC)_H zWu>5Xh9+?;VNJ#fZJEw3;t7JNGyYF{orNia|L=vf`yxx(6JgGI1_vf&mQ`rqs@eq9 zhh4{vaA1KeKy1D=9erluu}pS@-9(}k8jjkG;e5IN)G`dLW#R`F;%rAhiRilTCu!fKu<5K!bP*xf1dNnR~P@&kWRW@^F!B37^tL z%QqnEXMmXW6eX$bID$Hn&*{Y3dHvASH@~jGN%V{GBiL2Dv_ptW>uuZRyrfiXKlA`H ziUKpunDwEtV8&Q>HPJ7)SMbxtY#bUyw>qZFMQywgRssEtd=89Zo#w5oyT{w?}k2ufNtpt&>Hu-(+es06@hW0M&rSOPJ@$ca( zsYVLr{(hlaGAwJ-HVJ-n+5?&c@=s_(yl#G#!)u_~y+FL*)jIq*O6D#mu@ z+O|)U77cotbBTf&VA%K zl|0d=>K_dNp6Br)+4@(x`<_d*TjdPM%i|AHusl!+Nw76X>qZY&I6`gYzfn$-cL?JG9-Oj43sgKR>h_XrXHK ze^~apot?Boc+~YWzib#vr3U;Y zo=}GtOT-g(wXZAv(bW{8-#~!SQ~t{zLIE>{v28C#mZbdmWeq)4fIUVNP-#{V-QQSh z>Vr@OAa11&^3_BEx<2Fs>WyOnaq^3{V$+{>6oCzEFtuL;{%qWE<%>_040&3bf@uIt zjBMtCoS!@Dm=qGOdYFds__b?sXTUQ77)QMtl!)=VCGiWx8~WzIRIGb&1iFqJ9bVuD*>pioMjQgl z%;dfH_Sg47_~aU7(ED$13i`{w=+d%yit2FSa?O9cv9e@w9%gV=Ls;4MJ0ECtz6k88cV zhzXEw_>Fo0+fqQCwf`$~^UXXTEcRmokPU%YhXGi~;YhCElb8`mbNc-gd8E5F?!U%O z{y=`dVH8x0-`~rM96Sq>w8uEAe;f7x0k(lQiEOthZ*tsQZp-7h`?$ojg_o+vs_YTT zL1TyK1%fWn5P^GuS>znp3{wK1{$t>&M&}&Py8EtQ^98NIj`m+(;(T9ho@66mk0%a* z#~o{M-4AzKJPWk^zrVD{G4)H*_u3}Nf?fwA&R;Gc-q}lB_4B2X3Ho-8K`2>;uk&3$ z3yr<|g2nGx`0k)~`!C23vJn6aAEFhSyW5#Ie<2vD_qlsHieX^AZr)>%ATu-k2afXpn$Z5&$+|TU(XP3_ zwQcYJnNch%F%9}z&Vo*hy6h?XdhRn0I{!p=#zM4K|Eo68Qz082#?ig?gmCWfoLxFV z5q=clen`^y)7vG=N`4i{vuBxXdG1ZhFw%D}M4R6&RHccN2DC`U)Xkvfv`~fp$`wK8;sMll{lH7Y zRgCWy-yLAt|39A&eK|a^MKtL1FDO>&n805^c+k3t7=lytz1uOadyW*-zl!?ymSR`q ze{CswFuy3oLWQA*W^$;OUYef*EpF>xg|^EF+y~*G;eWK6@2?+#Is}A)1!L8CO$RIU zJNITR*`)87bvQq)+nDY5nAPqrAg5NB1YRCmF^5s3?p`6y16b zoQHEN9$@gqXBUU1mhX;e493&cPTa~q1AtrYwyOp!-8j`#ZH8g5qo+^hiLU$>5ps+VK8A z9}UTiB+6Yw?Q_2p@z>LKKcL*H?LKl+Lhw~{065d}P6*ABj8FLBBbySBKY;GN9EL%I z9nY>2&({D1~7s4sMJI;x?Sd{Rroe6-X)vrY&6?*MYCE`|cdhmtWD0CLMD0(ZNHYfLn0ZXi!aP=yN}!rg>;~v8 z5#{B#YREhk~U@Lq8cx5s)<%pZvT6)co9;dV1 z!ifRguoH9j=@#1d+1Zo7hbwRuF1K&i!RgMZqTup6U5L~|h~?_D7G_P;K)es zd{Xu2BrOmyC~c1d9G#EC&GpVls2=Gs*Kf9ZOkrfeV%Qp}^BN$f^>D2e7^+4!yI}s} z!vZK;=m7v}z)5!5_>+Ip?cj#zls2EEArpJMK<_tINGNPJ$|=ua_PQB%>d{O^T*cdA z2$s?9$Y({1r{J1%IdI`macy9r?1lIg9hjOMv=g!cl98T@RS%$tOmdQ2dP;5wIH|{B6sv}XR+ZNYE9e| zFC4c$DS^;@&}+4GoI}JF#ciX z5sUOCx7SJr*rjcP*?`b6_*0R~D1HOkXEN1Mua!W7_6>N-pWkN$FU<;&G55#zSw%5c zSvm3+KcM&vSXVA!>CYZXOE}IXyQM3(#4lY&hc{j=7I0E zL^kTN8Eeo}J4sWsvK910EDGvN*W^jFfK49pbr~-@^pgJq==I*+Az7+zLel;D82<_1 zA1_;ICaYRsf?X2;plvqb?ft$UZ-4Va01@8BIz&+&0SLBtch&3bi!O!H8XK8$lNi6? zD~Ykr&6lPgKx$^8hMKt&XOOx=KNCH+!c%;N;^iOK4=h*#jEC28y2O*z?jAf zcTy6PpSR@Q*7;}Z!;#;A{5?HzuM`ecxF;BfKLDhgNf2}ZC|U|qUgutKbN8G>jz7~^ zAOQA8zdk_SLK(^fT*lQR4K5 zD^rhb(D;`){B5nx*cfs*o?eV9%^20*-#{|gEl*yydmg}El#TG%-cjUa{EH#sL3p#v z>n+0jUcnlljmZo3;o*u|Ic<^Tiw?as6L7K6YsQ~CAK$qA$F>7A)C>brXQt0wRnIlY z-2n~R$4jR6j_g;gj*o19mz*%c?itNwuSXMH8z98a=%QBZ2Uw~hS{)LWWpi!=v>zDEUCI|uiYiOvr zoq1Q-LStG`4grjks0w8>=&I}cOLY^Yix*b2*7rn4=BV91^s2=SEI}{4S?Y@QYp@h_ z3`Uw(0e4z6*HTQvQCv~SGi4c9Kp*cB08dk7*4lrdi#yakKR^2f+Sgj=pXZucne_1m z4Yk6;=BI6qKT(|U*_@>~EVEy!Ao36npaf^<5$VnqY_qGQymL)F^)~7G$8+TXLTY@t zN`TAjyzp9HUN>v2-SHSc0|w)$%#GZ=>t6Cr`0TIU8wH6}HLHniS{~~IxdOJ|xrvOU zm8^BVz*?|Sw@y6-sf3s$ODK~cgG&F`;p}0s)yX#}T4V6?&%9`jtTp)W0k#N2?}tbB z5!3r6Kahxm5|o~}p#>ar9p6v%iIOjIj*!VzUU9fah}Crh&2%~y$}%3~F6snPGb}n; zh28Bne^-8Sdb)PBuE z{KWZ#axAhf2edhZ_&}`aUPgLCDNTZMcr#p!hmA`thodN%mNH{&1Hc-qrIe1GY&kc} zh$JEbXk)_&)za4D>w0(prJ6aZhwx!x&#mEl;=jjTVyS?>RDpl($Cns4vF)1%Yt$Mp z(^={U!5f>ExES1)bGYE8i}qZk$|$Jx;Ph*F^Y=YC&uo}xdi|wOG5T{Ub$E~g=c@qO z2-PFHgw`Y=LzKCIwqqH#t2O&zq~ys=sG?|>xWuxfnl1D|y9;fqRlwJlH%)_)GzWue zzgqRc_rxiU*PbDxx0lad!>ZD;sGbMJudFITupc}-R-k+Rz)#P`9{~W}_U8v-?slA2 zHVsOg;oeKxH&F#SyYI=T@{p4E%k(-gPs+;Zk{V{H4l}#(=f4c8CZ zFtDVnTFHPU1z&DT%K>gNcoYpRSmTlk_?=>Mq?56nPFJr?#5AV7h1ZLxbR^d1o20^H zIla#NlsC`c`@rJ|@PspZpxll9=n+&UP4xV977tJRVsADbs*l=@^gP^Q>aJ$VE}IAl z!U*K^%!(t%?K$Z_+WOr_Fzbz$i!UP57c+J)lfDKout)!h4eH5CQK|QQEoeU%rQ)X( zhPjB@y#;1KNs@B$OfoK7w>q5MU9o3sQ~!SFKA(~+pC^e5aF**)iI5=~2B6qjTf`WyXQ6<2hfLNXI zF)Nc7$l7GX)0z3XFSmX?3nusO18+nNMexG-Wo+!hp5+vk@dvNDTWoaaZnTa&epeuG zO|dp~Ir9Fh2Z^9KgZ3`1#jfeJ;Rr`Xe!wV3?fknlyLiFAG2aOSHP+^)BgHYhepNK~ z!*6 zp9)kS5mV)e@c;JVY$&j6=NI{=CCqg__{u7~Aau=Gu5Nedx^&6xc@Z$JCzUdgzrxF) zEwC?#WIgNn@R0VQ)jh5V)bko1v3sJJ8vw?Qq_G{Yn)<6tn()mO^&P1BqyACCJ z*vJhhMO;eP3>J{u&?*^QM|1;xpuc8x4bj(AZ>d^Tz=v(yb+r`Ah;Tk?R-?3e#R&}! zX&3#!0Z}^(B#+v|^#fgjR~Vu5%wipOLB+xZwHB8dCJmfl7pjsnwj~P{U z!_Ha{glUoIYg50rI9$)Hqql6?LznW*o{+JcsCop@jj8+GN%)ql+^W7ETzK&c#z*DB zvqTUzVdm_vk@D1%SH53mDev<@)My6uyMpfXz3 z!?UBjqT!Y?jH#VhhhffG0$&X>HxOLQl{Hqtvu6hr+s95KyU~?Ltim}XP>*TvaJ9m( z#e!fyDfr4upoq;D*AH0(28RdT{g`r@L%{+SAlTj$t2|_YIYaE@=yJNx2UbxlZ4;>r zs7qvxWf1(|7p2Udk2DK&`x0UfKa*nK278(g+fI?^D{2SZxf@YxIDRx$wA4=tVUJ$y(gGYp_IPiRo7 zDYzQ!*b~$lhaZ$GkUnyk)(MhMt!KQPW!Fj{oi*-sAS5sjDqOqlYSx28t0;J~9BuYe zw+i6nbytMaZ|DYm(e>FOb?flV4w@-U{$t8~=W{F&(urQ72%b@x==V9G;r4 zupvP+_(AgFu{&Sz`VmU8`0(Zl_@UDbECS6AoI!^N(ad+FPyil|Ps}2+IqfRw$dtOc ztjop}#mrq=Qy^q-Ih06|gq#g6Tdvkg43Zt3JDv810|?NQ2F&65up4z^)NV8vi^7=3 z<+Fu^*qkDXZy)^?1YKnw2GaPP<7j;d!MsO8s>=qO_0d#V#SEnfNPLRTTr0>7kZ42N zciJ1%_H-pbQzZ;C&H@Ci9cDHeb{Xg3HI(fLN5ph8Ho7FQhBe7DQhsxq8H8v-CB#MI zVVs#c{(B}O0dK3w_G z6@Z4vp}NldBv$n4Opx38!VS^JjD$#&xBI zoKXfit;pq1JCAGYi7{Lq%OC2b@jV4!Ui&moQsI>rLYaEu3#Q(=mHN5ZSk#H)oxt-$ zfha0eAP z<_T6HK(b2zT~0h~@f}i_lG~BrR&Gy&0GiL* zp6_f3*!W24v@5*UX$nQEEL&YQ=@K9FlT)IYRb}2sL^HB_AzFjO+SP9vHB;I)irA-^ z6WCs)*Pzu5l!Mo4DAhmQ zOSO9KEH6)_OC%?+KxAtalNTENs#o-}`(*q?XicGmv%Q2z9Dyosb|8u!XHIt7VtLb= z^ihPCCTy2NUZ)TkKkHK(7^URjc1J!B7gN93Pd{A~)DATmXwnfkODw@oCJnqG)VQ5r z6`x6d@l9N=Y3#CI=!C_&2neaw2WKa3L7G$|w27noXbeOS8whDGVijjHp{ zTWFG!n_Fm7+}lE}{jpc$Qe#D83*MZeoH^U=#{2E#IF&bBl1G27-KEV3-h{0-d7oSV z#Qi-6%ywDecyp@aUKpQx0qn#8OHrXgatXG2gZ*Se-2J7wt@gHecXh@La0miP`4szV zh&`|M>E44U2uqDElUW5hcb10ZA+KoP_|OUIVSpOk(IyFy~u~H#Rb?t zvNt_*HC(fuYx>U5^s_K}7u=gPn)JRC6dFbp6lG%GbZPh#qWF+noQo zHymW&6+k(iv^%QOEbS(w+-2xc8^EHqXle4+tZ;UeYDM`4WyFG6j{&!pkHRId75&CU zPptr#47;kR&BVTT2&#$~l{x9!G?VhprYt<|(V(N+8FC2(70tJO40@0)Lz%3lMn{RM zS|3mv<5jRn9Ot*SO;h0YcX8p(p@lc6goz2;TT>iOF(OpBD>(hoXeDB%Gh=tAnsgmX z))_cN7*LuW@3!$pOOoUER7a0Xhr>yfQ?oeq349j!*0#CtD!f1!WMOnqfT{5lb#})1 zR%^joM9$Y-^lJ9&x=Z_|)r^0SPRS}aerQ`|Oc=}1XAu{!xZl{_w#v}r z%rB)Slt0d8(I@X_EVBYctXMN`wmM^*R8~m4nk5WGk1(uF2bo|CZHmYHGENON>ENa+ z%ZS#6!#`K$Hz9R8NKj>&0zVU|I2=!V@)Dwy--(9WrhRcIvfr zY0(9giAxvp|DumP7&?MgJIt89bB*U-5uyCi#f6QX5iG-3Ac@6hX|ok2CT)-DG9E#3 zQ&6Q1r_gui4i{Yt@fk4aWS#?E1kW??_qQiuf8MQKwoK{7sI{(N2%=w+_ev_4v7G8V z@W`<%-4WY9oSrY#CQoXK`FdEPa>)8d8`!V3GB_4-a6}|ceBANm-_asTh@5laC7(4K zdVbF}lQW!R%cM8;{T89Ye+D@mMmxi6eNRF4z(1JC;R1uVUBpGTgw9)9{w9AfZONuA zN@T^(wfRyeYR;MLn73yIc$d-M_^J|NtkAVr+aNUp279g z6*=k)o30vNsp!rUV*;74$e7yDS{}As?>Vnz>+;@P7p~N(FOEqWILa@0esb^y$xRY> zZm3h=4XKFH*8v;rWp*d~z@u{hrmut7JBea)q}iC20%*w=1iC%2fxbHnChtJ?I}lc# zBy|u|jn59W`6a4Aq=7fM&KMZ3cj)ZYl2*%jTKv%$Hb5Djb9cA&D1Y-e#KfnTDB-r} z?junv+ifi3-cgGE1l80L8bVIBR)-zGl*d&b)O%>+zRS+rHTSM>zHdGun+7K-ec8Gu zDJQ5XG9GwZ@e`#D2bi{@N8Yxa?u^fFWK53c{F4R?7z<-jSdgv8<;gsjb43Qe8{7Zh zDYVST*RkEXG|V~7Wk2kCVo-kY2@9R@L9oG_s!zWe%xMG`WpOJj0S=V&6iqW%T0*N$ z6lo^M2b>UYnu?`;&^KfM&>tg?6?!jp2of+E$O@p;3A{B zNRqS}^ljo&kzVG8gcS7K$_5nk($6$e>#8QSUmLI^`Uhfisb#4rMrl3&9+-%Qx!jrV83ReI?TzW)Q66R zT!H7boov?vp57_|Fp`Q?;1p_oOjwP6bTmPXT0 zHDOVLh>+1bKAbLg;Oue~x;G=#CBgAUau~BNz0x3NiQBIcsoFa$6qttx7VcYbvaQX9u{3D42KvjqLo*7r3}dudrn-XTO6b;{hZW{K zuB6#FytTiF88Ti57F+v-3WqLsqj6)qvFoU3M3I`8f&?mayqS_aIaOX^AZ9D&sD||Q zI}aNG!rgGZ#W>Hi%;nh3=_x2`LJJ#$LXWv{r?0vxokU75u6p^<)cZf$+r)Z2VD~#V zpMT~--crME22UYxb=Ji>51DsvN+x@)P!l*g^i!3kwZ5DvoL`dj3ezrw_8P(Ecg4X zL;BpySr_hY&V9U`QvY)yi>WHA;SqFj9NiQH$fXzoqc}xfKxZF~dFWzu?WpDQ+aTp7uNLLtF3R&5Btc z_IX(!|Do%maL24=lGyPw`g~ z^$b7l{w-N%#`!AibYA6(!Evw1uev&M&g!2i^Rhox)QJ$ix#--Lxq3+{5bg}y?6f;o z-)U&B<9ve8&IR_6;n0xP9@6Hov(1%Jr9n{#MxTqK9$pg<0^Z7m@L^&bY8%;lx%bi> zclXsa`va1^-eaVn9YT4=fRT&p$i2a~Eq%D3b3B7=zBFO-LXA84osf0)HZ+gkYj z;L(et)3S;*!l?l+udHE=LgCFEA`U1M=01;-E9)guHh&ejcg{+X-)5K&Z)|mq@O^k< z?m$ZsE`g`G0N$84uO+BqG`QUPvC&Hy(oY0O(=1}u#W%J0qSlxTr6jGI;jxg^|L6&* zQa{4VK7PLSz@ruSB>1Cb<(8BbhDX}+f1UMGRe#&JJblE912d}}*6?V08}UsB#e+)j zZrM=sGh+##;G=P8!MYxAraHb^kiUV051ZL@=%3Q7Oem7ZDClQ-0mI}(J`(&I^7{A$J_WB#t8u1&Lfy=OJ z>KfvYq^sDU?sdA69(==9SB@@Z`6|*7@8A5Nf(g5m%&JZgkAb<=*jxgwgWMBoryhl0 zmgaWGx(H}lgu>#AYM{qX#`f{TNYv$~4>l(T6!`pqwhSDhpdm@~Ti3v3?kDv2{=v|qJ58zI*D zQMO%L=C!Lm`W!?ovT34%ipR~moE3GIre>HSocejt1DsF)Xlk-rR_t$|L z%ac}*qhfFizbwp6eU=Zaii^7?7ZVti%$#$Glgk-@YlgwF5I)@CxFiroF>2!b*5r&F zZ?OpgB}rPMObL8cPsDdoatUl`S>BiHTDH>BZDIs!kP>Hc21TQPe3?eWoWs*vZdiER zx!&WIIL-IPQ{ne+Pbb*;uHDHzgB2u?1SGw^zbjTHl@MxfV&6pZ_Ngw@tX&A7Tu#qa zat_$K7V#rD(+iZ`8^*%Dl2ca=5prGky>++iR(i`S8^SGV9x_Odv-SVs=76&b4~u0k zfy3w+9)(9ou_uhBSJGTkp;t<9Ih-|x)Olh}BcRXWnRfSdT1TLhkeWxSZBD=$Laj1t z<&ma55x*TrL9_FoeMjv_kd}~Hypj3XMN}pA)Wc`#ncH0Fzieg&crE47&}cN{xU~MZ zzjd9B0v2?1?dJPx_Ijg{?Vm3>i68MwT`-1~sggJRcq2%Y$(ODu2D>Bj&CJ9f9rHLs zL=pvyr^59+cMhOf18mK!bH0Tbu;e*KMqCFSVJ!89tXbyYehzv*n_N38q~1v%T|8A# zwETPLsN0p{Qq=iOK%^hiZ?9?j8%{}J=LZOPgOj&Z=>IA5CrUjBVmX_~U2_hemIsG1 zifIpHd^OicwgUXHDcM7TQ;hM!aLqYPN;ls@2A9JRC}_k7C#p&!;QqXf9|k;bE6Yir zMMnj!HP!1(iI?5DdXh&(2DK?6%_Kb~B}%L>cu#FGE&yzwrGLu6xm}q8jW3lqwBJtB z$g89&`L)ZVj`U5}@QOsk*WV6@){EavA>m)m-4vpLAz@Fux@;9D2atj-pG_OT56!fh zX97RR+R3x_j}i32Gwuuelu)NS( z@hAADwvzmXf9VDfSu;w<2R`qjnJP=|@|7pzY-$pvFW;;u*nBZ0op=`K3XYx5`|*DW zr-cSo-_kGxqfu5-6H(F`bJkGEO7eQg&Bn z6}Z$-;F>d#aJ>exvROrz@bBzXq00f=9agF!K@mRQnyydZH}R-O>z-0-VtDyoxz$EM zUC>5X{;QuPbmR#?TsZ-~`#yZtwMpLXOA-iUWWT+JpnF zlhS$J%xVu+4kZJ=w&UN-Ihc%i3ivBeC5J11ac@fkrAZGcbD1nKDeaZpc-&POL#U7` zA4B-}Agwyd)MIuusN>XA6)UX{;{q#HxiT~=D&E_(=BcAza`k8$4V7DO$Nrg_6++e0 zOi78%j)sj3L^>5wxAUKl>GFDb+~tN|0&c%#NrVZqDyfm(_*oiPQRdg|2(4pv9@BQu za&1g)*55P6-*cP2>!9G8oWfyg*;}A&nfOYO^3u^MaliG!ZRg>pjJ8R9=i^)VBESxw ztQ>UzMRqq)47&@tg#j=cdHQGF=&VR;R;39?j*Ypbl-y2Lbb8tQF9Bon(jz${M?n}o z8}4;{rs}8&WB7OU7D4L;`*z>ykGswt7j2c%-}3iSTQ(jvnkrI^$>D3?cMSgCnMIol zj(M%|U)3z;nO;q>exkKnbT;-%mSY)rCc>1CG;kBMF={|TJ!oD_`f>WI&cl_+n{P## zb?Sw@x3_lTs$>NIM)LqQ-&@!G75c$%2+QIoqxagdx`4SOlh#Znz z%EPyw6+xhUpSW(NcCF>IO&QAB_leCMe+Kjsy58*>uhkRX;^4XMdK|nWWP8KKaTY~m zS~VL?Z5lmOt$`hVJu^H!ix=SasWP)NS{DlXU>o#tXUoBs$tZRcba6^2!-bmLX$E~I zA*)_82WzK1H#JMW^W7MoB6sG?#?DsKQ-^nnG#VNlyo$nGPKDq8g<@GW+Re_kI`Zhv zWS&~$4<^rh=v4=Tj9wLKrP}FRG!pZn91wpG{~SHDvp$a>^~YC)kJqK2U~h3PYqg-% zx-Q*x2V$TG(};i701Pjacg+25Z=2Lq?JjYI#W+l6N%NMz^E$CBv~OKbzBcy;@D_@1 zrd@iH()B&}#EM*T3-d^BX}j?g$T~UN*6vr{FI#^TZC<+-6 zT%v!KKkXB+io5#o_;y*qkG9lM?bi=dq8kiPC5^YQe6SmH#ul0=i*A&^eBnMLTs%Kc z5>hfh#A)JJMjulABHevYulZ=KeCvnCGA9mdsb(MX3a~@5+VU1STyM;b5|c-oc&Ef} zQXV^}9eNw*I%G{-E$g(ra^_wi|K2@W zUOha!9}57bu3@msw6n7=-1KL)jt*Ng>g_k_NXNrT!PL_a{75rb!ZcG^^Iz%~{TzIe zvysMZeb~h}#qVd0hrNZ25DA!Uamyal4?;pwB~1vOxG@_=w~YE?Va_u7h=YAX)6-WDaLDuasZ z?aTBQgVq8B#^$SXr`Io}mC8_0ZHVWbN(=9@=wT&f(NSh{gm)S1$iEmw%c&cTeb;+* zMrv$0&QqXaZdW-Q>?k$a6a*7tCqibI9T;>= znXK&jbvF6Mi9HoUe3Q>jv5N+iVW#GjvKhS@=B5Q>ew!61ayR-GP3qX&#_z;= zq<74k%YOAF_Kn|=e_`6+CF<+70FJsicY!Nus&H+ksOPefkbvakJ=op7qq|e{+SV+3 ztN1ey^I2ZOND+p6w%J}=e_4I6kR6N~r~^e$-{yj!(`wtMU78(jh5H{W8OWgZC{pu# z3mBeqVR_p#tzPrn9^&3hwe+SaaNmN!4G6wS9GY8{4(UabMK_XOn092lT!M3`tz`e z`PkLfO|=UOu11o?GSze3Sb^PH1U8saR>>Yei#pjlBt(KyR)mL&C7L$iU>e!;lXIX-ti-MPZ7@|;vBgGTDMjoB*_8P29XRUS$8DR3s@ z-1;qi-AH5K0AXBN28dz(xOeXMOa1YI9X9b=Q|A|)^E@%raY&VFr}`})#Lk_bw_71+ zrykVFhI%fH>36#1QBrc}_lWLxjI^7;H+H2Gb)RO+o|@)bHagAjt~HEqX*9raYpx>T zO*3fX9W74=+cI-jTW&CF;|d4|_glAetXD<9U()A0_|>$h`mckV2(RftqGSW%nlP3wg*vZVY-y5!l@W|cpUuYTXl&m2RZKE2TC^_nM}y};2$NKS zYxV7Rk==Dh5^vX9AL-rk7c(WD&Z~1KBsmg>5o6VY0jmjdZa`2yjr`{jLstA&3zyJe z%6`1$cTRp8fh?`Frpadneza!uZfjR}SfI|nf)~JOt~Ki(kG#d?Epd*QAJ}uZjjIV#f+oKT5QZ*?Lo?OcxcNL)~v!Xmj0})ujwh2RbcXsZL@{*Qi5^! z=hH(>ajS_X^S&P9b)U*>WMS1usMS8}cM~A36j7o;>{oYaT;bq7!|*ITdL!>v3gZdj ze?pnEL=YtwqZGTB>?RrRi|^oE7JpY0GB(eRqFzv#7LSdNl2)}v*Yi93vOJrx>fEjf zKDB?FA#1(G5^QyD97LV28mIkJ<6SjA2CjDX_?$(4RERon%F8I0tnDL>mtj69o8P(X z$cG^;2Yj4D=T2S#arjrK%__jdx|0GQ?(YMo{O6ZOZT0Lyw?62^xW=wG`kaUrEpjix`(SZ# zQi++xmb?o=Tbl?jN44Is&e>SjUKA!h@$K-4tn=_#&60dtxP4_iB^r5t*f7)qw;J1J zsxvcPCT(>&8j*$owlOILlC%(QIGH1e9PrE(+&e)0jGY;L?=5ft`_-VHbo#NyBS~)1 zJetqgoaU-?D6K7;Vm4E+v&*5MPdC#bBeS%%hW25R+O)-H?ts2~QKG@Ic2B=r$b;6s zWh>je?=UYi@BB5R45sE8M1E@Scbc@WBtn z1n^%sc)qe+yIobZn6_VpxqI$|?mn|F^R!u6c;ikr<%M?h>vaEztS^s;djI~@u$%TShNH&K0VO3J>gME0HRlWvGC*S=Hsb?jm+zt?-lsQdl> z=P};%p4aQV&N;8MJkL2%tXd&W5o7KXj23ldO`e|35>DoE+L0^{eE6$t4m0B84q;W5 zt8ypIb}ROz-F7Q-A`MF34vI}gZ_re0u01#h42#tK1TY{8vy1o$A?k@o0Ah5K%c001 zpso2OxY-YcuH@@Di1nlBVT8@PpnN-eTu{|t99~-|?(Redr@F2BZxz227}_>b%;%Hd zX=x31pIP4D5DHdE-5>AqH}33^-RZXdTJAO$XYkzXy6aA+GkvT5jO;$n|HH@BSAHAK zmu6(~3^k_VGtc(N&MUTO)I2fT`FD<-v@F8k3Tg zKh>41XCLjiEZhl0k#k?1#Fysb5`EY1jEH8u!d}PBH19(Rvi^45{+4*K-ps|_R()Nr-w!6QrXcTxKvUe(;&qA`}>?h!}mA~w9 zfnB9;I|Wwl$afzE?922nBuMebuCxf;J+SUsg>Qr3r5(B->nn!@^O_EqO@3N16rt$y zLrL(QorBtAYCkA~Jy^AwjHU(xSA>ZEJ@N|`36o6R>5$#Bd~Ma3V$VI|kJEQ=_Xh8} zEQh=Z$S91!%#Z2aaCws)Gyqb`h#E>It4Wb460^(A#m(&D@&Dr1!65R(*R0#10Y{EwwV7`V6nQE{F82zKVJmC z_%}8qjeVS4fuN|vTm)`p1+@QpEeMNYZgFeYb#pAR344;U5clzn?xQSxZhX1p9WO2v ztxK9gH2R)lmx-B==WWdep2JcdBGb$pv3guJUUv)f2C$OH)GcDq{r{u8laFJVpKWNp zxWsjNY2y=aLQ zbOyGZd%g>oaih!6-s2(!-6Lvm0`uv{%;E%8suxpM|j^~71 z$gsS9>!*3^9`ZHGT_L_GfkK~x>r+7XRjV2VAF1Xg?*r0ze*t8eFHJFJeC5o&z5vWD z=y&e3Vkq?R8xyMuz8gDhK6R&c9@9L;79Ijg2&&+uknq!UQY@AyP2|r1he)Uv*mjBW zsPV!(OqXih!4Pz21cSZE~mP0AdWl9k2LBJG-*N|GZ6i)vsb?bc=a6OfE>6!o1?j1d3?U47G)V5P- z(~rpA+i{C0irZw#hYqPNk%!!zy_g_nRF;S6(_e`uRo_R42c&VVRg{rCZp@`$1Fkl8 z-f4{8iM6fsd_0!1{zr}fn6-oDf<!QW4r4Bzl7tdP@ z%?}4T5U`!zw19FjM#X4!_eN~Izv?G(D=2bt5>#TX zPec#-?pK+h3&(}DuvbQ4;^l&e%l&SK+y}G}{)lZO^9D(_A)gb6G8p|TAQAk_14GU+ zXjg_E8{T~eLVlA@$^NShj9$rhdyl;ceI-Cx$pU!>Qm`^)^)6!rT*d?l2(XWHlndJD1T0YMd;7v{?pGuYc+ zVG9{{!{5^#oF|qQc7hW*`k0U}UAarexc!c-_TZ>7l9V82>-F~h;~PSu%v=iD(C5M` zAY0yIb`CHPgY+EfTC-tIMu7hsmSZpOeclY#(^R4g&0DJp^<3ZYk9hCtt^}})1lehU z(F45jIT(mg6p5|<`gLgptan;Togk+m%+XKCmb00r-rIs?wCqcc!`;CiWj4Q}u; z*Fze^pV7ZGQ2G$ZWBN|`Y_11S{XM72)L*;`)WF#y0MaBZJh>u(6Vkz`zhGt2>|}6H zw0*biuLay$!r7`TC(DF(x?O1s-+oWn5E69>77K(0;8prVERSbueLl``uRJuzFUw=; zraj5JK#{}L@k&Qu{rxJrCzhxKOK2H?K0OZjdw{7Bd_E$O}%Sp>wYz^&J339EMXu@XXSeS1Vc%Wx{i8rF6Q_6vl6|A?~sd9^>f zoB*7>0iPcezpYiP5!XPpfKdA|`-9kD2?IFgsszy~_BJ=UCLgafZtzP)R)@}r3j+Y1 zaRn32hRHMUFl>u95?1nN#B1K0;Ulh4+IacyWRL1f=)MgQ`q(4wfS811mf@08GLq@2ZM% z`C!8&VWwo(N0||Bo6`fxVp>MSWIL^NyCu6(8=ge$JcS!!m@#0fwkT|QaA*JHMSO;Z z(1W_E`}`8CaN}7KqB6@5@*ro;d{jNd9OO^=Qtj0V$NNO|_)?*Kt@N?st;($uW`kJcwF zd|n6NrOiDJ=~2hj}fBTWgS+lpRMNcxQZ*ws~1usJ&qcNsaqjtmP5s*sKTi%XS86m zzuyN8_FQn1UK6^#-^pjWQSDXILri>n%D+#N(vfv(dR%#~y}n-Dcq--?uBD`|4rgU@^>0;sF9P^wuB;9vF9A8QL>RtAori zB8%i{u;Mk>gN101lsieU5-15`AS>QI*Q(p-@_KA7C^*;BjUp#V2{z(wu)!Bv@z<~? zPTwKH11Ia4V0#RcO~F-i=U5CxgC{3dCiMO=f>2U0c#cI^Ec5Z)Sm)tu6#XHsGCOXu zyD{pS?!FT_Hk`6dC$bn^}j{HHc z2@N|VH0eawc-!0x6H9z^Wajkf3GbE&M?S{I`ps=T_!6l8nCA4vd-MO$6_hhU@w@C* zn$Y_oc-XyVbL~V!d_J-R9_=O`sN)$yv;_$7Vtj?oID!Yt>P6aH1AbkN0r`Fn? zo)GK>@JyXx8{KGM2~KpQ`W~@n%aFT`D)fGdN(b&o--`?T)ZuOHsqg-HCt%PTph7>b z4rkY?q)~^q^}5ACn4fd^?a#-bD`NX?mVqZ7pi8RMyyy8dDnkp~fd@t%R|dD+FCVr* z(gH$}#f>+2wh)XuD7o0Ck#Lkm%X#3-e}J3#i<5uxp$!Nv8XF1A1fWInZwO7L-hvC6 z)X@Mq2ajIMM~CvQa{NK54WawMZr$TgPJQzeaqXGNB>dp9rr2??plgqgd>{807<^4M%At4Xsi0o3?k%0E9_hzH z+SOBAehy{>09@A+0^m)!-S*q&f0Ce%`+klhyjwQP@=gH^U2mEAhKSH2tP-n45i8i> zSP|fwV%7%I5|M1lQ6MhbfHN96b;iZ~(HN}MR8Ffl^1l9`v4g*1+fv6co47$I^i3Ge z;;?ty^^ub>@@krU*U7@l_Wwf3Gajx0qlkF%eigP@pU?8tQE_0oM+SFC;_iMp$t7Y8 zLkc!#9rv5GgO`Q6sx5TVgD4SivLLL3!El|tZY^ga{{G~80thDwWc=wNZBuKVz#M~& zeV`D&#J{5ogsoAL|96Y;4L)NqAU={dm=Za{;XSi)7Ltl_a{z)E zb{Xs{G8JT0qVnvJI?ycGYfySkx<~7C%9O-undKX@H>%p6&c`v))?hDL)xu&mpa^<@ zA~t&1)`xBC@v5JNvX*>nI}>vIy?Ds;$_>+^pCtAJDVbzYp6JNiwhR(@EfB88WK-r|u<7*}iVxUOpCMK0u*yw)Okf?|S zN%USQAo(f38zlQh4cTj&eb?`buEWR6wtRI$XG{M>aTJYyePF0lMHeCy)go>v_28p@ zi%rLkTE(U5$rcE15x{!z^`uYv>ez3;bTH1r0XU*`unlYae|(tSrXV@4dc2+(?Pu>a%!mg2{8Be_g5Cpav3D63JLRKR}&@2OSkt2ayWiCBUiz zfbltmf4mx&;2R9EjEpl&gLrWiLAFmgd5j!DA{zdM3mKK40K%0M}5G=|; zn@ZvD_eE9YJqD@-QggPL`1k5a`If$%jO$h>GbhhTYiiX7)Xs_R1?XvJO#2uX9F4k` z{?vg`FMg6W8O*8&Ut5a6;ys)g&>p^O5c<@|dV&QbL(vZ;GGwstYW*?+J_@{n1&S;} z_{NMvLnATEv}oaz=Y)#QqB`r8tm_pMlPB;Kvg0geB5#C9v4E2U{hXv;Z@{2)Q?VQ1 zZmKrjm`UxR6@YGX(BEKu(6Qy;oC+>!GB~=%7B4~_o+o6tUUXvoi%ZGTP2(RS!PzQ6 zQzKDF$cVy#p+<19{%Cog#zCpXxLns!WJJj!%y!g3JwftDi2v?KyGVl0V|*VV26?F1 zaf)sVF16}F(D6i&v4Q2J>*=CwZxDseHyH5Qg0>H><0bj!$}sFLq31t6{2%rk-rShk zn|}FT{=Pi>D>aBlj9RQU(vsp8InU#Jq}`D6{X9HuCvvrqJr3uSSMp2!U`g>) z+VPYMh^}BQ$vZ(14KgJhx$^i}*))}Vv#zOv;L}Uwu^f?rt|BLmT8XF508AJFI%KYq zXcTJo!BjYJ_ViO2%}xSwVRncthu!!69XV1%_6fZbles6 zdU?fS|CJo;)Dzbh$$FK{es)&Nh!CPW9(^2e66SqY2~|6?KVH-zW1{o5uji`ZFb6w9 z9d6S!tk2rkh~{PsU732|D&w*H25)rdUpe>$RtrY0Ka_qc?#|H8<*;y;uu7=YiQ&@# zbCL?&hDx>ubZ7wc(ZOi8*Y(cRDY=%9FK@is7} zOr~P;WiiaO?vhjSR+%GPeKULKQn?5;$a@{|1Wv_6QP3LcTk2B2XKz{wFyheRJv_^k zYuDb4IH6g@phP z{5VxZfd1m?u7@;SfmXI2^GlsUM;%%8S~QT)h-^m&6NLit_L5xnmqJ(T%@RXGH})1= zHG-KMlsQ>vR|-WU8;M3#t|D#+eF-uC~Hg_NKpbRAl@M&M5jxfChLD zWrA_H`pGNa!xkyNa7F9_HNovIr*sr4(Gn2q`82he9xEQX8H`YAxcNN<>3ej%h3@Zj z%8hl6ZoV<5!p`+?a{x5I1@=d;CoK-vw+p;*puD|tWT0~C=B3aFVWwJPWVxwa)`Jt5 ztNe5sZ`sipJ0^x4+PaRsp<_P<42q3k!6aMb(=LraF3j-|`u;$tMRv3Iq#`&f)I6*o z$ek+29q$ZNwYa1{z5n9xDdSr5xE%Y9zE8g#zV?0kl)tQ}4FS_peXxmN@;&)awE1fk zwxkokg((A6yIxsjwC=m!akei%)AzyH#}NK-IqNYFqoG8%z!?2nDO5}v}`apS48&N)7d zGDt)T^jD?1e|sR$0=-Y8@ar&``j#+Bs) z0VW1b5i#@Uj|gh^g}}JaOzIfogQ=hY%8l@m_ae?Oa)VE(fb89Ltr);458PDoJN9Ch zf8y2qL|d<`7)GuM1$~RF#7$(h3Z)hLZTW@go+Cw`!LmRNEzlk4&wztUn%@A36(u=M zblz+_+?v)k-Xbx;?i_+ADsDXU=Hby$^#)?gD;5^t!hROd{KpGH0=EKJjOePJ^wHXfY;!rN9ymMSz zahe@F`4a+MJZ!SFeaT&?LQh3t1MSUscXh??Rt;Ijw>;x#VC9%N8mT+N6<1VIz944Q zT5w2NAYHdu!PTRw+(5zLfsldg3-skNOC)+(O`(IJJwQXZ(j50=-=Hc&)*4? ztY5;hD8R=}Z3O9?mQ`A;Cgm|HIqRH^KjuG8Go+ar!Hihs*=UURm*dIDl)5MN+2P-^Uz*RJka-A%-8qfKH)!cDnBr2@K1qSGsw zQsv(Ezb&Wb4Ax9fj=1;vMV+^>+gkdkP|eIFdc9omJTArO;~SCxMV&Fwe*D*)@<=^1 zLG(wz>DAAz49J!Cq}c*Au23ObC^#kDz)Y}%mw!TEXLj1yuNd-8h>`?S8D^}S%J=5R zs_z~u6Tr`xiTk=%`vNTPdxG-+MfK)#nBa5 zPzI50CIxU&?ukqmAaQ$%xBi^6N~h5L<&^pNT-N@gR%6P<0!m;vP>7U-hT~>aUhs2RJF?jgbWg<2%u0MI=}~qz z@wb>0xWw}|B;u4oE5H8TyJ?nR=WjPRUi6MBuzI7bfopFIzwH-LK&zWNPx&FltT89| zJkIPW)vR?S+IhQ;8jM$^oHx<4QKISI%GLLSMgN zp395REbG3^i!V^_%Wal%(%$e0o1KdxBv<^%S6Jf0af2y7$GIo)5>^Q1tsIU1;yRaj zwjQ-9@w+`Mr>pklKx}?!W(R37H|X|-^Cw53D%?iGd-tnd@uvt}CPPlCK(y>|iKp4B z&dt5))q3;PwHxX2EjyQciod&*Wkref%OKO)FP8ZHYIL8?z4F2$Ch3f}wrFmAly%dl zZ)NH(m;fJ{A*9OOfgFFTAfv93ggkKJMyL_q{~8qkwO$+suAy@r1-=wC&VqYsmi{I(x z7DQ+LmqJZXzrUMP3oPP%2UF&8ToHKegv^7D*JmOc#U4rXF$(vtJCAB5jdAvvI2EpV zi;mwg-au%6+G#;yKndRB<`+YvF03I`Nj zS@~gaV%xJ*ls3HA8Fj|BV?=&C&n{uzy>X@K`bw;fvvJPEA0n$qRMDS2_AP(#!cEYg z{M6Cm$hxC%Tq@(oR#RlIhh7OtVb1K)sne)S6p^{M8J>U6u7=xMq?$Y7jP}pZRvG?B zt7SLwyONx^GMubhy1&Ar^WMe15zXNJ{mts0=skn|wI6-7bx*VWPg?hEE*Ih~Qe{H8 z8%11lgwmzzqg-Qs6WIml`c}H^53ded+6Kc%8@z@7eLaScB9aHWb8td9*K)_eo_8oL zs;36y>-VrrkM0UjsnL2xF>Z50LctHQ5*J!zll2zIHUFWq?>MKU7xkWbr-lBT&+|K1 zYJBh$`!OxwLWQngue9S!D>vQ?Z3^E}pH(s`@afJ>EvT&2UtN{C*iyucJCo23rZe`3 ztQ<`^S>6=#$iS&o@!8 zxtl@VktT*YiF<-kx_&{jL?h#3;HFVp!D;T$L*n^9xPv+REPemfuf0Ls=2Up)na!pg z8_;#8As@OF-T>;%yk}UQPBK4Gug|D~$-O3gHq*TbR`xWD86kc_roTDG5(MnEllL`j z^BmYN&A=~{NI%Y5Byc(D2*&8dI3Pr~ z^28^Fx(hC9{tpLt?QY-oxdYH*yaY#qXo=DHDvY>ZejPp*oWktDG11G;ThFfSeeXHn zZzV|AxB1=hk@m)|Lg(0BU8^5^62M3<#;RS9T7Duj;eBIdM0rb4vvJd_dSum1HcZfC zw(chgSZ|F7nL6%!*SNWD{4Y_@gqxu=H#W)Bh>PLtlyA(+@dVj%LH~b@YD{xyMA6w( zY4cv@sjHvAJ>$bQg_mS!zBesV^=`7RsMZgpD9~{1pG_AUC^2ocQ=Rc=2IX77Z2}N` z^DTPNr2_>a^Ima%1OX)Y2~bp0Kcvi*)PORNarthcZd*T{M6bAB%uF}9;r{q;ENKKd zuqgCUADIRgot?|g-7RXitG!IMd@U~A7&ioWAcL}kB+nmB5qoY%)R1BUC9potW(hzQ zvnJoZmE!Uwlj>YBm373UuV=UoaD)F|%$my6e`n=qy3mar`gcrdJQDWMeLdZPT*M`Zl<9b=t)5 z8APoT(piMF1Px#mTg*4ZgB0IQUn7IvK#Ut!#k#yO*PKWmEy-mv9Tc^mw*e^VU>Th{ z)oqm<&VNym7)*?A+Cer|Rr1DSU;-i%&7V2v_tSqBH^jF$f%C7qvOBWZ(-W*WF<&k_ zV7-gpEEPA)t*)`qFnEQ?z=`jy7Dy1?b7V3D99 z*+y~2{9II1*7ZrAsbZGRYZD%lTumbC^edDv)KF{9-)!v$I@h+$A`JX4I&K^L^*FBd zPk854t95Kz>zHpzoA|Tr*2$obLh@JI{PkBEV^yN;np?+{l`U+9|NK^-!9bfEwXbB2 zU%tQ0;MRMgDeC9oXWA0&} zf8;dT3_3Q1FUR|)yog}AbZV8#Vr!hI%c!G8Kotihv3L#UT1DuHmcwA>Oeo z6&Jp^ONTgK*I!`Ior(7TSXq)!v8A{i@p%!4ANKRzN$6^t-u4)AFUv_PO`V99smWYv z#09Eb)Z-V@tj#E(8&P)Fhe=OvmJHVAsZiOfxYQLq(vj$MzoVp}+6URR>4~n0t{L7a z6sos~w~6T1wMa9~6OdhXUyffUd@>s>+;&KU#ppaBsb%|jL<~*T((!XMbQYoR9?ml z_tll4z?4+9VXhE2pUWKwy%;#nH+YnLq`LLpp;VuPU_S_XQGN`>>XL&fYDvi?FC4uJ z!I24xZvcE5|K8j9UE;l)@%KKIqrWTOsdcA1rf!5?fJ5sk4JY8f=Ji*U-dM;dfX#tj$xy zXgFy0y?$34pCtn+{a!h&&i@4q;_0*)FyEj${AkAk(fEVQTlf|k*$3CbjO}aeWM)vr z8uaF(rw*qoHH}UT{&%%H)}?;ebUIPDd1PZZBX~z=KZl`a>dtlny6i|zcJ+9g^F)EC z`tE}Uya>7-M=p_N;-`m{Gnx|2oiPA4RXS#38#DgeO#ch5oD~^9pr{p9+c8k3!T~D# zUHfCVNgd0;9iT~O4a)Fd1_Te3+%7zQpsb)nct)#5oL#Gkx*`YfODn)-6|fe%-&vH9(KNs9H@)J4PFja77T`1+Lml@&z_YwmYTGZb9bT{?wc>RUW+q)c zm-1$L4PYwl*A`ONiH0fw(tf4jOu?6F?cw}gjK}Zb)tuvI8L*`hh04-)CdKjF6u5NP zuoW6LC>@baZ`3(=4*~m_6D|@v+gz^PWxXo1zUP!ZJTCrWEj=*_`S+SM?`KNoF0b}T zFInxIE7~5zQM{iyd2{2;VSZxNoGLmmAobvsXsHbEYRQ+GxsZ7?#cS1sR+*;m#ZJ5_F!wc2 zO_G+qcqG(XM|09$xeO^gmt`zAG4XCkuj#INq_VKwuz}8OL#4fWR4}fhJ8mOwxKk(F zstcc`laR#C%n{8>*vOXq)NEx@;q`<~ULm<-$}u^qYtmbAp9b2C+EaZixn~tuGMiF0 z*Gu%Lyg|wgV|`-!05zmGx>$8QE*nhwAX54WD2~1dgM{IQ9F*9)a!uj4FJ{A^Y(;u( zft;QtTQM?Sv+?=w!O`H*PVBqM#Uft?`-6qA3k#;I}nlb(h zjkmWp1|1@mrPJBd<6}0JXH+A3SLbqLdcYXBvTe6A^KOBu57iLTy@!j=b&lnor(D0p< z{+}cKotiMnafVo+IHRLKo77n#2TjnpN>Mm7(hyTXB`G<-BRt8nc=vZ)U{^ z@e^S*S@r>cmCzE>eP^XP-$v9Cb7RO+BrJod{dH(0mQ#Xw(Sjs2$xRO7I#7H$!e~`k zM8de|MSzOp?B1sqybNEsPg!(4vR6VW2(IOp@LJ5?}`o1;{BKn9bk+B7~e8LC9&qh7_J7;0B0>W&ljk{ydcd6ikQA z699Mi?H~}Qa!wIJiu9>w9ULrIN`jQfDc432vc_Ak#VhQX_g-$c>!8lW&KfT z!3+bn#`!Eo@3@5j(n3C_&EO?F6Qg0KT+9{C@n>Bgf(GP`DA0~(gedbWjDW*}M3|j= zsVL~RBV{ur(HPGY(`WywnH^hKi_`!<(JP7q~c|Hv^&IQ-> z%YYCP%S8%8$dqH7`oD#R5cFeTGrRdvi zq}d-yB#?&X27C*jqQ6D})BLykhd^!A9t^;qu}ByRsw%oEnfo}gim_VO{!qb!r@^oq0Bm`6VHQN=Dku#PuNAN| zKMH-b-fm}g6%Z6gdXTA-QgB56EC6j6FI(YpolOo=!L=PU4=)u#J@^lPvG2qqm0Cyf z>=1PwWab|(H{p1;5Yudjj}rc1OaO8=EdEXE#Lf~!+SK)xp`KSQ>T!Q8Gyq91#mRP} zU4&wd#MOjr;u-Bd(DD=@i@u1eG=p?{vJUb1#0hr_A`jQCVs%hyBrJ!qJI<*_<&&Y_ z(m|8j|8U_qAO(qHB-2!8tkX+B1uG!#;c$hR|9`!#!bX@DIe6H@+o#T)OaBJHd$b{< zXW)l-ac_i_Dd~hF1p!yA?jYLu|M(Exi8TQ?7DN2czpQ!!a!>@*ZvGZ@S?ubj02B}5 z>&QT?Od&bvypH!BcV7TOb`=1PF{THLK%?5KzdIm77*w6 zwHiia=wk(%4DD$qvn0>h!538Hev5nn_6>O|@O3%SEWU>}GU3R|5LxA8i#LL+^U#YX z=1?sG>5?Y=`yER7CeZsKhhK*MA~a=Fy6i@`sBcNg#`0tk(xaz79f2h z%U7lL!oWMeKehzD__vM*TQ%gr@3L}tL4=<8gYW6vBw#Fn_1uDtXYT-Htr6;RK+uOh z_%x|h3FOfzPX8+ff;vIv*AMi;2Y97#8PDtt0B)aEPcI*Ak0;nqs?;AhUAw-b>&0_> z7{p1yDpp}_GR?AcGf)4$3>L<$ge)dcy$mX0o4Yd;zkkEe!jt@0RBtJY?*4oJ)>mfW zxD6+b)Typ~+{^YJ@hON>EmW=M{}9Y@N;szETkH@;AsjSW3`ne|14=TAaxdvaz;3Y} zF1OhiFS+L^vlk!O^rkMhZm=gmWM*%;X?e^hJbA{+Ngc51XBB|r7bru)j#a{lXD&{|i-^G|9w zeERjgs~J*t7sz$<0c;WwxL*7rZ+H1`&V^Q;Y)keP_z&ceWjfBGs;yD3dz7j%tZPC! zmebM4m(;@plm`&3^Fx-S=hQmJd)HJ7bApM#HG1nEm0Kj1hGOktBpHDn|AjM;RLYc# z*-?R}!VGPYAC@sH*yD#1YU=tN%WOj;p{5EaVY-b=-+)aJrx-^VsD{Zj~4fRO#7zs$P;u^{soNmiI2~*cPK#J zrIF)^JIQN=B=0MH8bHT@RceaTC(vP*pX#lYr%qxouO|6!3xFGlKx*dadxoz@{dY~G z=1#81K3rgrIIU0}xrp}?DBY|!&*VP2xn8|9AoI^0R}w8?IdI0|e-1swN>OZx`icDW zsV#KOMBzo(x^!J{&#!w)R-b(RRT@k5@W$682R`l$^rtS`-iDs?-GR&3&1+{!;Kla<}k z?~r9xo9o8XmY;GrCq_2d%vbxayYb0RfhfdgGowy5qCPtHm)W~!fVI^k#nr%A1&X@+ zYVHkV&At~La1K6}7GvBBFA%3Bt3~_IynSj$#j{`1*s8Y0^1$-*Sthu~uPTe{eAW2v zf1iK&K5K@A%4vG#Mia))-^fDi{jrA)u4Lj66=7P8@^MbxKWBMIDEo%Olo*=Dt|+w244Ie`-`Fx_rDeIYc&>T zCJCcKvR+n+pW$YwE`zHEa|I3}Aa>{$U^Zm00^{qz(_)MYNaLJ$_WpQa_%dps-pIiR z$l1dg5aTIc8YP6ayGfXHLjD+5o1$?fI=w2Afs1*%xc637-|XZ|F&-zAHcSck><2Se}wRMr6oJSfBfSpE^DK> z5?Z3Yw71rR+=ob&1o6fZpeYnQXY~3D4Zv7%I^%K1Wn# z!dw_-a?YJFz^g8Itj?N(a1JeJSzH)0NY9u6W~qjeYDU+%p`Hpap9}$e`-%lrY6Hn3 zC~=7>z(HXe>7@`Qv`!F! zGY4dq#oRu|Iew)T6hMu&{C!6ACO{1Uz{?+4rOT$k!-IUzn@>PZW$z`Tln^Ia6NJ2%;U-;HA}K)u7%d|x-sU!aneulm3GCmi zjB=BMmj!EISRL%ljGu0>dguD{y&aUfPvuVjN;o)3m^-L}oiXFc4I#6(nHuQSA$(SqA{07b+-Sa91cb zn1#>EdosHLWEw5Yx+iFrIDHu<_ggd*fNB1gHtY!`q0lrO@XO}pBIZKEmO`C;AWDht zhJhngy ze*a7d9n_Vf?y0v5s89lc%!68|CVGg2csf%6i&X%d{A5h4g1fr zB2fug9^!9_uyc!cyVveKK};WljlmbH;Ez<~ox@LDLMA&C=hR|(C|nfYzL+Q#T?9sC zF$8r2&mBcT@q$mspjaY`2u(%R!7?8!FH|%?`Z7o4a>M^&KL^sp!e|n!c%H}q)9~%Z z6US%Y+;kNFV72I6NH9DGW|^Q0ZXzgKjJm;a?^%*q?t=vv(4q8R$!p*xW2zyX`$8tq z1jytHlMVgHN(X8b&U}sMEiWq@3qBz!fnM_O*P959|JpTGCyJywEpuOLF@b^bP~`+9 z4^ObqY9s{uVYJnFb#=sDPTg)UpjC&8Rd~Ngg2w& zfkS$K9Z19jG2=|qZ?RBpTnt|-utbA;f#5gX9F^oN#9@jDOWC+Q$_w{CW+CsseNd}> zS(_CDS7)htSjI!nb?qC#uR?1+Fb2U6k_)ko+@?d7!)43}l4H9e*!H%z>Nw|kih_nr z=RjmYP)XR?15^(9GI8giry#(INl1EX10L~jQHV@|@=_2@u!iI=V{b=x`|PY-iF7P` z5DEAcvJzP9ap=s7F{ili*H(*3DwIUV=o+l9_otrZAaV}y(=2m+!JsNb%izkPM*<$i zd^wTj^X$Vo=1@ zo37VctJa}eU_T+Uf=g6L;18c4Y;v29P@MGh^nQ3yoz1sHGdwx~Iq>p-D;(CEs?peE zoqvIS&FdkpiCc$?M2jfiq;3LBf8`P}n8bvb?jNMspbu|*xcR=Mg0q?BzkZ`Ip%P~A z9aFJC4iqvpUHKh$M_mOK5@l?+2euwJtCWJYD}YdQq6l5u zh4I~(0o^a^W(OaXzE&jNh@&W2V&r{cud|Sx3zJdMvMxQr`aPyO2cyyU)leG$vwRMU z89g^+1N_K;|2u@wCNR#lV)8=WUm(Ks;SuDmC({}3%mMsZu=o+u6U2=bGPKD7i0ftH zM_TfrFJ|Zd8QJylAT9<{<_o+ml|OkxhZbo0bo7-4lKiV_vWj!tdl}0Qlm*VLYX!r> zOxdI~E|AdB8Ms3VuYEU4UVt08E*4gUo|k%LQ1}CD1N#E74^o_#g*L{2@Fl2t<)WPD z0lT;XGfp5ee=?Xv(Ln<|$`hKZ(`xrVb0VgRgEona52k)J^{ejAcE)>h%1&}MAXcbj zu)t%SMME&C%gpe=dwG~DU7IZ=XpA>ey~#n5X&l#v&e}yU@*dVfqVB+A z!5pD)gI~MeM8zm zbeMDG-=X+2*uhEqa7e=;R=P;WKlXnV*Iq*Hvq1^WhIU2H$iZ>}3Y?~)gXXkuu{{Dn zxi6bxSv;cl7?Ssi{|AN&`I`_shws?}+r(hZX?|f-E%_!LnnYo7 z!j~|qX&fn@iEpSVNTF&lSps7#Bp5mPFz|h_ss_ic|JzF?5(b2`#I(cSn?dU!{B~as z1qR>faZ?YTnyD2Fy&{jX;NLUO&s~eVRb$HGo}IfysA|kQn@6BP5dvHtKS0gq0)Nc! zpb=>Ba>oC`a;jpFptD7uD0HihRzh{VQ&-K^%RVif4I&K_z$%eT30M}MvOGwZfL;q< z$RXzY@kKKY^DbhH?q2ylS%y{d5B@%DrO)+dY9zMT@8}s9JB_UR759H6 zqi-H&FjPWVTsgv!a6DXGpeEJJDi{R&f6HwEmH}3^Gw`tE9q6~c_A`?T@CX1t!3YHq z5GSF2!j7NjN%)iq^1lQ@d`34d&12d1Ezq`AXqaLqG{Imq4_4N;ySC9?|IoCcjB{XOD+HY-3^ZAt&wo>FyoHmSgHvIxt>y#7E zh(VMQL$C1Nn(|1{e`~HhWPpYsK-_zN(wC6x+ef0y=A`RWCg{-PES1r(^~Heg9X7zj-AX&oI^QzuQ;ClQFZu+_ztPPi24E zw)Ht@%E;c={laLKZQ1>wcDGaa@j`o_l(uta@wi|Sy?w5l-JR8UYF#^ThsAe?^!GPr zS2GtHra*JYrVFx@&tsthBL~tBqQQ^FN=TzIrYO`F%tpUhm{xlJn-RydP=(<;yk`hs z*n+>vx|MiewBXb`N#e$kLNIVM7bQr6b}8olH@?ZclHUZ|D?0l z#$DfBV$3WIx-2hXa$vICJM~}7i{?h`qt+`*N=WD+yTRoKcv?JCkSxTz1c?` zNFSc&X!F*RA0V>P?ljW(LS?_{_juhi@(oYg0u6FNLi!;MC}h!=Ry(P2dwcTC;;r|$r_*+7G-!gB&d!@eRo_;cI#u1i?DQQ5*ZP>++;4v% zk5J#|*u*!Xh_gU93MbyQCsv(Drv%&tRZHo>M*Q@M_Pv8ah?qd#3PiR%43vL3e;Iun z;!Ysw5 z&)IBCfBAElgSV#t()I}dQ?!F{j8yT$NRpA#`OeB5mos;`cPFA z8K{M(rEl{!JK#MVo;C+?XvzfHU%z)ca^M&{$B`c^UE;wtuIm=ks{8-W^#t$Fb?vKz zWMwEf z!TCPTm3#;M`?AKUkpimrCzTuI&>w|#X}e)Y@W45vyU=An0-OC^KLD80k-`h1at{Rg zziV6`hmAu66eMetXXSE%2smYDK7aunpyaH@#1dwB{@oE2Sgq=kwUlh8it%_ zoc9E1xZR(+Z#x2SmF1<$Dr(;DCKhP|FoytC#s5+dnBYWLkS&>zi~}}hY8+E>f-R$h zckyp6Ps}ia<{DXEwGjdB51emgA1pMMLQvG!Inf)W*2h%Tx#`a_#3OA4Wi*U?I?360 z5;FH^pCE(W=LGDlTWAD-H@i{{%KeYDia9NLain1mm}EW!YlMn40oeqi~* z=lD+Hl)wJYLX&@0!&Fr@a+14i6`IOKutHCBLI@az;#;7x+)4gqH^SP4IWdw$ZTD0b z`wu`QYQRMxErGzT0a!)~!BayY(?=Gj!8Q0gAZQTo8_|`?%})22TAw%O7P!XYYQIKj zJOp53<6|d=yG&nP1Fa4!@$?Z z04;QkM-SAQL!*R3cH_K2iOS1VM_?x(b_+a4dvCy2^~nZ-&IA(Z&;pYFSZHcCySV6d zt9gAr0spfwiJs6BVI9aT?Ta??N`Rb1vVMj`y2#$=i3YO`h+s=BKl&~;&q5thp<+Z9vfWgR$ zUFmDG&HwITY+!yHl-_q!JO!W^q4965!cJr)Zk*&>n*X|$2>4f`CY+ZjkEleL*Fiic z915dEIUkM(Ab6NN@5U+dQfpg%R1yFcXS8h;1jAuhqt(IB7U zxgl_6G<*#!yH{3S2^4-Rw-%V9b~OQ!9Ja!gWUg5hjr9TLkBQ+&o}^T2#yY>M*qjH= z$IdeVp1DaM^C5sZ*^bCcKyPIO+?P#-oj5L9l*lfa+mu;e#K2jg>O%cV$;P&ui znjBFnUdu*MT=hgv89l(xz%wO3K`hgZLdxK_27A1V`GhUIJd~=KK|hrjw~|l()$q01 zn(8q!XxZ_i02}CfQd0xUWw#_-odNm@04SygC%&z#2NG;ee$4zcTxYywdSnk-jAX>GowbH!aNOGQ_c9lL>9eM|W z7fNPBK>> z{084}jo|_gNH$U?*Or0FccbIoE7l+%ZjK4>_q@LM*NtC;i7OLfH-l3w11ayufd%{D z!aqu?8A9t6`&!pL3uwmO*M_}Vx&9Z6l^~cID(J{UaCVloS@D(1TWGcG1N$tacknxV zPO&spl@2ONPn9HP4DHX=7G8GkS*V&BF)Z8B^53+sSz%K3+Iqc8jE_h}LuE=Y-GxSf zmelzj1SA2C^^n3dhNUka5};WP6xWkLT`J{e-R; z)h(xcDu6&vC237AmSE2OK+k&Y16J&#xHo z-srE#?<_dQWi0UHO-1pe6C*xlzT4XlO}Gbw@=XpF)*AWoyC8z~{CYpYQD6W_t1Jn> z6LzU4P={xZgSEItmn#Z~SA6H)<5B2u{f4NlB zN>NEfwz6eUwu;J560(*(hAh!oMw5FhAw;&ZCA*Mq>`R+{%QnndD$8Ij8HQ$t@jLH9 zpZop&(W9DS=Dg2&o!9z&JzrB^mxS6?D81f?fD#Cdd4B-9VkiFifWW5J>@Q=E&az<0 zG>n9#`ui`&yU?r;i7PBHAr=+CZ*^yF&7_1v?vx8~-YiITKLe`Ly*w-@`*0y*`Pj2Lm$iFMk$JE=V*OYJdiJmt?74W6akKG~Hnp&bfX*b3GX1o4 zi}Umk`bBiF-k>hr(OS7h*42BEa{1dxtiw2<_1G~r5IM)Vpgqs}{M8wgD;20kLf62J zhJB~CcvC;l2MbR9mQL-i?Z%S~V7DZoEQOAN&1b>XG9{6-Un?uc_WyrFtWLarB6u{u z650!P`QIgEN1&s#ru;iCE-&W>mMUjwmg>K_3?0$3v*si z)@0I|GM{s{;HAKx{ERFt$lc2~>7PcZrdo-^(pmaW?dAgVvx$65*BSH37pz*VTl`@?^;zx0m^Vo*M( zmKFp+4afV8g@QcK-WUHTPjnHKi&;5ae6MakZ3$Z2=x)Bp?*!c(}$DKsNu%ncC^X$;fC@xbeWDe(!55 z-LARJSrHcCaU~h^Jfb7!U-C8B+NX^gAomUP=(QCu?KP2533oBJLS$nyw`NELjovL9 z$@)UuYC{brU!xatr;gcI2TX216}PX>41Ocn<$4#)Y(P(CldYV4+z?thz43ZXs?o4DGGIGwCZk8yq)rPm^5G>AonKt1S^!@Y_YB z*PWxm0a8#tbHzSfEy(v!4(Z{_)TfTR3fz zGlX`~6D;qHhJd6=X;#^hHFpXrDP|S*WcrhKkB4?6?oO6g7G`WL;-9{@h$(S1TVZh( zwfXl7GZB>()BRAT-ST|*N&g2Ae3gsb3{nem z#@U4S*uE(_5o=UZ(|R1*ER;ChiqFv@Ti7?O25Wt|ieaN})cO{zM7HZL?78v0?AH1} zOfqjk^EU{<*nBVv3j3p zbQDT13dnzLbW9b5?f5L|sHH@R{bAl3wEYntbTW5T*?d`|Ddx_0V0!IYCrbm?5(+o3 z%jZtYE9N?n^%Loty=cHPTeTCkWbr@bumPswe%yE-)7f)VKW8>n5D!VALQkh2`zW$~ zMwiXNgI+ zotr)%$=+VoXluO1whFu>p)uZUqR6DAoP??ys`z_P|yT{i}?$8THmd2+S7VHINw?cOfJ0P zZuIIA$QSAJQnNLuROYIe@d30I%gBD~3o+_8E({lTOCEIBO|2UcXJvrwpkJY;2biy9 z3i0?rDR*As9|E{Mc13sYz=ge+FG#LeE@;UE^)g*2I-fhi;CzfGIjme6IXX z+>F$t3b-3}8wKeH3`~t(>JPsLn=>}TvOX0?(=|!LXY19p96cjmJ|G|ZesThll0l6*F zaaG{iXz_9e7Swzv%)9kxcMD;b(5(BR)JIjl6CEsb>?@Qr)1{WM$eB(>2aaqE+N;Vp z=j6xAMnDXacGjd|rLRj`RHF@IUF6bpkMi2BK>#=H4|+?`l7UL!(#K3mlV8vt|D2SX z*)^v&y^L!(zp;RqJ0a+v<1+%nZ*%_zq!DuV5#sJ`zE`=qv-TY2HJD@~D()G-O!%k6 zI!|qUv+L_An0<=nj7Qbx)d(~RBv(KvvSEc!??jKir_h|t@jYaahpOy>x*V)pqUouT z367TKpDX%XB~GkPTi@`iZu4pg3|m;_cx4ka2-+oCz!;h-ucU5o^Wc@uhil3gKdNC% z^uZ*kouH8}Ab%l?nC>t~Bg*?%$DFrIhP)q?psSp9H6dC72J2)=L&KpWYmZ=LXfkeE zAZTD+571<-@k&z9V;4^+TyCG1PGnVfh)4?t0~C(6)FbK-Cvvp8llmFi=@-`oWPuq& zAcqVPo#@XGXGBfWUPLDt^mz;q=_{j3p@c z)h6Po3i3os=ZGpT6FQeD?-4QO3USPJNB-+XqT57r=tO?%g#1 z+Y8?go&hhMrcVVtZvNuJg&0)#6y1VL-%WJ{&W$~wVf`MQkFi2X1WYih)oY8}y^@&# zUWi0l2k_XzY))`NW&o>)3+_}(asJ`?arAPF(8Irww0xb1S5*iw0msw<1tW-2A4spM z0Px9;6(L9lT~FR&nfDz7=`?DA0gNu(z&vm>?P1j#daHW}s^(8Jd-hfqu>%nB?#@?@u|L95_Qa+Z&Fng^vAFA+eve@yU z3B^A-KcX=&jhmA<%XKuFuAl#q<}g)Se_ryezK-dU=kx?^<1=VRfn4D|(f_5=CFK|v zc9Snh;$s@qgW2wkYMdAH7c3W$jr|L0$TG>;Y$4n`m}5My3L}JxS^Mt`Gvwv;k}W5I z9ZM{k0+0D!8+o{EQ6^AD@+{|by&v*a0B4EY6ds3&{sRc~TFrIw$iSft@y?EaTdg-7 z0_)m;#-8m7eRB1XL}c+?01bCn>WvK+y+-e3MgCv{K(~{H4+VC7l~T5zgwK!ze+F&* z04mbZwV2?C`Lut!RbBe;K6;w%!3=qdPDcP_;MyAKBWBg>;t<~t0QTO;oG7kSzJUYy zV%u*Vpb?dU(b{4X4wmYh!tG`A31D@shot_K5^EBP+{9#n$vfWx&Azus;%})$eb5$b zY;*Oga}6S{?2gU=C#$7nZ!YrG+J&ne(qD7)b`DSQ1Yg(22Z19_{psO2N>V6 z&lFv8=T2_ODQvZR zw2H!pi!3*fIN{bEZl6KU0wpEeT%{}4y{=hrk~rPEt#lqSa8?Xx=s^1hqW;ye##QF| z8r>kSIRjvlYJE$-h>GUN$hhot?{SGxNyTP_ksLVN`^k*yocC-Fpoo|`7dbJ4Ud~dQ z$~QX80hLFQU-u;?DVgb5KZ=3Q>pE{53ot!mHVrTr#a%PS&sHgujt)x~feCqE|E3Vm z`yu#=@nQZ*_OCG6h~=M6Xmp#9qz|&`$v+pyPx+UY1MM8OUuF{_AJ`pMMoy%sPuP#N zENS&tXSuOQekjxd+^O;PYJIc^!}**bySUpD=*S4;tgMo_>DtGKU?Rnl`7@@T|@u9^l@{jnC`mp0iFmuk;Sf@x<@3&*R81@{Lu zP6f-Ve*~81YTE4jW#3Y_%g+>UXD>lT$N_-ruiSA}_OK6Ce;02MVPr#3m-8WqS!EWA zVw2BIAY6v!z%c1uWh{6;Z5aGdAqOHHJao6AZC6cOGIMan^c-*T++_hWtyWX!y*GP? zqW?rql~EU|YfGtz1N00lcb)InkAIa;f{%%hXbkXsJsxc#Q=4~#rKD4%IX@OmutM6? zznzbqA~L=+_#Vb6?&cB=p`GqA_tR^Uk05GN!vFdh-yMS-+=cdc^Gk8z4=$6bgWu%q zEt*h?Pc#9oKbzBK&3UHfJ4tu=9$rbKnN@p}U4YPD(F9inwO__^U!v^`if>oe)LMBh z7ziMcdzz8y6tmr-^B)!~&H-MY=BQvfogW}T)#9b*lk1%xc(0k)C`DyDTf(8ukyM4i z{&YLBa&%5$d!z%nI zC%)sFD}W)~S6I5Oyqz}{Vx4PVAEN_ldOVi6P@_Tba|SOR66z_K28qRLV@GY2M7>14LPbMk zvZ38!Ki;#0?6FycDn%f(!o5=|sy`C{t0DA&mQ&4Ta$b#=?qe<&FtM5cNDIr)qcYdn zfnN!3`^L=7+}%MT=jW%BjNWniB)*}=G!VTK$Z(orWyN+az=hA$Rq7L z0z4Prmb2^Ted6@OeiMI>j|b}VBHEqbYxfv;^a0eCa<73AEJLBXKj33}=rii(#4Uh1 z!!u(S@A@J{jDS@;?o^#a7_VC`dSp5334U?rT#rv!&nkC+ZX-8mp0y~{htI8jnlyI` zK!uRQ``%MVA*e>5A;5Ni=LL%I{a)uVExMWkuKxc9I6oGEy0G$n@z#I|&_m@j)S&=0 zO3D)s2{oIjD=e%-h1CG$w+~v1{HLr3Y{+k5l=)kW@7*)ygE)A)XYMvXTeaqgBQYiu8PfD@qE zk_Dc#igR?X8yG#goqflxswa8fE!iBzE87EsLFpAMz8_@34c+C!`6We=S%HJz zywrkio@jtQ;?FBt_=!F$YiRU;Pp46axeR!W5};EhK=TL0B>(LA!;h;U>LF%GAY8hP zUac-5mu*4G;(<1h-se;>-$r_MCE>0!8i!JIn(LGxL8?}j4I##hHETI zWy&Hyem5BypNBlVXto|x(19ifo_Ju*>{0LZ03R5M2MIAU3aAi+WuS|%_bPVselSH2 z`_wL&{^;>dt^@6LuAPsECO^ z!?-rO_V)cDMqBnCXbxJ(H9%sYzc91dR>WJo{h%!S%0^*6jJlXFBKw`BksQcCOFIfE z5pv!I5GKx>c8~~^0dXz_*%GX7);%V{3*Y_iOHg{BoB7hXnHk!+tsd zc8#&&(Udu^$W<3C*j2cP<8=AGiyT7R-64Qk95iJu%UsvqJyWKaz=CldA1fXooZ<5t zVZ2L6?zOWWiTU-wpNGiz&P4YYm`KgYr1Zv~fy;~&ngb$THNIRhR6ys<({1=ct*p!k zIYcfQTsrg+4{d<3V*Zxb1TEklrj5nRVe*S^mZe|>*?%5U=O*1$4W1dV9gCNUZoI$% zTw$~tqy@M9ctES#Fe`a&|&0hsz?BGUNwn-4gG?R0TLaE8Lyt# zWC{LsA*t~xvy$eo9xiKWzQ>6osND@Z>fP^d>}R5nTLf=9v4O_!r#1bun<5a$C=Vm) z@?g1TT1f;tCm0lvy&(bpdmoUY_VdqF&=54SB(D?$0^F3k?VjVT3*Vpqn031>CIpaT zZ`aKa-+u?@UjWSI&9sGAHC)H<-`jm)pyu`Nro>1-{%TvGRtNM$vSx$RF0M9YBu8{#5kSkD8W;?{2WWq9z3Sy2P1YU0p<2B_F`jj~@NkECfx7)`CJ#&uI?A}q7}25g zz2M#E$S4KM3ADhqJ~6XFjyCvMQAUsrhV~rj`Y>=E^c;+w=?565uNJy5>?$NShGp0I zcb`X>e*csM$Ls)uIN$-%sriwe8YH)H$Z3b2MKT9!>2Aw^NdL%~CrtppU(on1Gapy@ zK$-qplp2oP*Rfw?n9#4bOc?b$j|$7=qZn9(6j@)7x&-nLY7bH0P|*3#xG(jO&15? z3;~c)c*42?aD`0s8bSR#4*O^mC?75c0uZhpx!V56ZtJgUE&ZU}|Jr%?M0R7Qhn!1d zLGOeAZrp`mphR~VTSfQa>o0##nvlF=bDQzhu8h#nCU<|55&}Eq4VrQ6qN*M;jBY>m z^J7kapNz3y0C)Lka6;n@Q`V^%NyVE7cc9N}{0}K)M{4d(F|dt8@1UNi)O;~Oxyj|K zQjx|2%BO!?mA9|QjA5hh5x+0DZ>KW0{ee&KJfxs_511|SQ@Nj>K-+!tFpD%=%s)}` zCM*Bp*Vq;hKw=8!cZik~Sm!Im!S#kV!|13}HS&#+g|0opS&05)3T2Hnf;BKhmqnMh z4(o<9?F$fi=si1U!alYW3xsk)2h0on_Lfi?M~1-v!knOGPfMgd|DQN+pBmu9|D^+| zLr3Lxh*N&|YJ(JqK@c6qaHA&=E_=m&_YG~f-`{2<;`%M=z1Ki-CN82;e1LJIyFDYi zX=n9J(}GX~s%@N-*lu=CR9#KJ`GTaW!6#f?GtOBIEDnGiXqCV7uNfEYj6botf#eCK zMRRLcR#Fb6zJ6F7O-Gs0h2xO;LqE#KcNi430c#zhW^VIok678ReS!LTL7r{+npocU z1{Q#!8ACU1KBWBIchaXNsU1(P%5X>$EwWSF2hBs6qdrlF!IHJ2AL<{%|n%XZ?sfDjcVPh6h7 zK2EBRkU!>5JfJbMpT*05Yrm4>GeLW&D&8 zP}za$a$r=z|I8?~6}bIjkLtiaO<17@y*W{ke{=Wwb~o<_Mo>&XgJ$@XR}3>%>pLVw zKZ~g<~+V*WKPu>-~?t z)Q}WF#Wx!CxN$J&KPY@4H4dU_E=*lel;i1!g$iZc!c_)!Pr3Lzi_u$t!P560KN9oM z070Ll21(>T(Hm;|ECB)#PR?4l)(6@I%ziw*>(yb)k-!>a>N$+IzZ@=AI_phohZ zUXU)_USkK-Y3**;;JGdnMsSb7$VCYE1`){QDP7pPSD+{?1it11C^>gowDKS80sO?k zLjD6f*)?4S!_WOli?`p+1?&h^n2B0D81?%7M(S2Zg`3|_pVp3+1BV;In8&APV+ECA zSLQOu{-Ym1)>R<_5N#7sLzFLocd##rH(6TI$C#{)L~n z5;If(obZ;k|5hJ=D;&>~!jYiK^6uIB7k&&!pI<*56PJEU$Igz&=g^~}nitG|6>(1~ zy*508FO3yT3UMQQIE0VC@pnqsfBIq!W|Nj@V(>iqv%|U9!iF;iN3sl@Cav}euOijo zDnzO~gas+DXx=rAuR-~PKM6tmXuTb0{O8Fl7Z0xseM)WK?#k$3<`5GM^j@<;jH&J{ z5BYZA>B;ne-hPj$;>PZF4ggteq%gw9Uw=S|6hi-5WCFPsx}-o`)c9jxQo@jrg1ost ziwx6g$f0Ze&D3?KUb+6d%TC2d(wQNY?OBk2c_bi zVKn6L>RA;8p;AYgYP)o@jAGVnqK|wCKa-)jlyy+GBth*mrZ= z{<^S=QqcdDvwCi)p}}c}0yc1q&yT=r_>g@ozIj`pw}>n7jgLY+w=e05wn;#nfICuI zO?kle^*qG)b@^yZ#kt>KJ|-LF|D(2-!E9R;Wtc?~iPM1t5D$mzwePK8O9$_7E~LNF z`04at;Pm!(483WjaR|)kJqHth0r%oW=~A6I{`Zf~xyg;aE5fYDO9~|JD5%tIDK>EL zi27ehABOSQJ&Syg?lV^Z*K|Tx4FXhdKQ^*}C1CaU1ed+Jj$g1kz4;TkCag$-N2W27 zpR0oKox=^Z)R&FU3+$Vvs&5eCZ+S>x_Xqu2IXpd{7x{I6)!~qft5>*o_YijkJnF_b zvOne}&AFW?vdI3Sn$6z~al2c*qiV$&Ia%vPeta7a7LRK$bz~UWz2ST|_pTn>Rw?m? zjYEDuj;;p>$2ysaxg-I(3-^>vl9RT+Ke8=NMKtJrC@pSWX$~^n+;S||WB>~(QM(r{ z6>AyoAK*vRdt(~wo`Zk2SbMQQ%NaP_kRX2009*1wV`TJL0n~H#{uqcRE2JV0fcIvM zz7xN426AMJLO-dXhAe&V&SO&)=Q9kF#oMdi{tPu63Zvgp@DmLdW!^*OFLe58!TKsW z)5|NvYsRiF_kSNb-HQ(_<0r+oeEI!F1zX&y*ic#dK1G$LK~mjXR}J8{R;mlIwC50= zR9IFlw#P#U=x(5(9F#pZPtg>?A9jdXh&HPV8F^09_SmMQ1~OOG2ov-r$Nn>g9_?z| zfnNUE(^at#GdMO%VYWZq^H11Q#v*#Ef*hMKC*};TUowC}EGZAHn!UC(A;yw}@3d;I zwLs#ik_y#I+L^7{y^DgIzbV)!-$zkYQK<>C{dPmJNvPyEKc4#j!c^zdLjG65Y`jDR zH!rS!&MZ4gLL9NF=+7a#F*kZRU)`)S^56X-n1lzHh48BJxPjM$W6H^-ExS8iSk6T< zV`@wlo-2)F$ZApddo%}EvN+E;!2gFr z14N22R`!7Q0hOf})j-@Nfr3Bx0aP5>d|uRb=C#?8bpGkiZmJMd&%s!y>R9QI+o?W^ zBa~SGT-`vitPGETwWCaMi=q_}#$h->?^Mrc7h3pA5rX12h`SrV2EfZ=EF|>MZe4HpjVuYt z{xeoeo8CFPed7ODd?Xba4hlY;0V*Wy_tD6Z;cWcU?R>%JpykyP%D`dOq#J_&;uYAx z$}jlM>Dt};t%RU`tUZ{?ouH7aaB1s`afFVVgrUA_GU;9)TBb;w+*wxt%6c6>I9^Ed zHrt5u)aEKpjjx%;9U06a*i9$9Xq(jx`8>L5PK?){ycj>hCc?id*4&PswI)t4zahj< zJ$kjHZhMXlwclG|e-NPk$;vHwJG%f@;#)l{|yVVG)F=SysWzSSg03y@Owyz8xbX@acvo$3dl9 zYx|#%R}#;1XD4^AeMwIkBvqQmXfTopx7<{gRig=|y5|bid$;ggG;r13=6O;Bm#*J6 zzgpLE%dJg3sv1{_dxTYFX1sioO?rH`>7h4n7u<9Ihe#b0*pSrE8T0JqYGix zw=W&;h$N24>zD;)M_?gAQ7FM9uRVnKqV!I%#j8E(V;A2%O^^y#vFWh#K81| zjY50-r;kH)6y2|5P0|r=$!q9x0TtLRDl4;AE>!1fY6TT2hk&0!*kl;rqQL8V=h3Rg zN6M-jAM)ac@3_s0PY-vKY+tMjY+4KsD#_`0xg)r47G7AtH%#g}s^E)`Ov_N@`1|VmF!3Ec+gTE-()`>cVee8`7FHf8|XB+(a`j6Ux z47)$O!A0aXHq$c6ACU)Ecl$3T_b^PLFOCSnPNSZzL6Qvk2RH;)2~}@;r9$R2?C<-W z&)4r7v%5-}CI8fat4}6@VWEKg`BGu3{#~rWeU;gbpCx(j1TtqPX2pA0pGS}5w|7;2 z0^ZxfvsYLmP%Qd;-{Q1vAh$eW_O8jrrF`z1^Z3wE>mp0zGmd6C-v%5O_FJggTxAUM zrj3=4O)5k&?+0p!dA}{S|DXK)qC!&Z$KT9SU1mM3tz7%Ql!{7r%GoBWbC^54y~-EL z!IoWmQJ)XvYVbx|5ll<}JpnJ=i29vfw1#J){Xs=QXN%;s0bQnlF(;1G6dDB|>_UFN z^D+}tj7lf!r}9L8K2BrYu1N3YwK4oOFF4-dr9|}&*y%HLX#VQvv0lgBQAXW8@S|E( z>4o-Y@$ZdgiDx}BFkS$9L95=3dFFWWDu=M0$5jrIFc0L_*-#h{BUOZ-eWKkC&OYJm zd$`2(Y}7^l^pW6^h`wP{CttAygf9FHEqiM|)nsdKG{^{;!`X3n2ohVP)|4I+cBRHz zU^{r`edy01u&a#e5)QJvqQc2o?uB=%^zaU3=Z-40Xt3P4vA*`M?p{Gc{HTw!VDzZZ zPgC60r#g%hp+|1{rWep0?qUKu32t5^^Fi2pXL!O3-`*15d*;#K*MF4fcFGlAR&J>O z%kEoUXb{JjFBgi#(epJO#mYhpIPJ|*W+@glLC8yl1c9JVe<3kiKCTQl87;CF?U75&4Ni^)>cO z6?$ewNKV0swGv6WsEbYgI z57nsQhG0wKimQ8Owqf|ZzwUnL&B*39bY9)SoF-Kwi8y(hUJHh7ZJg=KO*O}#1XB)i}f{2NBiUrBAWseQdH-r-My>nE~(NNMWghKI)DD7 z!(r}OVC1qt2LDwlqC#0dt1^0+;7_y!&7XtIX4u3hh?r4JidF_wwI$9}cSlgw9gn{nN_d0|5*#qk<*PX^r zhE9y ze9hp`f(zRAjj!}p%qt#czuTLwsT-Q4=B2F&V?k^`e}jzNJ0cGf!-!e{2f)Y5&PIrN z9dd7LHhRlcfM{xozYA|T+T!KM*Bud>!r9O|x@0w{o6+w|@KE%Rj-=@9<^o1@nrj17 zJFL7M412vSt)r?@_JJPD1c%;&2&3*=iBe2A8k2VGW9z)ED7<}H5NDBE-9{Lz?HD!{ zAqjdWwU8%AGhXQynHgI*#h;{};|Q1STk9L1$Z+9$y>2&+l?_t1M##-IuR)=fjUOXj z1wJ|%;cy^PnDrR(a__3ls*?`m$tC;uB@q`#Tw6Y%^6K8A<^`1Fm%RZfm<>*c&bV zF5e1;xBXT53$ybFo1@LPv;x}&%Zn1fn@R{xiCwsWXNU94;DDd${!IL(F*}3yr4@oI z{1StVyIb5%ztS$x&U6^IY-Xgew{QAOI;H-xpPBtn+cVvvM4d~@p+{*eLA34xo~>mb zlck0&)jJ7JMiDw2Zr25W%DhVuYEF~tsW>7H!RaL@YOLDn&ycZSO0sq6x3Q)#O#ey8hXMQ_Fzr9IYf6(s|Jgej47*? z!^>216uwWo9GGWFE+!UyALQ@i7ZJ+SwZBptF>i&W4SvWU}O*1p4Q8})s1XXbmK zMGwbIU*w^7)3SX0LYr;Qd~SAJ&yO*T$nbRzRid997#jx*5<-A{%lv3BVn?Ml>N1G@ zIahObpv_#$a1xa&_gufBe1%Ho@x-Q)S+TJg974Yu6NyObpxkcYJ4Bi&q-GzCK2dny zC0d@3Q&-9L!UcCXp*y6r(UjgXv@rh8o8s;j=ZQRKeoGt%(94_E0QiIE%)5G>BktD) z2{QcAzKKz-N}W#Atsa6Y6&j^uDwKC&qx}}5pRjVol<-)jNygd zlXJBkqW<-5D{w(4Ak&BQb=q19hI~}Z(?bOhk!GhE~&1Gu_h*UwVkI{ z3}@+9R3W~VXP08uRs%Q! zhc~0mS7=(Qvyz9f*9rHN6_STzhpsEvh?iPfHwBXebJRJCV^_#rx0+rK$CjaCO;bXp z{@#jS4=y(di;+hGRsr=glrUT`XE+ku3gzZ)U&W(`U?#HuCn$m&V{yd!c0fv-xF(7@GEGg&|a&!anmP})oh`KH84LO);7Hg z$ulBngu*?pQp}TVlRa+nIfu*(1ttWwEk3v_Azg$4zV)S4xdrL!wal`Ma?bvjy5t0h zeZnnLJ!7Z3$<^J}3l?|KUUXA+21$u8Yfm4RI@Gyzw&^Xdq5I_Dc44UTDQUx+1(M=K z@gxr6l4W`A0AXPO^Y!k|}&SR(jGmGVJ)udZAQ(*9jHd4)sz> z^zafBJS@dWQp;N3fsC>jRn!|(#}GN+@c-eN+0IM4UQvtMD-NPvr0QQgD3k;0jp_d& zM_#BTMzO5Gqs85O#QcmF%RX~?2A0`#*~{QkRI<7|tFdFp8lv#?2=6Ce;W9&zy2);po2iAL6Ak9EsPzF;oeR(2q%%`2&;PSZ}+u)A+WHKC5|ulTds zzEpLg8Dk{9Otany1-UPB>K2?d*%}SE6Y%F_cV`O;P#qOz=;6X7z<+hdka5rl_ zT-hE^mST6*B8SeI+9$|O!WA#Nw;xu0pNI<+(ux5V?n2x^kd*(J`{gZiUpsp8jq{@j zzv;3|3lc@C#d=hBO>H~XSrTDzG{U~FP{UqO`4Pv;Bf_vFt*p*!E6=^-CJ%uuUsnO| zz_b_B+f$zNM_zQkpR7?z@|b!1N~2AKoEDqf-B%f6ubMe_@+HZ-xc%`6?P%>Y{ywFSSMf3FGxai?J<>b+92g>#4zZ-<3 zZE53MMf!QFv>TB8=+9c-v!`+|$RbP`2kGYH%79_!HvFW0B zg>gDD?$op^(p99nsY=q>7=h6n{gk1U>89TTdT=c zV-@WuSC#59?t`mdyJt@BZT_9Hp~O+MCZGBg<+7db%>gsvGRfRIh(eg^M9-JAuQYH< za=I663rdc>y)=D(YPwv-HobN&ZnLmxGc&A2H#sD18Dw1#=jpuA&)_C0B!q|RTWMhL zq^G11Zdr+J$>Bhfe6%tkxq&oNSsD8o>WRmDNLl3*`pdV*-@llsbW-FsB3Id*I7F>Mj6 zD<1uwfYT|_?C%>K)xRb+Tze+8_jQWXwC-KL+2L1W*p8prFiQHrC8?Tvox=DwId&p0 z-E1jxRElNZx{m6eryi$i(^>yTO3%Y71@&{;W1*^UtU+mMio7J(y#!BrA7{37DmnG_fX{GnRb^A*-#dms8Mfv9D;Vi z=(c|vdsO5+t$&&NK;L{gv%Ax){S_+6C>I|N(=l?h(4PElCwFH2j`bXD2!l8itc%hJ z+S_R>8!-W|rT*CXEK5|-^8<%}%k9h(d|sZ)vE-0wyR9AskQ-wDTASbKjX$R1-@z2~ zi6c&^)O#axul%#$(ETu*IgnlISo{UzRfjFT^{rauouEEf9e0)K@VeT2*xJi*{_-=e zrSGk0w?I+jo9Hyjqfpnfh+S^vQgYo}gp_}91p+=-$WyTp*BS`#D_saMHjdUt(0+3o zkNqz2b^XTmm84`lzC?UHWY4n_>a2XrcT<6?c_C_oO+XBnVedb4^tqoM+ii2ZTep>^ zoEsqPuF9U9XjoJ?b2d6-XcJ4GQQB6E{qaXG8Do3nP%?p6?N@c}2cUz15DI{!eo-5i45%YHG z(MaiPDl-#(C?)MAR~8179_(hKs`s*KYAdB~>Sn?%FLhlF6VDQnh$6Bjcw0yGo41XS z)_!w@8rvGV`-{HnUaasrJJG35XpQ}X7i(B5@Cww9qT>ReG}!Uq(`!(A#KJPLe9t#T>2xPhWKh&_ugcklxMw5_BVH{&e&@rC zh4pNp&aG~){7(6fm1pPai~_#1~)M~uJw%abTL6WA?HGK z%LOk=y|R)b!+!y6>&bY1Y4 z>^o7@9Cv9lba2BGp?}Ze90D)75grLXnL@F%S*pB6TU~b!%B?`S4bax}f=bS}k9EtZ zVzh#ZNkKRak?bc(7hxSj=@$n*YMmaw$2uXo3Ktk zl8eA8A+#4qYVg{EAKwHJz)wd+jbI+NN75%nA2Q;#?Ni4v@3&V)v#XL!5t^T)pB1n06 zo`cdI5NiOG;`U>N*;dSwZqXrxAWkc0fojynBN?@ZW!>P>@{e(8LlIyY zWoxgWR&B1=7w_G-GEu4eWqhvSWEHxA8+Q{oh^oao5hB|*N>!;rw}CINpBF@y*qTzJ zb#KM_=Ibo#+41R0za9(IVR8@M_&LmRZLR@5e}k9xz?`9=?LdXu`<^hJ!Mq!r8&v#~ zvE$+KLZYcfg-Pa^4x{#a|INr1JY2Qt1`MVIsz+}$&A_EyQ8!PqcTSLrFQx+Il6C2sQJ#QoTLX^k-kZIYIEB2>fx0qInwaJpa z1Yms&ny}M2QGSw4Uo1CIcT*`$aMp`b;RX+#dq6A5n$%V{v-{v?`L#C2>jjQnhuRb? zBtJH_3w&{%LLX|wWK89;e2Fz%;g1nXE#4XWko+?mjAF9JT>W9ExrbaALC z_{s%#td!wARJ4kcZ<>oLOVU5L)S54Epv|-5aDSL*P7dboKcVP;ONiL?IK4I@QT}#c zk-8U~xhs}(ay-UZHBQmi2m1}Z&^hS`hkvd>SgfI7iV36d`cXF%I$OxRM zy9CM2-+v_DpmKqdI3>RnxUyjyf#W!7m#%9r!zmFnq0{CZ>RDgkIhm~SZ7?ojw??tD zsz3pc9qwtlGJ=lK=IZNG-&BBUWdxFZ-V+P)mcCowYhFF?-TRtbs~@!k?;V-Df5yak zYCUt~&}~G8nf>dF&gr5Crf-7I<55K)XHDRv-Q&8RwVI+_6B!%oP3^ECjPt9%Il^=0 zoiU0SyRZ^Hnmyd;PLpY;(nY7WiiGTl3Cn@L8|EncGUe+icw%#4;6tr5%_lG5$7FFw z`*0g!GPwC|2JZt`zWWL)igjbXFWw=UmY8~ozUq$#QMyAM9=fD}iQ*@^Y$T>T1Ch9oo zkV$3p&60+`orvCEv^sI%T|rV{;QhPS?)8J9P~x*i;*0mAz}ED;#}iba5$snztO--Y z*5Z-O%$+UZ{0yyY4aU3eQZ)>_O~xgngR$sNxi=G2bsjz)j0u0mwtV{MOFZ=!HU(d* zBiW{&uTj(>RAkkz@7Vo3#1l4-Lt_f+2~HOzijqmI8izczJWc^fw1Xt7bnSDF+<3uj-a6hD-< zo;yGBGE59hjB$BgF~4MsYC!fk3p;mb*~aw6F6*_mFR`>AkX!I=(;-h$=7kDQ>j&a$ zeP`Vf674?5lh~0WB{0KVRrN55@UyDG-=wH{o8@HaIh2y8=G;kUYT`>v-aaw|#wNGm zYVKX&XDwSih_p?V6J`Y66JeAr$K-SF@l)aBF(&#vy@;{j?I;9Eo;tmNSpPgH=bn-x zCs-{@O_KlQZmZ-z0Rq=sdZqKYvKq5HD+;98n^g9y=8*cOm5qbLsX>y~YLS|8a9cp; zvQ{)gh;FLWmR?ZPYqEIO;0HT zf8PKJi9%1MT$E&bmmQ;Nx(*|kVPBk_YQM*(PLKzD!u{bpjO$Z(jobkv-Uk24^^grj zq{mj?9S4g+8s-2^a|Phdega1AIJAbh;{cAf?v|Idz;>*`|*`(aq-KRDU{3h zBe$}q$6xoZ>E#CtJ8(~x9MF0Iu9WP4Ou*|Gm5?TFmxzwt5_; z7yYF~ejx760Ld!jm3mtuM%I5tI^th-SFMcAkQmfV@AE=9a09zJ`DIq{x>y~9oNPSJ z{whBGCQW^8Qg@6}K5I)c&^IqvT@6Xf$1VjlFecpY=SX;5COXG@Vvd^dzD#(I4E`P| z6UJii^itl$>p6qV+M3!oYiK+L4)q7TOIwB-iyu^aF4x!W6M&5mcvGLX)J`d$AziQ^ zC~7DC%qw}lMV@GAall8dy}`^+6INH68{$>>w8`N)Nj2Ti#-~X{00A<#s?m2`FYA`e ztc^AsCP~#O>CKUwOHx(;ifg(5Pl-DY=1GoBB366vi)x-#x?T$$n3m=fww~Q5Uvebo^Uh=OMXy7102 zipQcEB>~2V_e>HdWdiBYvJ9ET*}pe;9ILcG7K%-#Wk-Z|NocvF7v!SFIS0-rtD)2o zAKgQBIaKWoKUatHcu}yVfmxQT>wY7Z~<5 z3eP)MEU#miP0TYoaO!Oxm9A&#HMEoKu}-nctMHUk zYNt^hk9_lnv#pX=%tV=xhg6NDvvu9s<*uPxkm5nK>5?-S`-TIt8K*JydkwBLAMf@R z2ZaCo%Q_k2d&fnoWw$u!7kwzR@hryP@YBsDgkbfX7SuZdt-I)&87v5NFIpdq3V9qj zkWk{blJx`Jjhs1lLZZ8!kB6o;_WnS5=2-1=)p>Vp0>S|$%ziTZ&YYETQ(;#ef@Eo( zl#%yCAJ7Rf*uF{!n-b2PT9ppcjZ zuMjlhSHW*11*){g%ri4lMbuh}lXBqqQJMS6l ze!h?2f0235d7tw-uk$+3*Yov!QK?>sZ*cf6oxM{oZWsBx(r?c@Pclq=uK}?zOV8h@ zOYCbWY1dR$nOPy*a8OsMId0;V`ra>ze`yMm@|@H0oV*?+avIQFH-0>2;~9&5?cOmz zT=yv#|1{*w3;c*1f9~y4OV0sz!n6*!RIA|@;}8n%B$e&H_PWX}oM{pJmww{ddQ?(b z!la($H&>%OhtRzhM{__$PfZc%NhKF&eQ>ESkrybPYTxURkxXj&G&9D+GaQAl@=%wt z4~YfD&0xXU>}Vc0>yXaTRKyRVe15;W`Jm;>)9Sb{pGONgS3uOY5n?N0uU5A@>9J8d zwXufNo>-{Pto{Z$yqen#@6WBC!@q<|xhT-W3O7VEX4PjcAK(b5{Hl_k_n(^k03S49 zZOFfX(IN?(bySSM^t-{$oJ2D4B5n5=$aD)x!~|7bHRWVFkr1w)KrVtNyYAMDvN+$| z4IcA?24$9L?qlnJyyV2=nJlo5|G!X}e@7Cs{nd1n3PT$f^bo zw6^7Nc>T6!5&4o^lJ?L7sY`;&f3?C0NMs}L5PNHji_NlrHR_=eKW?|_uW+|mi_09a zqycl$ju8lT0P=GiYep~4GrpG57b~yu=Absyh(GM}U-P@I)k#9~6RyXV?tcx)LG+(p zQVKw*G<=FxS!vJJO3hWJ!*-xUxpyk}u>h6rYCMaq0^kt}Av1r%FQE zOo$!nKZ>+Tvz&Bgp5R~9HWiT)@?=7ecC^hLL2xv8m;b{*)}ue-W_K#QyTbgF;D$&v z?S(%#7upiT4=rDoKd09%Dkam(CSwy4f4L@ZBLaVq-=&S^$++I4tCK!BgkJ~Ut1{|n z7YWT|7b3nyPUT*Q*T&XMX8NLu#h21_$g<>ZGhF_oM#~IyvWR;=F8@wtvg}~n*cw*> zj#p3$_tr9UyFWNYGd7;fvRiEc2?)M<#1BW-!CXG5ftATyVU$^yj;tBjQCs?e%FqPG z!Q9dqVHsg}?D;j&=l48=9catNbP6Q@-Jb|q`p9o~?^147{)#(lH<-^`V~17PMb=-d zp;N6xH+eniY}h2^{}zk1)c)qDYXkc_nbn{Hu?@VUmJx#qUz!z4x}p*84Qa6sL4V4q zv5PEJ48BJ^Y;?v4A-wn^pNcs1q8n-6I!5Mxa<0uwv)!y%K+>zrOb)Sj_dhARyvo%r z@O=EN!Uu&>?wj{a)69c901(o7*LN0(oUNzgkr%cftvsqQo?DDswlxlI@4YLxZ4xas z9+|5m%Ty|#uTG5lK#+n3!o#||kzZ~xhahf;*9$WLfopK;K0i?d-;Kss$_cdV84!WQ;}Avo_0ugB|hX!Vbdeo zy9;gv7Ox%Ib4=@%7hV!nDw~=%%@m5~e5dSVaGMdEg-*uh-~1jvM0M+Dg8J8g581I` zKEqD$76Vab)F-5k<{otnaP7>jTGxi(> zLqvs%oN=u;{7P!p3a!_lEL{)dSE)~{c69B(UaEX)*pra9-d2aWr4dEnV}mXFU>kIsWwax3mU&|eXhfV8g>#Ac+BlL3mcly4k;$A#?(^*%5;w0kI?3R~xt=@p z!jZ=D+hw9ietT*1M-h|9H+piZ)bkk@9`YT3`ZSNzC5`fKbICAogB&C= zy+Y;N=(+bxYvq39kCJAde8Vo>ugfMnjV#2}-92r4<;z{EZ$@dK8XSEhi$10LihqgF zij;?c0-&CUy&fQ`9c(I+z*d`@nSCp?M#zy)e^>b8Ap6&yh_|G`{_5fQ+m_}!>*(k= zK#AvwqT=tm9k3(v?qaG2r%BF*`qzQJlL;lC>*b3pz?>L`39Y9-M4nVpx$nR__{o3FR`IlOrXEvJ87bY>*Pz5ZgFLNjYHX!fw-QefK9{$<6wD^R8Hf%LR8yA2;z&|aBixbG8yahtxB z`duOBOnKJ5KV9DSB~RTUm|sP0q(9Ro&`Uly`!o+%LAAXMmf@s?fNgj8n`RJ0)*+{w zN(6(QvBRn3FPshQZk#qm-Zac181WA0kC9JDinX)(U1+H|isnDEp8gOhN*vaQ6$ro{{nBnEz}*t*e+Tm0RwV#AJG?r$Cza6iToG<(b6kmY6MZW} zA~PYfWP{fOVPk#!BNV)g^vW_tbtQ2{ZIz1KIF^&l;b}tmYbV#+Xz7Cm%fplD4I~&1 zxjw;}s(+MoPH#O#FgZ858P9}oUQsaK7ig2fEw(0DSsQi0Ra}Q4wz;(k#lk zbMpP*2AQz(vU#qWEo*!03E$mU_=;fW0Ji2jPj0_H%axb5Hh9&(=uJ{cTK9$Sm;!ty z@{FK}QCH}_(^|R9Kv_~{r5luGNK89*b<57jQONp$S;_S1;mS~r*ZXp+;|3Csbh4$7 z++V+{bCOWwaugh*a#-_X087uoxq;foyY5n$y0JNro!g`h9BH#?5X9zD>NMpka(Z-q z*z#8VKNdJ2bGS&fx|WpS<>uA7K>eKAxpp~QGz@gD-z>ANl(pT+Q}-;MbeO_ow}001 zk&8cXZGFA6dfV81!Kka&3@aPo5{+yy4b}4~%rVnj{M!v1WX=sv4Po4jL1-b;!DFN1 ztEhZ~UQUy*W1nn9OnoIHt$#%8bkNOb)aJHEa9ws%j_9|hk`E!bzwEp?Nbu3%d_}SkPvK>i%1{Wku1xOw;@j7CUFsr8hUZ3JD;K@jQ0mwoIJO3G z&*iLAy4$UfTcV;}3bLH~m%#5}RS#!vB)NAIP(+>6AYUj#{9!#7?$e~^ zB{$aXyLi=9%v7DQU841GhUm0SH}30(`8V6@<@ty1=BfR$5j@1S(SG&WzO>?j`7{O) zz3@UJNaZK(Hj4&8jo3W?`2F9G->9YsdACf?@~sy&G3*OmP@UgVGIe*o2h9Rs?jWOs zOyWyEh%7}Mj<4z5y3(5_P-=Z9!>KhGVZ|37q#Wd8hA-x=YJc-il*xv%cm84PW5kzS zc~7y(0FfYBv{9IwjSJkTQ#9MuU{UC~S83DsMnJ)auc)O|s4=|B7Aw!w=sYE~zEU~c z7OT}4=bhvoEiY6qFWwe9DW~BA1B6e zd}mT&b6g)UW#QHo)vSP8AA8+KLX>EK<+0!00_84(HVXDZ2n!)k0{*4*y^9W}#P+2X z)K+7hjr__ZfV~16<2U2&XIqVSb~g3a(?%qWLjeW%kKT|HctUs4+2ZJdnB4iIjXUF2 zjq*9@C$$A4k*MDFjna`9u5#H`xFzy%0sF35Ebl50gEXVDa70n!rS-xlBdJxH%{!d1 zGD^9aJ~3nV&aXlTmh_reyGgFYz)!kS+5fRsSR;f`(B$tEdA8k=LtG%jRBb|jWaG;soAys{Zkn;{FW1h!x8xU`aVe~U( z>4eRTGU83kZlSK|y6oPrTw>Rqj*c63PkPe_KlvaeS!FVG8rls^4=*9N)mqbZ72nR z(xLu@%kNRDMuIWjn<2C!@cOh_M4pB3X9?R#iEszKZxXi8ieu^L0P()0D{t9jz`c6? z=gtR_GPbl(mW(RF^}C?@D~CWXom=ZHj!n%RTdgHW4w_#I8e#SQ;YTcHV#B$azCA`Nn-wD% zd%MUgkp2}r_cTb_*tO#6XPb^3 z*DyKExS;cir#t!|(^R(cEm=~Vi{>Prx?w6{JA$%<-Wj8mAEALiGuPSalAd9{f0hc~ z3#($X1vTP0 z2^p%#ZhR#E#XL6}m9GeY%Oi5591J&qZOZps8pvHY)BKzvrFS4qn#oH*p({^A!KK1! zq%7)2wV*wDSbwvjnm5LL^YiE2@eEO^s^II3ppXb}14Bz`Z!dlP>!;3ScXmRXi*uql zdgc?46Zel8-Y-(5n{Ozk{ChAAWv^mkjTU@ATW3&dnxc~XVkbS};4qbWYyf2`I6?hm zup|7Ww5TkG=TtMZI3Lr8#& z{6MSD)IZn*`&huPa`bRccca8P3<5TP7q;eea|cRH4I;g9A_cq$Q%}B}@I`5mgG3wG zo?W&xwY;{cV=31fmY<>)60=~zi`^~13z{$1jL?AE=++N9i^qZfsk-s{ryfTpn~yQ7 zbV+O0zcfyI3Th|;vvEM!#7+IWqM#6m>AQW!fgCNS4U@%u~c3@h(64*|LLYjs6qxA4x%Z$RGA%aemFjYWLTm_}0W&;E1Scp4@OWLi`f{)$9DW-#gkle_c_k#t zLO{1^@2wkU0T1gb{%Y_SN)1Ma>IxAq7|Ujfh>2kz-L=jkUd z?Hdr)l6qnl2iXY4>|4tVU-Z!jlvZ2?^Kp% zsh0<1m)m)ihiu=IP#Jmv#x0rXEw_+7MUfWWvo>f|h0#!l3NSx5u+{mB(wQO(W1ITT z*EmyttC3LtSR5mB*CB5OT;-U44~z0Npt~}0{y$T4@KVc)efd1D+9U6rv^Eecm!^n? zMVDV5re&|h2Yinh!%nLsNe+;TQ?{m9YaQ@8ygH3^XZ{Jt_ z$@?2BhLU(L=e@S_;tD;*T){gb0Vw$MMULEmO{V`?2}pQS{s?M8K@Uo9r>3%4$^F%? zJ{Pq1h{Di>oIg~g<;Z$R=0i{o(*SQXQ@8hG23NKd7`iyMovJ3CGF|8Ux&=z z%vK)ag%s!Z#sU73&iTN7#fs0o_2nS#iM>}ktOY_(I}a6a>a$PK#H@Y?^fk7#1Ex7Y z03Y%9rvd+Iui*9fLow%Q`{a?`BlvR|34unp{a0qDxD_=q_wuWpRF&3{>sA2*v!J$n zbv`t26-d_neg^ms@naA6A_zsRe}DP3uUP$mZA6Z)2;DaaJRb3W(66osG+xZY z?$f7lIYZyo66h}i=LZF?0jQiD(AMk-=JjjuVY{~ml)81ypC={X>tN+tuHnk3I@US)M^;a+5)69fU#^p;7cI#cWs#7%pRVv6|?;s}_-FL;Z9PIwewbGl(ZZDf) z1$Zm#zJpOV(U^g!V!pvVq{pMe_g*y57Mf>oC(IQ6VJ$^(ckUMP@MW+q%=L3Abb6Lo zHJ!nv7kQog=0kD3hc#%cBibS?G+Zx$%f0fr zN&9Pd`weP=DdH?T^=nkchVi`jQj{L+3*9baLs;k+a zfiVU;-;~eG){-qsB5nZEP?Yj=qykDKnz3;Ds~Ek?Y|zD4tQdXSs-qZyW&XsWlak0m3<`( zX!jhaV;k_iOOp+?1pkXag^~dRU9w?KI>fVx+A9zu3(bbGFD7ZZ=5bq+a2EAfY!zVT z4(=ZN1FX6rz-i@4Hf~d8AN;9bU89KsA&lkR+OO{9K(?!Ws%={arJbehMR^_XQ$Ov? zy{l=@?7jXn=L43fW^3sIwI!`y)By7@-Uqh+$TmtWDyeb+4R5(o!}HBOAmYW|uqYo@ zKG6cF3{ugG5eAMvi6CD{EfE@a9`}LIbNVTz!jOPYCI0$;jDDMrZ6-BfEZ`c>!k6Xf zqe=iazX3Y1REI#O_4zTgaSzg2g1%D^aH+P4N_<^!{P%G7iS z6KJeoGiJ3ne5WZQiTo!XJO+`HV6w0DbNBmPd#fP;(2{gF1@f~R48sHny8<~LJbXBR ztnA%OfLH1c?IaB!z-vTO7ySI82_ULQpb0UJos^_Xhf@FJ5lsi0BsZJNcAs}$TT-)jt41}xub3y$_9d}-X zgwKntKobys8`0!gY&r33by6ZwmORC!cK3t*x3mD1R5L`?y(BW1*!k!wO%+t?Xs7(8?q zdiDq<=k3Gp1{_)|!+w4C-biQEpd~I^x3EAD#_%H@V29ujj9|?2XS=q$h_m!X0{s0J zNDYwWtC4^XcRyDvit=UGG0Cs*uX_wiehr-#+nyiaDoWe2^E+*f+?Myd3b|Uf!4d9LVJNG0VrB$z__p&8I8^Wg?#m zrBJU9d(+wzq3C*t7?XJeL^tL%BUIPna46AOw=6wwhWfdhGFV_aH~Mpu@%(x_C8UbtEyrT^QSZ)`2%zL5TvkiS=FD0-~S2< zAkvrY>Ff1G_&XD0tWNH^z6xfeyEi^gJHRWKf^$*YXObTV0=*tgPD%Sw4O>7B2*3`u zHk*3f+26g5cTSe@jH**?e~9KfIJ{uPJw zGe6i5gC5X{XT9&%57W-S=C6fcOeITpVk=MV+rYp_GHQ zOp-G|)nnCUzW$BQ6_i`J8YJsdmHoz2XFo!E!q~zBy>%S@l~b>=yt2v*Ko0|4&*V?d zRvh4?Twm1bufXwInJDS~6DqFEA61&LakfhV8jY6XzckYHY|E(ubRR0ugSEkpM}Zep zL;)LUT+%?r9ooA;)+8%G2HD_t22xS`PhV9}A#b(gB$A36^_UAa-@Q@b>Qz zP1hX6SqUHGQKe;LAkYF0r%tr+!G=#tuBp-^i{}Cr5+yHfEA#;c&2QX;_VE(`ScFyq)(AwYk z%l+Dv(2XBalJqW%K14;4BFcLT^Taah7+DpE_vsZ0mt2Q{ldj_>j-D4DwH6n>*UPD( zIbvM%F?+Ds(YT32R|8{PmPl;k*2&2z4$sY@T`eatS@c(sK_pRwnqzX_Ps zcm6?0nNfpZ3g=*9RBNEle>8syKq@~g)*?5E8HpBEYZYaV2-yUiRY({{nxRN8kl%!^ zvsCvq{js-wmc`W^6otOHvYOGE)hF*(Z|p*bm12p(J3Ca1@j_8cHxw&XCkx9olB#W4 zcbO)%6t9BO*&RwulCy(TR1lzje2nEED7~2bVPqSWU!RrX$Wv1UO)9{D7#Tv;?mNM7 z`pxAsLq&10%eY#^J)K*Zny#HJ0g7VECtFaISp_~6AkrhNpETJYUv4W0935~~EA>AF zj0#+#0k_QOwK+4qe~(!OeP;k<*-z{OukoLJupf~_-&XA0nxSeA-o8Ni`^g9Z_BqfO z$$1!sO!IRW_3d@KGuExBn8u`Obz@c1#vPd9t%|oRh)J7auPv znwVtv5#0BRkSRdZ{QIs~gQvll@qUlBL}m37FM715rCR!sE8G~{+)Z8q*e0DbY&`Uy zCBKHqEU2H%biPSqzCLuvI=SUAKYlVsBy(00BGR{}7hxq0; zG_g@NG9EeyJI}p1uV_^U3-;v^cS@R*>lOv;G^00EH-ZQ0u|laSs*Wa5P^+jB@n?m~ zGGd*j_ChxBrQqIQJm=K&_<(tgge|kynJS+J&rb1%M~Y3|01WsGn1M4e1A>1-_C+F- z?jkcypKp4F0qTGW5HDMktGP>=YA5cW(^KpyGhDT(xrwfKttt#dPdD>{p=!V(cZ+X7 zhNUbFruJ9QZZOTvm_cUlqA0n>G{gf(-$j>6HTY@o+7i1Spk1z(g1q@K*_3%ScCgrg z@rWu%Fg+Gs35Mrp?_wDF8AyMSDvXI2Ef@C??V=vMp1En$FL2=1rgm%yXit zlJxvcC66{HKeXG*BUcjwft)a93ke+<1ZCKayynnoh+Zw&lqzkST@1etn1VN0k=S>OD#UgYNTflMGC5x zsRSr@vL>xaqyuw##-D?yR^d6QmqcikvC-a^%uyqXZ5i5VrqpwTBtk>MgFZGGV+-Bc)>Qn+1 zvHn+JSUR9s>2x#30h*irz(dh$6Ly~?PZNWueN+D4(ws7JfK&;tfO$jmLRghVi5Ha( zg@0&^VC?DM4+IlVS>8f6Gr;+Cv?gI-NAp{#tbH~at%ru73KS%hz(K;#r%d%aC4LW= zu#Bk@B<{kK6p^?FhBacx2rB;ww4f;1DFIT{&xx6T2m4;%p)6URN)5mo&%mm_XCC;m zCr&@13YLsJ#Dla}`P5caszCzIKjQqj<_v7OIYFIkcg_Q+A1i=!nS4Q7AX&<>;1!7y z+-aYY!2uD1;6?L7Yf{G}RGa0dqXZ}oTiHTua&s+w^*(OPNSuQ6du7L`hgyIDS_`vP zS!P^St+@w`E0SPMPw4@GK39GSYGenx{Lx&AgOJ86Uy$~%pVHqrMx865T<@{L?|9$F zrl7Sz=V}wp2>Z_5uIaW7c{O?$$owl_@IF;f6Tz=$cd3W98p+p2w=C4MVv^K7K{!<< z@X8O#%_zx+si-T~nt85BT+(i%<`V3fpe0-y@t8~gR!sH-0i%Vv)7^fP+)v=<7I~_^ z=R6@e6 z{SXL64=_MsG0b(_qv>7T`*8aT01=e}S@Z7SR(cNVY>rlMVEIrY<3=-(pqM*fnEG?D z%+;BTuGMdUs79up8jS@?m}9Vb>sGw~PY|m`(_3K6%OYydGmMm8Xg-hp%VL;#D-8;? zY+q;) zuuHx3uuRsH3kO~G!8Cdp%RU5Kc!%#MK(D~cxn4__VRm~6j^5O*Ht1Ldam>74iqG?P z;Osx%ZG9I1h-KvP}DIA|+f3gh5pN#p^T}^X{ZX^-4Cq+lft@YrH>QTz=$c z>VvFrj!o(v&dtYvU)f&AhufmL~aXKYv0G7)mxTwuuw@bs;pm|P> z2Bvtf>g!Fs&`avYt^9|2+3i7whx{itN1u`n?9m(J4D(4NRD@r3j)5rI3fvZ;Y zDc+)3zUV(N=tI^YUEo~z&foC05Rw5bJ8w~X>1KM0sTf-IIxG=z4h%G_-hmz300;Nn zwj`HT&#c?TRkmePfzxM#x>Xm?&n{EH*O4!bmVVval}P^OwXCp^pojUT!B2PxHd9Gm zF3bYMh$&MYi9rtXw~`<*hldpMm{8QzXwn6RzwH=DJqX^6k$5zRo?h*?NDPw*5t)=? zI3b9>za%i{uSwr;!J+UZ{+~4w`7A*hK^0!HanG8^0jak&t#)DS_<$`l!TajWaDHi? zq(1<>Tax(Vv*=$XW(ynDGoGVAJC+{_4ndhMM_yfK_!>Uo?*rz5Q((qHs#pXr16gIc z`=#VV&TR@1zH(7G{we*Y$}I^>fDN3>K?p`H{^c|N5=`*~bIz&1I420baVa5x#*n2+{}jzg+4O$+M!t{&C3O($985u)eml!A6nM*Xi(?B( zI@{<8vB0x18WWmD0eU0@V?<|(7!~Sr7ij6un4K#dm;&3w4~80$>9ZXD^ZojDl6>Y9-MOEASL&FzCrtIpU0+3r zm+_VWZ(@n1P%=BMvMFa4k**}B<{K@)#zedVz_!o5F+{O$U8=Kg;bJA zjOx2Ag7|DXG7YEvlDLv@M*95lMzYPSV`nK*79Qw>ob>qm-1(fQu}@fibK9uEsq;}g z{#4r`lCLV+IQK$7AHq86=r5OA>9p>|H6dLVEes=Z6@2(p+H~Z8bDy)s(wPnK@#ozdga<=8AD*~?)8BDP8 z+o)rY0+vx>F}gb2P45nF>vov+rMga%A(9jpR&9K`_}p@>@;JC z;h-^>5x~#!J`Rh|bm1blH?3DTa|BU0g`QVU-yFQn!0(kfD~dkl!G)R`8(#%pbuLxf z4V>SFip=o$UfWHN(-8)9rT0G{mo&n>a@zs`vp%!Pm~Ev4aj_zNBEgc%G|9_R+$J)* z%;KsR48*&Ch_LG}ke3|nkAQbWVEp{ZmZt>OeoAE3`XDC6Fz4y){sdG2I9{OLITYYd zi%2@-kT6xcER)2FtVK!6{j~NNgmQlrHhBXs6Nf=l4@yi7vM|$j1DvS%6Y;c%;)kN@ zt;bDIOoAS2c&;#9(^g2#XS((Eft&izL7~e**t(}Se->Y4^mt^9)`m&lNIwuEw+jN> zT`1G%`wd|^(CE;1D<$GPW=3SXhI6}FGG=*Q=#zfpT$~#((|9F=X~PB`tjr87fi+_ zLqx_iysYP3`j36H0j&kNTiD9wq`mXH$N)UZ6FWc)!cwbc5cSM_XTEpGniF-#CR_7wu^%vSzEFuArJD7(x1hpDEg)^iB@Gg#4nGUG8tSv zJLS23E?5!n1STO?NFIfBw^$`=bIILZ#=BC3ZE!V!Vu=mH)O^+=2?TAXr{LC@0WcpL z;$U+hQR84>-0`d4w9LvnRbAfdFx&-U3d>w602dWMX{YT(EMn^hR}O&i(9+}3=K2ad zieveKoY|b``kCkEH-GrigtHUsG|2U^C`XL+;pPoZBSPT-nnEl-;M)>+^91+7G zE)fMCg;|JXGoD7Wd2#&1PO+|;h?#?2E#%7`U%Sc9CW~Tz%o<+3F^j|rLTQ0OciPwW z=00%fua^>I7_$TfbXAtmG?><*6Kx@x6`L3Dgo3fP*dN-QaT zbXh6+&px=DjZfG@O@cmwO2q@fK&+vkrH!-FMJ^Brkvt2*a##7F3x&Un{c{#}kmKif zLq9#6t4gMZOA^`mhxRnrcvAia$Cb$tz^LE@3P~3L(T$(q&R1E9nPaOV*058kdMEvh z!e*0x^fKyZW@9mThnP6&<=r{us>|nzIG^#i_ph}{_ZJlxySTgTr*#+aF`Amrl%dUiB%0dE^07YV?8;3((+OaH z61rm-HOr@nE;&H(?xJge&fg$+UL!!eXcjh((fiy(+Tn1 z#|x>b?KZ9n1RrNq&$^z>#7MrfNgb0R%s5UrcUp(E_N4J+K-oWNSRl7FD z0u56TZH>*NnV;$2%zz4ssNsU9J5Lc)jjl@Sg;X%EoVi|tduuam*DJfvhJh(WGxvrR zB=#xt&0M^$sYlFj35&?cARY(eFknFO{tZY`nq4NAaFCB%UDBdMG8~;U-*~?=ORtW? zTHzipyiiQsohrYs&&hCOGQs=uEExqw_R>Cv%WV83#%|+@z{4+yG`3_TWf?Y zzJ2HhK4p+z#myan5EGPd&OJv=F`4@?p8ERE1iftaffQi^Apix8*0 z9jG-6sX&70ciyzx(uVlvk`NCDZGc|uB;8`>eRw=Fu*M4(9~F(uMtsc_QYr!WAun2i zdUN>0QDQE$bvQLku)>*Vcl)Evsy3>KCpS30Cb9b~D-X!m0mXO#>wG;mIA*)<(qQBv z?|ZiKPT!4sYT|fCF9mt~qdf67Xq8k(e}xCTd17bODc)x{a-L1!S(CqcyQ$Y~wW;+- z8NUG7A*XGi5NvpNIjk_<7|_ z*}VpPOcu2Fz>*;{5Na@m0?aosvc!Z)|^4h<EptiYc1~P@GFNrRy{!Z^^_pA9Yvn>@nNJXBPgQg+@a)$4-b}NO+g@SK2g%!_-AY7Ab1DXr z*o;4i#S7Zl+}Snt$l`MfLVOgm5xP_yti#OJfA4@&<<4^T;NV8-Oe~(qGPFBrxmdEu zJa!2=30!l@#k}08v5x^zB}CT6De9)9fpY=d2yjZzfhG;4kq*h|Vh|g=!Au3!N0i}D zxkXC3B5V78jE+QFR&J<#og?B4%F^Blps#I6kSE%+EDT~dJH?vQU%qzBCD44a$#()J zG#kc_i;o(u-+z);K$$O@gtX{uP(l)rLNPxhQlc0W&jn`(ks)?%7gd`I$ZW(9KG)jU1~7qm*IrIFIMK7W-6+K}A5 zm!ocs^t^eGlZ;Q&G4c6i&z~@v zq`~v1*ik}9$OQ>7^!K`~Kc^zrXKAd@3(H~Adml)ln~b4 zQ{iO00Mr4@s#v}idmssFrFTzAhKP@k3n>H|^GD$t1R0J$NBFK@c_wg%!Uz|3#}pPG zygUDRg(~`gS}QPJMo9wm7#KrSDx3cfMO7 z^R+K}vFl~*Y{plcaYAVa_A|qzrg|2tQ20D4AdL5(af)uUD{;GHz!5dIwh(Km&wQ1u zKr+=rC+8ign{AfM#O20f3tSU@yOw$sAhry3%|O7Z0>a%R3pvw(2NEcdvI>GOfiU&+ zLEfZ|Z9b-?LR|f)@ed5HfS6LrFk*XI0lQSPI?%|KGZ;jb`1582s!M)ovSsF2G2CZy zcK7!89|8AQz@%6+K7=dV-gyXDYmV6Vvx9AvGhw!TxC{O`AC4>E+8Q1I>GD~Evx7D6 zGSYYa>wE(F;oiB5fSo$kT-RZSIkZXQHrmcC~;S*uq!SWk+?TYJfMUjS0J_09T0>&>JYTfyLCi=uJ3 z&s&c06{5xm>S;Yo$8VDO^IK*6n_#B41VqR;n#owEH-7pcj{O1M7C1ehowK(k9e*PK z+SmY|5p1ddIc2hNazXm#lPdP^H*-am%hRLHowkL(zT%sn8$RczyRes?>OP!q&+*O% ziCrk5{0G9c;U#}B2--7YP&Dph&c3}8!q%zY%yd5OnbY1)9Mz0sbZO#yGIDWUG+bdcX0bqPgcatJGeQtYHo7Oh)mgI~FN=_H1EMXD1B!AJ zb3xOVsY$}hboZz8$%I9ng+%$|anEZaV?L+VA@xejH>loog(vTWDt(h>$x64X7!$_> z4pBzXBj8`eNpCPBe^T~oWeNpk0by^e+ z!)0ulMXMRF$7?!%U^+zI*MBnE32HwYpR*Txc?3*mG~v%nP2cyifKxa_YXISIibkx&A#+4;?e#v^MPp!6b0ez0 zxf33qzc}r@07B@x4_MwZ3NBd3389@v37JVWM{Zh?A{#}6s^ljXBwk5%b1{976dLd2 z9G|io*?>Hqz!Wi4m5wY8>`c-IK4ovC5X^qlL&~CaE+V%XIdFbd&?Ky7rn^A(0$Kje zR~2R%ewX_7WTnfLC8XwULJ(FCK<#!cr4+gfaey5PMS=Ar5oi@Sa-OeIWkCzSY9TOa zWV`9Ls2%w9-1Hf17v0ziuicEW+@{x)Ce=Kn7UJwjM-#Ms&!rE&JxY0YiVkMuM?m%a zot@E-0p%H;Jft1=F;Zd}O4lf(3X$XV5(SS&dHE)}*J}beHR~J^jlXzzdc9}8Qz;I7S z>d6H7SKEBW%9*0qz7>vstz5e&oHHDv zf_|D8Hw7&RhY~(*y5W}^uAgPT`LMxoqn#TSD@)jDy{9`RMBLaeaWCAbw++yW*T)07 zMT$#LuGTkYBTaj-24!%t&1p?Gw_({F@g(NY9(;foX!KwX>$LjLr z&$%FoYXWvuK7Idb(BlI-*~us4d!id zdk+GwaMeRWyQANN`65$xbx1oF(e-QR!-LxNuC!$M(k!mAXfC%86Ju{y0F=oYgry3* zy@Y1cmhIfc;OwP65pR|t#U(wDW{@vW8%~R{s~hVv+i%o^;oIY> zh-4ks0?U_UBdcR7TO-**B6iweo7WkoRwL(&gk;r{6Pw-jKfQ4n)VIm@t{U9E$C^;J z@D=t#VJk3;uZr6R=eISgA3agVao#4IXs`}o%MAa^M9F!q0rm7a50GZzwDSB9cwVY( zP$n*G1oOz9Io$FEO_l`9(%{c&*lWRuc zc{fvb567n@(@&ElM87LAeP<#s%dd_{j{3QFnpnp+{A?00J{d*71&XFn(!Aq(sO`Q) z%_xZ*saluO$f|)c%=CEhdj5-@`(BvhA2LlKC1C{J zFZUK)8zw?=62E_AN^f>W-feYe=4y0_{wu*bQ$OG+nR`ObkLHq!^IQYkm;Lwx)! zYT$kDh$UXjIDQRhXF3z+Ld-#RMbk1~d@X>I6F_UH<*39uOm!1MZAAsF>9VQU;?BBv zFCBHbR?;w;*&t9l_`jqp@G878YFXuP(@B6KBm2{P+XX8l0zoE8q@j{uyIy4t->~+^ zRw@=HU!S%eVL(cM?~+(S9*(H8Gi}B;EH(K^;a0@j3C>fR#E9IqXk?p96`MzV7*5{F z#PVH6Rny1kUaT%oRVhQJ`q8w9qy)o#>|LdDPu{yqZICvC-R(e`Ke13sFgfW}Xj-@kzT^#7^Kf|e*x0!o#;>lK>-PLerC zL;2-L8+~{8M^_vDc<}taRg6reKq9!4F_qLdt zra?`kumDCBjM`0^3`J(3ZR0aVL*QY`G#dUxV~4;8yW_u%p85}AG^UmO6Eq5TK#Ko6 zdxkOWThX?H!PJ{^v`}nRJ={^CPt2P>J7+@=$6% z?|GYqA!dj_3RG~6PXM9Ypc$cWy|ai$b?bkxGM|g8cjk2CDvO2#9=hHMJ3+3bJM3gg zIw6=g5%e%dVX}dN1#6OuH9(eS-w_-E43Yoq0U%MjG$_@ID60i^e>G{eRem0A1MN~^ z(^W7-@)+bQkVK?ghNo}hlD7K72GgSEP3|3)Ne8J}* zGXK1qnDovXFhxGWkilxrpwaY?bM}BKbR1&R^u&Us#Abvcg`@+Gw}x7R@O$ukvjaX4 zhfWdDH~GI-R|Dm~A;)$fOmv6v?|LqTx}xR(Z*+hee3Fv(Y6s+CGZ}Yi2fkwPSs}NW zzD0v?EvZxl{Hgw`TinNbp81PFuWJSMl|8(D#GZX`)c``@_rE6;K(?v9pCJ|wjRXTz z*B?Ucv&N+fRA#j}RDt{Fm0w+)S15hS|7XxpS7h)_ zn2U5p0*E-J>SYW_U>{qvnZ+^=mU*+FyEMTRtAKB9d%)RzSrGpUgNn@zoc8Mr177F%Dse%p zXOIm0Cu#z0mHIi%~auEkh7wg!YdHnJh1aHqZZpJ((D!L{Bo!Jg|R>^ zfZ0ylMMm^rWV43~ndS( zNTtuu=qv7(2toEo9WkY*jq+2;ML-&DCzT*{PI}yOy;nv!X|Q3D0+2szT-ZMHCHS9 z<;EVDe&!k=dksitJ%z^Nejx>F#7$X`y`k+H67*AuT8dQbY&c4jrFEeF7K}s})$p&4 zi!)JW#LJ|?5Knfssg_#zYz>$ivz}39s;supmIFl)%tp(u-7$k(@#bz76Slj}Rj#+h zn#FJuF=u1P6ZDCTvikU}MTut68d{(^8ofDRCL65gA&^4>6QL6Y)FADhDBj0(x%Wo3 ze{la^NZ@cTK_yb4pc@FV0Z>2*`Tq#}4tT2D{{NhgGP+9$6*98QYTBGc6qzYPW=2+$ zJx|dhBW3T3ZhOlwGrKG^*yK*H z@g6ie1w5sh;WiJqwJq}pl4pl=M_$bd7mp;*TOu!TwTatD6_(&7$@CgUTwAwPX2x()hFVvsiogDKnhweyZV*n$H)TmyNb_y8Ig#wbDW zpO%ra(%d~~?vV6SEN;9Y({ZHQbllWA^`d|zf4C~d$Pa&5%n{}RL0?Y}hSjpkB+?#xx>#O~g<;s)f z;Y7?G|4!%B)L_TxYOBr?D3a~bSRazo(NKR`c7VRGU|zWU$6nEX|GKc9ODIEtK@x0J}llW_vOwgpVVjx<4r;TJN3lBQqE)5hs#8ykY= z2)FOydGqh#i#>8eb>4kv;|mn2_-W#{M(a|NzchK+X{6EoD6-Fg-w*z4xZFqATiILb zEAgZ!Dc2&}we7;3Xuuo$`SgX4GZ8DHdbirs69QtF;zL?OhZ1l%nYot0n}Frdu}#J? zlm!ML#rQlMWpLd7A5b$CistKj-#hO<|#imD(@=rS9ax_lj* z1n*=aDy+uNn5`+)-NBU1mj*i>kd41cG}NUdID>PgDs8>G`*u-(NItAook-#C%&ORE zi4WAB)WAh+_QhDyvja(E16ho4%gE;i;m;zk7M7lWaFrDdnW6Ok5YGOJqibiIBAqwu z*?eST)NOi`tOS(IJW@1zEK*^21!AgHc3^r$Z^O^&ZtFzoi$BDO$b1+wQV-A@I0-3| zQu_k+5k1qd-rb6E4Kh87AFczRbl9E~>iJ=5)?#Ujg;IBR_hR&NQ1NyolxMB&Y^6c7 zD``U@VGxGO>E=ew<^h<`%7mKKH>wWtUcH?%{hvJkj$9S?=ZiDu`bZi zz>eCMUcwjKzz4()bwxrAx}_JcRJPIyXZC~Qc&CkAjkLE6=aGCFp~uDw?r!GK9I zD#o!6;lryWZ~5&5ui|RT9J5BTW>n@?oDPBQ7-KMv0EB=!i}{b(0^%-w2i~8;twIlq z#O52Bz!Y@~UvZ5a0{Li}HePwn_7?yyD4W5c{Q@3OcbPO>m^H{o+3sInJl}@lrPLClN#j>HG|t z)LNtJ8|7M$=#TnIn`vZ};01PQ&m?5uO>Cv_9GWk>A8DQI-wv{ek!-pIm1xN+*pmW~ zlV{Re@9$c+tJDkheC|@$00p1_HiW6y>L~Ox-hyoU3TVgx>wOPr+9CjU{sCnJ~WBl zLEF`nfYhV>I2IkaLoG0qko|W?2o`=2pJ|5)R(ed*fT8ZQLAh3!Dopi2CGKQcXv@>= zv(SY~LY)WeP-o&saUa$R07(5t4{Yr?EIvelMgKN~C0R7UweXsPWy3)LQpx+z}gn)0}6{lqom>*r_ z1!dp1ZxdRL5Ct73gTfWE+y6dCI&fv04NnA=m-Ohe;{%_!he6>{<7I*q|cD#%mJK86b*khGM7xvJ3=F#Lpk2@w{E+2h0611jsf&f7{T% zHC>>wRF@I?FGM~d(F$mO%Fg*?3uhg1(It0A?Txf9Xss`A6#G7qCkEJ-{D5X-4iKz6V7=laD)_pYF39`hQk>Nq(v--GupM{+Vk>0>&heu$*Ux`RA}%OiHe zMWB2!9dsO;s@(~EP)Y-Ng*`5Q_Z7iD;r%T{ze3lRL^Bx9CIeZM;bE;eA3EJlvbCc> zZ<0`)r$6biLCzts5(2+BrLpRnxdbX1)?41`_ zYSgNo2O&nKLJIOiGxbU)tUTk=4rkPUK1L09*rTDds*kg#;GnE#<< z@r>G!1nzVO1djq{sjY&g-4!Y{XJZ_gUwbuD12`GrMCWC;uLXL^4umw9)D&p#fQMNj zw6$M1+c$sf;0B%Cpk)jN<$C_)@?CDHAQO!JBx+RA`wunwewIOP>Vt!vQ^P$7eo!7e zfxZqVqOANnlr4yexr(|_zA5owk|**Ym{a;6@{`X$`1xhNQYyp;2kyjKeS@ko zVLI-!%v`c(&;Lat*hhe(o93BTVT3z*u7^T}O*;0}9TAwWgL#;2QX8ubxeS5S8F5ip z6|rn$)Cih|z_kmdypkR~PU5=z7XFB#cxjxb`dhMF8)3he1eijKxo~ou{rAW1&j19M z#KwY?C*A$x8=wymv_#(>2pN3*^r`z?EdmpYT+N%A?|9zG{XjKZ$ zFu||Ai7gUjmcrz@Pa}@Ne&kc`%;{e02)lJ?a_R8|h^BUs^^lVYZQa)@854rb1dN{@ zhWg`9+{w;!Ni3=+LIxD2?*;>@xxMTd-g~&~ju4nPiX33bv&^1YzMWtUZBm#PI!m*g zt_$!gZVgsYv9~=jpjd(J%zZ|}n^ZEb})Vm>m-b5Sfhz`cNcc=REMa=@B}64^l@e>sc!CPfXPUX!J;&D ze8KA^rEH)%3`|k;J~B&B(0Q$lw@`%J+(uu*d+?UP=~DX=l5ztoGejW#SGXYnw15WH z3+Obm^W)0Kh7&hWsc}P`Nu|k_`E#lXjEjW6o`gWCu5iQwI2g-I`cpsznoXdgYhqX+ zxVw6;{}myHT~@VNxfo5`ayv{08gm2aVd-!u^Avf`TX36^8&jT$*288V6icRhy4REJ zT;O|qdsuT3tF9;R2t3@DMY+qMkX_`pe3<1vH++|iCYKgMCoiLkgN)Dy-cmKo@8&1G zAE^Hh0Xm+q^gL+byssW7*^(2bd%h_ls({cW35W+!yX(P0yWXN~e5pg0;%7pq?ymjO z1|TR);=Y?{pou?j!Wd{~IHs~P=Tu8cPlb2lvym){68kx9fvo%TlBR1yA0$xVUif{7 zW9q9+8a$4L0;71M$ZHc~bc{Xv4m}4i_C1)WD%-4ETH+MmS*N+!3-Kr0p!B^Eb^QXX z(>wFmby|0=+ompNMh7DWRuoo&9RQb@=QhuebDgAODD)x?XD>%bK!IEkC2!<- zXnNkux>x)zbSf~E6;)Uuv}8yjR6way5+fGzAXLM@eVPsO152NMu~YG{ARQ2Qh=gVk zt8$~N85yy_A&GM_<7>mGEOxwAWd7-9P#I4hU8!4eunB|4al!4$kUsSNlW1VyVIQHU zOuFU!?Of;iOPaxCC-`0zG&yFo_!CSrSOe@GK@)U+8iO4!4-N^dpegUgj=rgld)mBM z&>gmdXgsu3KLUuKscD1D-fNsnj_pr(*JQ`vhbS;48W3v&pGLWYIqDeZ> z>c5nKe5>sO{H~=8BI0(mgj*yLh%-(jZbgbnF_~gaqXW4;&(eu2xrk<00-P z1o#SlG#E4h=Q7UBo=Az##tsO44|blOAS1S`ZqpE^EtEn=2_RA=Gr8wZFRBGe!&^HG zI}K;uTMmOE$l}eHs=j0Dfk0F-%%nGntx|yE9f(qaYntr|8a9%tMg3qXmy9vS>#v*} zA#d@N2e^gICgn>o=2Qp0FcgA!lz%&de8QoBX)JU0X$KXYv+|Q01f}NVFE21}qkn?A z#>_Xemn18a z=cAzj7ldtKqCV1L|I(~JGU7zfY8}UkUrvJDZzn%gLE?6w)UO(f5JX_6>ym*2l6l|7 zY#W6du9H^Z^g97Y#~@)Ns{`G|j~T9}FDU&|)xAz}8I^y=sDXbB#cV7PlB0RCl&x)^ z-|~Q)`Lw|yi{qN8(_UQhq?CRCWORzDjdcKX`0 znrvl}uSq1S*tarR0^-FU^l!2-A`mTcjm&E-<+#{oUFw^6CxjtNO)CtxcMg0!-?lU* zpxa}*AAm@dIJw!H)Jb;zHdJVW?*`*UT6Uwp$!O%lMF`afNVF_E8eC+Fc15d3-m27) zy3Bb~_#dD-#G=1La!#JiY?gTEQ17cIX5XM+&lEuCi*XoRLg*aoR39Cd%qUvV%RwIy z_AjbqIqh2M)OeQ0xUQ%*!NFE3!6^AsClpLulZ(VCD}H?o(F*MTAeTNIGZ6j?Z8pvg z?QYyP?zow5p97Q6>wRQfe7r5 z4}w4CSNgyq2IRch=6bqkw@&|hX7bIAQvL2Vf7r016TN`r^TY~&G5bkGwjDx0Eqwu5 z@|4*SsyMetYRoWTiQ)}R?)Dz=M?lY$8q3FB9*k^av}bhA#%=!l$eW8AhU`V#lg{?J z7GL9yaUAbxsML)i@ZV+f3DbPUS~J>Ye#PV0=dsoWtIGIs;v+*yI^?q2>%cR&+_5cy zdTL=*JWzj3JL2{(T@PsYgR&+Na|2nHm%zg63>g1X559-2nM41KPN?685xu5Pm&o#3 z1jqtBJuG+%eVJnPGV-8ESr+~b=m*Hn0vpnEH^{c{2iphCPTUe{&(A zA}chw^p1t~glH~!*xZW6lU=i;>I_V{OvORmO24(lw7QG7)-?3HXloKV;C-vdO^s(> zC~k?uUv(H7)Bl3nFkD&swubJ%f~;zfFgm28J2nU}XRifVE+dfF4o_%<0q1{SzseDZ zNIfWs029Z$9CUK!c2i@+{7vM3w=vN)SKOTyt?!dCZQmP^FD`T`9S3sx_=%_=2IlVs zKW+I5a6AaaEF)b0V0Cyc{IQS@EP(?9Tfa>Mk~JLVYnmyj6X1tP^=~0&UuT}y+5mIW zA|x~rXk`rPI%B@+{m*#j0q{_z+^n1#i`;Hxk=GH?!fduq1 zrY=?_c^-$8EL>jGM#XyM;-~r#J1s2<&EMzYeO4@E2*g&5u2}+>7vhF>=!E4}E5wpC zmd2ija^-yF^6aWPAxyX8ssuomFGFep&+YIRs5Qh{_!9P#xlM(?o&1r6`zNZLWYmTv zHc(EQmet%5fT+NYd&#Mk_=Y8P%dQ?VhF@u$ zY7{iWW~$P>oji&)TxWh9ViBkIOdUhpXrD^bl#;!;SYtV(l;(C16r>^ksUEsF5W;Mfs6+ z5*Y*OlYce*g!y?rCvY{*;SautA2@njRBv!bKk{CW8DOHuI-A4S*GryzgmYAh{P~QF z!}1N%6Q6=K4D_9n7|nad74F+xnEG9%~}66+;Au-PgE^zFr7RlI`>c3*@G6L zs3BJNGs`fXm1IZX^UK%d<9`T81u^RFr{M#A)VGhqk`9q4l_PVNWbfJr<~EZVVcBU- zebK&vL~d4No6Qle_5uJLbA(HVIJAJjTFfWp0pc#hKBDN3L)>~VT8zDor+ogC)|*3& z$+50@O@yPWiKeE;F-!%Yu_W@k3Gbk3#!)@De}P`rw?@qOUDLlIOI~Z-SK%G?R+tqo z0d7miUCNqmaA$pCwABlUo_e^ST6wGHFFrRYDMLRgXo|jWSMIU#{#4e_wMO<#O0-3F z@q|V!{3(OK5Rjq!tXy#bx>N9i0HzkYl`p-QV@xH(quW4iwtw*q29x-w1;cWIreK zF-LD+&O4=aVl!9tVQR!k_K1~p!A#`*(gjC?6kwQ<2QKLgAl~v``*2R#R(cZ?B=xWj zhZVo*OLJ$lUNu&opkwgcz@U)_h`Cg72uDOO9b4PEx~F9BBYPd?K1hfImIIiarU!WL z&-M3e7-lIuUel!g9R<)6L04Xc&8!7~h0SROr_~|P^axvQ3&5dhnNG66O}EIk$G^3( zc3&>|(U+g`Gw&YmZS00XvaVdOy~JXfWdBsYd0F}`tCgAJ*>Nhp;wt>TekPmn!MKrL z(S03QH{WQk@#7HF+GDwx3>qFK`BC-QvZZ>}_b3A<2`ivsGNsV#wr)y6b8^GAD?hF? z&AaO|Y8+s2`p5FuF{kw{QeW%HGI|l4;+1*+a*++iOr>-juC`vDaPBtJ$=EaVb~YYD zn+?@cd-cTn#Z%nOR3yc@Pq5`W3p9fL0PTK2h!UM%%)zY~R{10L;j1-gt8e7>PV-BK zKY7!w`33cKkOTQ&71&xMF-+3%<7PqIrohf2=(c6ePKA*K#bSJOR@q1D1 zSf@r={{xS*eJk^9XF$XT+9u_I14YH~1~cJHeJ^eO(@3X>%S|h_s6feixzI|`1@Y*& z)OyQdWCwjsXCo`SUinl1bpyxxASqF0j``}}BC=&Co+tNIu?%#|YMjv*T<*l&7%OPN z1=$t2O4%$#wl*QBMn&JmPCW@55A&?*e`x)5(=*hnT55C)mnOE1-Ey3Q;JFp`Smxe1 zXEd$+>n4!ySyj_C(rbK+o*k&p`Jqd_i$8P_$ggyPOwdS8p}n1@`dI)M#0ij%nzar@ z*C2knWG$`@PgF6HaYn?L(}ek|p4ID7;wwLIiOhTc{eqLuZz5TaoCk`)$!gsdsIbB@>KqojU=0Z5P;twD^-Q!&qSX9Ok z_8B==a4P5_k25MBmL7g{s4;onTK7!FzGq5DZ=!6#Ho8>eW|YW(PA;cKIzw^Z z1g%;BVOGkBPCl6r^k$uuosqutQrMSsHyX^CdmV6#YkC<~ba}Go0g=KsuI^I{kr}aB zmYsIm<5?mr*b=M-XMl6VLysWq`z(5OFK9ZR7H|Es+z5`kq_0jg4ta>E7DTYXHM2X> zMZ&C}@>kK)3C`bPF99+Lr~)r`yl%pq3Ko@gl&*K+Kx`5j>+eSM!nLod+L*(DdapT~ zHNx)q^-*6dZkuNne1_8XYhLjule-loT3&aFPNmZ~Ij6a(Kb=0^)YhKqvEmIbBn8cf za>>bzaPhGzZawAaZZA2$S@*Ub;j%nEv95+3#n%j$`BZMGO1})1diM?t!YMmngZ?K~ z(l!Ix0N6b~coLuq?%HD}m|{Ly;!g{(2gK%!$XLsz25K>)R)nZ-8P7ld52}HCpgS#I zg2_vfdm8)YfN7@E8EHD%6C0shx^GBZPi!`A;ns}kR7^b$pSY=UX4;{_7J(LF^AS&! zXU+OKXb;dxHic%4(#K1k#5?PS8hfAP_kl4&v-wgpkK6w&r{xB66uM5r>G|yHJC%5U z?4b*xO8G{7=$;lMpdOo-j(r$#6u)_7@4jNse*{gYF9<&AM0Kvn;5JG|FATzeG8--Q z)AUpzrv+Vs?CBR+0F%W{x^f;X(F5qtAcVJ!0WH(dE;vH5JEG~3gmhF0n@W-HM@oX% zn?_roN~PWGJId-PBhOm#vm6_}z~+5u>*=k=xxioM%K3odl28<0YVQK&gQQ>3WZMLb zj7~|BQba~gMV+AtBaB4|-b8oPa`4{qT4&`9lJ*gulxiD2BxK*_S#K`cQ7s;$VYM&s zZFSBIlE>+tsEx9b->HTwVV|VFR$KH~U@YP`E;KJmw0KAfIRE1W|4CgqW`>jScAqJa z9jd6bh%4zt_2TYsZn2k-ryKoV85DC(hX7T8w{sTV`JK$(ypf|fVLb&5*nS#$Tj|*t6?*Pev7nL@Cp#o;mS;$a?pOy^ zn3bxu-dk*dNJDkm_&t0Q+kq$U|L~+!z#PWhOvjZ%b?JnqIN1#oI5?ONf@<(GZ7!;055dY>L zfrr6CRm!{$5JKMP6i}@5#w>C(G`+knzgH5VwmbcH8o$gCCku+025%mDrx&v`>N-!Z zH4!m)zD6bzp>`ludF1qoQ{H}R2K_t*W$+)kDHRhdF2lT9$K}GBm6(He+ zI1DoV2TsGP)xinZ(a^EsKrQ^*%h0E<)->z)PdQIL`y(fBY_0oD4rOfSi?L77Qcr|~ z_K;b}G;MI$7hh&gO^^gR#FQXuIqIie>L8;)Pb&U*Vv`Wj!XD~A1VmT9_Nm#B<|@Mz z=mcaoM!4loTes&z`Hfls=J!UPXAtLl zrKMlxo3T9yd*wjFoXcOG#fSXFMwMf-+e}7;K_{*%d4ZAGjzeWeukyNi))36fw9*N> z5{^$$l^{_?i1{GeQhj8}oK_;A4Y`m0N`t5*Ggh@t;EU(I=CPVmt}B5xEpK+{D*H(m z#)HlyZ7g5D_5H#S;B$>mTy@W0(d|C7IJMV8EOx8fU|1y}m2?<{GKU=t2DWEgC23#U1 z^H?T40Wl?{;3jd{I*)sZu^pEjR=i~R90)ORKwhMSZZLwIs&d5Q`1^gi* z@DFh-umGPY_wEmCa;sCzhr<#v*`Q1DEVg?*raUkVyaH5z3tU}FKTSw!QvEHZF#=1V zmjH97j=x{BMlOPq#;*1LIuY5lET)foxxzB=AJTLt8>iuiO1*1}IZmtKX3|DLnu#({ z`%n*f{M?fC!OH8qKIG1N;intLlI$9E`U&)FM!cYYLdWFp$q5Jfggrou{=F91Ep#06 zkJ{3aFWg&?gpJo1(;Yf3A2vR9sRN0nNIj(~D(2c%kTTp``oSxG)q?jD%x_?%UY5LA zB@MUu|62h7vU(MB_|3jj^prl!;Dfq#Nt(0Z-X~iqB{z0DP>kc9)4vM(-8h9#5xZ{B z4XlFQRgDcWOg8;;R`@&)QWkV$5v#i_S#*#hk<6#{y(w3&JVlt77Q;4%@ z`IYTcrR(0U?1foJs+F`YdDt#by#3loJ+=}N2=!orUlxqQaDowxm+4%8FOiBEBi1$v zjKRtGs|WaijZ(48k!BLY<k8y`}kob$y z{yLAZimKCht*sy7n2ze&^VeD4c#Z7-ju)mGkx{mc)97TPIcQhl9e=Lv1lpPWAs^i= zwr#=rXAJ;PvPTy63jq_wBn!oVz$Zalqn(*mUkf%(@mu_Pl=@pJA`cRo4k+IfrmM-t z9B#ZrXiP3?$dQx0xV8mzQ>$f=VZH|L;z}p3A${y@yGJpFR8mBMGnAgic#|r+p9hR} z#g0dj_{08diwQ8O+M))Sos4Dn+PRXOMYmR9HYXe)KQ6QfYMhN2@TL6ASZ034&}Yk;pFn6;8jjq4#nA5;etd`06~08 zFSz$lf&pqmDl~)*u;$60dD{Z-i$`z{e7}Z&r^|)OZAt!cWA4-nK|1g>FGzuD^YUeO3>Eo+)wDTL8W+6!3&iIF5^XMF7=L~ z%PjLc_s3#HQpxN4Bi3XFWVB}sZ2D5u3*0E~Yir}cW-_2mN(V_32wmQoNti+R;6gF# zeln|T9Vi>$Vw0uyo)==+@3>EgOn?&t z`U57r7|ey*=UlU`kWoKpg^;Dl<)iRe6zG*|FOlDK6(Bp>p}#wGWC^R>Qf)IV{uW!X zVY#^BY7-ihzaD|ehi@OH4AiGY{CVQl`Ke-}{@cYtmf|xxl*3GC1|;mZuL1p)poRI; zub5B&$mv%hX3Nfw_)2BBUB^F!pr{3I=5%H}V=s4g$V)Ld!{Qtq*Y->;r@nXm&^n84jKeAIwHH#pwFQhl>zg+P##3U<@}L z@pq1)LSXUh?eM_1V;~%b$*%D3EwH}Hqa^%&+D{Px%NEfgW8IZhrQJYc7aY%>BdcrV z`&`$z<%MPwQgYvHVm*ih+za>bR}1C9PWO8|lq4+8|85}~CM`Y|)-_b8~x zy)?ZDvPr(E-h`p7`Ua><0#NS$;k4b#-FPRU>-qB=+Er?G=)JoG;XFvTIBsHEbower zaMvQc+|@+ZOi(RcGameM{_L5$f5~-#KbXgJ!nn*TRwbQ#h$XZl4r#)AAG@BR_cdqA zpU?hs!1jm5g5#{VRlqm$nuF!|?z8Oj-131=3;WeK=jNJH7EN$A4{+WO^zV7`_Tbr| zy$7(vwi>!XPWWH01K!dD6;=XiSb$a_6loMlk_ddTy#=T;M({pVVlbtyHn*Oq*VA%7 ztnE?;-K*dXn-k-)0~?qtEP}3RXT(REx*t>h4xJzFN(t%Cej<$g=qrIW#vbPVxaNgA zipc(-R}cOHOuyd&`P;^|*Q_MT0;`RUq!4)JZ7a}E7*?&#GD&}|>JLfUptI>-nWuyV0Aspqk ztDJP-34G$y@_i;MMPBQ>_r3==`&N~Aa6wQZ>g8mmymV3l- ztWoXURXswKhS>+GauH?s)rquz_tUtLVgG~nU{76dP;|X~rxj}urQgpO+!~n*-Gf#p zr7K|GSYPlhhUkomLzu=cNVbwj3^$}3EfX0M7C1v1l5wI05)bePhr%i>hh{=O3^I%+ z<7`7i$UEZ9=^1F3Z_uPVnHz7WX4rk;)CC089|?T~Rn4P zqa(i0fJG$)b?f2_>LTN5q7)Da(@G7!Y#3`b$-hIz)pcYyOIYEDXj5xxCFb1>z?biY-8nBle zTj4EMP=0a$L1Kr&IhvX#>2nHNMbH)m6-chy>_pjru=Fgc-_8p7@4prh96pf4V54DB zF{3SX+J~II>{%kAqM6E7@y!L{2^y|Pq=t_UKwzEawstLZ!W0p2(jq5BJGP zjEI?6;t~WsQA$e7xtREkXw-nd=|a}S&d@$u;C-_srW1bw`GmHa0AI1qHw6Cy%mM?j zi$nc5ReKPCwkm4^?}tF5_47}1h`9i0{txD!*ZgtZ@r$Q?^xK&E5Unj+;PI& zqhSSJ)4QYzXd|e#2IANSnhEW&`?!wlKI99o&NVRh7bh=xI{1D?j?j`WviJ}9wmO#`$hPJ1mVJ=yD`<06(VC-8sT%V%~i$=}93N)-G=ddOu z`7qA_Yx=DYhXH^F@QYy~UfuuWj=;Zaax{ZN_lDbw*nmT)Hwxd5gVLWv)KO9|OET>x z{3Z>^Yzh9RG{eF>Q717cnhWA}>{y4eR1^h` z>3$o)Z|n-{kMuFFK=FY5-oZe>Sc!vP*7#m>m5+eL6#|)y(C6yAl1S_b1YT|Jtiu9o z-Lzbbe2PxL`U8@uI`w)g&o2^^4{p4J@uKAl>Mz)|h#&9-;<|T zD;KsM$6RvmYi8rAIeII;vh_C^H`he|JeC!7tkYf2Wx&=E1rq+^Kh_0tC#CVHK_D452h_p> zmqBNO8wdeoqc;CzsF0;s@KouWuoqFGW1!HcMWVNhGIm)7qlkHAx8RyZJnd(N)%>|eH|tHBAET$P##h(N=0w# zRr*THo1~5h&CrqUXyi$x`?qM;?liygoGp9D60cBAn6A{9N9XxcKVj6-`|F$l>#qK9 zc4P-xof8! zW#!LEdpw!AXGDOB5j+96zsPKpa8xd((o z^6UuFN7r+VrI^NR!CnOcTY|*}i-1(SDys1>0)UJDVcG@2{wh9~9W~8zVWT{r)0{Qu z-1Aa_rBkX?BFoaGu;V$ep?zuSRT1DBqBqFeNJ*WQ8(r;~*2;9`N(BO(4`noIUHDAP z@{WqN(qc_AE4dV(pp82~q6IJoR4c;LpA`Oi;t*O7!)k^Xzla9c zN>}rG)mPMf5goth>V(!=k%^s(Ax&$Ta$oJvkb0ccBvHP3wGk34H0k_i8@~QYo4X#qG=e(ujb2~wRcRbc9&=XQ?h4~YLF9C?f!7Nh})bHK<|rkMOmeMU9lc@cR6{{<{{f?DV?HhWTv;8H&e`tsje}Y_EMe{$xVw1Q_=Ytawbj{GJMcHuWm;SMGZb zVDj^G1hTBQ8ljK{ZAY>NOi3Ux;b<27KSpLS{79l@-o75Zx^!R-l%0Hzoh6^*zf=Ec z>C594j~jPw@6z2qn1y*jUpTp-jvl+P^>A)J4J$f+j4PzT;Wc<+kVk&?@qkM__D9o} zrTv4E?uB9R23NbWc+v+Foza&Yuco^8OZJ{9-J0$B`~zoHc57_oeDBo5z`3U9wA6`% zEJ1U9&n>wgh-WF4_W=J!KMG+Y>xHTX!S%JWq6a$)A=BUMFZ@bEeH66lYki23eW^7V zCL1utW{d_KHu-e-1#R|yi7acWo;hWf&XTfz_YCKB+k~>J!dYD8Z*jS=!_x(2n-y!r z>*AXYLZ0tMc~%dCQSr6d;`{OHQTGj=as?l*nYuvA>D*va>|f&1n;;ouM=c^S!x{YR z)$=i&L75c4x!U_UmY|gpHz}o23DKY#nf`)S&a6~{YH-2L+9=3VoQ6`3P!^J?qIM_GNqV@4Ytoq8X#g~ccrrk+*QzBEnAt#vTZ3hV6KFV$`S;;2BQy)mmB6PMVj z&6===F7rowA2LVU^L>-d=yqAP?6jRJI~*+`0gMGwn$hc+Ty^DOvJ6@MtY;&fZhj{AXuAJ`Dn%qoR{Bu{AD* zWGTm{!8)0@O0kWyYavWF;<-KUn@0g+X{j+!X_1MqbLG<8J@0`g(gm2qO9hhrGBt+N zyx+>YhFeX29cfn=YpnCn7F2ds%GW($eo!*1rfpg;8eueg?47RN0B7${b|Vh8UxCuW zCdLD`{uC_OMn_x!aCJ62{{}!AoP&M8b>H$hSHpCyn^c-Fl}Sj^L-Og%7zXG%1l53^ zU@sL+BzkpWiC$X&%Q3x1Q!`x4tJ#G3O3P#X$;B{O+^*W2*HBs9X%0NhLQ3(RvG<+w z_<_@b7SSIv><9YouG1`Cu$Q=1*Y5i%XOB2#d(NJcnbhxR1_#!A%O#~2jd2-`1qEwK z%(%3SauvQSW37JmR%afp8)GULt=u<$>K$}U@*a&m^UC7E&ur@m>)Y!=S!b2}CbL3b zIzlpM(ah+o*UJ@Tm`%c{28XMTu z(6DjLv+0e^qSkVYIYZ;?`y*$ytT& zJeXTGIhB}KVyk6Z^R0WwZKIu+er6~~)~}3aU5(A>3b31Q<>&XE@mN^#(BYVOvA#lK zN!M$lH+&U0<7-2Q8(3MOWggu)7c>{@Ts9}dkikL%oNh>EJ_iZ=uvOCY1V|NqDZ~|g zfBlZQ?xe+<`2&3bJwDb~)bZX?&Mml8Dg?x_Ev6=6dHy~Qm>o3$_P*@bnXuGJDxzX{$(A(vb0|iwG-wT^_*S4Pf1%05eNm?Bm zt;*4$E92^Elo%}wKHj9k6)-Ne$Y^-@aemo|PWAA|?pWF1zPPFJpF)XQito0>IVUgr z2K>w^WGU~zV_A?f?(ELnC}fvvWXo(GSwg=eAgNbUEHhuvBtY#fA;eyJ(K%X(9Y<|m z-nDWgc6{U9nfA3N`~G=?m3%_~@vK{@3z0D_IR^i8)MvYcg62pKOoMmwtS!7ZmJScM z5pw}Gzpty;Ay#DQ3c1wcRH`2bP}0w9&eb7SO-8?)Sc(Q@f#-GJTNQ`nh8?VOYe%BB zg;J*U)}`}i^8kfLkKL6FU(n=rln8*%uf?b*U~F?-00+b&1}&NX zi;cyd-}0leO=tHV&JhTjnI3RZb+bz?Y8rdA?jmMn;%^>X z?JjfYv~Na0J-c%!P^`kCCI0j)X)Ycsp9a$I4a3t}5K~|jLB^_nR9XQbApotNOWE~* zv|0e*f@~)V00~daeL(9&^Th>T2W4Xtw{vv#gHmR+XU`YVgJ$NY3an&{g9qJGK|^VO zs9l8Jy-5$c zw^?FH=byWz`i0gEuTR?~+&%2FuvV5&PoE`JU0OVrG#&fhDP2@clh$)(Bq4xx!J_!i zl5m!lSbzPLN-r0mq_fq-hJuFaP^m4u=vF;9iK=%wzZnni)I|p$0sn}SF$TJ76c1t^ zQUiZl=N)ketgwiTsHA8RJIzbS`>t;>``pM~1ZXp_f6rpnJv@6?DaHRTs}p!8t#ZGv z?`R}ti(O-~hoh}H_YS-%jJK zUvbWj!xkBMIWL0pBXNbkgI0cZ41%p`-wVQ9Dprj(Kw+I{F-P6=n zh@v>G_8|~XqP|yQ4Vw9`5$~U?FzqJ24}=QI#q!g}%}fpv%8`0HUC~3?UYn!q!Beqy ztuNW!JGo5!XxSC-+O7wGk4;O`yNh-^7pr`5vCC;{Nd1sC5G&x;xS!D>|$Zv z#YmR|o#00E7+zYRhezLM#``xmGHz3nTM6viHuQ!xh?@CW{_jn*G=pr8G{uog(D2Ac zN(mgp$pjzqu_&3G6TKr;HTI0viccbCJ1b^+hdro)N)+l4P^#f-Nupvs^TyEo_L8vy ziEF58U)j{}(X3tp&rMSS#(w)t6+WLj+|&fBnvBNE80d?8`*OJPxayr3Imh5f_b~X{Nq-|2)%8&#Z675bBbS=P z;&CQ>Yt$CE*h}Z@`>XY0<$mW>cK5_s-ujGc%c+z?ftd$)><03C!s@f!I+4ju!_N9c6WuYN;kT;{FCa-zlCG#0(7C zrqKNwccNf|N|y?9%8_Sev{hwG=fEWI2kKgL^Ru9T+_qw0()F>|yz~9)wiO=~vxPTD ztCE1S)#080XdT5%dm#0cyk>_d-4}r?J+b03Q?(Vs-2-%70lkTQo?w{ z4&II~+nqp!mE70E@}E$%#wuW3<}1GsrTv-93+dE_$7THaVq!OZaaCJx8%IqpdFVz3 z%Jx`EM16P47v(XIU#=a|i4ZZd1$tPt*Vn!BLG%JHzoG9CHea`cpYj(?tw?9d(Zao# z*l-WrCcsY`AFLZI{Fz0oHhMt^a@m$Sl14)qTls?+7sRV0jmC;Dj`xb2L=tzZ-vgL1 z(S4)7j7NX_n*^QwSIQ7NH)asQBQAfq0t!`soN2-xc=hOU5d&-Qb8Ly_xHXl?9r{!6 z7+9Nf%B?%Gnq7^&%}T~Y%foCl?;?D9xM&0vHKRP|>xUOd3#@aO+LHnpOyk{R^X((u zTs(W(*7Dt#M3#)It{JO(&<%3k{82LL)VGotP;1(1cPpBHU^J}LmYJrzfH#RTpe4DC zX}eGeU?LK{f9idHY^=Zgr3-x1)PLmvDc=2JAtj5XV|&-kLb{Jfaw6rmp|^d{%8cW+ znQVD6-=Z9|a*;XU1KqT7-|!hrueF4&p0oItOGPc8b4OD#v*+4^RHwb!$c7g8i2+)Q z^CPuUn??7uSqAbycyteME(VpIyO}Vv{*tC^@XO_Z@_S!>GkkP)Ry6GH6Gm%+F<$|c zcd#j$A%pV=|H}#zE=r{g^Xc68Tq;%?NM%OR1OS#t>*W(C0GhK#zmX&#H23 zoORjGkF`Kuvw2#;=&q_86OSmI>$oZ>d*`CHKi9Xh z+B|H^sorj(#G0sC$<-7PBr0T#F8AeR--FdoWGx+E2fNnAk~Ig zzdoMR=v-Tx=1y1H+2T-AC?I=uYxs?n`E0Va^YQa}B_?EPdj zM_|HZT9)(dxT2nd8Rg%XUL23jtY+0cU+il7 ziC{Sj@raQqaS!(x%he*wWpx{_^6S{%(I^*1qB%#4P%84RoK}y_T-z;;06#j6h}1&l zF4zM2-C>d4?<-5zUC{VN-7S#K`}+~r0OzvCHQYU@f`&VG@2#zpwYc^MoJ@kuR%LIU zXzgzqy82jgkZZ}e3i4Q3P3%2t(`rZGB<377Qd?0HX$7)~s|^D<+c!1QR30Oao;n;6 zGa**vC6yyQ{KC%S%fp*v3!~u|v##UP4ZWjsK0cGe^{~lO{LJ8c&_HuEh3`S?(Qxfv zhRf4+7N%#Cf~z}uMqax+M%PCjzfEK)>v08COE|kJ<;?W?6hA&6@Y29_dhUXe z;Mx7K`=}D<^?D!G$FrytMcW=5{tLp0+@BJKw}lg@p_^pGhyDxVEi3Cqx-Sl?c?Z@w zlnxk4q0@cZwY;J$d$q{=kBG!*>Ijy9j4K&XT<)EOavL1gV;^`}KD^cP3RIp`KHuB# z{wr8HhJS3U7F~T@B%^`ds53oWfoZAiV`4*g*$GF_O+C8bu{NozNwWg({8ca11(=ld zLLCl%WEZh7tmM4IHSU9G(&$!db67H3PCKP93|MKT^OK!|X^h9W^lomux;(4d9727l z{yM7cJ>iQaoj`@&9o(vj(Ov~!Gkxmvlnm=ck zoheG0`t+EP``t@xDjPEiu^^!+{YG}Jp-kP6%2za^8fz(_z0Mr)@!?W%VOvW(Cr+I# z$Qfi4?{0KhJ#njN1oOy3*0lvzsZQ@zSb}E07{*xP=z2$;vGS~+YpZ1s7KU^;PMyTj z<7(Z`7DS2V0hk=&Jf28=^NJJOpdP{%q?j}1EH4vFO3-Bi_{{%dI2oi_{$FQT9th?7 z{h7CXp5;l`UjS(WVFqg(>P=T9g)KZ&3)zl6}%8l`N@?3Q3j_ zH){yL^Stl8V@7np-`{`3%=^60bDpz3=Q-zdc=;i@^~1e5B2vCaa>bV`RI+(<375se z6JKbhk{0(yZePl4bw_wzU{unp&(4Xs=GWx!U;OAFtpdI|%fIv{RXvLh+?9Ryu$5?V z!{Hwtm*QNz@`gTknr>{%|CaTq*A}_OrFw<&b1Rn_49!j+)OHzqqu>N zclPEj8pB3lX!7hHm*7quKgAX}4*T1fFGv@Yy3G|eqdMJGVP-$M=;T-BkrLe=#z!6!O*VtS#;1A?ZfuETXHc3Ck($L)qJ-z&r-YRN zO}n9cYGo_Qw{-NAs!4T1e|q@d=1n}wLc`DVzvjgz^Lbj_cG#sL>i*$Np!<*Bh6k}P zbi1Mo*V{aA%Wn8%i4%444)AqcAFdLZmK;`eRB~TnkQUj;h)3I+T08Q*KVpg1 zLnko!CT==Ac86=5EwS-XZ?5#OuCNbR)!G?(%0eQ-DMC-@QfOek+OvZST~@ct8WUq5 zLuj&K%B!N>T>WWyfMOM6E2ud`b0D;@YB;L&$F+L98DlSt!1#wTXTg@dwtUsDV&^64 zT|CJW-bMONy}SB)GK?Oazgg8Br!c6s$2Xj&V&2>X(ow=7{|y5rEejUKCc=o~J^wFf zZhRheC%a>#_0{SMcBc5^7<*9yPT%Vw3FIrD*JaGZSH|*hIZsA38n^$7DZjs!gzrxa zja^bRN>Jw7dDCZT)T9KTJ{IZl4`bXj_65P}Xr&x=cd0%GnDHf~ev)&+SQauo{{)sX z`-cd+^B&tQf}MZLIE639%_tJG+EDcpNP`)pnB~Xe#Nea>&T!+lSswUm=i(bL^!U#k zG0y*zh7&%|cMuIQORHI=D#GXT|KoWv1xP1*ykUOSSKgj6!cF`xpg3nV4DEn6+QHS; z5))pz(-dW6Yk7kN5r)JuyaXS6Z#l?|E|BRQA>J2~7yo#hDY0 zbEtF4X5;+O#M}?;3`tSt{zZ};u~v-d=RzqIC0TG6$8kwO2xW>Y+?5Op?r~-M6*JD@cWkytJ&%hyi#IC{>XorsGtfxzuT%98DLC2xS0cxEB zMJN{VP`eG7g^^bmScQz>j|~v3Cx-lmVseCJ(E89P2;LN@ zA()6So9-yZDL`yBJLrq}xrk*e_a&gx9w_GR>8?Gztnk2!aus~qG;P@ICg%rx@RVmV zFDnI)No^GN001^7(YSePS7uc?V(&))n;_6L5}x6S$^oTM0l03svR$ z2ou}RT;0DvuMc^QimgZ1pGHzi+=LO7C5{}dztM7$Kh&b?*m$@ur|f%6ORHZqcEyBI zG6im#_qsiV8juqL5|hgSLG{QOl&I^G_U51qNuDj(!cYc}ptvh}gGUMJ2rKr;Brp4R zGY1;4DWK*}pWik^q{%qiXVS7dCW+8Cw3~l~%Q-jA{1+Wd!4ArkoIUe00N+jC%rpf5 z86yE^)V|$()Ki2q&LE8AXN*=%y3?QXE0g6AWP)ShB4+gkm8J^}E${Mhjhcz*c;ob6 ztPKfufO4-7|EIZxGNnb{`hbs6UaJV#N5luIRD5T15WN{Ftc3Q#~ahLPJJuYVqQN*h2G$nw>*JA7^^m7E?%E+ z?Jfy)C{l05Yd3_FDqd(2u>d9wp!K5JL}LbB0H5p8I@dV8OBWLkx#kAKnxMzWHJvQ; zA4@9xW$WUWx%c7$8xMiKrb(b^PO2un854i_dAQHt>}w`y2%NEm_hPNLTZrg#wi56u z!W2cQxC1qjm|o64&OdsLyotx*qF+G7d+QON?`uldfJ#bg7JCg)&Jw8|8&aE<%)C*0hgMGd#+1dk*CsdO+h^j8`)#K1? zNQINVK&a{=WB81{hE!B&$9wHNn)>`_k0f7ZV&^&vai2mbLb&Jwc~*EkX2jA+zq+TO z1^XB&+1zb_Q{QTV*?FGdRQSIP!QMQ7+MaLiW#{(1|4Py-w9zyvWICO~_7KO^7LlZ} z5EIVoV*&$M-~1^6p|CDxp;U<%cK&V?%s!SqvZ6#H)#o|pF49kdxlotLq2rQBAK=GJ zPT1IrZ9teG0%bsn4{?79*|wmpd|{xgc;{70W!AjEbjJ#M%OKiU_9lrL%e*>Qnyr=y z<59w!!)7hE@Z%wVeVZN6g(duavJ%gKS{xtl%XDxVE$C1@A`&c(8CZ!tpBcolo0uib z*+De&q`PfO@3h^d<#J+shK5}67ZYhS(vWzIM`!h@;WV{qV?ycNLi&k9Pu z9HGx3j0|}**Z*Z;DnEv9&{&#lc1JzRSF@3daKIeo|9NBc!??GlXO2o}ymUS33~|dv zPlbuc7u-Q09YoC)Qad=${%mn+XGkx}0$G;%)9PJw6hFGJA}Q_PZfIZa`D&MCDY1b( zDxd@(x6}ioKp>fdP~6#u{OM3l3nBFz#jNODRP0e*BLc;h@1;B@R-gR7Y zbZNX_^T$1A<)aT{D$Ka}qwI#uj7>Z)6PD+3ypJM6-xERe>a81YyIg!Ex`N_BQWF8V zy!X~3TYfB=`}=)@X@5r*QR?@n@lREa{BJ@lH6#m4c08s2drhZngl6>IyHG>DlQ&@` z&wHB|U^EE^7I|*?lwT68odJk!cY`-D1L{?#;PplC7zTagw$5C6?SIzPT6QV2$h!=dkdzUomQF51-Sb%ghYu_#g1NKE zh;;Gx-KbA4c&cQm?lD?3ys;2)Dh=0seBnL#a(<_TW9+{q)p zQ*|o^FID>mqrmXx0@=bVpg z^|$xcIz@de4*y=e^pT*7HCjm!oiVay+tnnU19Le84s?IgPff`%#Y_(q*uB#!`apn~ z{O1II>t}%91a-xk(mTIRnZ z>N$~%5re@cpD)#Vr+dJ)-QxqgF#*5vybyUj*z9fIIE^0?2i@}&7g$zfRHwTO6nPv6 zJ6h9q>wzMf(Wf6>%CM=m$+wzee^$YHGi*bJ|R=?;dobL`pZ{6`5^PqYb8jE{sk0b zP)DkoGaIe?7Sc4?{zSscw7oQG`p}=HDm^X$wWV^by=xs=syTt*y?v&E6PCJnS8j8i zq>N34wOXm?s_3@wR{b_v9xgJyLowpvsQV9oC;~VD@OB#CAY2zh69DY{#8;H?a@q}& zg>R^OX4kf6ibauC-3pnAl-lYtczVrTl4@t@$rM*u%4~GGu&U}0mg=Y2a0gEwMUuD)oS2|JY*Z?)XzyA51EBlX z(sgCsHm_B-7Iep2%u^mw~`|1VqbYOdXYu3p2BHLVT@?0B@-rVCG??kxTB)&qB(k+Q@Umts0E^Jni#!(L7sw3Lh zwIGEEFwEY;U`D-ItjRpb<9|boBt)nzh28Y-yQ}S2xspvQjaAcX-`bL0{1dl58!hcr zzR+4XI>*FJb8xi7Ghy7`}hOs zC}_`9z$Yv$Ivrd9M8nO#FfCb?Tk~*w(QEiyIFGCB(L|)c!})Hj*MnY+6I0y%&^g?` zzB}+1bXoWqKpNO?`1wHhj{`m5Dr0x~zDij8KFkwhq3`1#tqa?ejEf&&NkL>|y(#l3 z2#u~$6&lMhpbu~V+dfjgfBuVr2vLZC9*7X>OYW&nhcgPhiY^X3Pd`8h;v(#o|6F}_J9>&8d}2J61W zhT{)=w(4wcT=XpDGVfc5^1t&=AS|)Im51L~7C&^)9?5)OY5XZLG4WF8>43z%ri?UI zf%u{JcW-aG8kG~rwWMtzrdy<@U``CBbZ>OW#`lvd+%B6P?Z&5?*6R!1xq6iN^7)q60rbN>&n4nl?Uvq4Zne$NpMq|GGt z&k45dJlplAMz09Di7Q>)!NDwJ+cG<^FD_ zWBDL6ZAI;#^!DDg&yAU=#&~ID(>~y}LAa)X%reT?A(m&}(V&Qkqb%z9FF-I; z=R1BqR@ULN20|(LTMs<>A=aN5*q@xHkyEuYBGo5r-WZO>R1_r^S`&s8d_RdOd&bu} zeiOJ!djR{c%O%}6IpNVkzW4=^TF|c}`$zDt)zc0i#AJqw0rB|lFy9C0Ti1M0P=%d` zIm8%Q(j2}IIysufsc~fA9i|V@;4VA$Ph{UbQeG48QW@NwM7=MB>#;srnh^dXmSk`o zNYU%4TNz;@Av4on3J1Uef2+{mA*na6_7O^-Z7(t#0sU5W^H8HFPQ6;IGWAPMx zY&MlZP~<099=hFN(Y9$Cdu~l`2w58?u|Bd*^xk{z2Ojqp4fWo_a0!YxMt)V%vIZ4; z^TKg_Qvu%_&a}CABwrLHT$TQiG%-Y)$|nH&zL$lpi|3V z%XNC`!nAH8O*F|6RKv5CQYHu)$7$vvspQ5#6Mk%Iz#tR~>n$9H@*xD z&p}N3Pm`m(a+*FCiC__R_Ik!+_K71-N8r6l29OOG?HPJ93QdM~nsnGp{poEcE-u{C z%t6$oU0ul$Nv22f5`>oWl3zyEv$hKFYO2rax zN~$Z(jrl^1?Xd%!C@?6ahufeVi>$)>4NUG>s0ul&#AP|Ks1~y<; z1KVPHjiAJ&=>$-Q_)7zD*^x%SGr&89d^tR(VrCa=T5B!P}KsCE;S=k>!KmGO(`b$zDniu0Biq|x4*+86n z9W5BFxEYhB*i?LjsCl2#TWi5}&u;k5K$@3fjzEy&&Fs>uyBp@oJoo;CTvUWjsc8sPw+jLzk*S)@O_lKP_OzV%F$#llIB4kp(xZSvEqW#?W zha+xJf5Kb4;z6vk$k$eN!3|j#0Z|wEh3^22?a+HmlY#IGuiZNnW0)*X{{#G(gM7_P zFv0un?`HQZq=a?XT}jJFpPCn0uLh2#dT{TNG|j1MWz-X!9f;acS)ai$&*&qhf^@@Gy639jiI@Z+cv^hN zDJigpQTn}@?w-Y`&b;1XX@hb0G=+cn!OZ@34K!;?0yMrU4~@L`x{iq=QkJifNo;CT27>p9l>HJe5nfPb`Z25`_Qj|21g{-l z+jr{TxG>DqCkG``wxVlSoj3Sw=Wmlpvt@6Gc}&0F*p3rivzU zG1@IZLf;4>4&wPw^?f(iWpdMDep$g9JqeQ=a{4cdNb?M zTQ&Mlo*q_31ygtkZOPhP>3<$Fl8w?!NN<$&h9BQQbDuv5r6Z?_6-hcno30vOj2AnV zGule7Kh+>ytuiH`O<*B=Zzw`K$8ig6G{~8SVTk@6Yv*l2Wpd6=dG@d!iW@&Rmd-Y* zJAQZQ;);RVhw(`dmi#%uWatJFV4Q@uMKRSy*O;rCe0U!KZnW4IQgFvQ<}L-WWx|Y# zJN7?%Hhdb{V7jE>ZRz^Pn5-$!`_CWmY&ld<1WRe@pk|J?X{t4T*Oz94O;F8Np){x!sVbk<8T#?U9b=O1N4is_IyqoD;pykAc~I1?fxxQ&-~`F8hvLKm(9 ztOE;bM`aM12rtRq@{Xxv@s}SbmWmWB;jClGb}j+{G!+qEQ~j~ww~Pb%0}4*wP4~7$ z{{f}dO@0a*<_9YZ8IIv%oaOBHz8NLF1ge$ z4;$(gPnUK`R{3o{na&5UGWoGtvb&cQ@EJp+AF&0}ivVC-29D$88x~hEB4T9At=UJ4ZoOTZ_;tJp#hlE__yEO#8y$8D1A~2F#SG8uN&}YF z=fS2kCf8at?knGY75z?+TxA#KAnSkV5!dp|1&{s9(?=hsScZB(FLi$PmvI5@#HmHz z*6po1w}YLBL!J-WNV@A7ejZ-b8R%YW*b{b17h|FzU!QfzIidmzfbMTk1x2zoN(G;OZ14&{ARl|~$>8s{Bbili zhc>D;4=xSt&s+Jfc8=NCt^Y|{U*tqO!GkrTqd$a@i^S0M#l&V$isgjO3^0AMsB!*+ zIiX>7t9Dk%`aQSB{7VfXgdAqpEp@YK$f09)=Va9ZTC;Ni9+-4AxVof6dJBq;yP3>rBQIZ$hw*W9R;G-Iph9G&9h7nreq zD77-q|B&z)k4R8?#&xIU@XDD2#U6o@po1O}w&K}}iDokIZX#Gt@cd*7nfRWSWd}TZ zSBdubn9$-RN5^wc@gZ~)&Nsf`E*iG%3Pxw^LOI&9|M7X$Vhx30ni0>m8!#0A=jTbF z)5MM$-_i4793_?fOCALpeOzp*>Jm_JSbY{;^Bm>&B&;-Z8tkMdC^n9wcFMs2h2l1? z&Y}T$$rxYM zZoQE7u{0eaoD+oxH^TE3*@w=Aq&ofYtA{Bt9q%(8YXS9Y>_xCx;zo>6e{2Sg?T3me z7?Y4VMm3z>CUoV922-pN={bVX8+d2ujG1Ggy%_0)sCSf0JH Include the Script First Start + Map Markings Advanced: CAP Advanced: Missions - Map Markings + Advanced: Lanes diff --git a/.docs/web/pages/advanced/lanes.html b/.docs/web/pages/advanced/lanes.html new file mode 100644 index 0000000..19be447 --- /dev/null +++ b/.docs/web/pages/advanced/lanes.html @@ -0,0 +1,125 @@ + + + + + + + Spearhead Lanes + + + + + + + +

+ +
+
+
+ + +
+

Lanes

+ +

+ If up to now you've used mission stages like MISSIONSTAGE_1_STAGE you've been using the main lane.
+ This is the default or "main" lane, however, if you wanted to mix things up and create a more dynamic mission, you can use additional lanes.
+ Each lane can have its own set of mission stages, allowing for parallel or branching mission objectives. +

+ +

How To

+

Define Lanes

+

+ Lanes are defined implicitly in the naming convention of the MISSIONSTAGE_.
+ A lane is identified by a single character (alpha [A-Z]), which gives you 26 unique lanes.
+ For example, MISSIONSTAGE_A1_[name] would belong to lane A.
+
+ If there is no lane character specified, the stage belongs to the main lane.
+
+ The 26 lane limit is only relevant if you want 26 lanes at the same time.
+ But splitting up lanes (eg. (1-4 and 10-15) ) you can easily have more than 26 stages throughout your entire mission.
+
+ Lanes don't have to start at index 1. as in the example lanes can easily start at any index.
+ How lanes are then activated and activate other lanes is described below in the Dependencies Explained part. +

+

Dependencies Explained

+

+ When we are talking about lanes it's important to make the distinction between the main lane and additional lanes.
+ The main lane is not only the default, but it's also the central lane that other lanes depend on.
+ +

Chapters

+ Another term that we have used in the code is `Chapter` which refers to a grouping of mission stages within a lane.
+ These are implied and cannot be directly controlled or altered.
+ A chapter is a set of `MissionStage`s that are directly connected.
+ For `MissionStages` `[ A1, A2, A3, A5, A6]` there are 2 chapters: `[ A1, A2, A3]` and `[ A5, A6]`.
+ Within a chapter the stages are only directly dependent on each other. Meaning A2 will start when A1 is completed.
+
+ However, the chapter start is where the inter-lane dependencies come into play.
+ These operate a little differently.
+
+ In the Visual example you can see the Stages grouped into chapters by the red boxes.
+ +

Side Lane Chapter start

+ +

+ Side lane chapters are started when all are true: +

    +
  • The main lane is at or above the current stage lane number.
  • +
  • All previous chapters in the same side lane have been completed.
  • +
+

+ +

Main Lane Chapter start

+

+ Main lane chapters are started when all are true: +

    +
  • The previous chapter in the main lane has been completed.
  • +
  • All side lanes are at or above the current stage lane number or the side lane has no additional stages.
  • +
+

+

+ +

Visual

+

+ The image below illustrates how different lanes can be used within a mission.
+ In the example you can see how the dependency between the main lane and side lanes works.
+ An arrow means that the completion of one stage is required before the next stage can begin. +

+ Example of mission lanes + +

Mermaid

+

+ Spearhead automatically exports a spearhead diagram to the logs on starting a mission.
+ This can be handy to visualize the logic and lanes you've created and verify your mission flow will be the way you want it.
+

+ +

Log Example

+

TODO: Show log example

+ +

Diagram Example

+

TODO: Show diagram example

+ +

Limitations

+

CAP

+

+ Due to the CAP naming conventions, we've opted to currently have CAP only react with the main lane.
+ This might mean a bit less flexibility when using lanes for major mission logic, however, it's a limitation we've accepted for now.
+ In the future we might be able to extend CAP's interaction with other lanes as well.
+ Currently this issue can be tracked here. +

+
+
+ +
+
+

© 2025 Spearhead Project

+
+ + + \ No newline at end of file diff --git a/.docs/web/style/style.css b/.docs/web/style/style.css index 6df6800..70db585 100644 --- a/.docs/web/style/style.css +++ b/.docs/web/style/style.css @@ -262,7 +262,7 @@ header nav a:hover::after { overflow: hidden; top: 100%; /* Position below the dropdown */ left: 0; /* Align left edge */ - min-width: 160px; + min-width: 240px; background-color: var(--color-bg-secondary); box-shadow: var(--shadow-medium); @@ -336,7 +336,6 @@ main { } .side-nav { - width: 200px; min-width: 200px; padding-left: 0; overflow-y: auto; diff --git a/lanes.excalidraw.json b/lanes.excalidraw.json index b9aca9c..a075b21 100644 --- a/lanes.excalidraw.json +++ b/lanes.excalidraw.json @@ -1,7 +1,7 @@ { "type": "excalidraw", "version": 2, - "source": "vscode-webview://1hn2vaam3v69jt67pr4i27hnkafotvd70l4ao9nlb18pmrffl5dm", + "source": "vscode-webview://1h45nhtr1vhnknf2q5n6qdd43citnkfueml5qdvamifv7pfv0our", "elements": [ { "id": "kJXWwZE94uUnPMEB7mBNj", @@ -629,11 +629,11 @@ "type": 2 }, "seed": 2125327475, - "version": 40, - "versionNonce": 1013087493, + "version": 44, + "versionNonce": 2047370396, "isDeleted": true, "boundElements": [], - "updated": 1787675736572, + "updated": 1788258273370, "link": null, "locked": false, "points": [ @@ -2138,7 +2138,7 @@ "version": 99, "versionNonce": 1709724811, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1787675780472, "link": null, "locked": false, @@ -2263,7 +2263,7 @@ "version": 3, "versionNonce": 1276059851, "isDeleted": true, - "boundElements": null, + "boundElements": [], "updated": 1787675789610, "link": null, "locked": false, @@ -2302,7 +2302,7 @@ "version": 261, "versionNonce": 1283832069, "isDeleted": true, - "boundElements": null, + "boundElements": [], "updated": 1787675799132, "link": null, "locked": false, @@ -2357,7 +2357,7 @@ "version": 382, "versionNonce": 2105101093, "isDeleted": false, - "boundElements": null, + "boundElements": [], "updated": 1787675810843, "link": null, "locked": false, @@ -2398,6 +2398,547 @@ "startArrowhead": null, "endArrowhead": "arrow", "elbowed": false + }, + { + "id": "Qg114yJFcnUOPX16ZsJ8x", + "type": "rectangle", + "x": 509.8671875, + "y": 686.59375, + "width": 444.67578125, + "height": 167.3125, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "VfG5-6eCT8RzeqEVN8myu" + ], + "frameId": null, + "index": "ap", + "roundness": { + "type": 3 + }, + "seed": 1685903900, + "version": 112, + "versionNonce": 1755199388, + "isDeleted": false, + "boundElements": null, + "updated": 1788258305636, + "link": null, + "locked": false + }, + { + "id": "73h7FwfangZc2to491dHS", + "type": "text", + "x": 528.00390625, + "y": 660.9140625, + "width": 84.21994018554688, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "VfG5-6eCT8RzeqEVN8myu" + ], + "frameId": null, + "index": "aq", + "roundness": null, + "seed": 2008726428, + "version": 28, + "versionNonce": 557293604, + "isDeleted": false, + "boundElements": null, + "updated": 1788258305636, + "link": null, + "locked": false, + "text": "Chapter ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chapter ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "DGkXXz8b3r1CA3lp1SUNA", + "type": "rectangle", + "x": 1072.755859375, + "y": 843.8359375, + "width": 444.67578125, + "height": 167.3125, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Wu4PaRDsQhtHo9txEwFaq" + ], + "frameId": null, + "index": "ar", + "roundness": { + "type": 3 + }, + "seed": 81759516, + "version": 274, + "versionNonce": 1049204252, + "isDeleted": false, + "boundElements": [], + "updated": 1788258312611, + "link": null, + "locked": false + }, + { + "id": "gHZ2EHWic_RFDVzfaEeWl", + "type": "text", + "x": 1090.892578125, + "y": 818.15625, + "width": 84.21994018554688, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Wu4PaRDsQhtHo9txEwFaq" + ], + "frameId": null, + "index": "as", + "roundness": null, + "seed": 1814530460, + "version": 190, + "versionNonce": 1437102748, + "isDeleted": false, + "boundElements": [], + "updated": 1788258312611, + "link": null, + "locked": false, + "text": "Chapter ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chapter ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "yzc8kTihzHlUVl-TDoGtD", + "type": "rectangle", + "x": 507.05134802628254, + "y": 1027.3553987485943, + "width": 779.734375, + "height": 180.99004003531365, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dPJ-abW3oM5fQQd-eQqzv" + ], + "frameId": null, + "index": "at", + "roundness": { + "type": 3 + }, + "seed": 607103004, + "version": 711, + "versionNonce": 2046521372, + "isDeleted": false, + "boundElements": [], + "updated": 1788258356226, + "link": null, + "locked": false + }, + { + "id": "Sw0whVPXyycRuB36rl13U", + "type": "text", + "x": 892.9185355262825, + "y": 1105.350418766251, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dPJ-abW3oM5fQQd-eQqzv" + ], + "frameId": null, + "index": "atG", + "roundness": null, + "seed": 257763356, + "version": 7, + "versionNonce": 969870492, + "isDeleted": true, + "boundElements": null, + "updated": 1788258356227, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "yzc8kTihzHlUVl-TDoGtD", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ePG9RXnjdF7K-5HCGF-sG", + "type": "text", + "x": 892.826171875, + "y": 1105.350418766251, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dPJ-abW3oM5fQQd-eQqzv" + ], + "frameId": null, + "index": "atV", + "roundness": null, + "seed": 1253487140, + "version": 3, + "versionNonce": 1886913564, + "isDeleted": true, + "boundElements": null, + "updated": 1788258344772, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "yzc8kTihzHlUVl-TDoGtD", + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "R_Kw8DfCduiWxP7CASb_N", + "type": "text", + "x": 524.3895472712409, + "y": 998.6389362160919, + "width": 91.1047910105572, + "height": 27.04371162275886, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dPJ-abW3oM5fQQd-eQqzv" + ], + "frameId": null, + "index": "au", + "roundness": null, + "seed": 12338332, + "version": 420, + "versionNonce": 1541295132, + "isDeleted": false, + "boundElements": [], + "updated": 1788258353639, + "link": null, + "locked": false, + "text": "Chapter ", + "fontSize": 21.63496929820709, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chapter ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7ToWvccfEZqbEAjYL4emv", + "type": "text", + "x": 831, + "y": 1209, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "av", + "roundness": null, + "seed": 1688532764, + "version": 3, + "versionNonce": 1539555236, + "isDeleted": true, + "boundElements": null, + "updated": 1788258343223, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9skEFGeqqszPFdJV66133", + "type": "rectangle", + "x": 1330.6578165538313, + "y": 667.0195187552217, + "width": 444.67578125, + "height": 167.3125, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dousqSQWhbh19Dj8kK4fS" + ], + "frameId": null, + "index": "aw", + "roundness": { + "type": 3 + }, + "seed": 853836316, + "version": 170, + "versionNonce": 1121900188, + "isDeleted": false, + "boundElements": [], + "updated": 1788258361087, + "link": null, + "locked": false + }, + { + "id": "4Cd9i97bkeod6ywtcj5Xn", + "type": "text", + "x": 1348.7945353038313, + "y": 641.3398312552217, + "width": 84.21994018554688, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dousqSQWhbh19Dj8kK4fS" + ], + "frameId": null, + "index": "ax", + "roundness": null, + "seed": 1472585372, + "version": 86, + "versionNonce": 243376924, + "isDeleted": false, + "boundElements": [], + "updated": 1788258361087, + "link": null, + "locked": false, + "text": "Chapter ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chapter ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "U8a4GgGtIoLS6pXwncq5a", + "type": "rectangle", + "x": 1810.8701028484863, + "y": 843.8080905841363, + "width": 230.73755409848874, + "height": 167.3125, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "IWb0wwURCie1t66j-aH-H" + ], + "frameId": null, + "index": "ay", + "roundness": { + "type": 3 + }, + "seed": 1566757796, + "version": 308, + "versionNonce": 1300628124, + "isDeleted": false, + "boundElements": [], + "updated": 1788258382644, + "link": null, + "locked": false + }, + { + "id": "YB4-1BJixVvFCAPEKUjkb", + "type": "text", + "x": 1829.0068215984863, + "y": 818.1284030841363, + "width": 84.21994018554688, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "IWb0wwURCie1t66j-aH-H" + ], + "frameId": null, + "index": "az", + "roundness": null, + "seed": 1754316580, + "version": 184, + "versionNonce": 1187836068, + "isDeleted": false, + "boundElements": [], + "updated": 1788258367320, + "link": null, + "locked": false, + "text": "Chapter ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chapter ", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "BbFtWqq47jrAmSsK1kS5K", + "type": "rectangle", + "x": 1572.2560817430196, + "y": 1164.5515767881157, + "width": 213.3201668995678, + "height": 167.3125, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Y2e1HJZ6fg1eVldte5E0E" + ], + "frameId": null, + "index": "b00", + "roundness": { + "type": 3 + }, + "seed": 1408083100, + "version": 307, + "versionNonce": 1993713316, + "isDeleted": false, + "boundElements": [], + "updated": 1788258378727, + "link": null, + "locked": false + }, + { + "id": "8ysTWPdFv_xsWQSdnrBNI", + "type": "text", + "x": 1590.3928004930196, + "y": 1138.8718892881157, + "width": 84.21994018554688, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Y2e1HJZ6fg1eVldte5E0E" + ], + "frameId": null, + "index": "b01", + "roundness": null, + "seed": 1887875356, + "version": 138, + "versionNonce": 336624028, + "isDeleted": false, + "boundElements": [], + "updated": 1788258371803, + "link": null, + "locked": false, + "text": "Chapter ", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chapter ", + "autoResize": true, + "lineHeight": 1.25 } ], "appState": { -- 2.54.0 From 4b1ec92235a7a01c31b8f4ff590051b5601ba955 Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Tue, 1 Sep 2026 13:34:58 +0200 Subject: [PATCH 07/12] updated docs and release notes --- .docs/web/pages/advanced/lanes.html | 8 +++++--- RELEASENOTES.md | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.docs/web/pages/advanced/lanes.html b/.docs/web/pages/advanced/lanes.html index 19be447..6303f44 100644 --- a/.docs/web/pages/advanced/lanes.html +++ b/.docs/web/pages/advanced/lanes.html @@ -57,7 +57,7 @@ Another term that we have used in the code is `Chapter` which refers to a grouping of mission stages within a lane.
These are implied and cannot be directly controlled or altered.
A chapter is a set of `MissionStage`s that are directly connected.
- For `MissionStages` `[ A1, A2, A3, A5, A6]` there are 2 chapters: `[ A1, A2, A3]` and `[ A5, A6]`.
+ For MissionStages [ A1, A2, A3, A5, A6 ] there are 2 chapters: [ A1, A2, A3 ] and [ A5, A6 ].
Within a chapter the stages are only directly dependent on each other. Meaning A2 will start when A1 is completed.

However, the chapter start is where the inter-lane dependencies come into play.
@@ -66,7 +66,6 @@ In the Visual example you can see the Stages grouped into chapters by the red boxes.

Side Lane Chapter start

-

Side lane chapters are started when all are true: