From fe23ba4050ba74a7dd7a6fe1186488a49b3c296c Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Thu, 28 Aug 2025 21:21:43 +0200 Subject: [PATCH] cargosoft migrations agent --- .../api/CargosoftMigrationRestService.java | 127 ++ .../main/resources/agl_wandlung_20250822.csv | 2031 +++++++++++++++++ 2 files changed, 2158 insertions(+) create mode 100644 office-alexander-logistics-app/src/main/resources/agl_wandlung_20250822.csv diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/api/CargosoftMigrationRestService.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/api/CargosoftMigrationRestService.java index 333750d..cb7af35 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/api/CargosoftMigrationRestService.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/api/CargosoftMigrationRestService.java @@ -27,8 +27,15 @@ package com.alexanderlogistics.api; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import org.imixs.marty.team.TeamService; @@ -191,6 +198,126 @@ public class CargosoftMigrationRestService implements Serializable { return messageBuffer.toString(); } + /** + * Migriert die Rechnungen mit den neuen cdtr. Nummern + * + * + */ + @GET + @Path("/cargosoft-renew_cdtr_number") + @Produces({ MediaType.TEXT_PLAIN }) + public String migrationAdresswandlungOpenInvoices(@QueryParam("maxcount") int maxcount, + @QueryParam("type") String type) + throws QueryException, AccessDeniedException, ProcessingErrorException, PluginException, ModelException { + StringBuffer messageBuffer = new StringBuffer(); + if (maxcount <= 0) { + maxcount = 100; + } + if (type == null || type.isEmpty()) { + type = "workitem"; + } + + if (isRunning) { + log("├── sync process already running!", messageBuffer); + return messageBuffer.toString(); + } + isRunning = true; + + log("├── read cargosoft migration file....", messageBuffer); + Map mapping = readAdressMapping(); + log("├── found " + mapping.size() + " mappings", messageBuffer); + + String query = "(type:" + type + ") AND ($modelversion:rechnungseingang*)"; + int syncs = 0; + long l = System.currentTimeMillis(); + int batchSize = 100; + int totalObjects = 0; + log("├── migration cargosoft addresses....", messageBuffer); + log("│ ├── query=" + query, messageBuffer); + + int totalCount = documentService.count(query); + log("│ ├── found " + totalCount + " invoices", messageBuffer); + + // Berechne Anzahl der benötigten Pages + int totalPages = (int) Math.ceil((double) totalCount / batchSize); + + // Verarbeite Page für Page + for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) { + log("│ ├── read page " + pageIndex, messageBuffer); + List invoiceList = documentService.find(query, batchSize, pageIndex); + long l1 = System.currentTimeMillis(); + + int updates = migratateInvioceBPAddress(invoiceList, mapping); + syncs = syncs + updates; + log("│ ├── " + updates + " invoices migrated in " + + (System.currentTimeMillis() - l1) + "ms ", messageBuffer); + // break; + } + long duration = System.currentTimeMillis() - l; + double objectsPerSecond = totalObjects / (duration / 1000.0); + log("├── Successfully " + syncs + " business partner objects synced in " + duration + "ms (" + + String.format("%.1f", objectsPerSecond) + " objects/sec)", messageBuffer); + + isRunning = false; + return messageBuffer.toString(); + } + + @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) + private int migratateInvioceBPAddress(List invoices, Map map) { + int count = 0; + for (ItemCollection invoice : invoices) { + String cdtrNumber = invoice.getItemValueString("cdtr.number"); + String newNumber = map.get(cdtrNumber); + if (newNumber != null) { + // migrate number + invoice.setItemValue("cdtr.number.old", cdtrNumber); + invoice.setItemValue("cdtr.number", newNumber); + + logger.info("│ ├── replace " + cdtrNumber + "->" + newNumber + " : " + invoice.getUniqueID()); + // documentService.save(invoice); + count++; + + } + } + return count; + } + + /** + * Diese hilfsmethode liest die Cargosoft Datei mit den Mapping - alt->neu ein + * + * @return + */ + private Map readAdressMapping() { + Map result = new HashMap<>(); + try (InputStream inputStream = getClass().getClassLoader() + .getResourceAsStream("agl_wandlung_20250822.csv"); + BufferedReader reader = new BufferedReader( + new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + + String line; + boolean firstLine = true; + + while ((line = reader.readLine()) != null) { + if (firstLine) { + firstLine = false; + continue; // Header überspringen + } + + String[] parts = line.split(";"); + if (parts.length == 2) { + String oldID = parts[0].trim(); + String newID = parts[1].trim(); + result.put(oldID, newID); + + } + } + } catch (IOException e) { + // Logging framework verwenden + System.err.println("Fehler beim Laden der CSV: " + e.getMessage()); + } + return result; + } + /** * Hilfsmethode speichert eine cargoosft kreditor object... * diff --git a/office-alexander-logistics-app/src/main/resources/agl_wandlung_20250822.csv b/office-alexander-logistics-app/src/main/resources/agl_wandlung_20250822.csv new file mode 100644 index 0000000..b935c20 --- /dev/null +++ b/office-alexander-logistics-app/src/main/resources/agl_wandlung_20250822.csv @@ -0,0 +1,2031 @@ +alt;neu +10633;21054 +10741;21418 +10807;20601 +10814;20969 +10970;21042 +11281;21046 +11374;20900 +11959;21035 +12142;20997 +12597;20719 +12652;21009 +12785;21451 +12941;20699 +12983;21453 +13012;20706 +13036;21044 +13390;21039 +13404;20702 +13532;21319 +13946;20743 +14136;21027 +14231;20747 +14233;20991 +14244;20737 +14409;21022 +14514;21324 +14861;21034 +15063;21452 +15339;20848 +15342;20560 +15343;21165 +15346;20873 +15347;20875 +15348;20847 +15350;21065 +15351;21313 +15352;21066 +15353;21067 +15354;21377 +15355;21248 +15356;21068 +15357;21070 +15358;21072 +15359;21073 +15360;21074 +15361;21075 +15362;21171 +15363;21076 +15364;20661 +15365;21078 +15366;21444 +15367;21181 +15368;21079 +15374;21084 +15375;21087 +15377;21089 +15378;21091 +15379;21092 +15380;21094 +15381;21096 +15384;21103 +15385;20673 +15386;21108 +15387;21109 +15388;21111 +15389;21113 +15390;21115 +15391;20658 +15392;21117 +15393;21119 +15394;21168 +15395;21122 +15396;21125 +15397;21129 +15398;21194 +15399;21131 +15400;21133 +15425;20625 +15451;20652 +15452;20660 +15453;20670 +15454;20675 +15455;21061 +15456;20680 +15457;21081 +15458;21085 +15459;21176 +15460;21298 +15461;20672 +15462;21134 +15463;21137 +15464;21450 +15465;20532 +15466;21138 +15467;21139 +15468;21142 +15469;21185 +15475;21260 +15485;21144 +15495;21258 +15496;21257 +15497;21256 +15528;21252 +15529;21242 +15530;21241 +15531;21240 +15532;21157 +15533;21239 +15534;21238 +15535;21237 +15536;21302 +15553;20866 +15558;21236 +15559;21235 +15560;21234 +15561;21232 +15562;21231 +15563;21230 +15566;21229 +15567;21405 +15568;21359 +15570;21281 +15571;21227 +15572;21226 +15573;21225 +15574;21224 +15575;21222 +15576;21221 +15579;21220 +15580;21218 +15581;21216 +15582;21371 +15583;21421 +15584;21215 +15586;21213 +15589;21343 +15605;21403 +15606;21372 +15607;21356 +15608;21331 +15609;21454 +15611;21358 +15613;21353 +15614;21346 +15615;21344 +15617;21341 +15618;21340 +15619;21334 +15624;21274 +15625;21269 +15626;21268 +15638;21374 +15639;21364 +15640;21350 +15641;21264 +15642;21210 +15643;21208 +15644;21299 +15659;21196 +15660;21195 +15689;20893 +15727;21174 +15766;21383 +15769;21355 +15783;20985 +15812;21255 +15838;20821 +15839;21305 +15843;21156 +15844;21152 +15852;21285 +15854;21282 +15855;21099 +15903;21414 +15904;21420 +15948;21201 +15949;21200 +15958;21349 +15959;21116 +15960;21321 +15961;21291 +15962;21263 +15963;21193 +15966;21187 +15967;21175 +15968;21393 +15969;21386 +15970;21365 +15971;21351 +15973;21294 +15974;21280 +15975;21211 +15976;21169 +15977;21166 +15978;21163 +15979;21161 +15980;21159 +16030;21050 +16039;21048 +16093;21029 +16095;21025 +16133;21018 +16134;21015 +16135;21010 +16136;21002 +16140;20999 +16175;20961 +16176;20957 +16177;20955 +16178;20953 +16179;20947 +16259;21348 +16285;21150 +16286;21147 +16287;21107 +16288;21105 +16289;21090 +16290;20992 +16294;21083 +16295;21080 +16296;21058 +16310;21397 +16311;21367 +16312;21295 +16314;21053 +16317;21332 +16318;21292 +16319;21251 +16320;21198 +16328;21412 +16329;21410 +16330;21366 +16340;21335 +16348;21031 +16349;21021 +16364;21283 +16368;20993 +16369;20987 +16370;20983 +16371;20981 +16372;21323 +16373;20978 +16375;20977 +16376;20976 +16377;20973 +16378;20972 +16379;20971 +16380;20970 +16383;20968 +16384;20966 +16385;20964 +16386;20960 +16387;20948 +16388;20945 +16389;20943 +16390;21052 +16391;20940 +16392;20939 +16393;20935 +16403;21033 +16407;20663 +16412;20934 +16422;21406 +16423;21402 +16447;21388 +16449;21278 +16450;20931 +16451;20930 +16452;20928 +16453;21191 +16455;21279 +16457;20926 +16458;20923 +16480;20922 +16489;20921 +16516;21288 +16578;21379 +16588;21409 +16653;20918 +16654;20917 +16655;20916 +16656;20914 +16657;20912 +16658;20906 +16664;20905 +16665;20903 +16697;20902 +16700;21400 +16715;21301 +16719;21266 +16721;21329 +16722;20901 +16723;20899 +16744;21396 +16745;21417 +16746;21362 +16747;21338 +16748;21293 +16749;21203 +16750;21020 +16751;20897 +16827;21204 +16983;20937 +16985;20896 +16986;20895 +16987;20891 +16988;20890 +16989;20889 +16990;20888 +16991;20886 +16992;20885 +16993;20884 +16994;20882 +16995;20880 +17199;20879 +17200;20877 +17201;20876 +17202;20539 +17203;20870 +17227;21384 +17228;21368 +17229;20864 +17241;20863 +17256;20861 +17258;20860 +17261;20859 +17262;20858 +17263;20857 +17286;20856 +17287;20855 +17288;20854 +17308;20853 +17309;20851 +17310;20849 +17318;20846 +17319;20844 +17320;20843 +17321;20841 +17322;20839 +17323;20836 +17324;20834 +17325;20832 +17326;20830 +17327;20829 +17328;20825 +17329;20824 +17330;20822 +17331;20820 +17332;20818 +17341;20816 +17342;20814 +17343;20809 +17810;20802 +17811;20800 +17812;20799 +17813;20798 +17814;20797 +17815;20796 +17857;20845 +17859;20872 +17860;20840 +17861;20826 +17863;21243 +17865;20795 +17866;20792 +17867;20791 +17868;20790 +17869;20789 +17870;20787 +17871;20786 +17872;20784 +17873;20783 +17874;20779 +17875;20776 +17876;20772 +17877;20771 +17882;20769 +17884;20768 +17885;20767 +17887;20766 +17896;20729 +17900;20764 +17901;20763 +17902;20761 +17903;20758 +17907;20754 +17916;21245 +17918;20938 +17919;20752 +17920;20750 +17921;20692 +17922;20690 +17927;21246 +17929;20684 +17930;20679 +17932;20667 +17934;20657 +17936;20655 +17937;20653 +17938;20648 +17940;20645 +17941;20643 +17942;20642 +17945;21004 +17948;20641 +17949;20639 +17950;20638 +17951;20637 +17952;20636 +17953;20634 +17957;20633 +17958;20629 +17959;20628 +17960;20626 +17961;20623 +17962;20622 +17963;20619 +17964;20618 +17965;20616 +17966;20614 +17967;20612 +17968;20611 +17969;20610 +17970;20609 +17971;20608 +17972;20606 +17973;20604 +17974;20603 +17975;20600 +17978;21247 +17979;20599 +17980;20598 +17982;20597 +17983;20594 +17984;20760 +17985;20592 +17999;20591 +18001;20587 +18002;20586 +18004;20584 +18005;20583 +18006;20582 +18007;20580 +18012;20811 +18014;20579 +18019;20862 +18020;20578 +18021;20576 +18029;20574 +18031;20573 +18032;20570 +18035;20568 +18036;20567 +18037;20566 +18039;20565 +18040;20563 +18041;20561 +18042;20552 +18043;20549 +18044;20547 +18045;20541 +18046;20540 +18047;20538 +18048;20529 +18049;20527 +18050;20524 +18053;20521 +18056;20518 +18057;20517 +18058;20516 +18061;20513 +18062;20511 +18064;20508 +18065;20506 +18066;20504 +18067;21449 +18072;21354 +18079;21447 +18080;21446 +18081;21442 +18090;21441 +18091;21440 +18094;21438 +18096;20522 +18097;21435 +18103;21434 +18108;20941 +18109;20950 +18110;20954 +18111;20881 +18112;20874 +18113;20956 +18114;20805 +18115;20812 +18122;20887 +18125;20607 +18126;21063 +18127;21249 +18130;21028 +18131;21253 +18132;21254 +18136;21190 +18137;21250 +18138;21262 +18139;21267 +18140;21271 +18141;21272 +18142;21276 +18144;21284 +18145;21289 +18146;21296 +18147;21300 +18149;20963 +18151;20998 +18159;21189 +18172;21375 +18174;21023 +18175;21126 +18176;21286 +18182;20707 +18183;21376 +18184;20534 +18188;21381 +18192;21387 +18194;20780 +18195;20959 +18196;21206 +18197;21390 +18198;21395 +18199;20755 +18200;21432 +18201;21429 +18202;21427 +18203;21425 +18204;21423 +18205;20770 +18211;20773 +18212;20502 +18223;20509 +18224;20512 +18228;20788 +18229;20630 +18231;20525 +18233;20526 +18234;20528 +18235;20530 +18237;20536 +18238;20543 +18239;20545 +18240;20546 +18241;20548 +18242;20550 +18244;20553 +18245;20554 +18246;20558 +18247;20562 +18248;20564 +18250;20571 +18255;20589 +18256;20590 +18257;20593 +18258;20596 +18260;20602 +18261;20605 +18262;21055 +18263;20615 +18264;20617 +18267;20620 +18269;20624 +18296;20647 +18297;20649 +18298;20650 +18299;20666 +18300;20669 +18301;20674 +18302;20682 +18303;20683 +18308;21180 +18309;20697 +18314;20705 +18315;20709 +18316;20711 +18317;20712 +18318;20713 +18321;21008 +18322;20714 +18325;20718 +18330;20730 +18331;20731 +18332;20732 +18333;20736 +18334;20738 +18335;20740 +18340;20741 +18342;21205 +18343;20742 +18344;20744 +18347;20748 +18348;20749 +18349;20751 +18351;21219 +18352;20681 +18357;20753 +18360;20756 +18361;20757 +18370;21228 +18371;20774 +18372;20775 +18373;20777 +18374;20781 +18375;20782 +18380;20794 +18382;20801 +18385;20806 +18386;20815 +18387;20817 +18388;20819 +18396;21244 +18399;21459 +18400;20828 +18402;20831 +18404;20850 +18405;20852 +18425;21259 +18426;21059 +18427;20762 +18428;21082 +18433;21261 +18435;21265 +18440;21095 +18441;21097 +18443;21100 +18445;21102 +18446;21104 +18447;21106 +18452;21110 +18453;21112 +18454;21273 +18455;21114 +18459;21275 +18460;21277 +18461;21118 +18464;21120 +18466;21121 +18467;21123 +18468;21124 +18474;20668 +18476;21128 +18477;21130 +18478;21132 +18479;21140 +18484;21141 +18485;21290 +18490;21145 +18494;21146 +18495;21148 +18497;21151 +18498;21153 +18501;20804 +18504;21155 +18505;20533 +18507;21160 +18508;21162 +18509;21164 +18511;21303 +18512;21304 +18516;20927 +18517;21173 +18520;21182 +18531;20810 +18535;21192 +18540;21154 +18542;21197 +18544;21199 +18546;21202 +18547;21207 +18549;21136 +18550;21209 +18553;21212 +18554;21214 +18793;21306 +18795;21307 +18796;21308 +18806;21309 +18807;21310 +18809;21312 +18817;20807 +18820;21314 +18822;21322 +18827;21315 +18828;21317 +18829;21318 +18831;21320 +18832;21101 +18833;20920 +18836;21336 +18838;21325 +18840;21326 +18843;21327 +18844;21328 +18845;21330 +18851;21333 +18852;20746 +18853;21337 +18854;20975 +18855;21342 +18859;21233 +18860;21339 +18865;21077 +18868;20651 +18869;21345 +18871;21347 +18875;20867 +18877;20925 +18879;21006 +18880;20542 +18881;21360 +18882;21352 +18887;21357 +18888;21179 +18889;21361 +18890;21363 +18897;21369 +18898;21370 +18899;20904 +18900;21373 +18907;21183 +18909;21170 +18910;21378 +18911;21178 +18912;21380 +18913;21382 +18914;21223 +18921;20990 +18922;21385 +18926;20664 +18927;21391 +18928;21389 +18929;21392 +18930;21394 +18936;21398 +18939;21455 +18940;20974 +18942;21399 +18944;21401 +18945;21404 +18948;21407 +18952;21408 +18953;21043 +18954;21411 +18961;21413 +18962;20813 +18967;21415 +18968;21416 +18973;21458 +18979;21419 +18980;21422 +18981;21424 +18982;21426 +18983;21287 +18985;21428 +18986;21433 +18987;21436 +18991;21437 +18992;21439 +18993;21456 +18996;20500 +18999;20503 +19001;21005 +19002;20808 +19003;20868 +19004;21445 +19005;21003 +19008;20520 +19012;20523 +19013;21448 +19014;20531 +19018;20510 +19019;20515 +19024;20933 +19025;20537 +19037;20803 +19039;21297 +19045;20551 +19046;20555 +19047;21431 +19049;21430 +19055;20501 +19056;20507 +19057;20505 +19059;20519 +19067;20559 +19073;20514 +19076;20569 +19079;20581 +19080;20572 +19083;20575 +19085;20595 +19086;20631 +19087;20632 +19088;20635 +19094;20665 +19098;20662 +19100;20919 +19103;20671 +19104;20676 +19105;20677 +19106;21217 +19107;20678 +19111;20685 +19112;20686 +19113;20687 +19114;20688 +19115;20689 +19116;20691 +19117;20693 +19118;20694 +19119;20695 +19120;20696 +19128;20698 +19129;20700 +19132;20701 +19138;20708 +19139;20703 +19143;20909 +19145;20908 +19150;20910 +19151;20715 +19152;20716 +19154;20717 +19155;20911 +19156;20720 +19157;20721 +19158;20951 +19159;20722 +19160;20735 +19161;20704 +19162;20725 +19163;20726 +19164;20727 +19165;20728 +19168;20733 +19170;20759 +19176;20710 +19178;20835 +19179;20838 +19180;20865 +19181;20842 +19182;20869 +19183;20871 +19184;20878 +19188;20894 +19189;20892 +19191;20898 +19194;20907 +19198;20924 +19199;20913 +19200;20929 +19201;20932 +19203;20915 +19213;20936 +19216;20942 +19217;20944 +19218;20946 +19226;20949 +19227;20952 +19232;20958 +19235;20962 +19238;20965 +19239;20967 +19255;20979 +19257;20986 +19258;20988 +19259;20980 +19260;20982 +19261;20984 +19263;20989 +19265;20994 +19267;20995 +19268;20996 +19278;21000 +19281;21001 +19283;21007 +19286;21016 +19288;21011 +19290;21012 +19291;21013 +19292;21014 +19293;21017 +19294;21019 +19308;20588 +19309;21024 +19310;21026 +19312;20644 +19314;20646 +19316;20544 +19317;20557 +19322;20577 +19323;20585 +19327;20621 +19329;20627 +19331;20640 +19332;20654 +19333;20656 +19334;20659 +19342;20739 +19349;20765 +19350;20778 +19351;20785 +19353;20793 +19354;20823 +19355;20833 +19356;20837 +19357;20883 +19358;21270 +19359;21030 +19360;21032 +19361;21036 +19362;21037 +19363;21038 +19364;21040 +19365;21041 +19367;21045 +19368;21047 +19369;21049 +19370;21051 +19383;21056 +19384;21057 +19387;21060 +19388;21062 +19389;21064 +19391;21069 +19394;21071 +19396;21086 +19397;21088 +19403;21443 +19404;21093 +19414;20535 +19416;21127 +19417;21135 +19419;20556 +19421;21143 +19424;21311 +19425;21149 +19427;21158 +19431;21167 +19433;21172 +19434;21177 +19436;20613 +19437;21184 +19438;21186 +10310;21316 +19439;21188 +70633;81054 +70741;81418 +70807;80601 +70814;80969 +70970;81042 +71281;81046 +71374;80900 +71959;81035 +72142;80997 +72597;80719 +72652;81009 +72785;81451 +72941;80699 +72983;81453 +73012;80706 +73036;81044 +73390;81039 +73404;80702 +73532;81319 +73946;80743 +74136;81027 +74231;80747 +74233;80991 +74244;80737 +74409;81022 +74514;81324 +74861;81034 +75063;81452 +75339;80848 +75342;80560 +75343;81165 +75346;80873 +75347;80875 +75348;80847 +75350;81065 +75351;81313 +75352;81066 +75353;81067 +75354;81377 +75355;81248 +75356;81068 +75357;81070 +75358;81072 +75359;81073 +75360;81074 +75361;81075 +75362;81171 +75363;81076 +75364;80661 +75365;81078 +75366;81444 +75367;81181 +75368;81079 +75374;81084 +75375;81087 +75377;81089 +75378;81091 +75379;81092 +75380;81094 +75381;81096 +75384;81103 +75385;80673 +75386;81108 +75387;81109 +75388;81111 +75389;81113 +75390;81115 +75391;80658 +75392;81117 +75393;81119 +75394;81168 +75395;81122 +75396;81125 +75397;81129 +75398;81194 +75399;81131 +75400;81133 +75425;80625 +75451;80652 +75452;80660 +75453;80670 +75454;80675 +75455;81061 +75456;80680 +75457;81081 +75458;81085 +75459;81176 +75460;81298 +75461;80672 +75462;81134 +75463;81137 +75464;81450 +75465;80532 +75466;81138 +75467;81139 +75468;81142 +75469;81185 +75475;81260 +75485;81144 +75495;81258 +75496;81257 +75497;81256 +75528;81252 +75529;81242 +75530;81241 +75531;81240 +75532;81157 +75533;81239 +75534;81238 +75535;81237 +75536;81302 +75553;80866 +75558;81236 +75559;81235 +75560;81234 +75561;81232 +75562;81231 +75563;81230 +75566;81229 +75567;81405 +75568;81359 +75570;81281 +75571;81227 +75572;81226 +75573;81225 +75574;81224 +75575;81222 +75576;81221 +75579;81220 +75580;81218 +75581;81216 +75582;81371 +75583;81421 +75584;81215 +75586;81213 +75589;81343 +75605;81403 +75606;81372 +75607;81356 +75608;81331 +75609;81454 +75611;81358 +75613;81353 +75614;81346 +75615;81344 +75617;81341 +75618;81340 +75619;81334 +75624;81274 +75625;81269 +75626;81268 +75638;81374 +75639;81364 +75640;81350 +75641;81264 +75642;81210 +75643;81208 +75644;81299 +75659;81196 +75660;81195 +75689;80893 +75727;81174 +75766;81383 +75769;81355 +75783;80985 +75812;81255 +75838;80821 +75839;81305 +75843;81156 +75844;81152 +75852;81285 +75854;81282 +75855;81099 +75903;81414 +75904;81420 +75948;81201 +75949;81200 +75958;81349 +75959;81116 +75960;81321 +75961;81291 +75962;81263 +75963;81193 +75966;81187 +75967;81175 +75968;81393 +75969;81386 +75970;81365 +75971;81351 +75973;81294 +75974;81280 +75975;81211 +75976;81169 +75977;81166 +75978;81163 +75979;81161 +75980;81159 +76030;81050 +76039;81048 +76093;81029 +76095;81025 +76133;81018 +76134;81015 +76135;81010 +76136;81002 +76140;80999 +76175;80961 +76176;80957 +76177;80955 +76178;80953 +76179;80947 +76259;81348 +76285;81150 +76286;81147 +76287;81107 +76288;81105 +76289;81090 +76290;80992 +76294;81083 +76295;81080 +76296;81058 +76310;81397 +76311;81367 +76312;81295 +76314;81053 +76317;81332 +76318;81292 +76319;81251 +76320;81198 +76328;81412 +76329;81410 +76330;81366 +76340;81335 +76348;81031 +76349;81021 +76364;81283 +76368;80993 +76369;80987 +76370;80983 +76371;80981 +76372;81323 +76373;80978 +76375;80977 +76376;80976 +76377;80973 +76378;80972 +76379;80971 +76380;80970 +76383;80968 +76384;80966 +76385;80964 +76386;80960 +76387;80948 +76388;80945 +76389;80943 +76390;81052 +76391;80940 +76392;80939 +76393;80935 +76403;81033 +76407;80663 +76412;80934 +76422;81406 +76423;81402 +76447;81388 +76449;81278 +76450;80931 +76451;80930 +76452;80928 +76453;81191 +76455;81279 +76457;80926 +76458;80923 +76480;80922 +76489;80921 +76516;81288 +76578;81379 +76588;81409 +76653;80918 +76654;80917 +76655;80916 +76656;80914 +76657;80912 +76658;80906 +76664;80905 +76665;80903 +76697;80902 +76700;81400 +76715;81301 +76719;81266 +76721;81329 +76722;80901 +76723;80899 +76744;81396 +76745;81417 +76746;81362 +76747;81338 +76748;81293 +76749;81203 +76750;81020 +76751;80897 +76827;81204 +76983;80937 +76985;80896 +76986;80895 +76987;80891 +76988;80890 +76989;80889 +76990;80888 +76991;80886 +76992;80885 +76993;80884 +76994;80882 +76995;80880 +77199;80879 +77200;80877 +77201;80876 +77202;80539 +77203;80870 +77227;81384 +77228;81368 +77229;80864 +77241;80863 +77256;80861 +77258;80860 +77261;80859 +77262;80858 +77263;80857 +77286;80856 +77287;80855 +77288;80854 +77308;80853 +77309;80851 +77310;80849 +77318;80846 +77319;80844 +77320;80843 +77321;80841 +77322;80839 +77323;80836 +77324;80834 +77325;80832 +77326;80830 +77327;80829 +77328;80825 +77329;80824 +77330;80822 +77331;80820 +77332;80818 +77341;80816 +77342;80814 +77343;80809 +77810;80802 +77811;80800 +77812;80799 +77813;80798 +77814;80797 +77815;80796 +77857;80845 +77859;80872 +77860;80840 +77861;80826 +77863;81243 +77864;81457 +77865;80795 +77866;80792 +77867;80791 +77868;80790 +77869;80789 +77870;80787 +77871;80786 +77872;80784 +77873;80783 +77874;80779 +77875;80776 +77876;80772 +77877;80771 +77882;80769 +77884;80768 +77885;80767 +77887;80766 +77896;80729 +77900;80764 +77901;80763 +77902;80761 +77903;80758 +77907;80754 +77916;81245 +77918;80938 +77919;80752 +77920;80750 +77921;80692 +77922;80690 +77927;81246 +77929;80684 +77930;80679 +77932;80667 +77934;80657 +77936;80655 +77937;80653 +77938;80648 +77940;80645 +77941;80643 +77942;80642 +77945;81004 +77948;80641 +77949;80639 +77950;80638 +77951;80637 +77952;80636 +77953;80634 +77957;80633 +77958;80629 +77959;80628 +77960;80626 +77961;80623 +77962;80622 +77963;80619 +77964;80618 +77965;80616 +77966;80614 +77967;80612 +77968;80611 +77969;80610 +77970;80609 +77971;80608 +77972;80606 +77973;80604 +77974;80603 +77975;80600 +77978;81247 +77979;80599 +77980;80598 +77982;80597 +77983;80594 +77985;80592 +77999;80591 +78001;80587 +78002;80586 +78004;80584 +78005;80583 +78006;80582 +78007;80580 +78012;80811 +78014;80579 +78019;80862 +78020;80578 +78021;80576 +78029;80574 +78031;80573 +78032;80570 +78035;80568 +78036;80567 +78037;80566 +78039;80565 +78040;80563 +78041;80561 +78042;80552 +78043;80549 +78044;80547 +78045;80541 +78046;80540 +78047;80538 +78048;80529 +78049;80527 +78050;80524 +78053;80521 +78056;80518 +78057;80517 +78058;80516 +78061;80513 +78062;80511 +78064;80508 +78065;80506 +78066;80504 +70310;81316 +78067;81449 +99267;80995 +78072;81354 +78079;81447 +78080;81446 +78081;81442 +78090;81441 +78091;81440 +78094;81438 +78096;80522 +78097;81435 +78103;81434 +78108;80941 +78109;80950 +78110;80954 +78111;80881 +78112;80874 +78113;80956 +78114;80805 +78115;80812 +78122;80887 +78125;80607 +78126;81063 +78127;81249 +78130;81028 +78131;81253 +78132;81254 +78136;81190 +78137;81250 +78138;81262 +78139;81267 +78140;81271 +78141;81272 +78142;81276 +78144;81284 +78145;81289 +78146;81296 +78147;81300 +78149;80963 +78151;80998 +78159;81189 +78172;81375 +78174;81023 +78175;81126 +78176;81286 +78182;80707 +78183;81376 +78184;80534 +78188;81381 +78192;81387 +78194;80780 +78195;80959 +78196;81206 +78197;81390 +78198;81395 +78199;80755 +78200;81432 +78201;81429 +78202;81427 +78203;81425 +78204;81423 +78205;80770 +78211;80773 +78212;80502 +78223;80509 +78224;80512 +78228;80788 +78229;80630 +78231;80525 +78233;80526 +78234;80528 +78235;80530 +78237;80536 +78238;80543 +78239;80545 +78240;80546 +78241;80548 +78242;80550 +78244;80553 +78245;80554 +78246;80558 +78247;80562 +78248;80564 +78250;80571 +78255;80589 +78256;80590 +78257;80593 +78258;80596 +78260;80602 +78261;80605 +78262;81055 +78263;80615 +78264;80617 +78267;80620 +78269;80624 +78296;80647 +78297;80649 +78298;80650 +78299;80666 +78300;80669 +78301;80674 +78302;80682 +78303;80683 +78308;81180 +78309;80697 +78314;80705 +78315;80709 +78316;80711 +78317;80712 +78318;80713 +78321;81008 +78322;80714 +78325;80718 +78330;80730 +78331;80731 +78332;80732 +78333;80736 +78334;80738 +78335;80740 +78340;80741 +78342;81205 +78343;80742 +78344;80744 +78347;80748 +78348;80749 +78349;80751 +78351;81219 +78352;80681 +78357;80753 +78360;80756 +78361;80757 +78370;81228 +78371;80774 +78372;80775 +78373;80777 +78374;80781 +78375;80782 +78380;80794 +78382;80801 +78385;80806 +78386;80815 +78387;80817 +78388;80819 +78396;81244 +78399;81459 +78400;80828 +78402;80831 +78404;80850 +78405;80852 +78425;81259 +78426;81059 +78427;80762 +78428;81082 +78433;81261 +78435;81265 +78440;81095 +78441;81097 +78443;81100 +78445;81102 +78446;81104 +78447;81106 +78452;81110 +78453;81112 +78454;81273 +78455;81114 +78459;81275 +78460;81277 +78461;81118 +78464;81120 +78466;81121 +78467;81123 +78468;81124 +78474;80668 +78476;81128 +78477;81130 +78478;81132 +78479;81140 +78484;81141 +78485;81290 +78490;81145 +78494;81146 +78495;81148 +78497;81151 +78498;81153 +78501;80804 +78504;81155 +78505;80533 +78507;81160 +78508;81162 +78509;81164 +78511;81303 +78512;81304 +78516;80927 +78517;81173 +78520;81182 +78531;80810 +78535;81192 +78540;81154 +78542;81197 +78544;81199 +78546;81202 +78547;81207 +78549;81136 +78550;81209 +78553;81212 +78554;81214 +78793;81306 +78795;81307 +78796;81308 +78806;81309 +78807;81310 +78809;81312 +78817;80807 +78820;81314 +78822;81322 +78827;81315 +78828;81317 +78829;81318 +78831;81320 +78832;81101 +78833;80920 +78836;81336 +78838;81325 +78840;81326 +78843;81327 +78844;81328 +78845;81330 +78851;81333 +78852;80746 +78853;81337 +78854;80975 +78855;81342 +78859;81233 +78860;81339 +78865;81077 +78868;80651 +78869;81345 +78871;81347 +78875;80867 +78877;80925 +78879;81006 +78880;80542 +78881;81360 +78882;81352 +78887;81357 +78888;81179 +78889;81361 +78890;81363 +78897;81369 +78898;81370 +78899;80904 +78900;81373 +78907;81183 +78909;81170 +78910;81378 +78911;81178 +78912;81380 +78913;81382 +78914;81223 +78921;80990 +78922;81385 +78926;80664 +78927;81391 +78928;81389 +78929;81392 +78930;81394 +78936;81398 +78939;81455 +78940;80974 +78942;81399 +78944;81401 +78945;81404 +78948;81407 +78952;81408 +78953;81043 +78954;81411 +78961;81413 +78962;80813 +78967;81415 +78968;81416 +78972;81458 +78979;81419 +78980;81422 +78981;81424 +78982;81426 +78983;81287 +78985;81428 +78986;81433 +78987;81436 +78991;81437 +78992;81439 +78993;81456 +78996;80500 +79001;81005 +79002;80808 +79003;80868 +79004;81445 +79008;80520 +79012;80523 +79013;81448 +79014;80531 +79018;80510 +79019;80515 +79021;81003 +79024;80933 +79025;80537 +79037;80803 +79039;81297 +79045;80551 +79046;80555 +79047;81431 +79049;81430 +79055;80501 +79056;80507 +79057;80505 +79059;80519 +79067;80559 +79073;80514 +79076;80569 +79079;80581 +79080;80572 +79083;80575 +79085;80595 +79086;80631 +79087;80632 +79088;80635 +79098;80662 +79100;80919 +79102;80665 +79103;80671 +79104;80676 +79105;80677 +79106;81217 +79107;80678 +79111;80685 +79112;80686 +79113;80687 +79114;80688 +79115;80689 +79116;80691 +79117;80693 +79118;80694 +79119;80695 +79120;80696 +79128;80698 +79129;80700 +79132;80701 +79139;80703 +79142;80708 +79143;80909 +79145;80908 +79150;80910 +79151;80715 +79152;80716 +79154;80717 +79155;80911 +79156;80720 +79157;80721 +79158;80951 +79159;80722 +79160;80735 +79161;80704 +79162;80725 +79163;80726 +79164;80727 +79165;80728 +79168;80733 +79170;80759 +79176;80710 +79178;80835 +79179;80838 +79180;80865 +79181;80842 +79182;80869 +79183;80871 +79184;80878 +79188;80894 +79189;80892 +79191;80898 +79194;80907 +79198;80924 +79199;80913 +79200;80929 +79201;80932 +79203;80915 +79213;80936 +79216;80942 +79217;80944 +79218;80946 +79226;80949 +79227;80952 +79235;80962 +79238;80965 +79239;80967 +79255;80979 +79257;80986 +79258;80988 +79259;80980 +79260;80982 +79261;80984 +79263;80989 +79265;80994 +79268;80996 +79278;81000 +79281;81001 +79283;81007 +79286;81016 +79288;81011 +79290;81012 +79291;81013 +79292;81014 +79293;81017 +79294;81019 +79308;80588 +79309;81024 +79310;81026 +79312;80644 +79314;80646 +79316;80544 +79317;80557 +79322;80577 +79323;80585 +79327;80621 +79329;80627 +79331;80640 +79332;80654 +79333;80656 +79334;80659 +79342;80739 +79349;80765 +79350;80778 +79351;80785 +79353;80793 +79354;80823 +79355;80833 +79356;80837 +79357;80883 +79358;81270 +79359;81030 +79360;81032 +79361;81036 +79362;81037 +79363;81038 +79364;81040 +79365;81041 +79367;81045 +79368;81047 +79369;81049 +79370;81051 +79383;81056 +79384;81057 +79387;81060 +79388;81062 +79389;81064 +79391;81069 +79394;81071 +79396;81086 +79397;81088 +79403;81443 +79404;81093 +79414;80535 +79416;81127 +79417;81135 +79421;81143 +79425;81149 +79427;81158 +79431;81167 +79433;81172 +79434;81177 +79436;80613 +79437;81184 +79438;81186 +79439;81188 +79569;80556 +79574;81311 +87984;80760 +99232;80958 +17676;21460 +19447;21461 +19448;21462 +19452;21463 +19453;21464 +19462;21465 +19463;21466 +19469;21467 +19479;21468 +19480;21469 +19490;21470 +19497;21471 +19499;21472 +19503;21473 +19515;21474 +19527;21475 +19534;21476 +19540;21477 +19545;21478 +19554;21479 +19555;21480 +19558;21481 +19564;21482 +19578;21483 +19586;21484 +19587;21485 +19591;21486 +19596;21487 +19597;21488 +19598;21489 +19599;21490 +19600;21491 +19603;21492 +19609;21493 +19610;21494 +19611;21495 +19613;21496 +19614;21497 +19615;21498 +19619;21499 +19620;21500 +19622;21501 +19631;21502 +19632;21503 +19633;21504 +19634;21505 +19637;21506 +19638;21507 +19640;21508 +19642;21509 +19644;21510 +19645;21511 +19649;21512 +19652;21513 +19655;21514 +19656;21515 +19658;21516 +19661;21517 +19663;21518 +19664;21519 +19667;21520 +79447;81461 +79448;81462 +79452;81463 +79453;81464 +79462;81465 +79463;81466 +79479;81468 +79480;81469 +79490;81470 +79497;81471 +79499;81472 +79503;81473 +79527;81475 +79534;81476 +79540;81477 +79545;81478 +79554;81479 +79555;81480 +79558;81481 +79564;81482 +79586;81484 +79587;81485 +79591;81486 +79596;81487 +79597;81488 +79598;81489 +79599;81490 +79600;81491 +79603;81492 +79609;81493 +79610;81494 +79611;81495 +79613;81496 +79614;81497 +79615;81498 +79619;81499 +79620;81500 +79622;81501 +79623;81467 +79631;81502 +79632;81503 +79633;81504 +79634;81505 +79637;81506 +79638;81507 +79640;81508 +79642;81509 +79644;81510 +79645;81511 +79649;81512 +79652;81513 +79655;81514 +79656;81515 +79658;81516 +79660;81474 +79661;81517 +79663;81518 +79664;81519 +79667;81520 +79676;81460 +79712;81483 +79678;81521 +19678;21521 \ No newline at end of file