From 1e819b8ee6f8dd04278267ee0b683143d07b1f45 Mon Sep 17 00:00:00 2001 From: Augusto Passalacqua Date: Mon, 6 Jul 2026 12:21:36 +0200 Subject: [PATCH 1/8] Add ExportOQLToMarkdown java action, remove community commons and CsvAsTable widget dependencies and re-wire the ACT_ExecuteOQL microflow to use the new java action to retrieve data as markdown; replace CsvAsTable with the markdown viewer in the OQL view demo page Also renamed the CSV attribute of the Query NPE with Result, reflecting it no longer contains a CSV --- OQLModule.mpr | Bin 61440 -> 61440 bytes build.gradle | 12 +- environment.gradle | 1 - javasource/communitycommons/DateTime.java | 65 -- .../communitycommons/ImmutablePair.java | 58 -- javasource/communitycommons/Logging.java | 90 -- javasource/communitycommons/Misc.java | 744 --------------- javasource/communitycommons/ORM.java | 380 -------- javasource/communitycommons/StringUtils.java | 514 ---------- .../communitycommons/UserThrownException.java | 15 - javasource/communitycommons/XPath.java | 893 ------------------ .../actions/Base64Decode.java | 52 - .../actions/Base64DecodeToFile.java | 63 -- .../actions/Base64Encode.java | 52 - .../actions/Base64EncodeFile.java | 57 -- .../communitycommons/actions/Clone.java | 65 -- .../actions/CreateLogNode.java | 53 -- .../actions/DateTimeToLong.java | 52 - .../communitycommons/actions/DeepClone.java | 96 -- .../communitycommons/actions/Delay.java | 55 -- .../actions/DuplicateFileDocument.java | 69 -- .../actions/DuplicateImageDocument.java | 75 -- .../actions/EndTransaction.java | 46 - .../actions/EnumerationFromString.java | 59 -- .../communitycommons/actions/EscapeHTML.java | 55 -- .../actions/FileDocumentFromFile.java | 69 -- .../actions/FileFromFileDocument.java | 73 -- .../actions/GenerateHMAC_SHA256.java | 55 -- .../actions/GenerateHMAC_SHA256_hash.java | 55 -- .../actions/GetApplicationUrl.java | 46 - .../actions/GetCFInstanceIndex.java | 50 - .../actions/GetDefaultLanguage.java | 49 - .../actions/GetFileContentsFromResource.java | 71 -- .../actions/GetImageDimensions.java | 67 -- .../actions/GetIntFromDateTime.java | 60 -- .../actions/GetModelVersion.java | 46 - .../actions/GetRuntimeVersion.java | 46 - .../communitycommons/actions/HTMLEncode.java | 57 -- .../actions/HTMLToPlainText.java | 53 -- javasource/communitycommons/actions/Hash.java | 59 -- .../actions/IsInDevelopment.java | 46 - .../actions/IsStringSimplified.java | 52 - .../communitycommons/actions/ListTop.java | 56 -- .../actions/LongToDateTime.java | 52 - .../actions/MergeMultiplePdfs.java | 68 -- .../actions/MonthsBetween.java | 67 -- .../actions/OverlayPdfDocument.java | 67 -- .../actions/ParseDateTimeWithTimezone.java | 78 -- .../communitycommons/actions/RandomHash.java | 46 - .../actions/RandomString.java | 52 - .../actions/RandomStrongPassword.java | 80 -- .../RandomStrongPasswordWithLowercase.java | 83 -- .../communitycommons/actions/RegexQuote.java | 52 - .../actions/RegexReplaceAll.java | 64 -- .../communitycommons/actions/RemoveEnd.java | 55 -- .../actions/RunMicroflowAsyncInQueue.java | 54 -- .../actions/StartTransaction.java | 46 - .../actions/StringFromFile.java | 65 -- .../actions/StringLeftPad.java | 64 -- .../actions/StringRightPad.java | 64 -- .../actions/StringSimplify.java | 52 - .../communitycommons/actions/StringSplit.java | 66 -- .../actions/StringToFile.java | 70 -- .../communitycommons/actions/StringTrim.java | 54 -- .../actions/SubstituteTemplate.java | 74 -- .../actions/SubstituteTemplate2.java | 64 -- .../actions/SubstringAfter.java | 55 -- .../actions/SubstringAfterLast.java | 55 -- .../actions/SubstringBefore.java | 55 -- .../actions/SubstringBeforeLast.java | 55 -- .../actions/ThrowException.java | 57 -- .../actions/ThrowWebserviceException.java | 57 -- .../actions/TimeMeasureEnd.java | 61 -- .../actions/TimeMeasureStart.java | 56 -- .../communitycommons/actions/XSSSanitize.java | 104 -- .../actions/YearsBetween.java | 67 -- .../commitInSeparateDatabaseTransaction.java | 62 -- .../actions/commitWithoutEvents.java | 55 -- .../actions/copyAttributes.java | 59 -- .../communitycommons/actions/deleteAll.java | 52 - .../actions/executeMicroflowAsUser.java | 63 -- .../actions/executeMicroflowAsUser_1.java | 66 -- .../actions/executeMicroflowAsUser_2.java | 72 -- .../actions/executeMicroflowInBackground.java | 68 -- .../actions/executeMicroflowInBatches.java | 79 -- .../executeUnverifiedMicroflowAsUser.java | 63 -- .../executeUnverifiedMicroflowAsUser_1.java | 66 -- .../executeUnverifiedMicroflowAsUser_2.java | 72 -- ...xecuteUnverifiedMicroflowInBackground.java | 68 -- .../executeUnverifiedMicroflowInBatches.java | 79 -- .../actions/getCreatedByUser.java | 55 -- .../communitycommons/actions/getFileSize.java | 62 -- .../communitycommons/actions/getGUID.java | 53 -- .../actions/getLastChangedByUser.java | 55 -- .../actions/getOriginalValueAsString.java | 62 -- .../actions/getTypeAsString.java | 54 -- .../actions/memberHasChanged.java | 61 -- .../actions/memberHasChangedValue.java | 56 -- .../actions/objectHasChanged.java | 55 -- .../actions/objectHasChangedMemberValue.java | 53 -- .../communitycommons/actions/objectIsNew.java | 52 - .../actions/recommitInBatches.java | 58 -- .../actions/refreshClass.java | 56 -- .../actions/refreshClassByObject.java | 58 -- .../communitycommons/actions/retrieveURL.java | 65 -- .../actions/storeURLToFileDocument.java | 70 -- .../oql/actions/ExportOQLToMarkdown.java | 62 ++ ...13c411b-c6ba-4fe9-b842-583c4853753f.mxunit | Bin 1040 -> 0 bytes ...6c46b42-722e-4bb7-abba-3a0a49bb2ac9.mxunit | Bin 1177 -> 0 bytes ...bac7797-fd37-4834-badf-454a6334f7b9.mxunit | Bin 1309 -> 0 bytes ...c856a2d-2236-40fb-8155-0f4b6bbff4ef.mxunit | Bin 1187 -> 0 bytes ...e2a0433-04d8-4c74-9275-335bd68ff360.mxunit | Bin 939 -> 0 bytes ...fa22ce8-d674-4098-99aa-d522cd2a362c.mxunit | Bin 79 -> 0 bytes ...1730161-c9a1-4e76-85c8-b777affb9e12.mxunit | Bin 1887 -> 0 bytes ...25797ad-7f8d-4def-a68f-d88bb08bad16.mxunit | Bin 1205 -> 0 bytes ...4d5ba43-5f28-4e2b-bfce-76d4ab2cfc0d.mxunit | Bin 2392 -> 0 bytes ...93addff-f779-4e47-a8ea-69fc6922c4f6.mxunit | Bin 1496 -> 0 bytes ...f2c4703-788f-4bb5-8b58-94088896316a.mxunit | Bin 242 -> 0 bytes ...09b3fb0-1b92-4e02-a318-21099fb30c07.mxunit | Bin 73 -> 0 bytes ...1795fc5-fccd-4f3f-850d-a895791a9695.mxunit | Bin 10986 -> 12763 bytes ...3390396-86a1-431e-ace2-1019f84ae93a.mxunit | Bin 80 -> 0 bytes ...52623ce-00e2-46ef-9863-fa54edcc933c.mxunit | Bin 1030 -> 0 bytes ...5905f62-d767-4053-9a17-c4e7b59ba931.mxunit | Bin 544 -> 0 bytes ...6df65a0-31fc-4ad2-8379-dd6ff55e6d84.mxunit | Bin 85 -> 0 bytes ...758d413-8bc4-4570-8522-8c85a22ea96b.mxunit | Bin 243 -> 0 bytes ...75e8860-72a1-4f65-86a6-6dbd79be6bbb.mxunit | Bin 587 -> 0 bytes ...8aabeb5-d781-4389-ba73-fb483078a131.mxunit | Bin 1047 -> 0 bytes ...a639441-051e-4576-88ce-de5ce43cc281.mxunit | Bin 1586 -> 0 bytes ...c5c8be1-3894-4a38-b3b3-5bc84b32647a.mxunit | Bin 1411 -> 0 bytes ...e7a6433-d40b-44c1-8bce-7eb8d3245959.mxunit | Bin 8338 -> 0 bytes ...fe59de0-076a-4c5e-8891-0fa390406aee.mxunit | Bin 2157 -> 0 bytes ...292aafb-cb40-488d-84b8-2b06f79d3298.mxunit | Bin 1202 -> 0 bytes ...2e1b2e4-2c2f-4da4-9a44-1f93080e702c.mxunit | Bin 1921 -> 0 bytes ...35d12eb-da1e-4191-b771-a3cffad2d7dc.mxunit | Bin 1210 -> 0 bytes ...4618046-ffb8-4b19-bae1-cf00400d7285.mxunit | Bin 76 -> 0 bytes ...6af3c25-6b85-4e29-a7ee-0d1f6b7af119.mxunit | Bin 74 -> 0 bytes ...711fb9b-49b3-4edc-89bb-242980d9e013.mxunit | Bin 875 -> 0 bytes ...792e394-7ee1-4bd2-bd66-29b95537c7b6.mxunit | Bin 4750 -> 0 bytes ...80d3f03-fe78-42f4-be74-8b773246f993.mxunit | Bin 4033 -> 0 bytes ...bc7a565-94ff-46c7-805c-5654e9454e1a.mxunit | Bin 2773 -> 0 bytes ...d276089-410d-437c-8677-c226e99de37d.mxunit | Bin 84 -> 0 bytes ...1199396-2edd-4812-957c-0d3a4df302fa.mxunit | Bin 901 -> 0 bytes ...11be654-7889-49b2-9659-ae4165865b1c.mxunit | Bin 280 -> 0 bytes ...13d63ba-1d48-40ab-b2b9-ba920002647f.mxunit | Bin 2067 -> 0 bytes ...269b76e-7532-4ec5-8f87-3104c3ac35f4.mxunit | Bin 2868 -> 0 bytes ...291ccae-6b0e-4da4-a7da-412e22be58a0.mxunit | Bin 970 -> 0 bytes ...554a69d-94ff-469d-baf1-76e4f5e521c3.mxunit | Bin 1085 -> 0 bytes ...5664afd-3868-49b5-8854-f17716ccb49e.mxunit | Bin 608 -> 0 bytes ...64ddf7e-dd1b-4d8e-b7ae-972ca0ba4678.mxunit | Bin 1289 -> 0 bytes ...8b4121a-6dca-47d8-b9e1-12cc7b615b37.mxunit | Bin 1123 -> 0 bytes ...bad8d25-e5aa-44f3-914c-945649a1dad6.mxunit | Bin 1369 -> 0 bytes ...e6fbfd9-cb0d-4dc7-abb9-2f7c61a48839.mxunit | Bin 320 -> 0 bytes ...f6e48bf-b665-4910-83a4-ef1370342887.mxunit | Bin 2499 -> 0 bytes ...01e57e5-98d2-4a47-a0e9-85f75d41d80d.mxunit | Bin 1269 -> 0 bytes ...5194696-b0e5-46c2-bbe7-dd5a5d95e787.mxunit | Bin 953 -> 0 bytes ...b78ee28-e066-4098-a180-1a3efda60f8a.mxunit | Bin 13959 -> 12730 bytes ...bc5ed62-9161-4f75-a6b7-8e989a4ea6ee.mxunit | Bin 1682 -> 0 bytes ...cf090fc-d880-4617-b738-ebc8747fa3f8.mxunit | Bin 1580 -> 0 bytes ...d96a675-8b26-4e41-a8b4-3e9e9d21c822.mxunit | Bin 2016 -> 0 bytes ...f33ef3d-ff24-4710-a336-0868cedf0c65.mxunit | Bin 1398 -> 0 bytes ...2b889da-ec36-4bcc-b7e8-82ad756aa341.mxunit | Bin 1139 -> 0 bytes ...357efb6-66a6-4fbe-a08b-b6a7c2d34f49.mxunit | Bin 1757 -> 0 bytes ...4d66178-e97d-44d0-8b8d-0b02fa8f4ad7.mxunit | Bin 1717 -> 0 bytes ...7acd8e9-474c-4eff-b8c2-13bdce431524.mxunit | Bin 1753 -> 0 bytes ...9489ab2-1f36-49a4-98cf-b518e0552dbe.mxunit | Bin 918 -> 0 bytes ...dcea552-d688-4c4f-bf86-d3ebe5a7b4f4.mxunit | Bin 1483 -> 0 bytes ...02c6958-2b3f-4997-a978-65a051b7e7b0.mxunit | Bin 1642 -> 0 bytes ...2484a2b-ac9a-4e21-9f39-1655e243bba8.mxunit | Bin 1481 -> 0 bytes ...320a1b2-f9ef-4cef-9940-5cf1dcbee25b.mxunit | Bin 72 -> 0 bytes ...426abea-6dca-4a78-b80f-a81a6faabffb.mxunit | Bin 2264 -> 0 bytes ...434faab-9b88-4ea2-8310-1901e04e94c0.mxunit | Bin 593 -> 0 bytes ...4a6557f-b52f-4e6e-b6f2-220549b1a029.mxunit | Bin 1382 -> 0 bytes ...6fbd7b9-db26-4c16-b674-494ab38938a6.mxunit | Bin 997 -> 0 bytes ...a90a204-9d71-46a2-a681-525a4a73a7fa.mxunit | Bin 1471 -> 0 bytes ...b82f74b-ca76-4b6c-8193-c07b7c859f53.mxunit | Bin 1223 -> 0 bytes ...dcfbab9-f1b0-425c-bd68-e8f26d0536f2.mxunit | Bin 1235 -> 0 bytes ...072a112-065f-4090-8437-59ec3aeb3039.mxunit | Bin 283 -> 0 bytes ...0de880e-544f-4a2c-9f03-54c477f7b6bc.mxunit | Bin 887 -> 0 bytes ...15964be-bcb1-4ae4-946d-1a78fab2a049.mxunit | Bin 1635 -> 0 bytes ...2e92749-f8b2-44fc-bff0-d5cb54c1a5be.mxunit | Bin 601 -> 0 bytes ...3f86cae-04cf-4177-93a1-cbdb75896b6d.mxunit | Bin 2698 -> 0 bytes ...70735ab-b61c-43a5-8a12-f9f94a19352f.mxunit | Bin 1383 -> 0 bytes ...a36d97c-8bd8-4fdc-a74c-c5146c170159.mxunit | Bin 1377 -> 0 bytes ...b285504-0ea9-4457-81f1-5672867385c6.mxunit | Bin 934 -> 0 bytes ...ce23aaf-4652-42c0-8fd9-5ccf841f2470.mxunit | Bin 1231 -> 0 bytes ...d64fb90-624d-4517-90fb-5f1006330527.mxunit | Bin 900 -> 0 bytes ...0a6952e-7573-4453-8c35-e852178f6048.mxunit | Bin 1405 -> 0 bytes ...212c43e-4e29-4284-abeb-69b313105a8d.mxunit | Bin 1296 -> 0 bytes ...2a16b06-4320-4bef-b613-4d5e75eaafca.mxunit | Bin 591 -> 0 bytes ...3807c97-df06-4376-b94b-2893da1820a7.mxunit | Bin 1275 -> 0 bytes ...8d0f7e5-3c77-48bd-848c-f97e78f61ef1.mxunit | Bin 1534 -> 0 bytes ...9d2ef87-63ba-4468-85e6-aea66bb94f41.mxunit | Bin 901 -> 0 bytes ...bd23e92-f195-433e-b6b4-ae5f16991a5f.mxunit | Bin 5063 -> 0 bytes ...eb2ec1c-1169-4520-b73a-1229b2c06893.mxunit | Bin 78 -> 0 bytes ...f9c9b78-c67c-4283-8d6f-62dcf933276a.mxunit | Bin 16198 -> 16204 bytes ...fc0c7d0-2733-40fe-b6ce-b8e0a26061fb.mxunit | Bin 2605 -> 0 bytes ...0851786-be34-44ab-9850-e330885a0459.mxunit | Bin 77 -> 0 bytes ...330388c-fa3b-4513-ab2a-c2e811833b7f.mxunit | Bin 1762 -> 0 bytes ...3c6f007-8a21-452b-9170-ab11fd5e27b8.mxunit | Bin 3153 -> 0 bytes ...4e3f1ec-8f10-43ed-b33c-9fe2a30a490f.mxunit | Bin 3979 -> 0 bytes ...a3cc804-dc1c-4fa0-ad46-e726c21fe3da.mxunit | Bin 3058 -> 0 bytes ...bd2bd2b-d3c2-45a0-a71a-22be0c92e811.mxunit | Bin 959 -> 0 bytes ...c754e40-2cda-4bdd-95a4-1def12d18dfd.mxunit | Bin 961 -> 0 bytes ...02094ef-defa-402f-ac93-59effd58ae2b.mxunit | Bin 650 -> 0 bytes ...1ae64e0-91f8-4ab2-bf04-cffe11596808.mxunit | Bin 1213 -> 0 bytes ...3fbd897-33ae-4056-b2ff-4493b3f7c31d.mxunit | Bin 2332 -> 0 bytes ...4bcdd4c-2e90-4adf-a6b3-68e3bcf097f9.mxunit | Bin 900 -> 0 bytes ...7dec694-362f-48ae-8fa5-c64e0fc507d8.mxunit | Bin 466 -> 0 bytes ...90235b9-1e35-492e-8f46-07c792c3a6ce.mxunit | Bin 3933 -> 0 bytes ...ab64d45-15b1-4fc7-b40b-861297a9b856.mxunit | Bin 1370 -> 0 bytes ...cc73544-a623-4ef4-b11e-a8356ee45b7a.mxunit | Bin 1642 -> 0 bytes ...32ee613-9245-4a1c-823c-04deaab7eca0.mxunit | Bin 76 -> 0 bytes ...42f512f-fc1f-461c-94df-fb58a2c39e83.mxunit | Bin 2268 -> 0 bytes ...5a1acc8-f0c3-4492-8748-615dfc5f1089.mxunit | Bin 1072 -> 0 bytes ...e24ce2d-531f-4cc6-89f3-b8788a6308d0.mxunit | Bin 611 -> 0 bytes ...e4916a7-4aa0-4a65-b5d4-cbb83d0ca02c.mxunit | Bin 1580 -> 0 bytes ...0de4dd0-4e0a-404c-a4d0-6728e4b7da59.mxunit | Bin 76 -> 0 bytes ...3055cec-d54d-4d26-8fa0-236c6653e775.mxunit | Bin 296 -> 0 bytes ...51747fb-2f79-427b-9111-4f9146a8c321.mxunit | Bin 850 -> 0 bytes ...6806243-190a-476f-8016-89303a425800.mxunit | Bin 2297 -> 0 bytes ...83dcc11-b9f3-4ea3-932a-82bb6c9e6ca3.mxunit | Bin 1415 -> 0 bytes ...9ae85dd-d8ec-419f-9848-185c6a0b5397.mxunit | Bin 935 -> 0 bytes ...e50da93-2589-4cad-9130-261931c71c1c.mxunit | Bin 1502 -> 0 bytes ...420ec5a-aabc-464b-8adf-3fc2c2c9e323.mxunit | Bin 1119 -> 0 bytes ...555196b-c0ca-497e-b581-bf190d744b58.mxunit | Bin 861 -> 0 bytes ...a11f719-67e4-4944-873f-174f182338c4.mxunit | Bin 0 -> 1855 bytes ...a145d49-84cb-4328-a50b-b8d8b35317ab.mxunit | Bin 926 -> 0 bytes ...b0c3cf5-4c0b-4cd9-9642-0106c40e6cb1.mxunit | Bin 2014 -> 0 bytes ...c255d6f-b9a8-4bb2-a312-c9d1d07dbd07.mxunit | Bin 896 -> 0 bytes ...d97f4c1-6f14-4e8c-b9a5-84410d40aa31.mxunit | Bin 2087 -> 0 bytes ...dc0beb2-d305-40a5-80db-696738eaf052.mxunit | Bin 157 -> 0 bytes ...e3dc1fc-fa9d-469f-ab56-1c763276eba2.mxunit | Bin 934 -> 0 bytes ...f288b8a-0371-48c4-9db4-8ac2f0ae39d4.mxunit | Bin 1247 -> 0 bytes ...f4ae36f-1485-4ea1-9f7e-26ec5835b911.mxunit | Bin 1675 -> 0 bytes ...4841ac1-f038-4d61-be48-28b4c9b859fd.mxunit | Bin 447 -> 0 bytes ...6164553-18d9-4c6f-bb39-4cecb3f26c80.mxunit | Bin 1271 -> 0 bytes ...85abab2-8261-4e09-b8f2-1cd4d9c697c6.mxunit | Bin 888 -> 0 bytes ...a398d01-80e6-47c8-8ad3-8d2f0576793a.mxunit | Bin 987 -> 0 bytes ...dd60a1a-e6b2-4053-9be1-f1d43eade39e.mxunit | Bin 10178 -> 0 bytes .../native/design-properties.json | 3 - themesource/communitycommons/native/main.js | 2 - themesource/communitycommons/settings.json | 3 - .../web/design-properties.json | 3 - themesource/communitycommons/web/main.scss | 2 - widgets/com.mendix.widget.web.Markdown.mpk | Bin 0 -> 138468 bytes widgets/mendix.CsvAsTable.mpk | Bin 155898 -> 0 bytes 246 files changed, 63 insertions(+), 8551 deletions(-) delete mode 100644 javasource/communitycommons/DateTime.java delete mode 100644 javasource/communitycommons/ImmutablePair.java delete mode 100644 javasource/communitycommons/Logging.java delete mode 100644 javasource/communitycommons/Misc.java delete mode 100644 javasource/communitycommons/ORM.java delete mode 100644 javasource/communitycommons/StringUtils.java delete mode 100644 javasource/communitycommons/UserThrownException.java delete mode 100644 javasource/communitycommons/XPath.java delete mode 100644 javasource/communitycommons/actions/Base64Decode.java delete mode 100644 javasource/communitycommons/actions/Base64DecodeToFile.java delete mode 100644 javasource/communitycommons/actions/Base64Encode.java delete mode 100644 javasource/communitycommons/actions/Base64EncodeFile.java delete mode 100644 javasource/communitycommons/actions/Clone.java delete mode 100644 javasource/communitycommons/actions/CreateLogNode.java delete mode 100644 javasource/communitycommons/actions/DateTimeToLong.java delete mode 100644 javasource/communitycommons/actions/DeepClone.java delete mode 100644 javasource/communitycommons/actions/Delay.java delete mode 100644 javasource/communitycommons/actions/DuplicateFileDocument.java delete mode 100644 javasource/communitycommons/actions/DuplicateImageDocument.java delete mode 100644 javasource/communitycommons/actions/EndTransaction.java delete mode 100644 javasource/communitycommons/actions/EnumerationFromString.java delete mode 100644 javasource/communitycommons/actions/EscapeHTML.java delete mode 100644 javasource/communitycommons/actions/FileDocumentFromFile.java delete mode 100644 javasource/communitycommons/actions/FileFromFileDocument.java delete mode 100644 javasource/communitycommons/actions/GenerateHMAC_SHA256.java delete mode 100644 javasource/communitycommons/actions/GenerateHMAC_SHA256_hash.java delete mode 100644 javasource/communitycommons/actions/GetApplicationUrl.java delete mode 100644 javasource/communitycommons/actions/GetCFInstanceIndex.java delete mode 100644 javasource/communitycommons/actions/GetDefaultLanguage.java delete mode 100644 javasource/communitycommons/actions/GetFileContentsFromResource.java delete mode 100644 javasource/communitycommons/actions/GetImageDimensions.java delete mode 100644 javasource/communitycommons/actions/GetIntFromDateTime.java delete mode 100644 javasource/communitycommons/actions/GetModelVersion.java delete mode 100644 javasource/communitycommons/actions/GetRuntimeVersion.java delete mode 100644 javasource/communitycommons/actions/HTMLEncode.java delete mode 100644 javasource/communitycommons/actions/HTMLToPlainText.java delete mode 100644 javasource/communitycommons/actions/Hash.java delete mode 100644 javasource/communitycommons/actions/IsInDevelopment.java delete mode 100644 javasource/communitycommons/actions/IsStringSimplified.java delete mode 100644 javasource/communitycommons/actions/ListTop.java delete mode 100644 javasource/communitycommons/actions/LongToDateTime.java delete mode 100644 javasource/communitycommons/actions/MergeMultiplePdfs.java delete mode 100644 javasource/communitycommons/actions/MonthsBetween.java delete mode 100644 javasource/communitycommons/actions/OverlayPdfDocument.java delete mode 100644 javasource/communitycommons/actions/ParseDateTimeWithTimezone.java delete mode 100644 javasource/communitycommons/actions/RandomHash.java delete mode 100644 javasource/communitycommons/actions/RandomString.java delete mode 100644 javasource/communitycommons/actions/RandomStrongPassword.java delete mode 100644 javasource/communitycommons/actions/RandomStrongPasswordWithLowercase.java delete mode 100644 javasource/communitycommons/actions/RegexQuote.java delete mode 100644 javasource/communitycommons/actions/RegexReplaceAll.java delete mode 100644 javasource/communitycommons/actions/RemoveEnd.java delete mode 100644 javasource/communitycommons/actions/RunMicroflowAsyncInQueue.java delete mode 100644 javasource/communitycommons/actions/StartTransaction.java delete mode 100644 javasource/communitycommons/actions/StringFromFile.java delete mode 100644 javasource/communitycommons/actions/StringLeftPad.java delete mode 100644 javasource/communitycommons/actions/StringRightPad.java delete mode 100644 javasource/communitycommons/actions/StringSimplify.java delete mode 100644 javasource/communitycommons/actions/StringSplit.java delete mode 100644 javasource/communitycommons/actions/StringToFile.java delete mode 100644 javasource/communitycommons/actions/StringTrim.java delete mode 100644 javasource/communitycommons/actions/SubstituteTemplate.java delete mode 100644 javasource/communitycommons/actions/SubstituteTemplate2.java delete mode 100644 javasource/communitycommons/actions/SubstringAfter.java delete mode 100644 javasource/communitycommons/actions/SubstringAfterLast.java delete mode 100644 javasource/communitycommons/actions/SubstringBefore.java delete mode 100644 javasource/communitycommons/actions/SubstringBeforeLast.java delete mode 100644 javasource/communitycommons/actions/ThrowException.java delete mode 100644 javasource/communitycommons/actions/ThrowWebserviceException.java delete mode 100644 javasource/communitycommons/actions/TimeMeasureEnd.java delete mode 100644 javasource/communitycommons/actions/TimeMeasureStart.java delete mode 100644 javasource/communitycommons/actions/XSSSanitize.java delete mode 100644 javasource/communitycommons/actions/YearsBetween.java delete mode 100644 javasource/communitycommons/actions/commitInSeparateDatabaseTransaction.java delete mode 100644 javasource/communitycommons/actions/commitWithoutEvents.java delete mode 100644 javasource/communitycommons/actions/copyAttributes.java delete mode 100644 javasource/communitycommons/actions/deleteAll.java delete mode 100644 javasource/communitycommons/actions/executeMicroflowAsUser.java delete mode 100644 javasource/communitycommons/actions/executeMicroflowAsUser_1.java delete mode 100644 javasource/communitycommons/actions/executeMicroflowAsUser_2.java delete mode 100644 javasource/communitycommons/actions/executeMicroflowInBackground.java delete mode 100644 javasource/communitycommons/actions/executeMicroflowInBatches.java delete mode 100644 javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser.java delete mode 100644 javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser_1.java delete mode 100644 javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser_2.java delete mode 100644 javasource/communitycommons/actions/executeUnverifiedMicroflowInBackground.java delete mode 100644 javasource/communitycommons/actions/executeUnverifiedMicroflowInBatches.java delete mode 100644 javasource/communitycommons/actions/getCreatedByUser.java delete mode 100644 javasource/communitycommons/actions/getFileSize.java delete mode 100644 javasource/communitycommons/actions/getGUID.java delete mode 100644 javasource/communitycommons/actions/getLastChangedByUser.java delete mode 100644 javasource/communitycommons/actions/getOriginalValueAsString.java delete mode 100644 javasource/communitycommons/actions/getTypeAsString.java delete mode 100644 javasource/communitycommons/actions/memberHasChanged.java delete mode 100644 javasource/communitycommons/actions/memberHasChangedValue.java delete mode 100644 javasource/communitycommons/actions/objectHasChanged.java delete mode 100644 javasource/communitycommons/actions/objectHasChangedMemberValue.java delete mode 100644 javasource/communitycommons/actions/objectIsNew.java delete mode 100644 javasource/communitycommons/actions/recommitInBatches.java delete mode 100644 javasource/communitycommons/actions/refreshClass.java delete mode 100644 javasource/communitycommons/actions/refreshClassByObject.java delete mode 100644 javasource/communitycommons/actions/retrieveURL.java delete mode 100644 javasource/communitycommons/actions/storeURLToFileDocument.java create mode 100644 javasource/oql/actions/ExportOQLToMarkdown.java delete mode 100644 mprcontents/01/3c/013c411b-c6ba-4fe9-b842-583c4853753f.mxunit delete mode 100644 mprcontents/06/c4/06c46b42-722e-4bb7-abba-3a0a49bb2ac9.mxunit delete mode 100644 mprcontents/0b/ac/0bac7797-fd37-4834-badf-454a6334f7b9.mxunit delete mode 100644 mprcontents/0c/85/0c856a2d-2236-40fb-8155-0f4b6bbff4ef.mxunit delete mode 100644 mprcontents/0e/2a/0e2a0433-04d8-4c74-9275-335bd68ff360.mxunit delete mode 100644 mprcontents/0f/a2/0fa22ce8-d674-4098-99aa-d522cd2a362c.mxunit delete mode 100644 mprcontents/11/73/11730161-c9a1-4e76-85c8-b777affb9e12.mxunit delete mode 100644 mprcontents/12/57/125797ad-7f8d-4def-a68f-d88bb08bad16.mxunit delete mode 100644 mprcontents/14/d5/14d5ba43-5f28-4e2b-bfce-76d4ab2cfc0d.mxunit delete mode 100644 mprcontents/19/3a/193addff-f779-4e47-a8ea-69fc6922c4f6.mxunit delete mode 100644 mprcontents/1f/2c/1f2c4703-788f-4bb5-8b58-94088896316a.mxunit delete mode 100644 mprcontents/20/9b/209b3fb0-1b92-4e02-a318-21099fb30c07.mxunit delete mode 100644 mprcontents/23/39/23390396-86a1-431e-ace2-1019f84ae93a.mxunit delete mode 100644 mprcontents/25/26/252623ce-00e2-46ef-9863-fa54edcc933c.mxunit delete mode 100644 mprcontents/25/90/25905f62-d767-4053-9a17-c4e7b59ba931.mxunit delete mode 100644 mprcontents/26/df/26df65a0-31fc-4ad2-8379-dd6ff55e6d84.mxunit delete mode 100644 mprcontents/27/58/2758d413-8bc4-4570-8522-8c85a22ea96b.mxunit delete mode 100644 mprcontents/27/5e/275e8860-72a1-4f65-86a6-6dbd79be6bbb.mxunit delete mode 100644 mprcontents/28/aa/28aabeb5-d781-4389-ba73-fb483078a131.mxunit delete mode 100644 mprcontents/2a/63/2a639441-051e-4576-88ce-de5ce43cc281.mxunit delete mode 100644 mprcontents/2c/5c/2c5c8be1-3894-4a38-b3b3-5bc84b32647a.mxunit delete mode 100644 mprcontents/2e/7a/2e7a6433-d40b-44c1-8bce-7eb8d3245959.mxunit delete mode 100644 mprcontents/2f/e5/2fe59de0-076a-4c5e-8891-0fa390406aee.mxunit delete mode 100644 mprcontents/32/92/3292aafb-cb40-488d-84b8-2b06f79d3298.mxunit delete mode 100644 mprcontents/32/e1/32e1b2e4-2c2f-4da4-9a44-1f93080e702c.mxunit delete mode 100644 mprcontents/33/5d/335d12eb-da1e-4191-b771-a3cffad2d7dc.mxunit delete mode 100644 mprcontents/34/61/34618046-ffb8-4b19-bae1-cf00400d7285.mxunit delete mode 100644 mprcontents/36/af/36af3c25-6b85-4e29-a7ee-0d1f6b7af119.mxunit delete mode 100644 mprcontents/37/11/3711fb9b-49b3-4edc-89bb-242980d9e013.mxunit delete mode 100644 mprcontents/37/92/3792e394-7ee1-4bd2-bd66-29b95537c7b6.mxunit delete mode 100644 mprcontents/38/0d/380d3f03-fe78-42f4-be74-8b773246f993.mxunit delete mode 100644 mprcontents/3b/c7/3bc7a565-94ff-46c7-805c-5654e9454e1a.mxunit delete mode 100644 mprcontents/3d/27/3d276089-410d-437c-8677-c226e99de37d.mxunit delete mode 100644 mprcontents/41/19/41199396-2edd-4812-957c-0d3a4df302fa.mxunit delete mode 100644 mprcontents/41/1b/411be654-7889-49b2-9659-ae4165865b1c.mxunit delete mode 100644 mprcontents/41/3d/413d63ba-1d48-40ab-b2b9-ba920002647f.mxunit delete mode 100644 mprcontents/42/69/4269b76e-7532-4ec5-8f87-3104c3ac35f4.mxunit delete mode 100644 mprcontents/42/91/4291ccae-6b0e-4da4-a7da-412e22be58a0.mxunit delete mode 100644 mprcontents/45/54/4554a69d-94ff-469d-baf1-76e4f5e521c3.mxunit delete mode 100644 mprcontents/45/66/45664afd-3868-49b5-8854-f17716ccb49e.mxunit delete mode 100644 mprcontents/46/4d/464ddf7e-dd1b-4d8e-b7ae-972ca0ba4678.mxunit delete mode 100644 mprcontents/48/b4/48b4121a-6dca-47d8-b9e1-12cc7b615b37.mxunit delete mode 100644 mprcontents/4b/ad/4bad8d25-e5aa-44f3-914c-945649a1dad6.mxunit delete mode 100644 mprcontents/4e/6f/4e6fbfd9-cb0d-4dc7-abb9-2f7c61a48839.mxunit delete mode 100644 mprcontents/4f/6e/4f6e48bf-b665-4910-83a4-ef1370342887.mxunit delete mode 100644 mprcontents/50/1e/501e57e5-98d2-4a47-a0e9-85f75d41d80d.mxunit delete mode 100644 mprcontents/55/19/55194696-b0e5-46c2-bbe7-dd5a5d95e787.mxunit delete mode 100644 mprcontents/5b/c5/5bc5ed62-9161-4f75-a6b7-8e989a4ea6ee.mxunit delete mode 100644 mprcontents/5c/f0/5cf090fc-d880-4617-b738-ebc8747fa3f8.mxunit delete mode 100644 mprcontents/5d/96/5d96a675-8b26-4e41-a8b4-3e9e9d21c822.mxunit delete mode 100644 mprcontents/5f/33/5f33ef3d-ff24-4710-a336-0868cedf0c65.mxunit delete mode 100644 mprcontents/62/b8/62b889da-ec36-4bcc-b7e8-82ad756aa341.mxunit delete mode 100644 mprcontents/63/57/6357efb6-66a6-4fbe-a08b-b6a7c2d34f49.mxunit delete mode 100644 mprcontents/64/d6/64d66178-e97d-44d0-8b8d-0b02fa8f4ad7.mxunit delete mode 100644 mprcontents/67/ac/67acd8e9-474c-4eff-b8c2-13bdce431524.mxunit delete mode 100644 mprcontents/69/48/69489ab2-1f36-49a4-98cf-b518e0552dbe.mxunit delete mode 100644 mprcontents/6d/ce/6dcea552-d688-4c4f-bf86-d3ebe5a7b4f4.mxunit delete mode 100644 mprcontents/70/2c/702c6958-2b3f-4997-a978-65a051b7e7b0.mxunit delete mode 100644 mprcontents/72/48/72484a2b-ac9a-4e21-9f39-1655e243bba8.mxunit delete mode 100644 mprcontents/73/20/7320a1b2-f9ef-4cef-9940-5cf1dcbee25b.mxunit delete mode 100644 mprcontents/74/26/7426abea-6dca-4a78-b80f-a81a6faabffb.mxunit delete mode 100644 mprcontents/74/34/7434faab-9b88-4ea2-8310-1901e04e94c0.mxunit delete mode 100644 mprcontents/74/a6/74a6557f-b52f-4e6e-b6f2-220549b1a029.mxunit delete mode 100644 mprcontents/76/fb/76fbd7b9-db26-4c16-b674-494ab38938a6.mxunit delete mode 100644 mprcontents/7a/90/7a90a204-9d71-46a2-a681-525a4a73a7fa.mxunit delete mode 100644 mprcontents/7b/82/7b82f74b-ca76-4b6c-8193-c07b7c859f53.mxunit delete mode 100644 mprcontents/7d/cf/7dcfbab9-f1b0-425c-bd68-e8f26d0536f2.mxunit delete mode 100644 mprcontents/80/72/8072a112-065f-4090-8437-59ec3aeb3039.mxunit delete mode 100644 mprcontents/80/de/80de880e-544f-4a2c-9f03-54c477f7b6bc.mxunit delete mode 100644 mprcontents/81/59/815964be-bcb1-4ae4-946d-1a78fab2a049.mxunit delete mode 100644 mprcontents/82/e9/82e92749-f8b2-44fc-bff0-d5cb54c1a5be.mxunit delete mode 100644 mprcontents/83/f8/83f86cae-04cf-4177-93a1-cbdb75896b6d.mxunit delete mode 100644 mprcontents/87/07/870735ab-b61c-43a5-8a12-f9f94a19352f.mxunit delete mode 100644 mprcontents/8a/36/8a36d97c-8bd8-4fdc-a74c-c5146c170159.mxunit delete mode 100644 mprcontents/8b/28/8b285504-0ea9-4457-81f1-5672867385c6.mxunit delete mode 100644 mprcontents/8c/e2/8ce23aaf-4652-42c0-8fd9-5ccf841f2470.mxunit delete mode 100644 mprcontents/8d/64/8d64fb90-624d-4517-90fb-5f1006330527.mxunit delete mode 100644 mprcontents/90/a6/90a6952e-7573-4453-8c35-e852178f6048.mxunit delete mode 100644 mprcontents/92/12/9212c43e-4e29-4284-abeb-69b313105a8d.mxunit delete mode 100644 mprcontents/92/a1/92a16b06-4320-4bef-b613-4d5e75eaafca.mxunit delete mode 100644 mprcontents/93/80/93807c97-df06-4376-b94b-2893da1820a7.mxunit delete mode 100644 mprcontents/98/d0/98d0f7e5-3c77-48bd-848c-f97e78f61ef1.mxunit delete mode 100644 mprcontents/99/d2/99d2ef87-63ba-4468-85e6-aea66bb94f41.mxunit delete mode 100644 mprcontents/9b/d2/9bd23e92-f195-433e-b6b4-ae5f16991a5f.mxunit delete mode 100644 mprcontents/9e/b2/9eb2ec1c-1169-4520-b73a-1229b2c06893.mxunit delete mode 100644 mprcontents/9f/c0/9fc0c7d0-2733-40fe-b6ce-b8e0a26061fb.mxunit delete mode 100644 mprcontents/a0/85/a0851786-be34-44ab-9850-e330885a0459.mxunit delete mode 100644 mprcontents/a3/30/a330388c-fa3b-4513-ab2a-c2e811833b7f.mxunit delete mode 100644 mprcontents/a3/c6/a3c6f007-8a21-452b-9170-ab11fd5e27b8.mxunit delete mode 100644 mprcontents/a4/e3/a4e3f1ec-8f10-43ed-b33c-9fe2a30a490f.mxunit delete mode 100644 mprcontents/aa/3c/aa3cc804-dc1c-4fa0-ad46-e726c21fe3da.mxunit delete mode 100644 mprcontents/ab/d2/abd2bd2b-d3c2-45a0-a71a-22be0c92e811.mxunit delete mode 100644 mprcontents/ac/75/ac754e40-2cda-4bdd-95a4-1def12d18dfd.mxunit delete mode 100644 mprcontents/b0/20/b02094ef-defa-402f-ac93-59effd58ae2b.mxunit delete mode 100644 mprcontents/b1/ae/b1ae64e0-91f8-4ab2-bf04-cffe11596808.mxunit delete mode 100644 mprcontents/b3/fb/b3fbd897-33ae-4056-b2ff-4493b3f7c31d.mxunit delete mode 100644 mprcontents/b4/bc/b4bcdd4c-2e90-4adf-a6b3-68e3bcf097f9.mxunit delete mode 100644 mprcontents/b7/de/b7dec694-362f-48ae-8fa5-c64e0fc507d8.mxunit delete mode 100644 mprcontents/b9/02/b90235b9-1e35-492e-8f46-07c792c3a6ce.mxunit delete mode 100644 mprcontents/ba/b6/bab64d45-15b1-4fc7-b40b-861297a9b856.mxunit delete mode 100644 mprcontents/bc/c7/bcc73544-a623-4ef4-b11e-a8356ee45b7a.mxunit delete mode 100644 mprcontents/c3/2e/c32ee613-9245-4a1c-823c-04deaab7eca0.mxunit delete mode 100644 mprcontents/c4/2f/c42f512f-fc1f-461c-94df-fb58a2c39e83.mxunit delete mode 100644 mprcontents/c5/a1/c5a1acc8-f0c3-4492-8748-615dfc5f1089.mxunit delete mode 100644 mprcontents/ce/24/ce24ce2d-531f-4cc6-89f3-b8788a6308d0.mxunit delete mode 100644 mprcontents/ce/49/ce4916a7-4aa0-4a65-b5d4-cbb83d0ca02c.mxunit delete mode 100644 mprcontents/d0/de/d0de4dd0-4e0a-404c-a4d0-6728e4b7da59.mxunit delete mode 100644 mprcontents/d3/05/d3055cec-d54d-4d26-8fa0-236c6653e775.mxunit delete mode 100644 mprcontents/d5/17/d51747fb-2f79-427b-9111-4f9146a8c321.mxunit delete mode 100644 mprcontents/d6/80/d6806243-190a-476f-8016-89303a425800.mxunit delete mode 100644 mprcontents/d8/3d/d83dcc11-b9f3-4ea3-932a-82bb6c9e6ca3.mxunit delete mode 100644 mprcontents/d9/ae/d9ae85dd-d8ec-419f-9848-185c6a0b5397.mxunit delete mode 100644 mprcontents/de/50/de50da93-2589-4cad-9130-261931c71c1c.mxunit delete mode 100644 mprcontents/e4/20/e420ec5a-aabc-464b-8adf-3fc2c2c9e323.mxunit delete mode 100644 mprcontents/e5/55/e555196b-c0ca-497e-b581-bf190d744b58.mxunit create mode 100644 mprcontents/ea/11/ea11f719-67e4-4944-873f-174f182338c4.mxunit delete mode 100644 mprcontents/ea/14/ea145d49-84cb-4328-a50b-b8d8b35317ab.mxunit delete mode 100644 mprcontents/eb/0c/eb0c3cf5-4c0b-4cd9-9642-0106c40e6cb1.mxunit delete mode 100644 mprcontents/ec/25/ec255d6f-b9a8-4bb2-a312-c9d1d07dbd07.mxunit delete mode 100644 mprcontents/ed/97/ed97f4c1-6f14-4e8c-b9a5-84410d40aa31.mxunit delete mode 100644 mprcontents/ed/c0/edc0beb2-d305-40a5-80db-696738eaf052.mxunit delete mode 100644 mprcontents/ee/3d/ee3dc1fc-fa9d-469f-ab56-1c763276eba2.mxunit delete mode 100644 mprcontents/ef/28/ef288b8a-0371-48c4-9db4-8ac2f0ae39d4.mxunit delete mode 100644 mprcontents/ef/4a/ef4ae36f-1485-4ea1-9f7e-26ec5835b911.mxunit delete mode 100644 mprcontents/f4/84/f4841ac1-f038-4d61-be48-28b4c9b859fd.mxunit delete mode 100644 mprcontents/f6/16/f6164553-18d9-4c6f-bb39-4cecb3f26c80.mxunit delete mode 100644 mprcontents/f8/5a/f85abab2-8261-4e09-b8f2-1cd4d9c697c6.mxunit delete mode 100644 mprcontents/fa/39/fa398d01-80e6-47c8-8ad3-8d2f0576793a.mxunit delete mode 100644 mprcontents/fd/d6/fdd60a1a-e6b2-4053-9be1-f1d43eade39e.mxunit delete mode 100644 themesource/communitycommons/native/design-properties.json delete mode 100644 themesource/communitycommons/native/main.js delete mode 100644 themesource/communitycommons/settings.json delete mode 100644 themesource/communitycommons/web/design-properties.json delete mode 100644 themesource/communitycommons/web/main.scss create mode 100644 widgets/com.mendix.widget.web.Markdown.mpk delete mode 100644 widgets/mendix.CsvAsTable.mpk diff --git a/OQLModule.mpr b/OQLModule.mpr index 329357658ec3282749574e6e08c1fcca1dfa637b..d3eb7ddc460d9758a96d0efd1ddacc3732e58c2d 100644 GIT binary patch delta 3929 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 XoanMRlnu}llr5H*Ge-ZfA1VF`FJ9*p delta 6572 zcmZ{p2Y6G}9>DKy_G+LYP((pS87U^s4l&r8*nEIjV$K(h72eCP97MoK-A6Y_YvPaS_O!`O;hv67WrLjslHkzGfv!-9Fm*u6G z4#dLKYbxJIq~9nGg6a7aBLiW>fuf zy;cu3hM-d6Ov6+^7?nC-Z_G3Xp;DA7M!30tASyj?N|-P{6V(VH3J}*2dHMJ9XXFnj zoFsS&c>Gqp3fGQXfGfeC!-lXuF}pC8=%?sq=yy=xqdq_lKpsR|kT66eLI}SPp9voU z`vz7GBj#<-D+ix|DUc3a1fmPMeKRqXqf&_lP%vev)Rk;QjY_c>LPUj1EzLHRsMH_X zh60t+Es_??OgbT3LN;ox33{!>=2MQDP%lRn7xzco3Hh_G*QvF|vQ;qck=WDbFH-g2 z6pH*>hnvJRxE*edf*evAwLZ7hTH|oryh6&Mxj9-kqPBIf4s_Q)g(MItSF`4ZGx{6s+o>572 zDsUd>`Te@%;t$WyBO{`fD!ZD_LNk;X0<^q?%ID^*Ac$2^7cDKT3vY$q!-a6b{0sR5w#Wii%wfgEdiJ z&X$;LJgUh=jhASmLL*h=kkHHwm)V<9iF2yi?+qP8;J(kF5j#}$(~3JEK&qtB#x@!a z0lPq}ka|@vI?EENVg_l{TBgD()v7FNgIy`3D;41&J#&Gg+y&m6Gog4fn=MPH#~+td zZHXDZr>~~(+bmdCc84;{1UCx&)<~7TIvlE&l*d$dzrq+0aOeUxNgoR`tEoDHv7DlVraOSB@?{+NEE~2nuLH zdmvWhVTVcaib`kLQ^A(Vovx@g;iN=;L4hVxuIBM+p^TsZU;n2PH?x1EblI6*eQxST z?(0%dPiiDuCrMyd(LxlyL+Di0@_8{ z^Jn}I3;z65R>&ZC=?{yUB&I>C3A1b(smo3ksw&lFich1lN2OF}nL3b+@@m5zGsA2X zX8hcoKdD<6Chw|NH9r}MknUJLyh}e{XLrcrl_3VVJm8EoBIKBjTUkXDm-}RXvDgrx z(JLy$<(7nz3~i6noc`^P*DVM|Dg<*GKiV|C=f5ZE((f~I7-2=NFj~!}1Wges)5{H0 zB2JAVDC5X&dK*_8t(K&=TT;(Csd!j(Nujz+LIO^OKLJg}n4Etu zo6_*k^B%&@BM$x8ed;^OF8vysM5$-7X>6NPtu(`crCX_Y z(Y#zWKVXd+JUX^55~+zRHC#F+lGKt&l$cttaq^)}Gb-obXEWCC_~Nc?aaG^=^QP6( zF8zKMogvdJsx6fsy`LGdQOl${hSeA}^K_M7w}5AhnW`0Wj@uoF^qic2>HBpl?NRwn0E>A8AqLan5dl~SvmEw_@`^hh)q zb4WN0C}**9{?yg7>$8V!RV<_w6_y<9*RM-IM`%>@ln$BMC99OPRps0glV4n=(!{-@ zs*p$KG9?2{GOeOEC^ktmerC=;`G!*T`n8XgySFVZUcE;Y@6s<<8)>qH-7L_kOjL1| zA|hi}suRwVm_4&Rbux-SA)pJWM!VMrEp$dsZ~5h`@#cjQ^}5|3C6|4wTK8+0epQ(x z%&}{^tSWx3&>W6)xO9n>A0fHq?x>T=;{_Fta!-kbrBCQGetOPt21DJ~oQSHXAKxAO zykliSm->VYcb51<9owTPnNsYpC%cJH!lmB5JMO5cQh4 zBtJ8#mxak9zEjVp@JZ4db$}kCOQAawCFdV|q+ro-)imDb2kvx_Zl-x%>MKIAq{}B4 z`KWYmpqgp1su`9lb|^vT8bemTT}RW?L?lBdPfP94@*(H^H28@8Hh5UEC_)>5Y5s5T zb?NuG%G|;dCcT7Bq8MaSzrfG$*A1JqF<&pJe_R=yVF^t?+NIyE35SB=a*@o+_o!(kQbJ^~2~C!2qgv~XDJ2q* zxLW738Ur?tGLz?vGk)lf*IAcM^Kpj9O=EhfwNi(W8T3Umr(Xqy>0s$pVTp&U_Swpu zB|5pLN^FBdCFMf3OjuP= z%pIvyb%i25Ri5A|9kyDt!lz;}-PCeEi^8uEk`h{v!bhp9wg|LAx5sL(fU@hboa*$T zq9M0|cF{8HbL}suQllYN(q3CBukj}&iiF7!V0-CetwX8x>lHq`mgF;wU8aDZA_;4q z7OHRz7EuSx1)~5Qi?X3U!W_XBVW)s=VZS35p?^bDP#jzeeLepuVKuf2)dI_d$MX)L z`{Hc~Enb!9B35G!#HsjJG#vFS+=9Fh-bIW>48tcIv2cP6Y$3ddn~a}N>`Rz~Qe$Rd zwxQbK1F#qKG_U|T7daMvg7^@OqD9CGqA_n1;Re14Ih=SIuE;CG?#H0vOysxlMtlM_ zh;R}`z>Lr92Ky&^Cvp)+h~0=Nz+A<-;P-I=Opx~waRGM@u`hoI{xmHeO&a{No4A3A zcAdU~w*%im^mXoNaL>`7)Ga*2Xh}t69B?YDdcSelt83cOIQCWJ=f+RKg4DFn22-F8 z{)s~#ZfI?iHx!)s_Us2=qJZ-dtq}J5<4PaDVlPMWF#W_=2b_awy6v+fFf;b$y207# z`Ifp%*h0U!uGehJD4qcT9%R3A%=#3FOMSckjU@E8Z^2H<$*MMS>#c%Q|1ghd0nf7( zd+D#H`xT|jZ#}*+cI%y$z@HH9erinHZ>1(4VF> zJ$oV8|LEe^+Jm3%1OCc(nzV5o*dw)S;@s0L^ zZ|D65VzXneY#Il4PZe$+l%4tauP{GsoAbSTz2d8$zTTh_%!fL83w8HS9+)iMRlmQG z5SAN2LUyQc^SR8|joXs@I@cCA*fVu*%V^jxU`(p}n4*z{UBI|&)@JS2X$;<{J~#-XY1`HndC5$rW*LkI5FenD#7n5n2tM&3T1ebX zTtciT`iOcW51t~9B=$j!M5o~&AbO)dCc;o|G#R}DJrh-t|7-pgxHJE7{1}DO3*kjlxWCQk}*qO+A*dTTyGKLkS z4#NIKn&A(yRBS(l5sSibo?xzFjw9tr2C_eF5+;qrz%OD}U}j-Ln0GN!3=Q)JdOQZ5 zNxj!$cM!j!Ph=`myAju5QuzKI^&Mb}mM+e&?}rl*=am)8GJzHtjp`3*!7|rFGxAo$Q|2EB8r;?L5(9{0r;>(bmfy(W38qDU!`$ zsVqI4y$&pZ@bZrCthDrd)$F~4hu2-X*#qnj(Zxrv?)dqHh=z70+VHdcg?r$U zKR^UT+ZPW=ZhwBAT)HJ?Z2!x!jRaG-cxBTPBWBJWHw@vExN#98z z0MQTU3~R4}9g(cq`Qf2Q+c+11m#@K+#d$v#uO)^rEi3(G)5U?`j9?Z6|AIPiAGdtK zqSy0O4Sn9itV-ii!0!+}`1{gddiv+8T0fh{C6sO|0e*w%wo?mv`QAq5`m5Zx2ktYh z2A)84eJ||;lE@Kp^Lps zI!pUF*6Y;HmB0@W?bx)4TKe@o$+Q*{^63idGT=T$A3na**lqqV{PgHmw;QlhB5)6) z4+_0j@&y^HI0wYD5Qk^RG-eGp+yN0B{AO+kDTao`J`>sWo4J7n$v?0@@(D zb*a8!Ub0=eZhqUG?Q^#F0xm-|xwNe#y^U5`+VoP8Nf8CU6m=GuzL7vd8KYOuxTvowrrZ1ukU!cB;(+$06Fe%nBTXXy=M4kUR?E&V^3k zD~SGGpL|uG1de2Br>Y`w7^0nPfxsb%cCK3i`yl%N)g}v6ZUVl9aOcVnuot48>oLF{ zi2hwhc~wOLTC=oM@dIdqXnJ?cJ9(+e)Ltp{-sG!W?VP=%Q{AY&(%1Ix&C8PXKlj-{ zDk1yeA@J(K!=3zT`9lat2~GkUzY#CPJ;2Syjl`bD`mx -{ - public static ImmutablePair of(T left, U right) { - return new ImmutablePair(left, right); - } - - private final T left; - private final U right; - - private ImmutablePair(T left, U right) { - if (left == null) - throw new IllegalArgumentException("Left is NULL"); - if (right == null) - throw new IllegalArgumentException("Right is NULL"); - - this.left = left; - this.right = right; - } - - public T getLeft() { - return left; - } - - public U getRight() { - return right; - } - - @Override - public String toString() { - return "<" + left.toString()+ "," + right.toString() + ">"; - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof ImmutablePair)) - return false; - - if (this == other) - return true; - - ImmutablePair o = (ImmutablePair) other; - return left.equals(o.getLeft()) && right.equals(o.getRight()); - } - - @Override - public int hashCode() { - return new HashCodeBuilder(19, 85) - .append(left) - .append(right) - .toHashCode(); - } - -} diff --git a/javasource/communitycommons/Logging.java b/javasource/communitycommons/Logging.java deleted file mode 100644 index dfbf47e..0000000 --- a/javasource/communitycommons/Logging.java +++ /dev/null @@ -1,90 +0,0 @@ -package communitycommons; - -import com.mendix.core.Core; -import com.mendix.logging.ILogNode; -import communitycommons.proxies.LogLevel; -import communitycommons.proxies.LogNodes; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -public class Logging { - - private static Map timers = new HashMap(); - - public static void trace(String lognode, String message) { - log(lognode, LogLevel.Trace, message, null); - } - - public static void info(String lognode, String message) { - log(lognode, LogLevel.Info, message, null); - } - - public static void debug(String lognode, String message) { - log(lognode, LogLevel.Debug, message, null); - } - - public static void warn(String lognode, String message, Throwable e) { - log(lognode, LogLevel.Warning, message, e); - } - - public static void warn(String lognode, String message) { - warn(lognode, message, null); - } - - public static void error(String lognode, String message, Throwable e) { - log(lognode, LogLevel.Error, message, e); - } - - public static void error(String lognode, String message) { - error(lognode, message, null); - } - - public static void critical(String lognode, String message, Throwable e) { - log(lognode, LogLevel.Critical, message, e); - } - - public static void log(String lognode, LogLevel loglevel, String message, Throwable e) { - ILogNode logger = createLogNode(lognode); - switch (loglevel) { - case Critical: - logger.critical(message, e); - break; - case Warning: - logger.warn(message, e); - break; - case Debug: - logger.debug(message); - break; - case Error: - logger.error(message, e); - break; - case Info: - logger.info(message); - break; - case Trace: - logger.trace(message); - break; - } - } - - public static Long measureEnd(String timerName, LogLevel loglevel, - String message) { - Long cur = new Date().getTime(); - if (!timers.containsKey(timerName)) { - throw new IllegalArgumentException(String.format("Timer with key %s not found", timerName)); - } - Long timeTaken = cur - timers.get(timerName); - String time = String.format("%d", timeTaken); - log(LogNodes.CommunityCommons.name(), loglevel, "Timer " + timerName + " finished in " + time + " ms. " + message, null); - return timeTaken; - } - - public static void measureStart(String timerName) { - timers.put(timerName, new Date().getTime()); - } - - public static ILogNode createLogNode(String logNode) { - return Core.getLogger(logNode); - } -} diff --git a/javasource/communitycommons/Misc.java b/javasource/communitycommons/Misc.java deleted file mode 100644 index 0a7d5eb..0000000 --- a/javasource/communitycommons/Misc.java +++ /dev/null @@ -1,744 +0,0 @@ -package communitycommons; - -import com.mendix.core.Core; -import com.mendix.core.CoreException; -import com.mendix.core.objectmanagement.member.MendixBoolean; -import com.mendix.integration.WebserviceException; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.ISession; -import com.mendix.systemwideinterfaces.core.IUser; -import communitycommons.proxies.LogNodes; -import static communitycommons.proxies.constants.Constants.getMergeMultiplePdfs_MaxAtOnce; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicLong; -import java.util.stream.Collectors; -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.multipdf.Overlay; -import org.apache.pdfbox.multipdf.PDFMergerUtility; -import org.apache.pdfbox.pdmodel.PDDocument; -import system.proxies.FileDocument; -import system.proxies.Language; - -public class Misc { - - private static final String LOGNODE = LogNodes.CommunityCommons.name(); - private static boolean UNDER_TEST = false; - - static { - try { - // if this succeeds, we have a runtime - Logging.createLogNode(LOGNODE); - } catch (NullPointerException npe) { - UNDER_TEST = true; - } - } - - public abstract static class IterateCallback { - - boolean start = false; - boolean stop = false; - private Iterator mapIter; - - public abstract void hit(T1 key, T2 value) throws Exception; - - synchronized public void exit() { - stop = true; - } - - synchronized public void remove() { - mapIter.remove(); - } - - synchronized void runOn(Map map) throws Exception { - if (start) { - throw new IllegalMonitorStateException(); - } - start = true; - - try { - this.mapIter = map.keySet().iterator(); - - while (mapIter.hasNext()) { - T1 key = mapIter.next(); - T2 value = map.get(key); - - hit(key, value); - - if (stop) { - break; - } - } - } finally { - //reset state to allow reuse, even when exceptions occur - mapIter = null; - stop = false; - start = false; - } - } - } - - /** - * - * @param Any Java enumeration, such as a proxy class for a Mendix enumeration - * @param enumClass For instance: LogLevel.class - * @param value The value to look up in the enumeration - * @return An Optional of the requested enumeration. Will have the requested value if found, - * Optional.empty() otherwise. - */ - public static > Optional enumFromString(final Class enumClass, final String value) { - try { - if (value != null) { - return Optional.of(E.valueOf(enumClass, value)); - } - } catch (IllegalArgumentException iae) { - if (!UNDER_TEST) { - Logging.warn(LOGNODE, String.format("No enumeration with value %s found", value)); - } - } - return Optional.empty(); - } - - /** - * Because you cannot remove items from a map while iteration, this function is introduced. In - * the callback, you can use this.remove() or this.exit() to either remove or break the loop. - * Use return; to continue - * - * @throws Exception - */ - public static void iterateMap(Map map, IterateCallback callback) throws Exception { - //http://marxsoftware.blogspot.com/2008/04/removing-entry-from-java-map-during.html - if (map == null || callback == null) { - throw new IllegalArgumentException(); - } - - callback.runOn(map); - } - - public static String getApplicationURL() { - final String applicationURL = UNDER_TEST ? "http://localhost:8080/" : Core.getConfiguration().getApplicationRootUrl(); - return StringUtils.removeEnd(applicationURL, "/"); - } - - /** - * @return the runtime version - * @deprecated since 11.0.0. Use {@link com.mendix.core.Core.getRuntimeVersion} instead - */ - @Deprecated - public static String getRuntimeVersion() { - return Core.getRuntimeVersion(); - } - - /** - * @return the model version - * @deprecated since 11.0.0. Use {@link com.mendix.core.Core.getModelVersion} instead - */ - @Deprecated - public static String getModelVersion() { - return Core.getModelVersion(); - } - - public static void throwException(String message) throws UserThrownException { - throw new UserThrownException(message); - } - - public static void throwWebserviceException(String faultstring) throws WebserviceException { - throw new WebserviceException(WebserviceException.clientFaultCode, faultstring); - } - - public static String retrieveURL(String url, String postdata) throws Exception { - // Send data, appname - URLConnection conn = new URI(url).toURL().openConnection(); - - conn.setDoInput(true); - conn.setDoOutput(true); - conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - - if (postdata != null) { - try ( - OutputStream os = conn.getOutputStream()) { - IOUtils.copy(new ByteArrayInputStream(postdata.getBytes(StandardCharsets.UTF_8)), os); - } - } - - String result; - try ( - InputStream is = conn.getInputStream()) { - // Get the response - result = IOUtils.toString(is, StandardCharsets.UTF_8); - } - - return result; - } - - public static Boolean duplicateFileDocument(IContext context, IMendixObject toClone, IMendixObject target) throws Exception { - if (toClone == null || target == null) { - throw new Exception("No file to clone or to clone into provided"); - } - - MendixBoolean hasContents = (MendixBoolean) toClone.getMember(FileDocument.MemberNames.HasContents.toString()); - if (!hasContents.getValue(context)) { - return false; - } - - try ( - InputStream inputStream = Core.getFileDocumentContent(context, toClone)) { - Core.storeFileDocumentContent(context, target, (String) toClone.getValue(context, system.proxies.FileDocument.MemberNames.Name.toString()), inputStream); - } - - return true; - } - - public static Boolean duplicateImage(IContext context, IMendixObject toClone, IMendixObject target, int thumbWidth, int thumbHeight) throws Exception { - if (toClone == null || target == null) { - throw new Exception("No file to clone or to clone into provided"); - } - - MendixBoolean hasContents = (MendixBoolean) toClone.getMember(FileDocument.MemberNames.HasContents.toString()); - if (!hasContents.getValue(context)) { - return false; - } - - try ( - InputStream inputStream = Core.getImage(context, toClone, false)) { - Core.storeImageDocumentContent(context, target, inputStream, thumbWidth, thumbHeight); - - } - - return true; - } - - public static Boolean storeURLToFileDocument(IContext context, String url, IMendixObject __document, String filename) throws IOException, URISyntaxException { - if (__document == null || url == null || filename == null) { - throw new IllegalArgumentException("No document, filename or URL provided"); - } - - final int MAX_REMOTE_FILESIZE = 1024 * 1024 * 200; //maximum of 200 MB - try { - URL imageUrl = new URI(url).toURL(); - URLConnection connection = imageUrl.openConnection(); - //we connect in 20 seconds or not at all - connection.setConnectTimeout(20000); - connection.setReadTimeout(20000); - connection.connect(); - - int contentLength = connection.getContentLength(); - - //check on forehand the size of the remote file, we don't want to kill the server by providing a 3 terabyte image. - Logging.trace(LOGNODE, String.format("Remote filesize: %d", contentLength)); - - if (contentLength > MAX_REMOTE_FILESIZE) { //maximum of 200 mb - throw new IllegalArgumentException(String.format("Wrong filesize of remote url: %d (max: %d)", contentLength, MAX_REMOTE_FILESIZE)); - } - - InputStream fileContentIS; - try (InputStream connectionInputStream = connection.getInputStream()) { - if (contentLength >= 0) { - fileContentIS = connectionInputStream; - } else { // contentLength is negative or unknown - Logging.trace(LOGNODE, String.format("Unknown content length; limiting to %d", MAX_REMOTE_FILESIZE)); - byte[] outBytes = new byte[MAX_REMOTE_FILESIZE]; - int actualLength = IOUtils.read(connectionInputStream, outBytes, 0, MAX_REMOTE_FILESIZE); - fileContentIS = new ByteArrayInputStream(Arrays.copyOf(outBytes, actualLength)); - } - Core.storeFileDocumentContent(context, __document, filename, fileContentIS); - } - } catch (IOException | URISyntaxException e) { - Logging.error(LOGNODE, String.format("A problem occurred while reading from URL %s: %s", url, e.getMessage())); - throw e; - } - - return true; - } - - public static Long getFileSize(IContext context, IMendixObject document) { - final int BUFFER_SIZE = 4096; - long size = 0; - - if (context != null) { - byte[] buffer = new byte[BUFFER_SIZE]; - - try ( - InputStream inputStream = Core.getFileDocumentContent(context, document)) { - int i; - while ((i = inputStream.read(buffer)) != -1) { - size += i; - } - } catch (IOException e) { - Logging.error(LOGNODE, "Couldn't determine filesize of FileDocument '" + document.getId()); - } - } - - return size; - } - - public static void delay(long delaytime) throws InterruptedException { - Thread.sleep(delaytime); - } - - public static IContext getContextFor(IContext context, String username, boolean sudoContext) { - if (username == null || username.isEmpty()) { - throw new RuntimeException("Assertion: No username provided"); - } - - if (username.equals(context.getSession().getUserName())) { - return context; - } else { // when it is a scheduled event, then get the right session. - ISession session = getSessionFor(context, username); - - IContext c = session.createContext(); - if (sudoContext) { - return c.createSudoClone(); - } - - return c; - } - } - - private static ISession getSessionFor(IContext context, String username) { - ISession session = Core.getActiveSession(username); - - if (session == null) { - IContext newContext = context.getSession().createContext().createSudoClone(); - newContext.startTransaction(); - try { - session = initializeSessionForUser(newContext, username); - } catch (CoreException e) { - newContext.rollbackTransaction(); - - throw new RuntimeException("Failed to initialize session for user: " + username + ": " + e.getMessage(), e); - } finally { - newContext.endTransaction(); - } - } - - return session; - } - - private static ISession initializeSessionForUser(IContext context, String username) throws CoreException { - IUser user = Core.getUser(context, username); - - if (user == null) { - throw new RuntimeException("Assertion: user with username '" + username + "' does not exist"); - } - - return Core.initializeSession(user, null); - } - - public static Object executeMicroflowAsUser(IContext context, - String microflowName, String username, Boolean sudoContext, Object... args) throws Exception { - - if (context == null) { - throw new Exception("Assertion: No context provided"); - } - if (microflowName == null || microflowName.isEmpty()) { - throw new Exception("Assertion: No context provided"); - } - if (!Core.getMicroflowNames().contains(microflowName)) { - throw new Exception("Assertion: microflow not found: " + microflowName); - } - if (args.length % 2 != 0) { - throw new Exception("Assertion: odd number of dynamic arguments provided, please name every argument: " + args.length); - } - - Map params = new LinkedHashMap(); - for (int i = 0; i < args.length; i += 2) { - if (args[i] != null) { - params.put(args[i].toString(), args[i + 1]); - } - } - - IContext c = getContextFor(context, username, sudoContext); - - return Core.microflowCall(microflowName).withParams(params).execute(c); - } - - //MWE: based on: http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executor.html - static class MFSerialExecutor { - - private static MFSerialExecutor _instance = new MFSerialExecutor(); - - private final AtomicLong tasknr = new AtomicLong(); - private final ExecutorService executor; - - public static MFSerialExecutor instance() { - return _instance; - } - - private MFSerialExecutor() { - executor = Executors.newSingleThreadExecutor(new ThreadFactory() { - - //Default thread factory takes care of setting the proper thread context - private final ThreadFactory defaultFactory = Executors.defaultThreadFactory(); - - @Override - public Thread newThread(Runnable runnable) { - Thread t = defaultFactory.newThread(runnable); - t.setPriority(Thread.MIN_PRIORITY); - t.setName("CommunityCommons background pool executor thread"); - return t; - } - - }); - } - - public void execute(final Runnable command) { - if (command == null) { - throw new NullPointerException("command"); - } - - final long currenttasknr = tasknr.incrementAndGet(); - Logging.debug(LOGNODE, "[RunMicroflowAsyncInQueue] Scheduling task #" + currenttasknr); - - executor.submit(new Runnable() { - @Override - public void run() { - Logging.debug(LOGNODE, "[RunMicroflowAsyncInQueue] Running task #" + currenttasknr); - try { - command.run(); - } catch (RuntimeException e) { - Logging.error(LOGNODE, "[RunMicroflowAsyncInQueue] Execution of task #" + currenttasknr + " failed: " + e.getMessage(), e); - throw e; //single thread executor will continue, even if an exception is thrown. - } - Logging.debug(LOGNODE, "[RunMicroflowAsyncInQueue] Completed task #" + currenttasknr + ". Tasks left: " + (tasknr.get() - currenttasknr)); - } - }); - } - } - - public static Boolean runMicroflowAsyncInQueue(final String microflowName) { - MFSerialExecutor.instance().execute(new Runnable() { - @Override - public void run() { - try { - Future future = Core.executeAsync(Core.createSystemContext(), microflowName, true, new HashMap<>()); //MWE: somehow, it only works with system context... well thats OK for now. - future.get(); - } catch (CoreException | InterruptedException | ExecutionException e) { - throw new RuntimeException("Failed to run Async: " + microflowName + ": " + e.getMessage(), e); - } - } - }); - return true; - } - - public static Boolean runMicroflowInBackground(final IContext context, final String microflowName, - final IMendixObject paramObject) { - - MFSerialExecutor.instance().execute(new Runnable() { - - @Override - public void run() { - try { - IContext c = Core.createSystemContext(); - if (paramObject != null) { - Core.executeAsync(c, microflowName, true, paramObject).get(); //MWE: somehow, it only works with system context... well thats OK for now. - } else { - Core.executeAsync(c, microflowName, true, new HashMap<>()).get(); //MWE: somehow, it only works with system context... well thats OK for now. - } - } catch (CoreException | InterruptedException | ExecutionException e) { - throw new RuntimeException("Failed to run Async: " + microflowName + ": " + e.getMessage(), e); - } - - } - - }); - return true; - } - - private interface IBatchItemHandler { - - void exec(IContext context, IMendixObject obj) throws Exception; - - } - - private static class BatchState { - - private int state = 0; //-1 = error, 1 = done. - private final IBatchItemHandler callback; - - public BatchState(IBatchItemHandler callback) { - this.callback = callback; - } - - public void setState(int state) { - this.state = state; - } - - public int getState() { - return state; - } - - public void handle(IContext context, IMendixObject obj) throws Exception { - callback.exec(context, obj); - } - } - - public static Boolean executeMicroflowInBatches(String xpath, final String microflow, int batchsize, boolean waitUntilFinished, boolean asc) throws CoreException, InterruptedException { - Logging.debug(LOGNODE, "[ExecuteInBatches] Starting microflow batch '" + microflow + "..."); - - return executeInBatches(xpath, new BatchState(new IBatchItemHandler() { - - @Override - public void exec(IContext context, IMendixObject obj) throws Exception { - Core.executeAsync(context, microflow, true, obj).get(); - } - - }), batchsize, waitUntilFinished, asc); - } - - public static Boolean recommitInBatches(String xpath, int batchsize, - boolean waitUntilFinished, Boolean asc) throws CoreException, InterruptedException { - Logging.debug(LOGNODE, "[ExecuteInBatches] Starting recommit batch..."); - - return executeInBatches(xpath, new BatchState(new IBatchItemHandler() { - - @Override - public void exec(IContext context, IMendixObject obj) throws Exception { - Core.commit(context, obj); - } - - }), batchsize, waitUntilFinished, asc); - } - - public static Boolean executeInBatches(String xpathRaw, BatchState batchState, int batchsize, boolean waitUntilFinished, boolean asc) throws CoreException, InterruptedException { - String xpath = xpathRaw.startsWith("//") ? xpathRaw : "//" + xpathRaw; - - long count = Core.createXPathQuery("count(" + xpath + ")").executeAggregateLong(Core.createSystemContext()); - int loop = (int) Math.ceil(((float) count) / ((float) batchsize)); - - Logging.debug(LOGNODE, - "[ExecuteInBatches] Starting batch on ~ " + count + " objects divided over ~ " + loop + " batches. " - + (waitUntilFinished ? "Waiting until the batch has finished..." : "") - ); - - executeInBatchesHelper(xpath, batchsize, 0, batchState, count, asc); - - if (waitUntilFinished) { - while (batchState.getState() == 0) { - Thread.sleep(5000); - } - if (batchState.getState() == 1) { - Logging.debug(LOGNODE, "[ExecuteInBatches] Successfully finished batch"); - return true; - } - Logging.error(LOGNODE, "[ExecuteInBatches] Failed to finish batch. Please check the application log for more details."); - return false; - } - - return true; - } - - static void executeInBatchesHelper(final String xpath, final int batchsize, final long last, final BatchState batchState, final long count, final boolean asc) { - MFSerialExecutor.instance().execute(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(200); - IContext c = Core.createSystemContext(); - - List objects = - Core.createXPathQuery(xpath + (last > 0 ? "[id " + (asc ? "> " : "< ") + last + "]" : "")) - .setAmount(batchsize) - .setOffset(0) - .addSort("id", asc ? true : false) - .execute(c); - - //no new objects found :) - if (objects.isEmpty()) { - Logging.debug(LOGNODE, "[ExecuteInBatches] Succesfully finished batch on ~" + count + " objects."); - batchState.setState(1); - } else { - - //process objects - for (IMendixObject obj : objects) { - batchState.handle(c, obj); - } - - //invoke next batch - executeInBatchesHelper(xpath, batchsize, objects.get(objects.size() - 1).getId().toLong(), batchState, count, asc); - } - } catch (Exception e) { - batchState.setState(-1); - throw new RuntimeException("[ExecuteInBatches] Failed to run in batch: " + e.getMessage(), e); - } - } - - }); - } - - /** - * Tests if two objects are equal with throwing unecessary null pointer exceptions. - * - * This is almost the most stupid function ever, since it should be part of Java itself. - * - * @param left - * @param right - * @return - * @deprecated Native Java function Objects.equals() is available since Java 7 - */ - @Deprecated - public static boolean objectsAreEqual(Object left, Object right) { - if (left == null && right == null) { - return true; - } - if (left == null || right == null) { - return false; - } - return left.equals(right); - } - - /** - * Get the default language - * - * @param context - * @return The default language - * @throws CoreException - */ - public static Language getDefaultLanguage(IContext context) throws CoreException { - String languageCode = Core.getDefaultLanguage().getCode(); - List languageList = Language.load(context, "[Code = '" + languageCode + "']"); - if (languageList == null || languageList.isEmpty()) { - throw new RuntimeException("No language found for default language constant value " + languageCode); - } - return languageList.get(0); - } - - public static boolean mergePDF(IContext context, List documents, IMendixObject mergedDocument) throws IOException { - if (getMergeMultiplePdfs_MaxAtOnce() <= 0 || documents.size() <= getMergeMultiplePdfs_MaxAtOnce()) { - - List sources = new ArrayList<>(); - try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { - PDFMergerUtility mergePdf = new PDFMergerUtility(); - - for (FileDocument file : documents) { - InputStream content = Core.getFileDocumentContent(context, file.getMendixObject()); - sources.add(content); - } - mergePdf.addSources(sources); - mergePdf.setDestinationStream(out); - mergePdf.mergeDocuments(null); - - Core.storeFileDocumentContent(context, mergedDocument, new ByteArrayInputStream(out.toByteArray())); - - out.reset(); - documents.clear(); - } catch (IOException e) { - throw new RuntimeException("Failed to merge documents" + e.getMessage(), e); - } finally { // We cannot use try-with-resources because streams would be prematurely closed - for (InputStream is : sources) { - is.close(); - } - } - - return true; - } else { - throw new IllegalArgumentException("MergeMultiplePDFs: you cannot merge more than " + getMergeMultiplePdfs_MaxAtOnce() - + " PDF files at once. You are trying to merge " + documents.size() + " PDF files."); - } - } - - /** - * Overlay a generated PDF document with another PDF (containing the company stationary for - * example) - * - * @param context - * @param generatedDocumentMendixObject The document to overlay - * @param overlayMendixObject The document containing the overlay - * @param onTopOfContent if true, puts overlay position in the foreground, otherwise in the - * background - * @return boolean - * @throws IOException - */ - public static boolean overlayPdf(IContext context, IMendixObject generatedDocumentMendixObject, IMendixObject overlayMendixObject, boolean onTopOfContent) throws IOException { - Logging.trace(LOGNODE, "Retrieve generated document"); - try ( - PDDocument inputDoc = PDDocument.load(Core.getFileDocumentContent(context, generatedDocumentMendixObject)); - PDDocument overlayDoc = PDDocument.load(Core.getFileDocumentContent(context, overlayMendixObject)); - ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - Logging.trace(LOGNODE, "Overlay PDF start, retrieve overlay PDF"); - - Logging.trace(LOGNODE, "Perform overlay"); - try (Overlay overlay = new Overlay()) { - overlay.setInputPDF(inputDoc); - overlay.setDefaultOverlayPDF(overlayDoc); - if (onTopOfContent) { - overlay.setOverlayPosition(Overlay.Position.FOREGROUND); - } else { - overlay.setOverlayPosition(Overlay.Position.BACKGROUND); - } - - Logging.trace(LOGNODE, "Save result in output stream"); - - overlay.overlay(new HashMap<>()).save(baos); - } - - Logging.trace(LOGNODE, "Duplicate result in input stream"); - try (InputStream overlayedContent = new ByteArrayInputStream(baos.toByteArray())) { - Logging.trace(LOGNODE, "Store result in original document"); - Core.storeFileDocumentContent(context, generatedDocumentMendixObject, overlayedContent); - } - } - - Logging.trace(LOGNODE, "Overlay PDF end"); - return true; - } - - /** - * Get the Cloud Foundry Instance Index (0 for leader and >0 for slave) - * - * @return CF_INSTANCE_INDEX environment variable if available, otherwise -1 - */ - public static long getCFInstanceIndex() { - long cfInstanceIndex = -1L; - - try { - cfInstanceIndex = Long.parseLong(System.getenv("CF_INSTANCE_INDEX")); - } catch (SecurityException securityException) { - Logging.info(LOGNODE, "GetCFInstanceIndex: Could not access environment variable CF_INSTANCE_INDEX, permission denied. Value of -1 is returned."); - } catch (NumberFormatException numberFormatException) { - Logging.info(LOGNODE, "GetCFInstanceIndex: Could not parse value of environment variable CF_INSTANCE_INDEX as Long. Value of -1 is returned."); - } catch (NullPointerException nullPointerException) { - Logging.info(LOGNODE, "GetCFInstanceIndex: Could not find value for environment variable CF_INSTANCE_INDEX. This could indicate a local deployment is running. Value of -1 is returned."); - } - - return cfInstanceIndex; - } - - /** - * Returns the top n items of a List - * - * @param the type of the list elements - * @param objects the list to take the top n items from - * @param top the number of items to take - * @return the sublist of
objects
with max - *
top
elements - */ - public static List listTop(List objects, int top) { - return objects.stream() - .limit(top) - .collect(Collectors.toList()); - } -} diff --git a/javasource/communitycommons/ORM.java b/javasource/communitycommons/ORM.java deleted file mode 100644 index fb257fc..0000000 --- a/javasource/communitycommons/ORM.java +++ /dev/null @@ -1,380 +0,0 @@ -package communitycommons; - -import com.mendix.core.Core; -import com.mendix.core.CoreException; -import com.mendix.core.objectmanagement.member.MendixAutoNumber; -import com.mendix.core.objectmanagement.member.MendixDateTime; -import com.mendix.core.objectmanagement.member.MendixEnum; -import com.mendix.core.objectmanagement.member.MendixObjectReference; -import com.mendix.core.objectmanagement.member.MendixObjectReferenceSet; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixIdentifier; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.IMendixObject.ObjectState; -import com.mendix.systemwideinterfaces.core.IMendixObjectMember; -import com.mendix.systemwideinterfaces.core.meta.IMetaAssociation; -import com.mendix.systemwideinterfaces.core.meta.IMetaAssociation.AssociationType; -import com.mendix.systemwideinterfaces.core.meta.IMetaEnumValue; -import com.mendix.systemwideinterfaces.core.meta.IMetaEnumeration; -import com.mendix.systemwideinterfaces.core.meta.IMetaObject; -import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive; -import com.mendix.systemwideinterfaces.core.meta.IMetaPrimitive.PrimitiveType; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ORM { - - public static Long getGUID(IMendixObject item) { - return item.getId().toLong(); - } - - public static String getOriginalValueAsString(IContext context, IMendixObject item, - String member) { - return String.valueOf(item.getMember(member).getOriginalValue(context)); - } - - public static boolean objectHasChanged(IMendixObject anyobject) { - if (anyobject == null) { - throw new IllegalArgumentException("The provided object is empty"); - } - return anyobject.isChanged(); - } - - /** Returns true if any member has a value other than its original value. */ - public static boolean objectHasChangedMemberValue(IContext context, IMendixObject object) { - if (object == null) throw new IllegalArgumentException("The provided object is empty"); - return object.hasChangedMemberValue(context); - } - - /** - * checks whether a certain member of an object has changed. If the objects itself is still new, - * we consider to be changes as well. - * - * @param item - * @param member - * @param context - * @return - */ - public static boolean memberHasChanged(IContext context, IMendixObject item, String member) { - if (item == null) { - throw new IllegalArgumentException("The provided object is empty"); - } - if (!item.hasMember(member)) { - throw new IllegalArgumentException("Unknown member: " + member); - } - return item.getMember(member).isChanged() || item.getState() != ObjectState.NORMAL; - } - - /** Check if the value of the member was changed to something other than its original value. */ - public static boolean memberHasChangedValue(IContext context, IMendixObject item, String member) { - if (item == null) throw new IllegalArgumentException("The provided object is empty"); - if (!item.hasMember(member)) throw new IllegalArgumentException("Unknown member: " + member); - return item.getMember(member).isValueChanged(context); - } - - public static void deepClone(IContext c, IMendixObject source, IMendixObject target, String membersToSkip, String membersToKeep, String reverseAssociations, String excludeEntities, String excludeModules) throws CoreException { - List toskip = Arrays.asList((membersToSkip + ",createdDate,changedDate").split(",")); - List tokeep = Arrays.asList((membersToKeep + ",System.owner,System.changedBy").split(",")); - List revAssoc = Arrays.asList(reverseAssociations.split(",")); - List skipEntities = Arrays.asList(excludeEntities.split(",")); - List skipModules = Arrays.asList(excludeModules.split(",")); - Map mappedIDs = new HashMap(); - duplicate(c, source, target, toskip, tokeep, revAssoc, skipEntities, skipModules, mappedIDs); - } - - private static void duplicate(IContext ctx, IMendixObject src, IMendixObject tar, - List toskip, List tokeep, List revAssoc, - List skipEntities, List skipModules, - Map mappedObjects) throws CoreException { - mappedObjects.put(src.getId(), tar.getId()); - - Map> members = src.getMembers(ctx); - String type = src.getType() + "/"; - - for (var entry : members.entrySet()) { - String key = entry.getKey(); - if (!toskip.contains(key) && !toskip.contains(type + key)) { - IMendixObjectMember m = entry.getValue(); - if (m.isVirtual() || m instanceof MendixAutoNumber) { - continue; - } - - boolean keep = tokeep.contains(key) || tokeep.contains(type + key); - - if (m instanceof MendixObjectReference && !keep && m.getValue(ctx) != null) { - IMendixObject o = Core.retrieveId(ctx, ((MendixObjectReference) m).getValue(ctx)); - IMendixIdentifier refObj = getCloneOfObject(ctx, o, toskip, tokeep, revAssoc, skipEntities, skipModules, mappedObjects); - tar.setValue(ctx, key, refObj); - } else if (m instanceof MendixObjectReferenceSet && !keep && m.getValue(ctx) != null) { - MendixObjectReferenceSet rs = (MendixObjectReferenceSet) m; - List res = new ArrayList(); - for (IMendixIdentifier item : rs.getValue(ctx)) { - IMendixObject o = Core.retrieveId(ctx, item); - IMendixIdentifier refObj = getCloneOfObject(ctx, o, toskip, tokeep, revAssoc, skipEntities, skipModules, mappedObjects); - res.add(refObj); - } - tar.setValue(ctx, key, res); - } else if (m instanceof MendixAutoNumber) //skip autonumbers! Ticket 14893 - { - // do nothing - } else if ("__UUID__".equals(key) && (isFileDocument(src) || isFileDocument(tar))) { - // do nothing - } else { - tar.setValue(ctx, key, m.getValue(ctx)); - } - } - } - Core.commitWithoutEvents(ctx, tar); - duplicateReverseAssociations(ctx, src, tar, toskip, tokeep, revAssoc, skipEntities, skipModules, mappedObjects); - } - - private static IMendixIdentifier getCloneOfObject(IContext ctx, IMendixObject src, - List toskip, List tokeep, List revAssoc, - List skipEntities, List skipModules, - Map mappedObjects) throws CoreException { - String objType = src.getMetaObject().getName(); - String modName = src.getMetaObject().getModuleName(); - - // if object is already being cloned, return ref to clone - if (mappedObjects.containsKey(src.getId())) { - return mappedObjects.get(src.getId()); - // if object should be skipped based on module or entity, return source object - } else if (skipEntities.contains(objType) || skipModules.contains(modName)) { - return src.getId(); - // if not already being cloned, create clone - } else { - IMendixObject clone = Core.instantiate(ctx, src.getType()); - duplicate(ctx, src, clone, toskip, tokeep, revAssoc, skipEntities, skipModules, mappedObjects); - return clone.getId(); - } - } - - private static void duplicateReverseAssociations(IContext ctx, IMendixObject src, IMendixObject tar, - List toskip, List tokeep, List revAssocs, - List skipEntities, List skipModules, - Map mappedObjects) throws CoreException { - for (String fullAssocName : revAssocs) { - String[] parts = fullAssocName.split("/"); - - if (parts.length != 1 && parts.length != 3) //specifying entity has no meaning anymore, but remain backward compatible. - { - throw new IllegalArgumentException("Reverse association is not defined correctly, please mention the relation name only: '" + fullAssocName + "'"); - } - - String assocname = parts.length == 3 ? parts[1] : parts[0]; //support length 3 for backward compatibility - - IMetaAssociation massoc = src.getMetaObject().getDeclaredMetaAssociationChild(assocname); - - if (massoc != null) { - IMetaObject relationParent = massoc.getParent(); - // if the parent is in the exclude list, we can't clone the parent, and setting the - // references to the newly cloned target object will screw up the source data. - if (skipEntities.contains(relationParent.getName()) || skipModules.contains(relationParent.getModuleName())) { - throw new IllegalArgumentException("A reverse reference has been specified that starts at an entity in the exclude list, this is not possible to clone: '" + fullAssocName + "'"); - } - - //MWE: what to do with reverse reference sets? -> to avoid spam creating objects on - //reverse references, do not support referenceset (todo: we could keep a map of converted guids and reuse that!) - if (massoc.getType() == AssociationType.REFERENCESET) { - throw new IllegalArgumentException("It is not possible to clone reverse referencesets: '" + fullAssocName + "'"); - } - - List objs = Core.createXPathQuery(String.format("//%s[%s=$value]", relationParent.getName(), assocname)) - .setVariable("value", src) - .execute(ctx); - - for (IMendixObject obj : objs) { - @SuppressWarnings("unused") // object is unused on purpose - IMendixIdentifier refObj = getCloneOfObject(ctx, obj, toskip, tokeep, revAssocs, skipEntities, skipModules, mappedObjects); - // setting reference explicitly is not necessary, this has been done in the - // duplicate() call. - } - } - } - } - - public static Boolean commitWithoutEvents(IContext context, IMendixObject subject) throws CoreException { - Core.commitWithoutEvents(context, subject); - return true; - } - - public static String getValueOfPath(IContext context, IMendixObject substitute, String fullpath, String datetimeformat) throws Exception { - String[] path = fullpath.split("/"); - if (path.length == 1) { - IMendixObjectMember member = substitute.getMember(path[0]); - - //special case, see ticket 9135, format datetime. - if (member instanceof MendixDateTime) { - Date time = ((MendixDateTime) member).getValue(context); - if (time == null) { - return ""; - } - String f = datetimeformat != null && !datetimeformat.isEmpty() ? datetimeformat : "EEE dd MMM yyyy, HH:mm"; - return new SimpleDateFormat(f).format(time); - } - - if (member instanceof MendixEnum) { - String value = member.parseValueToString(context); - if (value == null || value.isEmpty()) { - return ""; - } - - IMetaEnumeration enumeration = ((MendixEnum) member).getEnumeration(); - IMetaEnumValue evalue = enumeration.getEnumValues().get(value); - return Core.getInternationalizedString(context, evalue.getI18NCaptionKey()); - } - //default - return member.parseValueToString(context); - } else if (path.length == 0) { - throw new Exception("communitycommons.ORM.getValueOfPath: Unexpected end of path."); - } else { - IMendixObjectMember member = substitute.getMember(path[0]); - if (member instanceof MendixObjectReference) { - MendixObjectReference ref = (MendixObjectReference) member; - IMendixIdentifier id = ref.getValue(context); - if (id == null) { - return ""; - } - IMendixObject obj = Core.retrieveId(context, id); - if (obj == null) { - return ""; - } - return getValueOfPath(context, obj, fullpath.substring(fullpath.indexOf("/") + 1), datetimeformat); - } else if (member instanceof MendixObjectReferenceSet) { - MendixObjectReferenceSet ref = (MendixObjectReferenceSet) member; - List ids = ref.getValue(context); - if (ids == null) { - return ""; - } - StringBuilder res = new StringBuilder(); - for (IMendixIdentifier id : ids) { - if (id == null) { - continue; - } - IMendixObject obj = Core.retrieveId(context, id); - if (obj == null) { - continue; - } - res.append(", "); - res.append(getValueOfPath(context, obj, fullpath.substring(fullpath.indexOf("/") + 1), datetimeformat)); - } - return res.length() > 1 ? res.toString().substring(2) : ""; - } else { - throw new Exception("communitycommons.ORM.getValueOfPath: Not a valid reference: '" + path[0] + "' in '" + fullpath + "'"); - } - } - } - - private static boolean isFileDocument(IMendixObject object) { - return object.getMetaObject().isFileDocument(); - } - - public static Boolean cloneObject(IContext c, IMendixObject source, - IMendixObject target, Boolean withAssociations) { - return cloneObject(c, source, target, withAssociations, false); - } - - public static Boolean cloneObject(IContext c, IMendixObject source, - IMendixObject target, Boolean withAssociations, Boolean skipIsBoth) { - Map> members = source.getMembers(c); - - for (var entry : members.entrySet()) { - IMendixObjectMember m = entry.getValue(); - if (m.isVirtual()) { - continue; - } - if (m instanceof MendixAutoNumber) { - continue; - } - if ("__UUID__".equals(m.getName()) && (isFileDocument(source) || isFileDocument(target))) { - continue; - } - if (withAssociations || ((!(m instanceof MendixObjectReference) && !(m instanceof MendixObjectReferenceSet) && !(m instanceof MendixAutoNumber)))) { - if (skipIsBoth && ( - (m instanceof MendixObjectReference && ((MendixObjectReference) m).isBoth()) || - (m instanceof MendixObjectReferenceSet && ((MendixObjectReferenceSet) m).isBoth()))) - continue; - target.setValue(c, entry.getKey(), m.getValue(c)); - } - } - return true; - } - - public static IMendixObject firstWhere(IContext c, String entityName, - Object member, String value) throws CoreException { - List items = - Core.createXPathQuery(String.format("//%s[%s = '%s']", entityName, member, value)) - .setAmount(1) - .setOffset(0) - .execute(c); - - if (items == null || items.size() == 0) { - return null; - } - return items.get(0); - } - - public static IMendixObject getLastChangedByUser(IContext context, - IMendixObject thing) throws CoreException { - if (thing == null || !thing.hasChangedByAttribute()) { - return null; - } - - IMendixIdentifier itemId = thing.getChangedBy(context); - if (itemId == null) { - return null; - } - - return Core.retrieveId(context, itemId); - } - - public static IMendixObject getCreatedByUser(IContext context, - IMendixObject thing) throws CoreException { - if (thing == null || !thing.hasOwnerAttribute()) { - return null; - } - - IMendixIdentifier itemId = thing.getOwner(context); - if (itemId == null) { - return null; - } - - return Core.retrieveId(context, itemId); - } - - public static void commitSilent(IContext c, IMendixObject mendixObject) { - try { - Core.commit(c, mendixObject); - } catch (CoreException e) { - throw new RuntimeException(e); - } - } - - public static void copyAttributes(IContext context, IMendixObject source, IMendixObject target) { - if (source == null) { - throw new IllegalStateException("source is null"); - } - if (target == null) { - throw new IllegalStateException("target is null"); - } - - for (IMetaPrimitive e : target.getMetaObject().getMetaPrimitives()) { - if (!source.hasMember(e.getName())) { - continue; - } - if (e.isVirtual() || e.getType() == PrimitiveType.AutoNumber) { - continue; - } - if ("__UUID__".equals(e.getName()) && (isFileDocument(source) || isFileDocument(target))) { - continue; - } - - target.setValue(context, e.getName(), source.getValue(context, e.getName())); - } - } -} diff --git a/javasource/communitycommons/StringUtils.java b/javasource/communitycommons/StringUtils.java deleted file mode 100644 index b61b7b9..0000000 --- a/javasource/communitycommons/StringUtils.java +++ /dev/null @@ -1,514 +0,0 @@ -package communitycommons; - -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.proxies.SanitizerPolicy; - -import static communitycommons.proxies.SanitizerPolicy.BLOCKS; -import static communitycommons.proxies.SanitizerPolicy.FORMATTING; -import static communitycommons.proxies.SanitizerPolicy.IMAGES; -import static communitycommons.proxies.SanitizerPolicy.LINKS; -import static communitycommons.proxies.SanitizerPolicy.STYLES; -import static communitycommons.proxies.SanitizerPolicy.TABLES; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.security.*; -import java.text.Normalizer; -import java.util.*; -import java.util.AbstractMap.SimpleEntry; -import java.util.function.Function; -import java.util.regex.MatchResult; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import javax.swing.text.MutableAttributeSet; -import javax.swing.text.html.HTML; -import javax.swing.text.html.HTMLEditorKit; -import javax.swing.text.html.parser.ParserDelegator; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.input.BOMInputStream; -import org.apache.commons.text.StringEscapeUtils; -import org.owasp.html.PolicyFactory; -import org.owasp.html.Sanitizers; -import system.proxies.FileDocument; - -public class StringUtils { - - private static final Random RANDOM = new SecureRandom(); - - private static final String UPPERCASE_ALPHA = stringRange('A', 'Z'); - private static final String LOWERCASE_ALPHA = stringRange('a', 'z'); - private static final String DIGITS = stringRange('0', '9'); - // Used in tests as well - static final String SPECIAL = stringRange('!', '/'); - private static final String ALPHANUMERIC = UPPERCASE_ALPHA + LOWERCASE_ALPHA + DIGITS; - - static final Map SANITIZER_POLICIES = - Map.ofEntries( - new SimpleEntry<>(BLOCKS.name(), Sanitizers.BLOCKS), - new SimpleEntry<>(FORMATTING.name(), Sanitizers.FORMATTING), - new SimpleEntry<>(IMAGES.name(), Sanitizers.IMAGES), - new SimpleEntry<>(LINKS.name(), Sanitizers.LINKS), - new SimpleEntry<>(STYLES.name(), Sanitizers.STYLES), - new SimpleEntry<>(TABLES.name(), Sanitizers.TABLES) - ); - - public static final String HASH_ALGORITHM = "SHA-256"; - - public static String hash(String value) throws NoSuchAlgorithmException, DigestException { - int LENGTH = 32; - return hash(value, LENGTH); - } - - @Deprecated - public static String hash(String value, int length) throws NoSuchAlgorithmException, DigestException { - byte[] inBytes = value.getBytes(StandardCharsets.UTF_8); - byte[] outBytes = new byte[length]; - - MessageDigest alg = MessageDigest.getInstance(HASH_ALGORITHM); - alg.update(inBytes); - - alg.digest(outBytes, 0, length); - - StringBuilder hexString = new StringBuilder(); - for (int i = 0; i < outBytes.length; i++) { - String hex = Integer.toHexString(0xff & outBytes[i]); - if (hex.length() == 1) { - hexString.append('0'); - } - hexString.append(hex); - } - - return hexString.toString(); - } - - /** - * The default replaceAll microflow function doesn't support capture variables such as $1, $2 - * etc. so for that reason we do not deprecate this method. - * - * @param haystack The string to replace patterns in - * @param needleRegex The regular expression pattern - * @param replacement The string that should come in place of the pattern matches. - * @return The resulting string, where all matches have been replaced by the replacement. - */ - public static String regexReplaceAll(String haystack, String needleRegex, - String replacement) { - Pattern pattern = Pattern.compile(needleRegex); - Matcher matcher = pattern.matcher(haystack); - return matcher.replaceAll(replacement); - } - - public static String leftPad(String value, Long amount, String fillCharacter) { - if (fillCharacter == null || fillCharacter.length() == 0) { - return org.apache.commons.lang3.StringUtils.leftPad(value, amount.intValue(), " "); - } - return org.apache.commons.lang3.StringUtils.leftPad(value, amount.intValue(), fillCharacter); - } - - public static String rightPad(String value, Long amount, String fillCharacter) { - if (fillCharacter == null || fillCharacter.length() == 0) { - return org.apache.commons.lang3.StringUtils.rightPad(value, amount.intValue(), " "); - } - return org.apache.commons.lang3.StringUtils.rightPad(value, amount.intValue(), fillCharacter); - } - - public static String randomString(int length) { - return randomStringFromCharArray(length, ALPHANUMERIC.toCharArray()); - } - - public static String substituteTemplate(final IContext context, String template, - final IMendixObject substitute, final boolean HTMLEncode, final String datetimeformat) { - return regexReplaceAll(template, "\\{(@)?([\\w./]+)\\}", (MatchResult match) -> { - String value; - String path = match.group(2); - if (match.group(1) != null) { - value = String.valueOf(Core.getConfiguration().getConstantValue(path)); - } else { - try { - value = ORM.getValueOfPath(context, substitute, path, datetimeformat); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - return HTMLEncode ? HTMLEncode(value) : value; - }); - } - - public static String regexReplaceAll(String source, String regexString, Function replaceFunction) { - if (source == null || source.trim().isEmpty()) // avoid NPE's, save CPU - { - return ""; - } - - StringBuffer resultString = new StringBuffer(); - Pattern regex = Pattern.compile(regexString); - Matcher regexMatcher = regex.matcher(source); - - while (regexMatcher.find()) { - MatchResult match = regexMatcher.toMatchResult(); - String value = replaceFunction.apply(match); - regexMatcher.appendReplacement(resultString, Matcher.quoteReplacement(value)); - } - regexMatcher.appendTail(resultString); - - return resultString.toString(); - } - - public static String HTMLEncode(String value) { - return StringEscapeUtils.escapeHtml4(value); - } - - public static String randomHash() { - return UUID.randomUUID().toString(); - } - - public static String base64Decode(String encoded) { - if (encoded == null) { - return null; - } - return new String(Base64.getDecoder().decode(encoded.getBytes())); - } - - public static void base64DecodeToFile(IContext context, String encoded, FileDocument targetFile) throws Exception { - if (targetFile == null) { - throw new IllegalArgumentException("Source file is null"); - } - if (encoded == null) { - throw new IllegalArgumentException("Source data is null"); - } - - byte[] decoded = Base64.getDecoder().decode(encoded.getBytes()); - - try (ByteArrayInputStream bais = new ByteArrayInputStream(decoded)) { - Core.storeFileDocumentContent(context, targetFile.getMendixObject(), bais); - } - } - - public static String base64Encode(String value) { - if (value == null) { - return null; - } - return Base64.getEncoder().encodeToString(value.getBytes()); - } - - public static String base64EncodeFile(IContext context, FileDocument file) throws IOException { - if (file == null) { - throw new IllegalArgumentException("Source file is null"); - } - if (!file.getHasContents()) { - throw new IllegalArgumentException("Source file has no contents!"); - } - - try (InputStream f = Core.getFileDocumentContent(context, file.getMendixObject())) { - return Base64.getEncoder().encodeToString(IOUtils.toByteArray(f)); - } - } - - public static String stringFromFile(IContext context, FileDocument source) throws IOException { - return stringFromFile(context, source, StandardCharsets.UTF_8); - } - - public static String stringFromFile(IContext context, FileDocument source, Charset charset) throws IOException { - if (source == null) { - return null; - } - try (InputStream f = Core.getFileDocumentContent(context, source.getMendixObject())) { - return stringFromInputStream(f, charset); - } - } - - public static String stringFromInputStream(InputStream inputStream, Charset charset) throws IOException { - return IOUtils.toString(BOMInputStream.builder().setInputStream(inputStream).get(), charset); - } - - public static void stringToFile(IContext context, String value, FileDocument destination) throws IOException { - stringToFile(context, value, destination, StandardCharsets.UTF_8); - } - - public static void stringToFile(IContext context, String value, FileDocument destination, Charset charset) throws IOException { - if (destination == null) { - throw new IllegalArgumentException("Destination file is null"); - } - if (value == null) { - throw new IllegalArgumentException("Value to write is null"); - } - - try (InputStream is = IOUtils.toInputStream(value, charset)) { - Core.storeFileDocumentContent(context, destination.getMendixObject(), is); - } - } - - public static String HTMLToPlainText(String html) throws IOException { - if (html == null) { - return ""; - } - final StringBuilder result = new StringBuilder(); - - HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() { - @Override - public void handleText(char[] data, int pos) { - result.append(data); // TODO: needs to be html entity decode? - } - - @Override - public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet a, int pos) { - if (tag.breaksFlow()) { - result.append("\r\n"); - } - } - - @Override - public void handleEndTag(HTML.Tag tag, int pos) { - if (tag.breaksFlow() && tag != HTML.Tag.HTML && tag != HTML.Tag.HEAD && tag != HTML.Tag.BODY) { - result.append("\r\n"); - } - } - }; - - new ParserDelegator().parse(new StringReader(html), callback, true); - - return result.toString(); - } - - /** - * Returns a random strong password containing a specified minimum number of uppercase, digits - * and the exact number of special characters. - * - * @param minLen Minimum length - * @param maxLen Maximum length - * @param noOfCAPSAlpha Minimum number of capitals - * @param noOfDigits Minimum number of digits - * @param noOfSplChars Exact number of special characters - * @deprecated Use the overload randomStrongPassword instead - */ - @Deprecated - public static String randomStrongPassword(int minLen, int maxLen, int noOfCAPSAlpha, int noOfDigits, int noOfSplChars) { - if (minLen > maxLen) { - throw new IllegalArgumentException("Min. Length > Max. Length!"); - } - if ((noOfCAPSAlpha + noOfDigits + noOfSplChars) > minLen) { - throw new IllegalArgumentException("Min. Length should be atleast sum of (CAPS, DIGITS, SPL CHARS) Length!"); - } - return generateCommonLangPassword(minLen, maxLen, noOfCAPSAlpha, 0, noOfDigits, noOfSplChars); - } - - /** - * Returns a random strong password containing a specified minimum number of uppercase, lowercase, digits - * and the exact number of special characters. - * - * @param minLen Minimum length - * @param maxLen Maximum length - * @param noOfCAPSAlpha Minimum number of capitals - * @param noOfLowercaseAlpha Minimum number of lowercase letters - * @param noOfDigits Minimum number of digits - * @param noOfSplChars Exact number of special characters - */ - public static String randomStrongPassword(int minLen, int maxLen, int noOfCAPSAlpha, int noOfLowercaseAlpha, int noOfDigits, int noOfSplChars) { - if (minLen > maxLen) { - throw new IllegalArgumentException("Min. Length > Max. Length!"); - } - if ((noOfCAPSAlpha + noOfLowercaseAlpha + noOfDigits + noOfSplChars) > minLen) { - throw new IllegalArgumentException("Min. Length should be atleast sum of (CAPS, LOWER, DIGITS, SPL CHARS) Length!"); - } - return generateCommonLangPassword(minLen, maxLen, noOfCAPSAlpha, noOfLowercaseAlpha, noOfDigits, noOfSplChars); - } - - // See https://www.baeldung.com/java-generate-secure-password - // Implementation inspired by https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-string-apis (under MIT license) - private static String generateCommonLangPassword(int minLen, int maxLen, int noOfCapsAlpha, int noOfLowercaseAlpha, int noOfDigits, int noOfSplChars) { - String upperCaseLetters = randomStringFromCharArray(noOfCapsAlpha, UPPERCASE_ALPHA.toCharArray()); - String lowerCaseLetters = randomStringFromCharArray(noOfLowercaseAlpha, LOWERCASE_ALPHA.toCharArray()); - String numbers = randomStringFromCharArray(noOfDigits, DIGITS.toCharArray()); - String specialChar = randomStringFromCharArray(noOfSplChars, SPECIAL.toCharArray()); - - final int fixedNumber = noOfCapsAlpha + noOfLowercaseAlpha + noOfDigits + noOfSplChars; - final int lowerBound = minLen - fixedNumber; - final int upperBound = maxLen - fixedNumber; - String totalChars = randomStringFromCharArray(lowerBound, upperBound, ALPHANUMERIC.toCharArray()); - - String combinedChars = upperCaseLetters - .concat(lowerCaseLetters) - .concat(numbers) - .concat(specialChar) - .concat(totalChars); - List pwdChars = combinedChars.chars() - .mapToObj(c -> (char) c) - .collect(Collectors.toList()); - Collections.shuffle(pwdChars); - String password = pwdChars.stream() - .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) - .toString(); - return password; - } - - /** - * Generate a secure random string using the given array of characters, of which the resulting - * string will be composed of. - * - * @param count The length of the random string. - * @param allowedChars The characters used for constructing the random string. - * @return A random string. - * @throws IllegalArgumentException if count is negative or allowedChars is null or empty. - */ - private static String randomStringFromCharArray(int count, final char[] allowedChars) { - if (count == 0) - return ""; - if (count < 0) - throw new IllegalArgumentException("The requested length for the random string was negative: " + count); - if (allowedChars == null) - throw new IllegalArgumentException("The char array 'allowedChars' cannot be null."); - if (allowedChars.length == 0) - throw new IllegalArgumentException("The char array 'allowedChars' cannot be empty."); - - StringBuilder builder = new StringBuilder(); - - while (count-- > 0) { - int index = RANDOM.nextInt(allowedChars.length); - builder.append(allowedChars[index]); - } - - return builder.toString(); - } - - /** - * Generate a random string with a random length between minLengthBound and maxLengthBound (inclusive), - * using the given set of allowed characters. - * - * @param minLengthBound The lower bound for the random length of the string. - * @param maxLengthBound The upper bound for the random length of the string. - * @param allowedChars An array of characters of which the resulting string will be made up of. - * @return A random string with a length between minLengthBound and maxLengthBound. - * @throws IllegalArgumentException if minLengthBound is larger than maxLengthBound. - */ - private static String randomStringFromCharArray(int minLengthBound, int maxLengthBound, final char[] allowedChars) { - if (minLengthBound == maxLengthBound) - return randomStringFromCharArray(minLengthBound, allowedChars); - if (minLengthBound > maxLengthBound) - throw new IllegalArgumentException("The minimum bound (" + minLengthBound + ") was larger than the maximum bound (" + maxLengthBound + "."); - final int randomLength = minLengthBound + RANDOM.nextInt(maxLengthBound - minLengthBound + 1); // add one to make the range inclusive. - return randomStringFromCharArray(randomLength, allowedChars); - } - - /** - * Produces a 'range' string starting from the begin character up to - * the end character (inclusive range). For example, for the range (a-z), - * this method will generate the lowercase alphabet. - * - * @param begin The starting point of the string. - * @param end The ending point of the string. - * @return A string from begin to end (inclusive range). - * @throws IllegalArgumentException if the begin character has a higher code point than the end character. - */ - private static String stringRange(char begin, char end) { - if (begin > end) { - throw new IllegalArgumentException("The 'begin' character cannot be larger than the 'end' character."); - } - - StringBuilder builder = new StringBuilder(); - while (begin <= end) - builder.append(begin++); - return builder.toString(); - } - - private static byte[] generateHmacSha256Bytes(String key, String valueToEncrypt) throws UnsupportedEncodingException, IllegalStateException, InvalidKeyException, NoSuchAlgorithmException { - SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); - Mac mac = Mac.getInstance("HmacSHA256"); - mac.init(secretKey); - mac.update(valueToEncrypt.getBytes("UTF-8")); - byte[] hmacData = mac.doFinal(); - - return hmacData; - } - - public static String generateHmacSha256(String key, String valueToEncrypt) { - try { - byte[] hash = generateHmacSha256Bytes(key, valueToEncrypt); - StringBuilder result = new StringBuilder(); - for (byte b : hash) { - result.append(String.format("%02x", b)); - } - return result.toString(); - } catch (UnsupportedEncodingException | IllegalStateException | InvalidKeyException | NoSuchAlgorithmException e) { - throw new RuntimeException("CommunityCommons::generateHmacSha256::Unable to encode: " + e.getMessage(), e); - } - } - - public static String generateHmacSha256Hash(String key, String valueToEncrypt) { - try { - return Base64.getEncoder().encodeToString(generateHmacSha256Bytes(key, valueToEncrypt)); - } catch (UnsupportedEncodingException | IllegalStateException | InvalidKeyException | NoSuchAlgorithmException e) { - throw new RuntimeException("CommunityCommons::generateHmacSha256Hash::Unable to encode: " + e.getMessage(), e); - } - } - - public static String escapeHTML(String input) { - return input.replace("&", "&") - .replace("<", "<") - .replace(">", ">") - .replace("\"", """) - .replace("'", "'");// notice this one: for xml "'" would be "'" (http://blogs.msdn.com/b/kirillosenkov/archive/2010/03/19/apos-is-in-xml-in-html-use-39.aspx) - // OWASP also advises to escape "/" but give no convincing reason why: https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet - } - - public static String regexQuote(String unquotedLiteral) { - return Pattern.quote(unquotedLiteral); - } - - public static String substringBefore(String str, String separator) { - return org.apache.commons.lang3.StringUtils.substringBefore(str, separator); - } - - public static String substringBeforeLast(String str, String separator) { - return org.apache.commons.lang3.StringUtils.substringBeforeLast(str, separator); - } - - public static String substringAfter(String str, String separator) { - return org.apache.commons.lang3.StringUtils.substringAfter(str, separator); - } - - public static String substringAfterLast(String str, String separator) { - return org.apache.commons.lang3.StringUtils.substringAfterLast(str, separator); - } - - public static String removeEnd(String str, String toRemove) { - return org.apache.commons.lang3.StringUtils.removeEnd(str, toRemove); - } - - public static String sanitizeHTML(String html, List policyParams) { - PolicyFactory policyFactory = null; - - for (SanitizerPolicy param : policyParams) { - PolicyFactory policyFactoryForParam = SANITIZER_POLICIES.get(param.name()); - policyFactory = (policyFactory == null) ? policyFactoryForParam : policyFactory.and(policyFactoryForParam); - } - - if (policyFactory == null) { - throw new IllegalArgumentException("Sanitizer policy not found."); - } - - return sanitizeHTML(html, policyFactory); - } - - public static String sanitizeHTML(String html, PolicyFactory policyFactory) { - return policyFactory.sanitize(html); - } - - public static String stringSimplify(String value) { - String normalized = Normalizer.normalize(value, Normalizer.Form.NFD); - return normalized.replaceAll("\\p{M}", ""); // removes all characters in Unicode Mark category - } - - public static Boolean isStringSimplified(String value) { - return Normalizer.isNormalized(value, Normalizer.Form.NFD); - } -} diff --git a/javasource/communitycommons/UserThrownException.java b/javasource/communitycommons/UserThrownException.java deleted file mode 100644 index 5c67787..0000000 --- a/javasource/communitycommons/UserThrownException.java +++ /dev/null @@ -1,15 +0,0 @@ -package communitycommons; - -public class UserThrownException extends Exception -{ - /** - * - */ - private static final long serialVersionUID = -55911261625752858L; - - public UserThrownException(String arg0) - { - super(arg0); - } - -} diff --git a/javasource/communitycommons/XPath.java b/javasource/communitycommons/XPath.java deleted file mode 100644 index a10fb83..0000000 --- a/javasource/communitycommons/XPath.java +++ /dev/null @@ -1,893 +0,0 @@ -package communitycommons; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.text.translate.AggregateTranslator; -import org.apache.commons.text.translate.CharSequenceTranslator; -import org.apache.commons.text.translate.EntityArrays; -import org.apache.commons.text.translate.LookupTranslator; - -import com.mendix.core.Core; -import com.mendix.core.CoreException; -import com.mendix.datastorage.XPathQuery; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixIdentifier; -import com.mendix.systemwideinterfaces.core.IMendixObject; - -public class XPath { - /** - * Built-in tokens, see: - * https://docs.mendix.com/refguide/xpath-keywords-and-system-variables/ - */ - - /* Keywords */ - public static final String ID = "id"; - public static final String NULL = "NULL"; - public static final String Empty = "empty"; - - /* Object related */ - public static final String CurrentUser = "[%CurrentUser%]"; - public static final String CurrentObject = "[%CurrentObject%]"; - - /* Time related */ - public static final String CurrentDateTime = "[%CurrentDateTime%]"; - public static final String BeginOfCurrentMinute = "[%BeginOfCurrentMinute%]"; - public static final String BeginOfCurrentMinuteUTC = "[%BeginOfCurrentMinuteUTC%]"; - public static final String EndOfCurrentMinute = "[%EndOfCurrentMinute%]"; - public static final String EndOfCurrentMinuteUTC = "[%EndOfCurrentMinuteUTC%]"; - public static final String BeginOfCurrentHour = "[%BeginOfCurrentHour%]"; - public static final String BeginOfCurrentHourUTC = "[%BeginOfCurrentHourUTC%]"; - public static final String EndOfCurrentHour = "[%EndOfCurrentHour%]"; - public static final String EndOfCurrentHourUTC = "[%EndOfCurrentHourUTC%]"; - public static final String BeginOfCurrentDay = "[%BeginOfCurrentDay%]"; - public static final String BeginOfCurrentDayUTC = "[%BeginOfCurrentDayUTC%]"; - public static final String EndOfCurrentDay = "[%EndOfCurrentDay%]"; - public static final String EndOfCurrentDayUTC = "[%EndOfCurrentDayUTC%]"; - public static final String BeginOfYesterday = "[%BeginOfYesterday%]"; - public static final String BeginOfYesterdayUTC = "[%BeginOfYesterdayUTC%]"; - public static final String EndOfYesterday = "[%EndOfYesterday%]"; - public static final String EndOfYesterdayUTC = "[%EndOfYesterdayUTC%]"; - public static final String BeginOfTomorrow = "[%BeginOfTomorrow%]"; - public static final String BeginOfTomorrowUTC = "[%BeginOfTomorrowUTC%]"; - public static final String EndOfTomorrow = "[%EndOfTomorrow%]"; - public static final String EndOfTomorrowUTC = "[%EndOfTomorrowUTC%]"; - public static final String BeginOfCurrentWeek = "[%BeginOfCurrentWeek%]"; - public static final String BeginOfCurrentWeekUTC = "[%BeginOfCurrentWeekUTC%]"; - public static final String EndOfCurrentWeek = "[%EndOfCurrentWeek%]"; - public static final String EndOfCurrentWeekUTC = "[%EndOfCurrentWeekUTC%]"; - public static final String BeginOfCurrentMonth = "[%BeginOfCurrentMonth%]"; - public static final String BeginOfCurrentMonthUTC = "[%BeginOfCurrentMonthUTC%]"; - public static final String EndOfCurrentMonth = "[%EndOfCurrentMonth%]"; - public static final String EndOfCurrentMonthUTC = "[%EndOfCurrentMonthUTC%]"; - public static final String BeginOfCurrentYear = "[%BeginOfCurrentYear%]"; - public static final String BeginOfCurrentYearUTC = "[%BeginOfCurrentYearUTC%]"; - public static final String EndOfCurrentYear = "[%EndOfCurrentYear%]"; - public static final String EndOfCurrentYearUTC = "[%EndOfCurrentYearUTC%]"; - - public static final String DayLength = "[%DayLength%]"; - public static final String HourLength = "[%HourLength%]"; - public static final String MinuteLength = "[%MinuteLength%]"; - public static final String SecondLength = "[%SecondLength%]"; - public static final String WeekLength = "[%WeekLength%]"; - public static final String MonthLength = "[%MonthLength%]"; - public static final String YearLength = "[%YearLength%]"; - - private String entity; - private int offset = 0; - private int limit = -1; - // important, linked map, insertion order is relevant! - private LinkedHashMap sorting = new LinkedHashMap(); - private LinkedList closeStack = new LinkedList(); - private StringBuilder builder = new StringBuilder(); - private IContext context; - private Class proxyClass; - // state property, indicates whether 'and' needs to be inserted before the next - // constraint - private boolean requiresBinOp = false; - - public static XPath create(IContext c, String entityType) { - XPath res = new XPath(c, IMendixObject.class); - res.entity = entityType; - return res; - } - - public static XPath create(IContext c, Class proxyClass) { - return new XPath(c, proxyClass); - } - - private XPath(IContext c, Class proxyClass) { - try { - if (proxyClass != IMendixObject.class) - entity = (String) proxyClass.getMethod("getType").invoke(null); - } catch (Exception e) { - throw new IllegalArgumentException( - "Failed to determine entity type of proxy class. Did you provide a valid proxy class? '" - + proxyClass.getName() + "'"); - } - - this.proxyClass = proxyClass; - this.context = c; - } - - private XPath autoInsertAnd() { - if (requiresBinOp) - and(); - return this; - } - - private XPath requireBinOp(boolean requires) { - requiresBinOp = requires; - return this; - } - - public XPath offset(int offset) { - if (offset < 0) - throw new IllegalArgumentException("Offset should not be negative"); - - this.offset = offset; - return this; - } - - public XPath limit(int limit) { - if (limit < -1 || limit == 0) - throw new IllegalArgumentException("Limit should be larger than zero or -1. "); - - this.limit = limit; - return this; - } - - public XPath addSortingAsc(Object... sortparts) { - assertOdd(sortparts); - sorting.put(StringUtils.join(sortparts, '/'), "asc"); - return this; - } - - public XPath addSortingDesc(Object... sortparts) { - sorting.put(StringUtils.join(sortparts, "/"), "desc"); - return this; - } - - public XPath eq(Object attr, Object valuecomparison) { - return compare(attr, "=", valuecomparison); - } - - public XPath eq(Object... pathAndValue) { - return compare("=", pathAndValue); - } - - public XPath equalsIgnoreCase(Object attr, String value) { - // (contains(Name, $email) and length(Name) = length($email) - return subconstraint() - .contains(attr, value) - .and() - .append(" length(" + attr + ") = ").append(value == null ? "0" : valueToXPathValue(value.length())) - .close(); - } - - public XPath notEq(Object attr, Object valuecomparison) { - return compare(attr, "!=", valuecomparison); - } - - public XPath notEq(Object... pathAndValue) { - return compare("!=", pathAndValue); - } - - public XPath gt(Object attr, Object valuecomparison) { - return compare(attr, ">", valuecomparison); - } - - public XPath gt(Object... pathAndValue) { - return compare(">", pathAndValue); - } - - public XPath gte(Object attr, Object valuecomparison) { - return compare(attr, ">=", valuecomparison); - } - - public XPath gte(Object... pathAndValue) { - return compare(">=", pathAndValue); - } - - public XPath lt(Object attr, Object valuecomparison) { - return compare(attr, "<", valuecomparison); - } - - public XPath lt(Object... pathAndValue) { - return compare("<", pathAndValue); - } - - public XPath lte(Object attr, Object valuecomparison) { - return compare(attr, "<=", valuecomparison); - } - - public XPath lte(Object... pathAndValue) { - return compare("<=", pathAndValue); - } - - public XPath contains(Object attr, String value) { - return functionCall("contains", String.valueOf(attr), valueToXPathValue(value)); - } - - public XPath startsWith(Object attr, String value) { - return functionCall("starts-with", String.valueOf(attr), valueToXPathValue(value)); - } - - public XPath endsWith(Object attr, String value) { - return functionCall("ends-with", String.valueOf(attr), valueToXPathValue(value)); - } - - private XPath functionCall(String functionName, String... args) { - autoInsertAnd(); - append(" " + functionName + "("); - - if (args.length > 0) { - append(args[0]); - for (int i = 1; i < args.length; i++) { - append(","); - append(args[i]); - } - } - append(") "); - return requireBinOp(true); - } - - public XPath compare(Object attr, String operator, Object value) { - return compare(new Object[] { attr }, operator, value); - } - - private XPath compare(String operator, Object[] pathAndValue) { - assertEven(pathAndValue); - int lastIndex = pathAndValue.length - 1; - return compare(Arrays.copyOf(pathAndValue, lastIndex), operator, pathAndValue[lastIndex]); - } - - public XPath compare(Object[] path, String operator, Object value) { - assertOdd(path); - autoInsertAnd().append(StringUtils.join(path, '/')).append(" ").append(operator).append(" ") - .append(valueToXPathValue(value)); - return requireBinOp(true); - } - - public XPath hasReference(Object... path) { - assertEven(path); // Reference + entity type - autoInsertAnd().append(StringUtils.join(path, '/')); - return requireBinOp(true); - } - - public XPath subconstraint(Object... path) { - assertEven(path); - autoInsertAnd().append(StringUtils.join(path, '/')).append("["); - closeStack.push("]"); - return requireBinOp(false); - } - - public XPath subconstraint() { - autoInsertAnd().append("("); - closeStack.push(")"); - return requireBinOp(false); - } - - public XPath addConstraint() { - if (!closeStack.isEmpty() && !closeStack.peek().equals("]")) - throw new IllegalStateException("Cannot add a constraint while in the middle of something else.."); - - return append("][").requireBinOp(false); - } - - public XPath close() { - if (closeStack.isEmpty()) - throw new IllegalStateException("XPathbuilder close stack is empty!"); - append(closeStack.pop()); - return requireBinOp(true); - // MWE: note that a close does not necessary require a binary operator, for - // example with two subsequent block([bla][boe]) constraints, - // but openening a binary constraint reset the flag, so that should be no issue - } - - public XPath or() { - if (!requiresBinOp) - throw new IllegalStateException("Received 'or' but no binary operator was expected"); - return append(" or ").requireBinOp(false); - } - - public XPath and() { - if (!requiresBinOp) - throw new IllegalStateException("Received 'and' but no binary operator was expected"); - return append(" and ").requireBinOp(false); - } - - public XPath not() { - autoInsertAnd(); - closeStack.push(")"); - return append(" not(").requireBinOp(false); - } - - private void assertOdd(Object[] stuff) { - if (stuff == null || stuff.length == 0 || stuff.length % 2 == 0) - throw new IllegalArgumentException("Expected an odd number of xpath path parts"); - } - - private void assertEven(Object[] stuff) { - if (stuff == null || stuff.length == 0 || stuff.length % 2 == 1) - throw new IllegalArgumentException("Expected an even number of xpath path parts"); - } - - public XPath append(String s) { - builder.append(s); - return this; - } - - public String getXPath() { - if (builder.length() > 0) - return "//" + entity + "[" + builder + "]"; - return "//" + entity; - } - - private void assertEmptyStack() throws IllegalStateException { - if (!closeStack.isEmpty()) - throw new IllegalStateException("Invalid xpath expression, not all items where closed"); - } - - public long count() throws CoreException { - assertEmptyStack(); - - return Core.createXPathQuery("count(" + getXPath() + ")").executeAggregateLong(context); - } - - public IMendixObject firstMendixObject() throws CoreException { - assertEmptyStack(); - - XPathQuery query = (XPathQuery) Core.createXPathQuery(getXPath()).setAmount(1).setOffset(offset); - for (Map.Entry sort : sorting.entrySet()) - query.addSort(sort.getKey(), sort.getValue() == "asc"); - List result = query.execute(context); - - if (result.isEmpty()) - return null; - return result.get(0); - } - - public T first() throws CoreException { - return createProxy(context, proxyClass, firstMendixObject()); - } - - /** - * Given a set of attribute names and values, tries to find the first object - * that matches all conditions, or creates one - * - * @param keysAndValues - * @return - * @throws CoreException - */ - public T findOrCreateNoCommit(Object... keysAndValues) throws CoreException { - T res = findFirst(keysAndValues); - - return res != null ? res : constructInstance(false, keysAndValues); - } - - public T findOrCreate(Object... keysAndValues) throws CoreException { - T res = findFirst(keysAndValues); - - return res != null ? res : constructInstance(true, keysAndValues); - - } - - public T findOrCreateSynchronized(Object... keysAndValues) throws CoreException, InterruptedException { - T res = findFirst(keysAndValues); - - if (res != null) { - return res; - } else { - synchronized (Core.getMetaObject(entity)) { - IContext synchronizedContext = context.getSession().createContext().createSudoClone(); - try { - synchronizedContext.startTransaction(); - res = createProxy(synchronizedContext, proxyClass, - XPath.create(synchronizedContext, entity).findOrCreate(keysAndValues)); - synchronizedContext.endTransaction(); - return res; - } catch (CoreException e) { - if (synchronizedContext.isInTransaction()) { - synchronizedContext.rollbackTransaction(); - } - throw e; - } - } - } - } - - public T findFirst(Object... keysAndValues) - throws IllegalStateException, CoreException { - if (builder.length() > 0) - throw new IllegalStateException("FindFirst can only be used on XPath which do not have constraints already"); - - assertEven(keysAndValues); - for (int i = 0; i < keysAndValues.length; i += 2) - eq(keysAndValues[i], keysAndValues[i + 1]); - - return first(); - } - - /** - * Creates one instance of the type of this XPath query, and initializes the - * provided attributes to the provided values. - * - * @param keysAndValues AttributeName, AttributeValue, AttributeName2, - * AttributeValue2... list. - * @return - * @throws CoreException - */ - public T constructInstance(boolean autoCommit, Object... keysAndValues) throws CoreException { - assertEven(keysAndValues); - IMendixObject newObj = Core.instantiate(context, entity); - - for (int i = 0; i < keysAndValues.length; i += 2) - newObj.setValue(context, String.valueOf(keysAndValues[i]), toMemberValue(keysAndValues[i + 1])); - - if (autoCommit) - Core.commit(context, newObj); - - return createProxy(context, proxyClass, newObj); - } - - /** - * Given a current collection of primitive values, checks if for each value in - * the collection an object in the database exists. - * It creates a new object if needed, and removes any superfluos objects in the - * database that are no longer in the collection. - * - * @param currentCollection The collection that act as reference for the - * objects that should be in this database in the - * end. - * @param comparisonAttribute The attribute that should store the value as - * decribed in the collection - * @param autoDelete Automatically remove any superfluous objects form - * the database - * @param keysAndValues Constraints that should hold for the set of - * objects that are deleted or created. Objects - * outside this constraint are not processed. - * - * @return A pair of lists. The first list contains the newly created objects, - * the second list contains the objects that (should be or are) removed. - * @throws CoreException - */ - public ImmutablePair, List> syncDatabaseWithCollection(Collection currentCollection, - Object comparisonAttribute, boolean autoDelete, Object... keysAndValues) throws CoreException { - if (builder.length() > 0) - throw new IllegalStateException( - "syncDatabaseWithCollection can only be used on XPath which do not have constraints already"); - - List added = new ArrayList(); - List removed = new ArrayList(); - - Set col = new HashSet(currentCollection); - - for (int i = 0; i < keysAndValues.length; i += 2) - eq(keysAndValues[i], keysAndValues[i + 1]); - - for (IMendixObject existingItem : allMendixObjects()) { - // Item is still available - if (col.remove(existingItem.getValue(context, String.valueOf(comparisonAttribute)))) - continue; - - // No longer available - removed.add(createProxy(context, proxyClass, existingItem)); - if (autoDelete) - Core.delete(context, existingItem); - } - - // Some items where not found in the database - for (U value : col) { - - // In apache lang3, this would just be: ArrayUtils.addAll(keysAndValues, - // comparisonAttribute, value) - Object[] args = new Object[keysAndValues.length + 2]; - for (int i = 0; i < keysAndValues.length; i++) - args[i] = keysAndValues[i]; - args[keysAndValues.length] = comparisonAttribute; - args[keysAndValues.length + 1] = value; - - T newItem = constructInstance(true, args); - added.add(newItem); - } - - // Oké, stupid, Pair is also only available in apache lang3, so lets use a - // simple pair implementation for now - return ImmutablePair.of(added, removed); - } - - public T firstOrWait(long timeoutMSecs) throws CoreException, InterruptedException { - IMendixObject result = null; - - long start = System.currentTimeMillis(); - int sleepamount = 200; - int loopcount = 0; - - while (result == null) { - loopcount += 1; - result = firstMendixObject(); - - long now = System.currentTimeMillis(); - - if (start + timeoutMSecs < now) // Time expired - break; - - if (loopcount % 5 == 0) - sleepamount = (int)(sleepamount * 1.5); - - // not expired, wait a bit - if (result == null) - Thread.sleep(sleepamount); - } - - return createProxy(context, proxyClass, result); - } - - public List allMendixObjects() throws CoreException { - assertEmptyStack(); - - XPathQuery query = (XPathQuery) Core.createXPathQuery(getXPath()).setAmount(limit).setOffset(offset); - for (Map.Entry sort : sorting.entrySet()) - query.addSort(sort.getKey(), sort.getValue() == "asc"); - return query.execute(context); - } - - public List all() throws CoreException { - List res = new ArrayList(); - for (IMendixObject o : allMendixObjects()) - res.add(createProxy(context, proxyClass, o)); - - return res; - } - - @Override - public String toString() { - return getXPath(); - } - - /* Static utility functions */ - - // Cache for proxy constructors. Reflection is slow, so reuse as much as - // possible - private static Map initializers = new HashMap(); - - public static List createProxyList(IContext c, Class proxieClass, List objects) { - List res = new ArrayList(); - if (objects == null || objects.size() == 0) - return res; - - for (IMendixObject o : objects) - res.add(createProxy(c, proxieClass, o)); - - return res; - } - - public static T createProxy(IContext c, Class proxieClass, IMendixObject object) { - // Borrowed from nl.mweststrate.pages.MxQ package - - if (object == null) - return null; - - if (c == null || proxieClass == null) - throw new IllegalArgumentException("[CreateProxy] No context or proxieClass provided. "); - - // jeuj, we expect IMendixObject's. Thats nice.. - if (proxieClass == IMendixObject.class) - return proxieClass.cast(object); // .. since we can do a direct cast - - try { - String entityType = object.getType(); - - if (!initializers.containsKey(entityType)) { - - String[] entType = object.getType().split("\\."); - Class realClass = Class.forName(entType[0].toLowerCase() + ".proxies." + entType[1]); - - initializers.put(entityType, realClass.getMethod("initialize", IContext.class, IMendixObject.class)); - } - - // find constructor - Method m = initializers.get(entityType); - - // create proxy object - Object result = m.invoke(null, c, object); - - // cast, but check first is needed because the actual type might be a subclass - // of the requested type - if (!proxieClass.isAssignableFrom(result.getClass())) - throw new IllegalArgumentException("The type of the object ('" + object.getType() - + "') is not (a subclass) of '" + proxieClass.getName() + "'"); - - T proxie = proxieClass.cast(result); - return proxie; - } catch (Exception e) { - throw new RuntimeException("Unable to instantiate proxie: " + e.getMessage(), e); - } - } - - public static String valueToXPathValue(Object value) { - if (value == null) - return NULL; - - // Complex objects - if (value instanceof IMendixIdentifier) - return "'" + String.valueOf(((IMendixIdentifier) value).toLong()) + "'"; - if (value instanceof IMendixObject) - return valueToXPathValue(((IMendixObject) value).getId()); - if (value instanceof List) - throw new IllegalArgumentException("List based values are not supported!"); - - // Primitives - if (value instanceof Date) - return String.valueOf(((Date) value).getTime()); - if (value instanceof Long || value instanceof Integer) - return String.valueOf(value); - if (value instanceof Double || value instanceof Float) { - // make sure xpath understands our number formatting - NumberFormat format = NumberFormat.getNumberInstance(Locale.ENGLISH); - format.setMaximumFractionDigits(10); - format.setGroupingUsed(false); - return format.format(value); - } - if (value instanceof Boolean) { - return value.toString() + "()"; // xpath boolean, you know.. - } - if (value instanceof String) { - return "'" + ESCAPE_XML.translate(String.valueOf(value)) + "'"; - } - - // Object, assume its a proxy and deproxiefy - try { - IMendixObject mo = proxyToMendixObject(value); - return valueToXPathValue(mo); - } catch (NoSuchMethodException e) { - // This is O.K. just not a proxy object... - } catch (Exception e) { - throw new RuntimeException("Failed to retrieve MendixObject from proxy: " + e.getMessage(), e); - } - - // assume some string representation - return "'" + ESCAPE_XML.translate(String.valueOf(value)) + "'"; - } - - public static IMendixObject proxyToMendixObject(Object value) - throws NoSuchMethodException, SecurityException, IllegalAccessException, - IllegalArgumentException, InvocationTargetException { - Method m = value.getClass().getMethod("getMendixObject"); - IMendixObject mo = (IMendixObject) m.invoke(value); - return mo; - } - - public static List proxyListToMendixObjectList( - List objects) throws SecurityException, IllegalArgumentException, NoSuchMethodException, - IllegalAccessException, InvocationTargetException { - ArrayList res = new ArrayList(objects.size()); - for (T i : objects) - res.add(proxyToMendixObject(i)); - return res; - } - - public static Object toMemberValue(Object value) { - if (value == null) - return null; - - // Complex objects - if (value instanceof IMendixIdentifier) - return value; - if (value instanceof IMendixObject) - return ((IMendixObject) value).getId(); - - if (value instanceof List) - throw new IllegalArgumentException("List based values are not supported!"); - - // Primitives - if (value instanceof Date - || value instanceof Long - || value instanceof Integer - || value instanceof Double - || value instanceof Float - || value instanceof Boolean - || value instanceof String) { - return value; - } - - if (value.getClass().isEnum()) - return value.toString(); - - // Object, assume its a proxy and deproxiefy - try { - Method m = value.getClass().getMethod("getMendixObject"); - IMendixObject mo = (IMendixObject) m.invoke(value); - return toMemberValue(mo); - } catch (NoSuchMethodException e) { - // This is O.K. just not a proxy object... - } catch (Exception e) { - throw new RuntimeException( - "Failed to convert object to IMendixMember compatible value '" + value + "': " + e.getMessage(), e); - } - - throw new RuntimeException("Failed to convert object to IMendixMember compatible value: " + value); - } - - public static interface IBatchProcessor { - public void onItem(T item, long offset, long total) throws Exception; - } - - private static final class ParallelJobRunner implements Callable { - private final XPath self; - private final IBatchProcessor batchProcessor; - private final IMendixObject item; - private long index; - private long count; - - ParallelJobRunner(XPath self, IBatchProcessor batchProcessor, IMendixObject item, long index, long count) { - this.self = self; - this.batchProcessor = batchProcessor; - this.item = item; - this.index = index; - this.count = count; - } - - @Override - public Boolean call() { - try { - batchProcessor.onItem(XPath.createProxy(Core.createSystemContext(), self.proxyClass, item), index, count); - return true; - } catch (Exception e) { - throw new RuntimeException(String.format("Failed to execute batch on '%s' offset %d: %s", self.toString(), - self.offset, e.getMessage()), e); - } - } - } - - /** - * Retreives all items in this xpath query in batches of a limited size. - * Not that this function does not start a new transaction for all the batches, - * rather, it just limits the number of objects being retrieved and kept in - * memory at the same time. - * - * So it only batches the retrieve process, not the optional manipulations done - * in the onItem method. - * - * @param batchsize - * @param batchProcessor - * @throws CoreException - */ - public void batch(int batchsize, IBatchProcessor batchProcessor) throws CoreException { - if (sorting.isEmpty()) - addSortingAsc(XPath.ID); - - final long itemcount = count(); - - int baseoffset = offset; - int baselimit = limit; - - boolean useBaseLimit = baselimit > -1; - - offset(baseoffset); - List data; - - long i = 0; - - do { - int newlimit = useBaseLimit ? Math.min(batchsize, baseoffset + baselimit - offset) : batchsize; - if (newlimit == 0) - break; // where done, no more data is needed - - limit(newlimit); - data = all(); - - for (T item : data) { - i += 1; - try { - batchProcessor.onItem(item, i, Math.max(i, itemcount)); - } catch (Exception e) { - throw new RuntimeException(String.format("Failed to execute batch on '%s' offset %d: %s", this, - offset, e.getMessage()), e); - } - } - - offset(offset + data.size()); - } while (data.size() > 0); - } - - /** - * Batch with parallelization. - * - * IMPORTANT NOTE: DO NOT USE THE CONTEXT OF THE XPATH OBJECT ITSELF INSIDE THE - * BATCH PROCESSOR! - * - * Instead, use: Item.getContext(); !! - * - * - * @param batchsize - * @param threads - * @param batchProcessor - * @throws CoreException - * @throws InterruptedException - * @throws ExecutionException - */ - public void batch(int batchsize, int threads, final IBatchProcessor batchProcessor) - throws CoreException, InterruptedException, ExecutionException { - if (sorting.isEmpty()) - addSortingAsc(XPath.ID); - - ExecutorService pool = Executors.newFixedThreadPool(threads); - - final long itemcount = count(); - - int progress = 0; - List> futures = new ArrayList>(batchsize); // no need to synchronize - - offset(0); - limit(batchsize); - - List data = allMendixObjects(); - - while (data.size() > 0) { - for (final IMendixObject item : data) { - futures.add(pool.submit(new ParallelJobRunner(this, batchProcessor, item, progress, itemcount))); - progress += 1; - } - - while (!futures.isEmpty()) - futures.remove(0).get(); // wait for all futures before proceeding to next iteration - - offset(offset + data.size()); - data = allMendixObjects(); - } - - if (pool.shutdownNow().size() > 0) - throw new IllegalStateException("Not all tasks where finished!"); - } - - public static Class getProxyClassForEntityName(String entityname) { - { - String[] parts = entityname.split("\\."); - try { - return Class.forName(parts[0].toLowerCase() + ".proxies." + parts[1]); - } catch (ClassNotFoundException e) { - throw new RuntimeException("Cannot find class for entity: " + entityname + ": " + e.getMessage(), e); - } - } - } - - public boolean deleteAll() throws CoreException { - limit(1000); - List objs = allMendixObjects(); - while (!objs.isEmpty()) { - if (!Core.delete(context, objs.toArray(new IMendixObject[objs.size()]))) - return false; // TODO: throw? - - objs = allMendixObjects(); - } - return true; - } - - // Implement our own ESCAPE_XML because the original got deprecated and we - // originally translated only a very small - // subset of characters. - private static final CharSequenceTranslator ESCAPE_XML = new AggregateTranslator( - new LookupTranslator(EntityArrays.BASIC_ESCAPE), - new LookupTranslator(EntityArrays.APOS_ESCAPE)); -} diff --git a/javasource/communitycommons/actions/Base64Decode.java b/javasource/communitycommons/actions/Base64Decode.java deleted file mode 100644 index e3e60ad..0000000 --- a/javasource/communitycommons/actions/Base64Decode.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Converts a base64 encoded string to the plain, original string - */ -public class Base64Decode extends UserAction -{ - private final java.lang.String encoded; - - public Base64Decode( - IContext context, - java.lang.String _encoded - ) - { - super(context); - this.encoded = _encoded; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.base64Decode(encoded); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "Base64Decode"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/Base64DecodeToFile.java b/javasource/communitycommons/actions/Base64DecodeToFile.java deleted file mode 100644 index 96e0c51..0000000 --- a/javasource/communitycommons/actions/Base64DecodeToFile.java +++ /dev/null @@ -1,63 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Stores an base 64 encoded string plain in the provided target file document - * - * Note that targetFile will be committed. - */ -public class Base64DecodeToFile extends UserAction -{ - private final java.lang.String encoded; - /** @deprecated use targetFile.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __targetFile; - private final system.proxies.FileDocument targetFile; - - public Base64DecodeToFile( - IContext context, - java.lang.String _encoded, - IMendixObject _targetFile - ) - { - super(context); - this.encoded = _encoded; - this.__targetFile = _targetFile; - this.targetFile = _targetFile == null ? null : system.proxies.FileDocument.initialize(getContext(), _targetFile); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - StringUtils.base64DecodeToFile(getContext(), encoded, targetFile); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "Base64DecodeToFile"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/Base64Encode.java b/javasource/communitycommons/actions/Base64Encode.java deleted file mode 100644 index e7f89b9..0000000 --- a/javasource/communitycommons/actions/Base64Encode.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Converts a plain string to a base64 encoded string - */ -public class Base64Encode extends UserAction -{ - private final java.lang.String value; - - public Base64Encode( - IContext context, - java.lang.String _value - ) - { - super(context); - this.value = _value; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.base64Encode(value); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "Base64Encode"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/Base64EncodeFile.java b/javasource/communitycommons/actions/Base64EncodeFile.java deleted file mode 100644 index 3fb6d3e..0000000 --- a/javasource/communitycommons/actions/Base64EncodeFile.java +++ /dev/null @@ -1,57 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Converts an unencoded file to a base 64 encoded string. - */ -public class Base64EncodeFile extends UserAction -{ - /** @deprecated use file.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __file; - private final system.proxies.FileDocument file; - - public Base64EncodeFile( - IContext context, - IMendixObject _file - ) - { - super(context); - this.__file = _file; - this.file = _file == null ? null : system.proxies.FileDocument.initialize(getContext(), _file); - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.base64EncodeFile(getContext(), file); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "Base64EncodeFile"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/Clone.java b/javasource/communitycommons/actions/Clone.java deleted file mode 100644 index 9f3a919..0000000 --- a/javasource/communitycommons/actions/Clone.java +++ /dev/null @@ -1,65 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Clones objects - * - * - Source: the original object to copy - * - Target: the object to copy it into (should be of the same type, or a specialization) - * - includeAssociations: whether to clone associations. - * - * If associated objects need to be cloned as well, use deepClone, this function only copies the references, not the reffered objects. Target is not committed automatically. - */ -public class Clone extends UserAction -{ - private final IMendixObject source; - private final IMendixObject target; - private final java.lang.Boolean withAssociations; - - public Clone( - IContext context, - IMendixObject _source, - IMendixObject _target, - java.lang.Boolean _withAssociations - ) - { - super(context); - this.source = _source; - this.target = _target; - this.withAssociations = _withAssociations; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.cloneObject(this.getContext(), source, target, withAssociations); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "Clone"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/CreateLogNode.java b/javasource/communitycommons/actions/CreateLogNode.java deleted file mode 100644 index 2506ceb..0000000 --- a/javasource/communitycommons/actions/CreateLogNode.java +++ /dev/null @@ -1,53 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Logging; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Initializes a log node for later use. Useful to set logging to a more detailed log level before the first time a certain log action is executed. - */ -public class CreateLogNode extends UserAction -{ - private final java.lang.String logNodeParameter; - - public CreateLogNode( - IContext context, - java.lang.String _logNodeParameter - ) - { - super(context); - this.logNodeParameter = _logNodeParameter; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - Logging.createLogNode(logNodeParameter); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "CreateLogNode"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/DateTimeToLong.java b/javasource/communitycommons/actions/DateTimeToLong.java deleted file mode 100644 index a44fc75..0000000 --- a/javasource/communitycommons/actions/DateTimeToLong.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.DateTime; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Converts a DateTime to a Unix timestamps. (Milliseconds since 1-1-1970) - */ -public class DateTimeToLong extends UserAction -{ - private final java.util.Date dateObject; - - public DateTimeToLong( - IContext context, - java.util.Date _dateObject - ) - { - super(context); - this.dateObject = _dateObject; - } - - @java.lang.Override - public java.lang.Long executeAction() throws Exception - { - // BEGIN USER CODE - return DateTime.dateTimeToLong(dateObject); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "DateTimeToLong"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/DeepClone.java b/javasource/communitycommons/actions/DeepClone.java deleted file mode 100644 index 0c47ddb..0000000 --- a/javasource/communitycommons/actions/DeepClone.java +++ /dev/null @@ -1,96 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Clones objects, their associations and even referred objects. - * - * - Source: the original object to copy - * - Target: the object to copy it into (should be of the same type, or a specialization) - * - MembersToSkip: members which should not be set at all - * - MembersToKeep: references which should be set, but not cloned. (so source and target will refer to exactly the same object). If an association is not part of this property, it will be cloned. - * - ReverseAssociations: 1 - 0 assications which refer to target, which will be cloned as well. Only the reference name itself needs to be mentioned. - * - excludeEntities: entities that will not be cloned. references to these entities will refer to the same object as the source did. - * - excludeModules: modules that will have none of their enities cloned. Behaves similar to excludeEntities. - * - * members format: or or , where objecttype is the concrete type of the object being cloned. - * - * reverseAssociation: - * - * - * membersToSkip by automatically contains createdDate and changedDate. - * membersToKeep by automatically contains System.owner and System.changedBy - * - * Note that DeepClone does commit all objects, where Clone does not. - */ -public class DeepClone extends UserAction -{ - private final IMendixObject source; - private final IMendixObject target; - private final java.lang.String membersToSkip; - private final java.lang.String membersToKeep; - private final java.lang.String reverseAssociations; - private final java.lang.String excludeEntities; - private final java.lang.String excludeModules; - - public DeepClone( - IContext context, - IMendixObject _source, - IMendixObject _target, - java.lang.String _membersToSkip, - java.lang.String _membersToKeep, - java.lang.String _reverseAssociations, - java.lang.String _excludeEntities, - java.lang.String _excludeModules - ) - { - super(context); - this.source = _source; - this.target = _target; - this.membersToSkip = _membersToSkip; - this.membersToKeep = _membersToKeep; - this.reverseAssociations = _reverseAssociations; - this.excludeEntities = _excludeEntities; - this.excludeModules = _excludeModules; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - java.lang.String membersToSkip = this.membersToSkip == null ? "" : this.membersToSkip; - java.lang.String membersToKeep = this.membersToKeep == null ? "" : this.membersToKeep; - java.lang.String reverseAssociations = this.reverseAssociations == null ? "" : this.reverseAssociations; - java.lang.String excludeEntities = this.excludeEntities == null ? "" : this.excludeEntities; - java.lang.String excludeModules = this.excludeModules == null ? "" : this.excludeModules; - - ORM.deepClone(getContext(), source, target, membersToSkip, membersToKeep, reverseAssociations, excludeEntities, excludeModules); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "DeepClone"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/Delay.java b/javasource/communitycommons/actions/Delay.java deleted file mode 100644 index e23adf4..0000000 --- a/javasource/communitycommons/actions/Delay.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Causes this request to sleep for a while. Useful to prevent brute force attacks or to simulate latency delays. - * - * Delaytime : time in ms - */ -public class Delay extends UserAction -{ - private final java.lang.Long delaytime; - - public Delay( - IContext context, - java.lang.Long _delaytime - ) - { - super(context); - this.delaytime = _delaytime; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - Misc.delay(delaytime); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "Delay"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/DuplicateFileDocument.java b/javasource/communitycommons/actions/DuplicateFileDocument.java deleted file mode 100644 index 7a9beb5..0000000 --- a/javasource/communitycommons/actions/DuplicateFileDocument.java +++ /dev/null @@ -1,69 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Clones the contents of one file document into another. - * - fileToClone : the source file - * - cloneTarget : an initialized file document, in which the file will be stored. - * - * Returns true if copied, returns file if the source had no contents, throws exception in any other case. - * Pre condition: HasContents of the 'fileToClone' need to be set to true, otherwise the action will not copy anything. - */ -public class DuplicateFileDocument extends UserAction -{ - /** @deprecated use fileToClone.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __fileToClone; - private final system.proxies.FileDocument fileToClone; - /** @deprecated use cloneTarget.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __cloneTarget; - private final system.proxies.FileDocument cloneTarget; - - public DuplicateFileDocument( - IContext context, - IMendixObject _fileToClone, - IMendixObject _cloneTarget - ) - { - super(context); - this.__fileToClone = _fileToClone; - this.fileToClone = _fileToClone == null ? null : system.proxies.FileDocument.initialize(getContext(), _fileToClone); - this.__cloneTarget = _cloneTarget; - this.cloneTarget = _cloneTarget == null ? null : system.proxies.FileDocument.initialize(getContext(), _cloneTarget); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.duplicateFileDocument(this.getContext(), fileToClone.getMendixObject(), cloneTarget.getMendixObject()); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "DuplicateFileDocument"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/DuplicateImageDocument.java b/javasource/communitycommons/actions/DuplicateImageDocument.java deleted file mode 100644 index f62c156..0000000 --- a/javasource/communitycommons/actions/DuplicateImageDocument.java +++ /dev/null @@ -1,75 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Clones the contents of one image document into another, and generates a thumbnail as well. - * - fileToClone : the source file - * - cloneTarget : an initialized file document, in which the file will be stored. - * - * Returns true if copied, returns file if the source had no contents, throws exception in any other case. - * Pre condition: HasContents of the 'fileToClone' need to be set to true, otherwise the action will not copy anything. - */ -public class DuplicateImageDocument extends UserAction -{ - /** @deprecated use fileToClone.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __fileToClone; - private final system.proxies.Image fileToClone; - /** @deprecated use cloneTarget.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __cloneTarget; - private final system.proxies.Image cloneTarget; - private final java.lang.Long thumbWidth; - private final java.lang.Long thumbHeight; - - public DuplicateImageDocument( - IContext context, - IMendixObject _fileToClone, - IMendixObject _cloneTarget, - java.lang.Long _thumbWidth, - java.lang.Long _thumbHeight - ) - { - super(context); - this.__fileToClone = _fileToClone; - this.fileToClone = _fileToClone == null ? null : system.proxies.Image.initialize(getContext(), _fileToClone); - this.__cloneTarget = _cloneTarget; - this.cloneTarget = _cloneTarget == null ? null : system.proxies.Image.initialize(getContext(), _cloneTarget); - this.thumbWidth = _thumbWidth; - this.thumbHeight = _thumbHeight; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.duplicateImage(this.getContext(), fileToClone.getMendixObject(), cloneTarget.getMendixObject(), thumbWidth.intValue(), thumbHeight.intValue()); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "DuplicateImageDocument"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/EndTransaction.java b/javasource/communitycommons/actions/EndTransaction.java deleted file mode 100644 index 5b2d0f7..0000000 --- a/javasource/communitycommons/actions/EndTransaction.java +++ /dev/null @@ -1,46 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Commit the transaction, this will end this transaction or remove a save point from the queue if the transaction is nested - */ -public class EndTransaction extends UserAction -{ - public EndTransaction(IContext context) - { - super(context); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - getContext().endTransaction(); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "EndTransaction"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/EnumerationFromString.java b/javasource/communitycommons/actions/EnumerationFromString.java deleted file mode 100644 index 9a9aacd..0000000 --- a/javasource/communitycommons/actions/EnumerationFromString.java +++ /dev/null @@ -1,59 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Misc; -import communitycommons.proxies.LogLevel; -import java.util.Optional; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Use this Java action as a template for your own String-to-Enumeration conversions. - * Studio Pro requires specifying the exact Enumeration to return in the definition of a Java action so we cannot provide a generic implementation. - * This implementation will throw a NoSuchElementException if an invalid toConvert parameter is given, so remember to handle this error gracefully. - */ -public class EnumerationFromString extends UserAction -{ - private final java.lang.String toConvert; - - public EnumerationFromString( - IContext context, - java.lang.String _toConvert - ) - { - super(context); - this.toConvert = _toConvert; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - - // Replace LogLevel.class by the proxy class for your Enumeration - Optional result = Misc.enumFromString(LogLevel.class, toConvert); - return result.orElseThrow().name(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "EnumerationFromString"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/EscapeHTML.java b/javasource/communitycommons/actions/EscapeHTML.java deleted file mode 100644 index 6c3ecbe..0000000 --- a/javasource/communitycommons/actions/EscapeHTML.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Given a, escapes it to html codes, for example - * - * "< Joe & John >" will be converted to - * "< Joe & John >" - */ -public class EscapeHTML extends UserAction -{ - private final java.lang.String rawString; - - public EscapeHTML( - IContext context, - java.lang.String _rawString - ) - { - super(context); - this.rawString = _rawString; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.escapeHTML(rawString); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "EscapeHTML"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/FileDocumentFromFile.java b/javasource/communitycommons/actions/FileDocumentFromFile.java deleted file mode 100644 index 337eed0..0000000 --- a/javasource/communitycommons/actions/FileDocumentFromFile.java +++ /dev/null @@ -1,69 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import java.io.File; -import java.io.FileInputStream; -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Loads a file from the local (server) storage and stores it inside a FileDocument. - */ -public class FileDocumentFromFile extends UserAction -{ - private final java.lang.String file; - /** @deprecated use fileDocument.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __fileDocument; - private final system.proxies.FileDocument fileDocument; - - public FileDocumentFromFile( - IContext context, - java.lang.String _file, - IMendixObject _fileDocument - ) - { - super(context); - this.file = _file; - this.__fileDocument = _fileDocument; - this.fileDocument = _fileDocument == null ? null : system.proxies.FileDocument.initialize(getContext(), _fileDocument); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - try ( - FileInputStream fis = new FileInputStream(new File(this.file)) - ) { - Core.storeFileDocumentContent(getContext(), fileDocument.getMendixObject(), - this.file, fis); - } - - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "FileDocumentFromFile"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/FileFromFileDocument.java b/javasource/communitycommons/actions/FileFromFileDocument.java deleted file mode 100644 index 59b2263..0000000 --- a/javasource/communitycommons/actions/FileFromFileDocument.java +++ /dev/null @@ -1,73 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import org.apache.commons.io.IOUtils; -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Reads contents from a FileDocument and stores it in a file on the local (server) storage. - */ -public class FileFromFileDocument extends UserAction -{ - private final java.lang.String targetFile; - /** @deprecated use fileDocument.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __fileDocument; - private final system.proxies.FileDocument fileDocument; - - public FileFromFileDocument( - IContext context, - java.lang.String _targetFile, - IMendixObject _fileDocument - ) - { - super(context); - this.targetFile = _targetFile; - this.__fileDocument = _fileDocument; - this.fileDocument = _fileDocument == null ? null : system.proxies.FileDocument.initialize(getContext(), _fileDocument); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - File output = new File(targetFile); - - try ( - FileOutputStream fos = new FileOutputStream(output); - InputStream is = Core.getFileDocumentContent(getContext(), fileDocument.getMendixObject()); - ) { - IOUtils.copy(is, fos); - } - - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "FileFromFileDocument"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GenerateHMAC_SHA256.java b/javasource/communitycommons/actions/GenerateHMAC_SHA256.java deleted file mode 100644 index 75b7e3e..0000000 --- a/javasource/communitycommons/actions/GenerateHMAC_SHA256.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Generates and asymmetric hexadecimal hash using the HMAC_SHA256 hash algorithm - */ -public class GenerateHMAC_SHA256 extends UserAction -{ - private final java.lang.String key; - private final java.lang.String valueToEncrypt; - - public GenerateHMAC_SHA256( - IContext context, - java.lang.String _key, - java.lang.String _valueToEncrypt - ) - { - super(context); - this.key = _key; - this.valueToEncrypt = _valueToEncrypt; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.generateHmacSha256(key, valueToEncrypt); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GenerateHMAC_SHA256"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GenerateHMAC_SHA256_hash.java b/javasource/communitycommons/actions/GenerateHMAC_SHA256_hash.java deleted file mode 100644 index b889a7d..0000000 --- a/javasource/communitycommons/actions/GenerateHMAC_SHA256_hash.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Generates an asymmetric hash using the HMAC_SHA256 hash algorithm - */ -public class GenerateHMAC_SHA256_hash extends UserAction -{ - private final java.lang.String key; - private final java.lang.String valueToEncrypt; - - public GenerateHMAC_SHA256_hash( - IContext context, - java.lang.String _key, - java.lang.String _valueToEncrypt - ) - { - super(context); - this.key = _key; - this.valueToEncrypt = _valueToEncrypt; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.generateHmacSha256Hash(key, valueToEncrypt); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GenerateHMAC_SHA256_hash"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GetApplicationUrl.java b/javasource/communitycommons/actions/GetApplicationUrl.java deleted file mode 100644 index 8f9c68e..0000000 --- a/javasource/communitycommons/actions/GetApplicationUrl.java +++ /dev/null @@ -1,46 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the runtime URL of this application. - */ -public class GetApplicationUrl extends UserAction -{ - public GetApplicationUrl(IContext context) - { - super(context); - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.getApplicationURL(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GetApplicationUrl"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GetCFInstanceIndex.java b/javasource/communitycommons/actions/GetCFInstanceIndex.java deleted file mode 100644 index fd5b3ff..0000000 --- a/javasource/communitycommons/actions/GetCFInstanceIndex.java +++ /dev/null @@ -1,50 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the Cloud Foundry Instance Index that is set during deployment of the application in a Cloud native environment. Based on the Cloud Foundry Instance Index, Mendix determines what is the leader instance (index 0 executes scheduled events, db sync, session management etc.) or slave instance. - * - * Returns 0 for the leader instance, 1 or higher for slave instances or -1 when the environment variable could not be read (when running locally or on premise). When -1 is returned, it will probably be the leader in the cluster. - * - * Make sure emulate cloud security is disabled. Otherwise, the policy restrictions will prevent the method to be executed. Action is tested in Mendix Cloud on 19-12-2018. - */ -public class GetCFInstanceIndex extends UserAction -{ - public GetCFInstanceIndex(IContext context) - { - super(context); - } - - @java.lang.Override - public java.lang.Long executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.getCFInstanceIndex(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GetCFInstanceIndex"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GetDefaultLanguage.java b/javasource/communitycommons/actions/GetDefaultLanguage.java deleted file mode 100644 index 4dbca97..0000000 --- a/javasource/communitycommons/actions/GetDefaultLanguage.java +++ /dev/null @@ -1,49 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import system.proxies.Language; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Get default language - */ -public class GetDefaultLanguage extends UserAction -{ - public GetDefaultLanguage(IContext context) - { - super(context); - } - - @java.lang.Override - public IMendixObject executeAction() throws Exception - { - // BEGIN USER CODE - Language defaultLanguage = Misc.getDefaultLanguage(getContext()); - return defaultLanguage.getMendixObject(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GetDefaultLanguage"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GetFileContentsFromResource.java b/javasource/communitycommons/actions/GetFileContentsFromResource.java deleted file mode 100644 index d05566a..0000000 --- a/javasource/communitycommons/actions/GetFileContentsFromResource.java +++ /dev/null @@ -1,71 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import java.io.File; -import java.io.FileInputStream; -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Set the contents of a FileDocument with the contents of a file which is a resource. - */ -public class GetFileContentsFromResource extends UserAction -{ - private final java.lang.String filename; - /** @deprecated use fileDocument.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __fileDocument; - private final system.proxies.FileDocument fileDocument; - - public GetFileContentsFromResource( - IContext context, - java.lang.String _filename, - IMendixObject _fileDocument - ) - { - super(context); - this.filename = _filename; - this.__fileDocument = _fileDocument; - this.fileDocument = _fileDocument == null ? null : system.proxies.FileDocument.initialize(getContext(), _fileDocument); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - File myFile = new File(Core.getConfiguration().getResourcesPath() + - File.separator + filename); - - try ( - FileInputStream fis = new FileInputStream(myFile) - ) { - Core.storeFileDocumentContent(getContext(), fileDocument.getMendixObject(), filename, fis); - } - - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GetFileContentsFromResource"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GetImageDimensions.java b/javasource/communitycommons/actions/GetImageDimensions.java deleted file mode 100644 index ee173f1..0000000 --- a/javasource/communitycommons/actions/GetImageDimensions.java +++ /dev/null @@ -1,67 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import java.awt.image.BufferedImage; -import javax.imageio.ImageIO; -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.proxies.ImageDimensions; -import java.io.InputStream; -import com.mendix.systemwideinterfaces.core.UserAction; - -public class GetImageDimensions extends UserAction -{ - /** @deprecated use ImageParameter.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __ImageParameter; - private final system.proxies.Image ImageParameter; - - public GetImageDimensions( - IContext context, - IMendixObject _imageParameter - ) - { - super(context); - this.__ImageParameter = _imageParameter; - this.ImageParameter = _imageParameter == null ? null : system.proxies.Image.initialize(getContext(), _imageParameter); - } - - @java.lang.Override - public IMendixObject executeAction() throws Exception - { - // BEGIN USER CODE - ImageDimensions imageDimensions = new ImageDimensions(getContext()); - try (InputStream inputStream = Core.getImage(getContext(), this.ImageParameter.getMendixObject(), false)) { - BufferedImage bimg = ImageIO.read(inputStream); - if (bimg != null) { - imageDimensions.setHeight(bimg.getHeight()); - imageDimensions.setWidth(bimg.getWidth()); - } - } - - return imageDimensions.getMendixObject(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GetImageDimensions"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GetIntFromDateTime.java b/javasource/communitycommons/actions/GetIntFromDateTime.java deleted file mode 100644 index c03b41f..0000000 --- a/javasource/communitycommons/actions/GetIntFromDateTime.java +++ /dev/null @@ -1,60 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.DateTime; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Converts a datetime to an integer based on the selector used. - * - * Selectors available are: - * - year (returns f. ex. 1980) - * - month (returns 1-12) - * - day (returns 1-31) - */ -public class GetIntFromDateTime extends UserAction -{ - private final java.util.Date dateObj; - private final communitycommons.proxies.DatePartSelector selectorObj; - - public GetIntFromDateTime( - IContext context, - java.util.Date _dateObj, - java.lang.String _selectorObj - ) - { - super(context); - this.dateObj = _dateObj; - this.selectorObj = _selectorObj == null ? null : communitycommons.proxies.DatePartSelector.valueOf(_selectorObj); - } - - @java.lang.Override - public java.lang.Long executeAction() throws Exception - { - // BEGIN USER CODE - return DateTime.dateTimeToInteger(dateObj, selectorObj); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GetIntFromDateTime"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GetModelVersion.java b/javasource/communitycommons/actions/GetModelVersion.java deleted file mode 100644 index abf7637..0000000 --- a/javasource/communitycommons/actions/GetModelVersion.java +++ /dev/null @@ -1,46 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the model version of the deployed application. - */ -public class GetModelVersion extends UserAction -{ - public GetModelVersion(IContext context) - { - super(context); - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return Core.getModelVersion(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GetModelVersion"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/GetRuntimeVersion.java b/javasource/communitycommons/actions/GetRuntimeVersion.java deleted file mode 100644 index 51d7b9b..0000000 --- a/javasource/communitycommons/actions/GetRuntimeVersion.java +++ /dev/null @@ -1,46 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the runtime version of this application. - */ -public class GetRuntimeVersion extends UserAction -{ - public GetRuntimeVersion(IContext context) - { - super(context); - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return Core.getRuntimeVersion(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "GetRuntimeVersion"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/HTMLEncode.java b/javasource/communitycommons/actions/HTMLEncode.java deleted file mode 100644 index d41d0ce..0000000 --- a/javasource/communitycommons/actions/HTMLEncode.java +++ /dev/null @@ -1,57 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Encodes a string to HTML Entities, so that they can be displayed in the browser without breaking any layout. - * - * This is useful for special widgets which allow HTML to be rendered properly, including special characters as '<' and '&'. - * For example '<' will be encoded as '<' and '&' will be encoded as '&' - * - * Returns the encoded string. - */ -public class HTMLEncode extends UserAction -{ - private final java.lang.String value; - - public HTMLEncode( - IContext context, - java.lang.String _value - ) - { - super(context); - this.value = _value; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.HTMLEncode(value); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "HTMLEncode"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/HTMLToPlainText.java b/javasource/communitycommons/actions/HTMLToPlainText.java deleted file mode 100644 index 17927e8..0000000 --- a/javasource/communitycommons/actions/HTMLToPlainText.java +++ /dev/null @@ -1,53 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Use this function to convert HTML text to plain text. - * It will preserve linebreaks but strip all other markup. including html entity decoding. - */ -public class HTMLToPlainText extends UserAction -{ - private final java.lang.String html; - - public HTMLToPlainText( - IContext context, - java.lang.String _html - ) - { - super(context); - this.html = _html; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.HTMLToPlainText(html); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "HTMLToPlainText"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/Hash.java b/javasource/communitycommons/actions/Hash.java deleted file mode 100644 index 140cee3..0000000 --- a/javasource/communitycommons/actions/Hash.java +++ /dev/null @@ -1,59 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Hashes a value using the SHA-256 hash algorithm. - * - * - value : the value to hash - * - * Returns a SHA-256 hash of 'value' - */ -public class Hash extends UserAction -{ - private final java.lang.String value; - private final java.lang.Long length; - - public Hash( - IContext context, - java.lang.String _value, - java.lang.Long _length - ) - { - super(context); - this.value = _value; - this.length = _length; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.hash(value); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "Hash"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/IsInDevelopment.java b/javasource/communitycommons/actions/IsInDevelopment.java deleted file mode 100644 index 33002ec..0000000 --- a/javasource/communitycommons/actions/IsInDevelopment.java +++ /dev/null @@ -1,46 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns true if the environment is a development environment. Calls Core.getConfiguration().isInDevelopment(). - */ -public class IsInDevelopment extends UserAction -{ - public IsInDevelopment(IContext context) - { - super(context); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Core.getConfiguration().isInDevelopment(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "IsInDevelopment"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/IsStringSimplified.java b/javasource/communitycommons/actions/IsStringSimplified.java deleted file mode 100644 index 7fd9102..0000000 --- a/javasource/communitycommons/actions/IsStringSimplified.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * True if a string can be simplified by the removal of diacritics. - */ -public class IsStringSimplified extends UserAction -{ - private final java.lang.String value; - - public IsStringSimplified( - IContext context, - java.lang.String _value - ) - { - super(context); - this.value = _value; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.isStringSimplified(this.value); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "IsStringSimplified"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/ListTop.java b/javasource/communitycommons/actions/ListTop.java deleted file mode 100644 index b0725c8..0000000 --- a/javasource/communitycommons/actions/ListTop.java +++ /dev/null @@ -1,56 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Takes the top n items of a given list and returns the resulting list. - */ -public class ListTop extends UserAction> -{ - private final java.util.List ObjectList; - private final java.lang.Long Top; - - public ListTop( - IContext context, - java.util.List _objectList, - java.lang.Long _top - ) - { - super(context); - this.ObjectList = _objectList; - this.Top = _top; - } - - @java.lang.Override - public java.util.List executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.listTop(ObjectList, Top.intValue()); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "ListTop"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/LongToDateTime.java b/javasource/communitycommons/actions/LongToDateTime.java deleted file mode 100644 index 3f1e103..0000000 --- a/javasource/communitycommons/actions/LongToDateTime.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.DateTime; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Converts a Unix timestamp to a dateTime object - */ -public class LongToDateTime extends UserAction -{ - private final java.lang.Long value; - - public LongToDateTime( - IContext context, - java.lang.Long _value - ) - { - super(context); - this.value = _value; - } - - @java.lang.Override - public java.util.Date executeAction() throws Exception - { - // BEGIN USER CODE - return DateTime.longToDateTime(value); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "LongToDateTime"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/MergeMultiplePdfs.java b/javasource/communitycommons/actions/MergeMultiplePdfs.java deleted file mode 100644 index bd3757f..0000000 --- a/javasource/communitycommons/actions/MergeMultiplePdfs.java +++ /dev/null @@ -1,68 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Restricted to 10 files at once for Mendix Cloud v4 compatibility. If you need to merge more than 10 files at once merge recursively instead or change the MergeMultiplePdfs_MaxAtOnce constant. - */ -public class MergeMultiplePdfs extends UserAction -{ - /** @deprecated use com.mendix.utils.ListUtils.map(FilesToMerge, com.mendix.systemwideinterfaces.core.IEntityProxy::getMendixObject) instead. */ - @java.lang.Deprecated(forRemoval = true) - private final java.util.List __FilesToMerge; - private final java.util.List FilesToMerge; - /** @deprecated use MergedDocument.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __MergedDocument; - private final system.proxies.FileDocument MergedDocument; - - public MergeMultiplePdfs( - IContext context, - java.util.List _filesToMerge, - IMendixObject _mergedDocument - ) - { - super(context); - this.__FilesToMerge = _filesToMerge; - this.FilesToMerge = java.util.Optional.ofNullable(_filesToMerge) - .orElse(java.util.Collections.emptyList()) - .stream() - .map(filesToMergeElement -> system.proxies.FileDocument.initialize(getContext(), filesToMergeElement)) - .collect(java.util.stream.Collectors.toList()); - this.__MergedDocument = _mergedDocument; - this.MergedDocument = _mergedDocument == null ? null : system.proxies.FileDocument.initialize(getContext(), _mergedDocument); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.mergePDF(this.getContext(), this.FilesToMerge, this.MergedDocument.getMendixObject()); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "MergeMultiplePdfs"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/MonthsBetween.java b/javasource/communitycommons/actions/MonthsBetween.java deleted file mode 100644 index cba194e..0000000 --- a/javasource/communitycommons/actions/MonthsBetween.java +++ /dev/null @@ -1,67 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.DateTime; -import communitycommons.Logging; -import communitycommons.proxies.LogLevel; -import communitycommons.proxies.LogNodes; -import java.util.Date; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Calculates the number of months between two dates. - * - dateTime : the original (oldest) dateTime - * - compareDate: the second date. If EMPTY, the current datetime will be used. Effectively this means that the age of the dateTime is calculated. - */ -public class MonthsBetween extends UserAction -{ - private final java.util.Date date1; - private final java.util.Date date2; - - public MonthsBetween( - IContext context, - java.util.Date _date1, - java.util.Date _date2 - ) - { - super(context); - this.date1 = _date1; - this.date2 = _date2; - } - - @java.lang.Override - public java.lang.Long executeAction() throws Exception - { - // BEGIN USER CODE - try { - return DateTime.periodBetween(date1, date2 == null ? new Date() : date2).toTotalMonths(); - } catch (Exception e) { - - Logging.log(LogNodes.CommunityCommons.name(), LogLevel.Warning, "DateTime calculation error, returning -1", e); - return -1L; - } - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "MonthsBetween"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/OverlayPdfDocument.java b/javasource/communitycommons/actions/OverlayPdfDocument.java deleted file mode 100644 index d2cc4ef..0000000 --- a/javasource/communitycommons/actions/OverlayPdfDocument.java +++ /dev/null @@ -1,67 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Overlay a generated PDF document with another PDF (containing the company stationary for example) - */ -public class OverlayPdfDocument extends UserAction -{ - /** @deprecated use generatedDocument.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __generatedDocument; - private final system.proxies.FileDocument generatedDocument; - /** @deprecated use overlay.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __overlay; - private final system.proxies.FileDocument overlay; - private final java.lang.Boolean onTopOfContent; - - public OverlayPdfDocument( - IContext context, - IMendixObject _generatedDocument, - IMendixObject _overlay, - java.lang.Boolean _onTopOfContent - ) - { - super(context); - this.__generatedDocument = _generatedDocument; - this.generatedDocument = _generatedDocument == null ? null : system.proxies.FileDocument.initialize(getContext(), _generatedDocument); - this.__overlay = _overlay; - this.overlay = _overlay == null ? null : system.proxies.FileDocument.initialize(getContext(), _overlay); - this.onTopOfContent = _onTopOfContent; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.overlayPdf(getContext(), __generatedDocument, __overlay, onTopOfContent); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "OverlayPdfDocument"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/ParseDateTimeWithTimezone.java b/javasource/communitycommons/actions/ParseDateTimeWithTimezone.java deleted file mode 100644 index 3383db5..0000000 --- a/javasource/communitycommons/actions/ParseDateTimeWithTimezone.java +++ /dev/null @@ -1,78 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import java.text.SimpleDateFormat; -import java.util.TimeZone; -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Logging; -import communitycommons.proxies.LogLevel; -import communitycommons.proxies.LogNodes; -import java.text.ParseException; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * This method parses a date from a string with a given pattern according to a specific timezone. - * The timezone has to be a valid timezone id http://docs.oracle.com/javase/7/docs/api/java/util/TimeZone.html (e.g. one of https://garygregory.wordpress.com/2013/06/18/what-are-the-java-timezone-ids/) - */ -public class ParseDateTimeWithTimezone extends UserAction -{ - private final java.lang.String date; - private final java.lang.String pattern; - private final java.lang.String timeZone; - private final java.util.Date defaultValue; - - public ParseDateTimeWithTimezone( - IContext context, - java.lang.String _date, - java.lang.String _pattern, - java.lang.String _timeZone, - java.util.Date _defaultValue - ) - { - super(context); - this.date = _date; - this.pattern = _pattern; - this.timeZone = _timeZone; - this.defaultValue = _defaultValue; - } - - @java.lang.Override - public java.util.Date executeAction() throws Exception - { - // BEGIN USER CODE - if (date == null || date.trim().equals("")) { - return defaultValue; - } - - try { - SimpleDateFormat sdf = new SimpleDateFormat(pattern); - sdf.setTimeZone(TimeZone.getTimeZone(timeZone)); - return sdf.parse(date); - } catch (ParseException e) { - Logging.log(LogNodes.CommunityCommons.name(), LogLevel.Warning, "Unable to parse date " + date, e); - return defaultValue; - } - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "ParseDateTimeWithTimezone"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/RandomHash.java b/javasource/communitycommons/actions/RandomHash.java deleted file mode 100644 index 788844f..0000000 --- a/javasource/communitycommons/actions/RandomHash.java +++ /dev/null @@ -1,46 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Generates a random hash, perfectly to use as random but unique identifier - */ -public class RandomHash extends UserAction -{ - public RandomHash(IContext context) - { - super(context); - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.randomHash(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "RandomHash"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/RandomString.java b/javasource/communitycommons/actions/RandomString.java deleted file mode 100644 index 06e7644..0000000 --- a/javasource/communitycommons/actions/RandomString.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Generates a random alphanumeric string of the desired length. - */ -public class RandomString extends UserAction -{ - private final java.lang.Long length; - - public RandomString( - IContext context, - java.lang.Long _length - ) - { - super(context); - this.length = _length; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.randomString(length.intValue()); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "RandomString"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/RandomStrongPassword.java b/javasource/communitycommons/actions/RandomStrongPassword.java deleted file mode 100644 index 8c8ef81..0000000 --- a/javasource/communitycommons/actions/RandomStrongPassword.java +++ /dev/null @@ -1,80 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns a random strong password containing a specified minimum number of digits, uppercase and special characters. - * - * Note:Minimumlength should be equal or larger than NrOfCapitalizedCharacters, NrOfDigits and NrOfSpecialCharacters - */ -public class RandomStrongPassword extends UserAction -{ - private final java.lang.Long MinLength; - private final java.lang.Long MaxLength; - private final java.lang.Long NrOfCapitalizedCharacters; - private final java.lang.Long NrOfDigits; - private final java.lang.Long NrOfSpecialCharacters; - - public RandomStrongPassword( - IContext context, - java.lang.Long _minLength, - java.lang.Long _maxLength, - java.lang.Long _nrOfCapitalizedCharacters, - java.lang.Long _nrOfDigits, - java.lang.Long _nrOfSpecialCharacters - ) - { - super(context); - this.MinLength = _minLength; - this.MaxLength = _maxLength; - this.NrOfCapitalizedCharacters = _nrOfCapitalizedCharacters; - this.NrOfDigits = _nrOfDigits; - this.NrOfSpecialCharacters = _nrOfSpecialCharacters; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.randomStrongPassword( - safeLongToInt(MinLength), - safeLongToInt(MaxLength), - safeLongToInt(NrOfCapitalizedCharacters), - 0, - safeLongToInt(NrOfDigits), - safeLongToInt(NrOfSpecialCharacters) - ); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "RandomStrongPassword"; - } - - // BEGIN EXTRA CODE - public static int safeLongToInt(Long l) { - if (l == null) return 0; - if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) { - throw new IllegalArgumentException(l + " cannot be cast to int without changing its value."); - } - return l.intValue(); - } - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/RandomStrongPasswordWithLowercase.java b/javasource/communitycommons/actions/RandomStrongPasswordWithLowercase.java deleted file mode 100644 index 9ddec88..0000000 --- a/javasource/communitycommons/actions/RandomStrongPasswordWithLowercase.java +++ /dev/null @@ -1,83 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns a random strong password containing a specified minimum number of digits, uppercase, lowercase and special characters. - * - * Note:Minimumlength should be equal or larger than NrOfCapitalizedCharacters, NrOfLowercaseCharacters, NrOfDigits and NrOfSpecialCharacters - */ -public class RandomStrongPasswordWithLowercase extends UserAction -{ - private final java.lang.Long MinLength; - private final java.lang.Long MaxLength; - private final java.lang.Long NrOfCapitalizedCharacters; - private final java.lang.Long NrOfLowercaseCharacters; - private final java.lang.Long NrOfDigits; - private final java.lang.Long NrOfSpecialCharacters; - - public RandomStrongPasswordWithLowercase( - IContext context, - java.lang.Long _minLength, - java.lang.Long _maxLength, - java.lang.Long _nrOfCapitalizedCharacters, - java.lang.Long _nrOfLowercaseCharacters, - java.lang.Long _nrOfDigits, - java.lang.Long _nrOfSpecialCharacters - ) - { - super(context); - this.MinLength = _minLength; - this.MaxLength = _maxLength; - this.NrOfCapitalizedCharacters = _nrOfCapitalizedCharacters; - this.NrOfLowercaseCharacters = _nrOfLowercaseCharacters; - this.NrOfDigits = _nrOfDigits; - this.NrOfSpecialCharacters = _nrOfSpecialCharacters; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.randomStrongPassword( - safeLongToInt(MinLength), - safeLongToInt(MaxLength), - safeLongToInt(NrOfCapitalizedCharacters), - safeLongToInt(NrOfLowercaseCharacters), - safeLongToInt(NrOfDigits), - safeLongToInt(NrOfSpecialCharacters) - ); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "RandomStrongPasswordWithLowercase"; - } - - // BEGIN EXTRA CODE - public static int safeLongToInt(Long l) { - if (l == null) return 0; - if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) { - throw new IllegalArgumentException(l + " cannot be cast to int without changing its value."); - } - return l.intValue(); - } - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/RegexQuote.java b/javasource/communitycommons/actions/RegexQuote.java deleted file mode 100644 index 8ad891a..0000000 --- a/javasource/communitycommons/actions/RegexQuote.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Escapes a string value so that it can be used literally with Mendix build-in regex replacement functions. (Otherwise the dollar sign would be interpreted as back reference to a match for example). - */ -public class RegexQuote extends UserAction -{ - private final java.lang.String unquotedLiteral; - - public RegexQuote( - IContext context, - java.lang.String _unquotedLiteral - ) - { - super(context); - this.unquotedLiteral = _unquotedLiteral; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.regexQuote(unquotedLiteral); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "RegexQuote"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/RegexReplaceAll.java b/javasource/communitycommons/actions/RegexReplaceAll.java deleted file mode 100644 index b1bc81a..0000000 --- a/javasource/communitycommons/actions/RegexReplaceAll.java +++ /dev/null @@ -1,64 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Performs a regular expression. Similar to the replaceAll microflow function, but supports more advanced usages such as capture variables. - * - * For the regexp specification see: - * https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html - * - * A decent regexp tester can be found at: - * http://www.fileformat.info/tool/regex.htm - */ -public class RegexReplaceAll extends UserAction -{ - private final java.lang.String haystack; - private final java.lang.String needleRegex; - private final java.lang.String replacement; - - public RegexReplaceAll( - IContext context, - java.lang.String _haystack, - java.lang.String _needleRegex, - java.lang.String _replacement - ) - { - super(context); - this.haystack = _haystack; - this.needleRegex = _needleRegex; - this.replacement = _replacement; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.regexReplaceAll(haystack, needleRegex, replacement); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "RegexReplaceAll"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/RemoveEnd.java b/javasource/communitycommons/actions/RemoveEnd.java deleted file mode 100644 index 64405ed..0000000 --- a/javasource/communitycommons/actions/RemoveEnd.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Removes a string (if present) from the end of an input string, - */ -public class RemoveEnd extends UserAction -{ - private final java.lang.String input; - private final java.lang.String toRemove; - - public RemoveEnd( - IContext context, - java.lang.String _input, - java.lang.String _toRemove - ) - { - super(context); - this.input = _input; - this.toRemove = _toRemove; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.removeEnd(input, toRemove); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "RemoveEnd"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/RunMicroflowAsyncInQueue.java b/javasource/communitycommons/actions/RunMicroflowAsyncInQueue.java deleted file mode 100644 index b644a4e..0000000 --- a/javasource/communitycommons/actions/RunMicroflowAsyncInQueue.java +++ /dev/null @@ -1,54 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Runs a microflow asynchronous, that is, this action immediately returns but schedules the microflow to be run in the near future. The queue guarantees a first come first serve order of the microflows, and only one action is served at a time. - * - * The microflow is run with system rights in its own transaction, and is very useful to run heavy microflows on the background. - */ -public class RunMicroflowAsyncInQueue extends UserAction -{ - private final java.lang.String microflow; - - public RunMicroflowAsyncInQueue( - IContext context, - java.lang.String _microflow - ) - { - super(context); - this.microflow = _microflow; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.runMicroflowAsyncInQueue(microflow); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "RunMicroflowAsyncInQueue"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/StartTransaction.java b/javasource/communitycommons/actions/StartTransaction.java deleted file mode 100644 index 7ed5304..0000000 --- a/javasource/communitycommons/actions/StartTransaction.java +++ /dev/null @@ -1,46 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Start a transaction, if a transaction is already started for this context, a savepoint will be added - */ -public class StartTransaction extends UserAction -{ - public StartTransaction(IContext context) - { - super(context); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - getContext().startTransaction(); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "StartTransaction"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/StringFromFile.java b/javasource/communitycommons/actions/StringFromFile.java deleted file mode 100644 index 6ead981..0000000 --- a/javasource/communitycommons/actions/StringFromFile.java +++ /dev/null @@ -1,65 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.StringUtils; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Reads the contents form the provided file document, using the specified encoding, and returns it as string. - */ -public class StringFromFile extends UserAction -{ - /** @deprecated use source.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __source; - private final system.proxies.FileDocument source; - private final communitycommons.proxies.StandardEncodings encoding; - - public StringFromFile( - IContext context, - IMendixObject _source, - java.lang.String _encoding - ) - { - super(context); - this.__source = _source; - this.source = _source == null ? null : system.proxies.FileDocument.initialize(getContext(), _source); - this.encoding = _encoding == null ? null : communitycommons.proxies.StandardEncodings.valueOf(_encoding); - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - Charset charset = StandardCharsets.UTF_8; - if (this.encoding != null) - charset = Charset.forName(this.encoding.name().replace('_', '-')); - return StringUtils.stringFromFile(getContext(), source, charset); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "StringFromFile"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/StringLeftPad.java b/javasource/communitycommons/actions/StringLeftPad.java deleted file mode 100644 index e3cbb91..0000000 --- a/javasource/communitycommons/actions/StringLeftPad.java +++ /dev/null @@ -1,64 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Pads a string on the left to a certain length. - * value : the original value - * amount: the desired length of the resulting string. - * fillCharacter: the character to pad with. (or space if empty) - * - * For example - * StringLeftPad("hello", 8, "-") returns "---hello" - * StringLeftPad("hello", 2, "-") returns "hello" - */ -public class StringLeftPad extends UserAction -{ - private final java.lang.String value; - private final java.lang.Long amount; - private final java.lang.String fillCharacter; - - public StringLeftPad( - IContext context, - java.lang.String _value, - java.lang.Long _amount, - java.lang.String _fillCharacter - ) - { - super(context); - this.value = _value; - this.amount = _amount; - this.fillCharacter = _fillCharacter; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return communitycommons.StringUtils.leftPad(value, amount, fillCharacter); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "StringLeftPad"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/StringRightPad.java b/javasource/communitycommons/actions/StringRightPad.java deleted file mode 100644 index eeb00fb..0000000 --- a/javasource/communitycommons/actions/StringRightPad.java +++ /dev/null @@ -1,64 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Pads a string on the right to a certain length. - * value : the original value - * amount: the desired length of the resulting string. - * fillCharacter: the character to pad with. (or space if empty) - * - * For example - * StringRightPad("hello", 8, "-") returns "hello---" - * StringLeftpad("hello", 2, "-") returns "hello" - */ -public class StringRightPad extends UserAction -{ - private final java.lang.String value; - private final java.lang.Long amount; - private final java.lang.String fillCharacter; - - public StringRightPad( - IContext context, - java.lang.String _value, - java.lang.Long _amount, - java.lang.String _fillCharacter - ) - { - super(context); - this.value = _value; - this.amount = _amount; - this.fillCharacter = _fillCharacter; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return communitycommons.StringUtils.rightPad(value, amount, fillCharacter); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "StringRightPad"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/StringSimplify.java b/javasource/communitycommons/actions/StringSimplify.java deleted file mode 100644 index 1889ed8..0000000 --- a/javasource/communitycommons/actions/StringSimplify.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Remove diacritics from a string. - */ -public class StringSimplify extends UserAction -{ - private final java.lang.String value; - - public StringSimplify( - IContext context, - java.lang.String _value - ) - { - super(context); - this.value = _value; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.stringSimplify(this.value); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "StringSimplify"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/StringSplit.java b/javasource/communitycommons/actions/StringSplit.java deleted file mode 100644 index ac8604a..0000000 --- a/javasource/communitycommons/actions/StringSplit.java +++ /dev/null @@ -1,66 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import java.util.ArrayList; -import java.util.List; -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.proxies.SplitItem; -import com.mendix.systemwideinterfaces.core.UserAction; - -public class StringSplit extends UserAction> -{ - private final java.lang.String inputString; - private final java.lang.String splitParameter; - - public StringSplit( - IContext context, - java.lang.String _inputString, - java.lang.String _splitParameter - ) - { - super(context); - this.inputString = _inputString; - this.splitParameter = _splitParameter; - } - - @java.lang.Override - public java.util.List executeAction() throws Exception - { - // BEGIN USER CODE - List returnList = new ArrayList(); - String[] parts = this.inputString.split(this.splitParameter); - Integer index = 0; - for (String part : parts) { - IMendixObject splitPart = Core.instantiate(getContext(), SplitItem.getType()); - splitPart.setValue(getContext(), SplitItem.MemberNames.Value.toString(), part); - splitPart.setValue(getContext(), SplitItem.MemberNames.Index.toString(), index); - returnList.add(splitPart); - index = index + 1; - } - return returnList; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "StringSplit"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/StringToFile.java b/javasource/communitycommons/actions/StringToFile.java deleted file mode 100644 index ec76e71..0000000 --- a/javasource/communitycommons/actions/StringToFile.java +++ /dev/null @@ -1,70 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.StringUtils; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Stores a string into the provided FileDocument, using the specified encoding. - * Note that destination will be committed. - */ -public class StringToFile extends UserAction -{ - private final java.lang.String value; - /** @deprecated use destination.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __destination; - private final system.proxies.FileDocument destination; - private final communitycommons.proxies.StandardEncodings encoding; - - public StringToFile( - IContext context, - java.lang.String _value, - IMendixObject _destination, - java.lang.String _encoding - ) - { - super(context); - this.value = _value; - this.__destination = _destination; - this.destination = _destination == null ? null : system.proxies.FileDocument.initialize(getContext(), _destination); - this.encoding = _encoding == null ? null : communitycommons.proxies.StandardEncodings.valueOf(_encoding); - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - Charset charset = StandardCharsets.UTF_8; - if (this.encoding != null) - charset = Charset.forName(this.encoding.name().replace('_', '-')); - StringUtils.stringToFile(getContext(), value, destination, charset); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "StringToFile"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/StringTrim.java b/javasource/communitycommons/actions/StringTrim.java deleted file mode 100644 index f16077b..0000000 --- a/javasource/communitycommons/actions/StringTrim.java +++ /dev/null @@ -1,54 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Left and right trims a string (that is; removes all surrounding whitespace characters such as tabs, spaces and returns). - * Returns the empty string if value is the empty value. Returns the trimmed string otherwise. - */ -public class StringTrim extends UserAction -{ - private final java.lang.String value; - - public StringTrim( - IContext context, - java.lang.String _value - ) - { - super(context); - this.value = _value; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - if (this.value == null) - return ""; - return this.value.trim(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "StringTrim"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/SubstituteTemplate.java b/javasource/communitycommons/actions/SubstituteTemplate.java deleted file mode 100644 index a760716..0000000 --- a/javasource/communitycommons/actions/SubstituteTemplate.java +++ /dev/null @@ -1,74 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Given an object and a template, substitutes all fields in the template. Supports attributes, references, referencesets and constants. - * - * The general field syntax is '{fieldname}'. - * - * Fieldname can be a member of the example object, an attribute which need to be retrieved over an reference(set) or a project constant. All paths are relative from the provided substitute obect. An example template: - * ------------------ - * Dear {EmailOrName}, - * - * {System.changedBy/FullName} has invited you to join the project {Module.MemberShip_Project/Name}. - * Sign up is free and can be done here: - * {@Module.PublicURL}link/Signup - * ------------------------- - * - * useHTMLEncoding identifies whether HTMLEncode is applied to the values before substituting. - * - * datetimeformat identifies a format string which is applied to date/time based attributes. Can be left empty. Defaults to "EEE dd MMM yyyy, HH:mm" - */ -public class SubstituteTemplate extends UserAction -{ - private final java.lang.String template; - private final IMendixObject substitute; - private final java.lang.Boolean useHTMLEncoding; - - public SubstituteTemplate( - IContext context, - java.lang.String _template, - IMendixObject _substitute, - java.lang.Boolean _useHTMLEncoding - ) - { - super(context); - this.template = _template; - this.substitute = _substitute; - this.useHTMLEncoding = _useHTMLEncoding; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.substituteTemplate(this.getContext(), template, substitute, useHTMLEncoding, null); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "SubstituteTemplate"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/SubstituteTemplate2.java b/javasource/communitycommons/actions/SubstituteTemplate2.java deleted file mode 100644 index 5dd4901..0000000 --- a/javasource/communitycommons/actions/SubstituteTemplate2.java +++ /dev/null @@ -1,64 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Identical to SubstituteTemplate, but adds an datetimeformat argument - * - * DateTimeFormat identifies a format string which is applied to date/time based attributes. Can be left empty. Defaults to "EEE dd MMM yyyy, HH:mm" - */ -public class SubstituteTemplate2 extends UserAction -{ - private final java.lang.String template; - private final IMendixObject substitute; - private final java.lang.Boolean useHTMLEncoding; - private final java.lang.String datetimeformat; - - public SubstituteTemplate2( - IContext context, - java.lang.String _template, - IMendixObject _substitute, - java.lang.Boolean _useHTMLEncoding, - java.lang.String _datetimeformat - ) - { - super(context); - this.template = _template; - this.substitute = _substitute; - this.useHTMLEncoding = _useHTMLEncoding; - this.datetimeformat = _datetimeformat; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.substituteTemplate(this.getContext(), template, substitute, useHTMLEncoding, this.datetimeformat); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "SubstituteTemplate2"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/SubstringAfter.java b/javasource/communitycommons/actions/SubstringAfter.java deleted file mode 100644 index 01e0766..0000000 --- a/javasource/communitycommons/actions/SubstringAfter.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Gets the substring after the first occurrence of a separator. - */ -public class SubstringAfter extends UserAction -{ - private final java.lang.String str; - private final java.lang.String separator; - - public SubstringAfter( - IContext context, - java.lang.String _str, - java.lang.String _separator - ) - { - super(context); - this.str = _str; - this.separator = _separator; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.substringAfter(str, separator); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "SubstringAfter"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/SubstringAfterLast.java b/javasource/communitycommons/actions/SubstringAfterLast.java deleted file mode 100644 index 53fdf2e..0000000 --- a/javasource/communitycommons/actions/SubstringAfterLast.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Gets the substring after the last occurrence of a separator. - */ -public class SubstringAfterLast extends UserAction -{ - private final java.lang.String str; - private final java.lang.String separator; - - public SubstringAfterLast( - IContext context, - java.lang.String _str, - java.lang.String _separator - ) - { - super(context); - this.str = _str; - this.separator = _separator; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.substringAfterLast(str, separator); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "SubstringAfterLast"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/SubstringBefore.java b/javasource/communitycommons/actions/SubstringBefore.java deleted file mode 100644 index 48b93cb..0000000 --- a/javasource/communitycommons/actions/SubstringBefore.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Gets the substring before the first occurrence of a separator. - */ -public class SubstringBefore extends UserAction -{ - private final java.lang.String str; - private final java.lang.String separator; - - public SubstringBefore( - IContext context, - java.lang.String _str, - java.lang.String _separator - ) - { - super(context); - this.str = _str; - this.separator = _separator; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.substringBefore(str, separator); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "SubstringBefore"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/SubstringBeforeLast.java b/javasource/communitycommons/actions/SubstringBeforeLast.java deleted file mode 100644 index cb2f797..0000000 --- a/javasource/communitycommons/actions/SubstringBeforeLast.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Gets the substring before the last occurrence of a separator. - */ -public class SubstringBeforeLast extends UserAction -{ - private final java.lang.String str; - private final java.lang.String separator; - - public SubstringBeforeLast( - IContext context, - java.lang.String _str, - java.lang.String _separator - ) - { - super(context); - this.str = _str; - this.separator = _separator; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return StringUtils.substringBeforeLast(str, separator); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "SubstringBeforeLast"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/ThrowException.java b/javasource/communitycommons/actions/ThrowException.java deleted file mode 100644 index 26a8276..0000000 --- a/javasource/communitycommons/actions/ThrowException.java +++ /dev/null @@ -1,57 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * This action always throws an exception (of type communityutils.UserThrownError), which is, in combination with custom error handling, quite useful to end a microflow prematurely or to bail out to the calling action/ microflow. - * - * The message of the last thrown error can be inspected by using the variable $lasterrormessage - * - * Example usuage: In general, if an Event (before commit especially) returns false, it should call this action and then return true instead. If an Before commit returns false, the object will not be committed, but there is no easy way for the calling Microflow/ action to detect this! An exception on the other hand, will be noticed. - */ -public class ThrowException extends UserAction -{ - private final java.lang.String message; - - public ThrowException( - IContext context, - java.lang.String _message - ) - { - super(context); - this.message = _message; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - Misc.throwException(message); - return null; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "ThrowException"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/ThrowWebserviceException.java b/javasource/communitycommons/actions/ThrowWebserviceException.java deleted file mode 100644 index 720e7c7..0000000 --- a/javasource/communitycommons/actions/ThrowWebserviceException.java +++ /dev/null @@ -1,57 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * (Behavior has changed since version 3.2. The exception is now properly propagated to the cient). - * - * Throws an exception. This is very useful if the microflow is called by a webservice. If you throw this kind of exceptions, an fault message will be generated in the output, instead of an '501 Internal server' error. - * - * If debug level of community commons is set to 'debug' the errors will be locally visible as well, otherwise not. Throwing a webservice exception states that the webservice invocation was incorrect, not the webservice implementation. - */ -public class ThrowWebserviceException extends UserAction -{ - private final java.lang.String faultstring; - - public ThrowWebserviceException( - IContext context, - java.lang.String _faultstring - ) - { - super(context); - this.faultstring = _faultstring; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - Misc.throwWebserviceException(faultstring); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "ThrowWebserviceException"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/TimeMeasureEnd.java b/javasource/communitycommons/actions/TimeMeasureEnd.java deleted file mode 100644 index 6a92954..0000000 --- a/javasource/communitycommons/actions/TimeMeasureEnd.java +++ /dev/null @@ -1,61 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Logging; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * End timing something, and print the result to the log. - * - TimerName. Should correspond to the TimerName used with TimeMeasureStart. - * - LogLevel. The loglevel used to print the result. - * - The message to be printed in the log. - */ -public class TimeMeasureEnd extends UserAction -{ - private final java.lang.String TimerName; - private final communitycommons.proxies.LogLevel Loglevel; - private final java.lang.String message; - - public TimeMeasureEnd( - IContext context, - java.lang.String _timerName, - java.lang.String _loglevel, - java.lang.String _message - ) - { - super(context); - this.TimerName = _timerName; - this.Loglevel = _loglevel == null ? null : communitycommons.proxies.LogLevel.valueOf(_loglevel); - this.message = _message; - } - - @java.lang.Override - public java.lang.Long executeAction() throws Exception - { - // BEGIN USER CODE - return Logging.measureEnd(TimerName, Loglevel, message); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "TimeMeasureEnd"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/TimeMeasureStart.java b/javasource/communitycommons/actions/TimeMeasureStart.java deleted file mode 100644 index e485a79..0000000 --- a/javasource/communitycommons/actions/TimeMeasureStart.java +++ /dev/null @@ -1,56 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Logging; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Start timing something, and print the result to the log. - * - TimerName. Should correspond to the TimerName used in TimeMeasureEnd. - * - * Note that multiple timers can run at once. Existing timers can be restarted using this function as well. - */ -public class TimeMeasureStart extends UserAction -{ - private final java.lang.String TimerName; - - public TimeMeasureStart( - IContext context, - java.lang.String _timerName - ) - { - super(context); - this.TimerName = _timerName; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - Logging.measureStart(TimerName); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "TimeMeasureStart"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/XSSSanitize.java b/javasource/communitycommons/actions/XSSSanitize.java deleted file mode 100644 index 3a147e6..0000000 --- a/javasource/communitycommons/actions/XSSSanitize.java +++ /dev/null @@ -1,104 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.MendixRuntimeException; -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.proxies.SanitizerPolicy; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.apache.commons.lang3.StringUtils; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Removes all potential dangerous HTML from a string so that it can be safely displayed in a browser. - * - * This function should be applied to all HTML which is displayed in the browser, and can be entered by (untrusted) users. - * - * - HTML: The html to sanitize - * - policy1... policy6: one or more values of SanitizerPolicy. You may leave these policy parameters empty if you don't want to allow additional elements. - * - * BLOCKS: Allows common block elements including

,

, etc. - * FORMATTING: Allows common formatting elements including , , etc. - * IMAGES: Allows elements from HTTP, HTTPS, and relative sources. - * LINKS: Allows HTTP, HTTPS, MAILTO and relative links - * STYLES: Allows certain safe CSS properties in style="..." attributes. - * TABLES: Allows commons table elements. - * - * For more information, visit: - * - * http://javadoc.io/doc/com.googlecode.owasp-java-html-sanitizer/owasp-java-html-sanitizer/20180219.1 - */ -public class XSSSanitize extends UserAction -{ - private final java.lang.String html; - private final communitycommons.proxies.SanitizerPolicy policy1; - private final communitycommons.proxies.SanitizerPolicy policy2; - private final communitycommons.proxies.SanitizerPolicy policy3; - private final communitycommons.proxies.SanitizerPolicy policy4; - private final communitycommons.proxies.SanitizerPolicy policy5; - private final communitycommons.proxies.SanitizerPolicy policy6; - - public XSSSanitize( - IContext context, - java.lang.String _html, - java.lang.String _policy1, - java.lang.String _policy2, - java.lang.String _policy3, - java.lang.String _policy4, - java.lang.String _policy5, - java.lang.String _policy6 - ) - { - super(context); - this.html = _html; - this.policy1 = _policy1 == null ? null : communitycommons.proxies.SanitizerPolicy.valueOf(_policy1); - this.policy2 = _policy2 == null ? null : communitycommons.proxies.SanitizerPolicy.valueOf(_policy2); - this.policy3 = _policy3 == null ? null : communitycommons.proxies.SanitizerPolicy.valueOf(_policy3); - this.policy4 = _policy4 == null ? null : communitycommons.proxies.SanitizerPolicy.valueOf(_policy4); - this.policy5 = _policy5 == null ? null : communitycommons.proxies.SanitizerPolicy.valueOf(_policy5); - this.policy6 = _policy6 == null ? null : communitycommons.proxies.SanitizerPolicy.valueOf(_policy6); - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - if (StringUtils.isEmpty(html)) { - return ""; - } - - List policyParams = Stream.of(policy1, policy2, policy3, policy4, policy5, policy6) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - - if (policyParams.isEmpty()) { - throw new MendixRuntimeException("At least one policy is required"); - } - - return communitycommons.StringUtils.sanitizeHTML(html, policyParams); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "XSSSanitize"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/YearsBetween.java b/javasource/communitycommons/actions/YearsBetween.java deleted file mode 100644 index cd1cd38..0000000 --- a/javasource/communitycommons/actions/YearsBetween.java +++ /dev/null @@ -1,67 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.DateTime; -import communitycommons.Logging; -import communitycommons.proxies.LogLevel; -import communitycommons.proxies.LogNodes; -import java.util.Date; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Calculates the number of years between two dates. - * - dateTime : the original (oldest) dateTime - * - compareDate: the second date. If EMPTY, the current datetime will be used. Effectively this means that the age of the dateTime is calculated. - */ -public class YearsBetween extends UserAction -{ - private final java.util.Date dateTime; - private final java.util.Date compareDate; - - public YearsBetween( - IContext context, - java.util.Date _dateTime, - java.util.Date _compareDate - ) - { - super(context); - this.dateTime = _dateTime; - this.compareDate = _compareDate; - } - - @java.lang.Override - public java.lang.Long executeAction() throws Exception - { - // BEGIN USER CODE - try { - return Long.valueOf(DateTime.periodBetween(this.dateTime, compareDate == null ? new Date() : compareDate) - .getYears()); - } catch (Exception e) { - Logging.log(LogNodes.CommunityCommons.name(), LogLevel.Warning, "DateTime calculation error, returning -1", e); - return -1L; - } - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "YearsBetween"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/commitInSeparateDatabaseTransaction.java b/javasource/communitycommons/actions/commitInSeparateDatabaseTransaction.java deleted file mode 100644 index 3f9324e..0000000 --- a/javasource/communitycommons/actions/commitInSeparateDatabaseTransaction.java +++ /dev/null @@ -1,62 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.core.Core; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.ISession; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * This function commits an object in a seperate context and transaction, making sure it gets persisted in the database (regarding which exception happens after invocation). - * - * Please note that this action is prone to deadlock. For example if you commit an object in one transaction and then use this action to commit the same object in a separate transaction. We do not recommend the use of this action. - * - * - */ -public class commitInSeparateDatabaseTransaction extends UserAction -{ - private final IMendixObject mxObject; - - public commitInSeparateDatabaseTransaction( - IContext context, - IMendixObject _mxObject - ) - { - super(context); - this.mxObject = _mxObject; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - ISession session = getContext().getSession(); - IContext newContext = session.createContext(); - Core.commit(newContext, mxObject); - newContext.endTransaction(); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "commitInSeparateDatabaseTransaction"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/commitWithoutEvents.java b/javasource/communitycommons/actions/commitWithoutEvents.java deleted file mode 100644 index 8329dba..0000000 --- a/javasource/communitycommons/actions/commitWithoutEvents.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Commits an object, but without events. - * - * N.B. This function is not very useful when called from the model, but it is useful when called from custom Java code. - */ -public class commitWithoutEvents extends UserAction -{ - private final IMendixObject subject; - - public commitWithoutEvents( - IContext context, - IMendixObject _subject - ) - { - super(context); - this.subject = _subject; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.commitWithoutEvents(this.getContext(), subject); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "commitWithoutEvents"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/copyAttributes.java b/javasource/communitycommons/actions/copyAttributes.java deleted file mode 100644 index 1469f25..0000000 --- a/javasource/communitycommons/actions/copyAttributes.java +++ /dev/null @@ -1,59 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Copies all common primitive attributes from source to target, which are not necessarily of the same type. This is useful to, for example, translate database object into view objects. - * - * Note that no automatic type conversion is done. - */ -public class copyAttributes extends UserAction -{ - private final IMendixObject source; - private final IMendixObject target; - - public copyAttributes( - IContext context, - IMendixObject _source, - IMendixObject _target - ) - { - super(context); - this.source = _source; - this.target = _target; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - ORM.copyAttributes(getContext(), source, target); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "copyAttributes"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/deleteAll.java b/javasource/communitycommons/actions/deleteAll.java deleted file mode 100644 index a1a3dfa..0000000 --- a/javasource/communitycommons/actions/deleteAll.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.XPath; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Removes ALL instances of a certain domain object type using batches. - */ -public class deleteAll extends UserAction -{ - private final java.lang.String entityType; - - public deleteAll( - IContext context, - java.lang.String _entityType - ) - { - super(context); - this.entityType = _entityType; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return XPath.create(this.getContext(), entityType).deleteAll(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "deleteAll"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeMicroflowAsUser.java b/javasource/communitycommons/actions/executeMicroflowAsUser.java deleted file mode 100644 index 18994f5..0000000 --- a/javasource/communitycommons/actions/executeMicroflowAsUser.java +++ /dev/null @@ -1,63 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Executes the given microflow as if the $currentuser is the provided user (delegation). Use sudoContext to determine if 'apply entity access' should be used - * - * - microflowName: the fully qualified microflow name, 'CommunityCommons.CreateUserIfNotExists' - * - username: The user that should be used to execute the microflow - * - sudoContext: whether entity access should be applied. - */ -public class executeMicroflowAsUser extends UserAction -{ - private final java.lang.String microflow; - private final java.lang.String username; - private final java.lang.Boolean sudoContext; - - public executeMicroflowAsUser( - IContext context, - java.lang.String _microflow, - java.lang.String _username, - java.lang.Boolean _sudoContext - ) - { - super(context); - this.microflow = _microflow; - this.username = _username; - this.sudoContext = _sudoContext; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - Object res = Misc.executeMicroflowAsUser(getContext(), microflow, username, sudoContext); - return res == null ? null : res.toString(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeMicroflowAsUser"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeMicroflowAsUser_1.java b/javasource/communitycommons/actions/executeMicroflowAsUser_1.java deleted file mode 100644 index dce9499..0000000 --- a/javasource/communitycommons/actions/executeMicroflowAsUser_1.java +++ /dev/null @@ -1,66 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Identical to executeMicroflowAsUser, but takes 1 argument - */ -public class executeMicroflowAsUser_1 extends UserAction -{ - private final java.lang.String microflow; - private final java.lang.String username; - private final java.lang.Boolean sudoContext; - private final java.lang.String arg1name; - private final IMendixObject arg1value; - - public executeMicroflowAsUser_1( - IContext context, - java.lang.String _microflow, - java.lang.String _username, - java.lang.Boolean _sudoContext, - java.lang.String _arg1name, - IMendixObject _arg1value - ) - { - super(context); - this.microflow = _microflow; - this.username = _username; - this.sudoContext = _sudoContext; - this.arg1name = _arg1name; - this.arg1value = _arg1value; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - Object res = Misc.executeMicroflowAsUser(getContext(), microflow, username, sudoContext, arg1name, arg1value); - return res == null ? null : res.toString(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeMicroflowAsUser_1"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeMicroflowAsUser_2.java b/javasource/communitycommons/actions/executeMicroflowAsUser_2.java deleted file mode 100644 index c046206..0000000 --- a/javasource/communitycommons/actions/executeMicroflowAsUser_2.java +++ /dev/null @@ -1,72 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Identical to executeMicroflowAsUser, but takes 2 arguments - */ -public class executeMicroflowAsUser_2 extends UserAction -{ - private final java.lang.String microflow; - private final java.lang.String username; - private final java.lang.Boolean sudoContext; - private final java.lang.String arg1name; - private final IMendixObject arg1value; - private final java.lang.String arg2name; - private final IMendixObject arg2value; - - public executeMicroflowAsUser_2( - IContext context, - java.lang.String _microflow, - java.lang.String _username, - java.lang.Boolean _sudoContext, - java.lang.String _arg1name, - IMendixObject _arg1value, - java.lang.String _arg2name, - IMendixObject _arg2value - ) - { - super(context); - this.microflow = _microflow; - this.username = _username; - this.sudoContext = _sudoContext; - this.arg1name = _arg1name; - this.arg1value = _arg1value; - this.arg2name = _arg2name; - this.arg2value = _arg2value; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - Object res = Misc.executeMicroflowAsUser(getContext(), microflow, username, sudoContext, arg1name, arg1value, arg2name, arg2value); - return res == null ? null : res.toString(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeMicroflowAsUser_2"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeMicroflowInBackground.java b/javasource/communitycommons/actions/executeMicroflowInBackground.java deleted file mode 100644 index 733093d..0000000 --- a/javasource/communitycommons/actions/executeMicroflowInBackground.java +++ /dev/null @@ -1,68 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * This action allows an microflow to be executed independently from this microflow. - * This function is identical to "RunMicroflowAsyncInQueue", except that it takes one argument which will be passed to the microflow being called. - * - * This might be useful to model for example your own batching system, or to run a microflow in its own (system) transaction. The microflow is delayed for at least 200ms and then run with low priority in a system context. Since the microflow run in its own transaction, it is not affected with rollbacks (due to exceptions) or commits in this microflow. - * - * Invocations to this method are guaranteed to be run in FIFO order, only one microflow is run at a time. - * - * Note that since the microflow is run as system transaction, $currentUser is not available and no security restrictions are applied. - * - * - The microflowname specifies the fully qualified name of the microflow (case sensitive) e.g.: 'MyFirstModule.MyFirstMicroflow'. - * - The context object specifies an argument that should be passed to the microflow if applicable. Currently only zero or one argument are supported. Note that editing this object in both microflows might lead to unexpected behavior. - * - * Returns true if scheduled successfully. - */ -public class executeMicroflowInBackground extends UserAction -{ - private final java.lang.String microflow; - private final IMendixObject contextObject; - - public executeMicroflowInBackground( - IContext context, - java.lang.String _microflow, - IMendixObject _contextObject - ) - { - super(context); - this.microflow = _microflow; - this.contextObject = _contextObject; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.runMicroflowInBackground(getContext(), microflow, contextObject); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeMicroflowInBackground"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeMicroflowInBatches.java b/javasource/communitycommons/actions/executeMicroflowInBatches.java deleted file mode 100644 index 164a610..0000000 --- a/javasource/communitycommons/actions/executeMicroflowInBatches.java +++ /dev/null @@ -1,79 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Invokes a microflow in batches. The microflow is invoked for each individual item returned by the xpath query. - * - * The objects will be processed in small batches (based on the batchsize), which makes this function very useful to process large amounts of objects without using much memory. All defaut behavior such as commit events are applied as defined in your microflow. - * - * Parameters: - * - xpath: Fully qualified xpath query that indicates the set of objects the microflow should be invoked on. For example: - * '//System.User[Active = true()]' - * - microflow: The microflow that should be invoked. Should accept one argument of the same type as the xpath. For example: - * 'MyFirstModule.UpdateBirthday' - * - batchsize: The amount of objects that should be processed in a single transaction. When in doubt, 1 is fine, but larger batches (for example; 100) will be faster due to less overhead. - * - waitUntilFinished: Whether this call should block (wait) until all objects are - * processed. - * - * Returns true if the batch has successfully started, or, if waitUntilFinished is true, returns true if the batch succeeded completely. - * - * Note, if new objects are added to the dataset while the batch is still running, those objects will be processed as well. - */ -public class executeMicroflowInBatches extends UserAction -{ - private final java.lang.String xpath; - private final java.lang.String microflow; - private final java.lang.Long batchsize; - private final java.lang.Boolean waitUntilFinished; - private final java.lang.Boolean ascending; - - public executeMicroflowInBatches( - IContext context, - java.lang.String _xpath, - java.lang.String _microflow, - java.lang.Long _batchsize, - java.lang.Boolean _waitUntilFinished, - java.lang.Boolean _ascending - ) - { - super(context); - this.xpath = _xpath; - this.microflow = _microflow; - this.batchsize = _batchsize; - this.waitUntilFinished = _waitUntilFinished; - this.ascending = _ascending; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.executeMicroflowInBatches(xpath, microflow, batchsize.intValue(), waitUntilFinished.booleanValue(), ascending); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeMicroflowInBatches"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser.java b/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser.java deleted file mode 100644 index a2f783d..0000000 --- a/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser.java +++ /dev/null @@ -1,63 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Executes the given microflow as if the $currentuser is the provided user (delegation). Use sudoContext to determine if 'apply entity access' should be used - * - * - microflowName: the fully qualified microflow name, 'CommunityCommons.CreateUserIfNotExists' - * - username: The user that should be used to execute the microflow - * - sudoContext: whether entity access should be applied. - */ -public class executeUnverifiedMicroflowAsUser extends UserAction -{ - private final java.lang.String microflowName; - private final java.lang.String username; - private final java.lang.Boolean sudoContext; - - public executeUnverifiedMicroflowAsUser( - IContext context, - java.lang.String _microflowName, - java.lang.String _username, - java.lang.Boolean _sudoContext - ) - { - super(context); - this.microflowName = _microflowName; - this.username = _username; - this.sudoContext = _sudoContext; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - Object res = Misc.executeMicroflowAsUser(getContext(), microflowName, username, sudoContext); - return res == null ? null : res.toString(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeUnverifiedMicroflowAsUser"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser_1.java b/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser_1.java deleted file mode 100644 index ff23314..0000000 --- a/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser_1.java +++ /dev/null @@ -1,66 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Identical to executeMicroflowAsUser, but takes 1 argument - */ -public class executeUnverifiedMicroflowAsUser_1 extends UserAction -{ - private final java.lang.String microflowName; - private final java.lang.String username; - private final java.lang.Boolean sudoContext; - private final java.lang.String arg1name; - private final IMendixObject arg1value; - - public executeUnverifiedMicroflowAsUser_1( - IContext context, - java.lang.String _microflowName, - java.lang.String _username, - java.lang.Boolean _sudoContext, - java.lang.String _arg1name, - IMendixObject _arg1value - ) - { - super(context); - this.microflowName = _microflowName; - this.username = _username; - this.sudoContext = _sudoContext; - this.arg1name = _arg1name; - this.arg1value = _arg1value; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - Object res = Misc.executeMicroflowAsUser(getContext(), microflowName, username, sudoContext, arg1name, arg1value); - return res == null ? null : res.toString(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeUnverifiedMicroflowAsUser_1"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser_2.java b/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser_2.java deleted file mode 100644 index a788646..0000000 --- a/javasource/communitycommons/actions/executeUnverifiedMicroflowAsUser_2.java +++ /dev/null @@ -1,72 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Identical to executeMicroflowAsUser, but takes 2 arguments - */ -public class executeUnverifiedMicroflowAsUser_2 extends UserAction -{ - private final java.lang.String microflowName; - private final java.lang.String username; - private final java.lang.Boolean sudoContext; - private final java.lang.String arg1name; - private final IMendixObject arg1value; - private final java.lang.String arg2name; - private final IMendixObject arg2value; - - public executeUnverifiedMicroflowAsUser_2( - IContext context, - java.lang.String _microflowName, - java.lang.String _username, - java.lang.Boolean _sudoContext, - java.lang.String _arg1name, - IMendixObject _arg1value, - java.lang.String _arg2name, - IMendixObject _arg2value - ) - { - super(context); - this.microflowName = _microflowName; - this.username = _username; - this.sudoContext = _sudoContext; - this.arg1name = _arg1name; - this.arg1value = _arg1value; - this.arg2name = _arg2name; - this.arg2value = _arg2value; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - Object res = Misc.executeMicroflowAsUser(getContext(), microflowName, username, sudoContext, arg1name, arg1value, arg2name, arg2value); - return res == null ? null : res.toString(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeUnverifiedMicroflowAsUser_2"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeUnverifiedMicroflowInBackground.java b/javasource/communitycommons/actions/executeUnverifiedMicroflowInBackground.java deleted file mode 100644 index 8309214..0000000 --- a/javasource/communitycommons/actions/executeUnverifiedMicroflowInBackground.java +++ /dev/null @@ -1,68 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * This action allows an microflow to be executed independently from this microflow. - * This function is identical to "RunMicroflowAsyncInQueue", except that it takes one argument which will be passed to the microflow being called. - * - * This might be useful to model for example your own batching system, or to run a microflow in its own (system) transaction. The microflow is delayed for at least 200ms and then run with low priority in a system context. Since the microflow run in its own transaction, it is not affected with rollbacks (due to exceptions) or commits in this microflow. - * - * Invocations to this method are guaranteed to be run in FIFO order, only one microflow is run at a time. - * - * Note that since the microflow is run as system transaction, $currentUser is not available and no security restrictions are applied. - * - * - The microflowname specifies the fully qualified name of the microflow (case sensitive) e.g.: 'MyFirstModule.MyFirstMicroflow'. - * - The context object specifies an argument that should be passed to the microflow if applicable. Currently only zero or one argument are supported. Note that editing this object in both microflows might lead to unexpected behavior. - * - * Returns true if scheduled successfully. - */ -public class executeUnverifiedMicroflowInBackground extends UserAction -{ - private final java.lang.String microflowName; - private final IMendixObject contextObject; - - public executeUnverifiedMicroflowInBackground( - IContext context, - java.lang.String _microflowName, - IMendixObject _contextObject - ) - { - super(context); - this.microflowName = _microflowName; - this.contextObject = _contextObject; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.runMicroflowInBackground(getContext(), microflowName, contextObject); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeUnverifiedMicroflowInBackground"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/executeUnverifiedMicroflowInBatches.java b/javasource/communitycommons/actions/executeUnverifiedMicroflowInBatches.java deleted file mode 100644 index 3ed89f6..0000000 --- a/javasource/communitycommons/actions/executeUnverifiedMicroflowInBatches.java +++ /dev/null @@ -1,79 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Invokes a microflow in batches. The microflow is invoked for each individual item returned by the xpath query. - * - * The objects will be processed in small batches (based on the batchsize), which makes this function very useful to process large amounts of objects without using much memory. All defaut behavior such as commit events are applied as defined in your microflow. - * - * Parameters: - * - xpath: Fully qualified xpath query that indicates the set of objects the microflow should be invoked on. For example: - * '//System.User[Active = true()]' - * - microflow: The microflow that should be invoked. Should accept one argument of the same type as the xpath. For example: - * 'MyFirstModule.UpdateBirthday' - * - batchsize: The amount of objects that should be processed in a single transaction. When in doubt, 1 is fine, but larger batches (for example; 100) will be faster due to less overhead. - * - waitUntilFinished: Whether this call should block (wait) until all objects are - * processed. - * - * Returns true if the batch has successfully started, or, if waitUntilFinished is true, returns true if the batch succeeded completely. - * - * Note, if new objects are added to the dataset while the batch is still running, those objects will be processed as well. - */ -public class executeUnverifiedMicroflowInBatches extends UserAction -{ - private final java.lang.String xpath; - private final java.lang.String microflowName; - private final java.lang.Long batchsize; - private final java.lang.Boolean waitUntilFinished; - private final java.lang.Boolean ascending; - - public executeUnverifiedMicroflowInBatches( - IContext context, - java.lang.String _xpath, - java.lang.String _microflowName, - java.lang.Long _batchsize, - java.lang.Boolean _waitUntilFinished, - java.lang.Boolean _ascending - ) - { - super(context); - this.xpath = _xpath; - this.microflowName = _microflowName; - this.batchsize = _batchsize; - this.waitUntilFinished = _waitUntilFinished; - this.ascending = _ascending; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.executeMicroflowInBatches(xpath, microflowName, batchsize.intValue(), waitUntilFinished.booleanValue(), ascending); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "executeUnverifiedMicroflowInBatches"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/getCreatedByUser.java b/javasource/communitycommons/actions/getCreatedByUser.java deleted file mode 100644 index bac0f00..0000000 --- a/javasource/communitycommons/actions/getCreatedByUser.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the user that created an object - * - * (or empty if not applicable). - */ -public class getCreatedByUser extends UserAction -{ - private final IMendixObject thing; - - public getCreatedByUser( - IContext context, - IMendixObject _thing - ) - { - super(context); - this.thing = _thing; - } - - @java.lang.Override - public IMendixObject executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.getCreatedByUser(getContext(), thing); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "getCreatedByUser"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/getFileSize.java b/javasource/communitycommons/actions/getFileSize.java deleted file mode 100644 index 408b51b..0000000 --- a/javasource/communitycommons/actions/getFileSize.java +++ /dev/null @@ -1,62 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the filesize of a file document in bytes. - * - * From version 2.3 on, this function can be used in cloud environments as well. - * - * NOTE: - * before 2.1, this functioned returned the size in kilobytes, although this documentation mentioned bytes - */ -public class getFileSize extends UserAction -{ - /** @deprecated use document.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __document; - private final system.proxies.FileDocument document; - - public getFileSize( - IContext context, - IMendixObject _document - ) - { - super(context); - this.__document = _document; - this.document = _document == null ? null : system.proxies.FileDocument.initialize(getContext(), _document); - } - - @java.lang.Override - public java.lang.Long executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.getFileSize(this.getContext(), document.getMendixObject()); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "getFileSize"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/getGUID.java b/javasource/communitycommons/actions/getGUID.java deleted file mode 100644 index ce5c1c2..0000000 --- a/javasource/communitycommons/actions/getGUID.java +++ /dev/null @@ -1,53 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * returns the Global Unique Identifier (GUID, or id) of an object. - */ -public class getGUID extends UserAction -{ - private final IMendixObject item; - - public getGUID( - IContext context, - IMendixObject _item - ) - { - super(context); - this.item = _item; - } - - @java.lang.Override - public java.lang.Long executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.getGUID(item); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "getGUID"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/getLastChangedByUser.java b/javasource/communitycommons/actions/getLastChangedByUser.java deleted file mode 100644 index 1d88839..0000000 --- a/javasource/communitycommons/actions/getLastChangedByUser.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the user that last changed this object as System.User - * - * (or empty if not applicable). - */ -public class getLastChangedByUser extends UserAction -{ - private final IMendixObject thing; - - public getLastChangedByUser( - IContext context, - IMendixObject _thing - ) - { - super(context); - this.thing = _thing; - } - - @java.lang.Override - public IMendixObject executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.getLastChangedByUser(getContext(), thing); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "getLastChangedByUser"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/getOriginalValueAsString.java b/javasource/communitycommons/actions/getOriginalValueAsString.java deleted file mode 100644 index e35fccd..0000000 --- a/javasource/communitycommons/actions/getOriginalValueAsString.java +++ /dev/null @@ -1,62 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the original value of an object member, that is, the last committed value. - * - * This is useful if you want to compare the actual value with the last stored value. - * - item : the object of which you want to inspect a member - * - member: the member to retrieve the previous value from. Note that for references, the module name needs to be included. - * - * The function is applicable for non-String members as well, but always returns a String representation of the previous value. - */ -public class getOriginalValueAsString extends UserAction -{ - private final IMendixObject item; - private final java.lang.String member; - - public getOriginalValueAsString( - IContext context, - IMendixObject _item, - java.lang.String _member - ) - { - super(context); - this.item = _item; - this.member = _member; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.getOriginalValueAsString(this.getContext(), item, member); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "getOriginalValueAsString"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/getTypeAsString.java b/javasource/communitycommons/actions/getTypeAsString.java deleted file mode 100644 index 52497e4..0000000 --- a/javasource/communitycommons/actions/getTypeAsString.java +++ /dev/null @@ -1,54 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns the actual type of an Entity. Useful as alternative way to split upon inheritance, or as input of other functions in this module. - */ -public class getTypeAsString extends UserAction -{ - private final IMendixObject instance; - - public getTypeAsString( - IContext context, - IMendixObject _instance - ) - { - super(context); - this.instance = _instance; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - if (instance == null) - return ""; - return instance.getType(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "getTypeAsString"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/memberHasChanged.java b/javasource/communitycommons/actions/memberHasChanged.java deleted file mode 100644 index 88735ec..0000000 --- a/javasource/communitycommons/actions/memberHasChanged.java +++ /dev/null @@ -1,61 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Checks whether a member has changed since the last commit. Useful in combination with getOriginalValueAsString. - * - * - item : the object to inspect - * - member: the name of the member to inspect. Note that for references, the module name needs to be included. - * - * Returns true if changed. - */ -public class memberHasChanged extends UserAction -{ - private final IMendixObject item; - private final java.lang.String member; - - public memberHasChanged( - IContext context, - IMendixObject _item, - java.lang.String _member - ) - { - super(context); - this.item = _item; - this.member = _member; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.memberHasChanged(this.getContext(), item, member); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "memberHasChanged"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/memberHasChangedValue.java b/javasource/communitycommons/actions/memberHasChangedValue.java deleted file mode 100644 index 2d6159a..0000000 --- a/javasource/communitycommons/actions/memberHasChangedValue.java +++ /dev/null @@ -1,56 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Check if the value of the member was changed to something other than its original value. - */ -public class memberHasChangedValue extends UserAction -{ - private final IMendixObject item; - private final java.lang.String member; - - public memberHasChangedValue( - IContext context, - IMendixObject _item, - java.lang.String _member - ) - { - super(context); - this.item = _item; - this.member = _member; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.memberHasChangedValue(getContext(), item, member); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "memberHasChangedValue"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/objectHasChanged.java b/javasource/communitycommons/actions/objectHasChanged.java deleted file mode 100644 index dfa9988..0000000 --- a/javasource/communitycommons/actions/objectHasChanged.java +++ /dev/null @@ -1,55 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns true if at least one member (including owned associations) of this object has changed. - * - * For Mendix < 9.5 this action keeps track of changes to the object except when 'changing to the same value'. For Mendix >= 9.5 this action keeps track of all changes. This is a result of a change of the underlying Mendix runtime-server behaviour. - */ -public class objectHasChanged extends UserAction -{ - private final IMendixObject item; - - public objectHasChanged( - IContext context, - IMendixObject _item - ) - { - super(context); - this.item = _item; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.objectHasChanged(item); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "objectHasChanged"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/objectHasChangedMemberValue.java b/javasource/communitycommons/actions/objectHasChangedMemberValue.java deleted file mode 100644 index 6ca7135..0000000 --- a/javasource/communitycommons/actions/objectHasChangedMemberValue.java +++ /dev/null @@ -1,53 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.ORM; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns true if any member has a value other than its original value. - */ -public class objectHasChangedMemberValue extends UserAction -{ - private final IMendixObject item; - - public objectHasChangedMemberValue( - IContext context, - IMendixObject _item - ) - { - super(context); - this.item = _item; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return ORM.objectHasChangedMemberValue(getContext(), item); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "objectHasChangedMemberValue"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/objectIsNew.java b/javasource/communitycommons/actions/objectIsNew.java deleted file mode 100644 index a1c8fdc..0000000 --- a/javasource/communitycommons/actions/objectIsNew.java +++ /dev/null @@ -1,52 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Returns true if this object is new (not committed in the database). - */ -public class objectIsNew extends UserAction -{ - private final IMendixObject mxObject; - - public objectIsNew( - IContext context, - IMendixObject _mxObject - ) - { - super(context); - this.mxObject = _mxObject; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return this.mxObject.isNew(); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "objectIsNew"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/recommitInBatches.java b/javasource/communitycommons/actions/recommitInBatches.java deleted file mode 100644 index 38ae402..0000000 --- a/javasource/communitycommons/actions/recommitInBatches.java +++ /dev/null @@ -1,58 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -public class recommitInBatches extends UserAction -{ - private final java.lang.String xpath; - private final java.lang.Long batchsize; - private final java.lang.Boolean waitUntilFinished; - private final java.lang.Boolean ascending; - - public recommitInBatches( - IContext context, - java.lang.String _xpath, - java.lang.Long _batchsize, - java.lang.Boolean _waitUntilFinished, - java.lang.Boolean _ascending - ) - { - super(context); - this.xpath = _xpath; - this.batchsize = _batchsize; - this.waitUntilFinished = _waitUntilFinished; - this.ascending = _ascending; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.recommitInBatches(xpath, batchsize.intValue(), waitUntilFinished.booleanValue(), ascending); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "recommitInBatches"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/refreshClass.java b/javasource/communitycommons/actions/refreshClass.java deleted file mode 100644 index 483d731..0000000 --- a/javasource/communitycommons/actions/refreshClass.java +++ /dev/null @@ -1,56 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.webui.FeedbackHelper; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Refreshes a certain domain object type in the client. Useful to enforce a datagrid to refresh for example. - * - * -objectType : Type of the domain objects to refresh, such as System.User or MyModule.MyFirstEntity. - * (you can use getTypeAsString to determine this dynamically, so that the invoke of this action is not be sensitive to domain model changes). - */ -public class refreshClass extends UserAction -{ - private final java.lang.String objectType; - - public refreshClass( - IContext context, - java.lang.String _objectType - ) - { - super(context); - this.objectType = _objectType; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - FeedbackHelper.addRefreshClass(this.getContext(), objectType); - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "refreshClass"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/refreshClassByObject.java b/javasource/communitycommons/actions/refreshClassByObject.java deleted file mode 100644 index 9bc34ab..0000000 --- a/javasource/communitycommons/actions/refreshClassByObject.java +++ /dev/null @@ -1,58 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixObject; -import com.mendix.webui.FeedbackHelper; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Refreshes a certain domain object type in the client. Useful to enforce a datagrid to refresh for example. - * - * - instance : This object is used to identify the type of objects that need to be refreshed. For example passing $currentUser will refresh all System.Account's. - */ -public class refreshClassByObject extends UserAction -{ - private final IMendixObject instance; - - public refreshClassByObject( - IContext context, - IMendixObject _instance - ) - { - super(context); - this.instance = _instance; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - if (instance != null) { - FeedbackHelper.addRefreshClass(this.getContext(), instance.getType()); - } - return true; - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "refreshClassByObject"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/retrieveURL.java b/javasource/communitycommons/actions/retrieveURL.java deleted file mode 100644 index 6b70186..0000000 --- a/javasource/communitycommons/actions/retrieveURL.java +++ /dev/null @@ -1,65 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Retrieves data (such as an HTML page) from an URL using the HTTP protocol, and returns it as string. - * - * - url : The URL to retrieve. - * - post : Data to be sent in the request body. If set, a POST request will be send, otherwise a GET request is used. - * - * Example urls: - * 'https://mxforum.mendix.com/search/' - * 'http://www.google.nl/#hl=nl&q=download+mendix' - * - * Example post data: - * 'ipSearchTag=url&x=0&y=0' - */ -public class retrieveURL extends UserAction -{ - private final java.lang.String url; - private final java.lang.String postdata; - - public retrieveURL( - IContext context, - java.lang.String _url, - java.lang.String _postdata - ) - { - super(context); - this.url = _url; - this.postdata = _postdata; - } - - @java.lang.Override - public java.lang.String executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.retrieveURL(url, postdata); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "retrieveURL"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/communitycommons/actions/storeURLToFileDocument.java b/javasource/communitycommons/actions/storeURLToFileDocument.java deleted file mode 100644 index ce3e1f6..0000000 --- a/javasource/communitycommons/actions/storeURLToFileDocument.java +++ /dev/null @@ -1,70 +0,0 @@ -// This file was generated by Mendix Studio Pro. -// -// WARNING: Only the following code will be retained when actions are regenerated: -// - the import list -// - the code between BEGIN USER CODE and END USER CODE -// - the code between BEGIN EXTRA CODE and END EXTRA CODE -// Other code you write will be lost the next time you deploy the project. -// Special characters, e.g., é, ö, à, etc. are supported in comments. - -package communitycommons.actions; - -import com.mendix.systemwideinterfaces.core.IMendixObject; -import communitycommons.Misc; -import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.UserAction; - -/** - * Retrieve a document from an URL using a HTTP GET request. - * - url : the URL to retrieve - * - document: the document to store the data into - * - filename: the filename to store it under. Only for internal use, so it can be an arbitrary filename. - * - * Example URL: 'http://www.mendix.com/wordpress/wp-content/themes/mendix_new/images/mendix.png' - * - * NOTE: For images, no thumbnail will be generated. - */ -public class storeURLToFileDocument extends UserAction -{ - private final java.lang.String url; - /** @deprecated use document.getMendixObject() instead. */ - @java.lang.Deprecated(forRemoval = true) - private final IMendixObject __document; - private final system.proxies.FileDocument document; - private final java.lang.String filename; - - public storeURLToFileDocument( - IContext context, - java.lang.String _url, - IMendixObject _document, - java.lang.String _filename - ) - { - super(context); - this.url = _url; - this.__document = _document; - this.document = _document == null ? null : system.proxies.FileDocument.initialize(getContext(), _document); - this.filename = _filename; - } - - @java.lang.Override - public java.lang.Boolean executeAction() throws Exception - { - // BEGIN USER CODE - return Misc.storeURLToFileDocument(this.getContext(), url, document.getMendixObject(), filename); - // END USER CODE - } - - /** - * Returns a string representation of this action - * @return a string representation of this action - */ - @java.lang.Override - public java.lang.String toString() - { - return "storeURLToFileDocument"; - } - - // BEGIN EXTRA CODE - // END EXTRA CODE -} diff --git a/javasource/oql/actions/ExportOQLToMarkdown.java b/javasource/oql/actions/ExportOQLToMarkdown.java new file mode 100644 index 0000000..492f1dd --- /dev/null +++ b/javasource/oql/actions/ExportOQLToMarkdown.java @@ -0,0 +1,62 @@ +// This file was generated by Mendix Studio Pro. +// +// WARNING: Only the following code will be retained when actions are regenerated: +// - the import list +// - the code between BEGIN USER CODE and END USER CODE +// - the code between BEGIN EXTRA CODE and END EXTRA CODE +// Other code you write will be lost the next time you deploy the project. +// Special characters, e.g., é, ö, à, etc. are supported in comments. + +package oql.actions; + +import com.mendix.core.Core; +import com.mendix.systemwideinterfaces.connectionbus.data.IDataColumnSchema; +import com.mendix.systemwideinterfaces.connectionbus.data.IDataRow; +import com.mendix.systemwideinterfaces.connectionbus.data.IDataTable; +import com.mendix.systemwideinterfaces.connectionbus.requests.IParameterMap; +import com.mendix.systemwideinterfaces.connectionbus.requests.IRetrievalSchema; +import com.mendix.systemwideinterfaces.connectionbus.requests.types.IOQLTextGetRequest; +import com.mendix.systemwideinterfaces.core.IContext; +import com.mendix.systemwideinterfaces.core.IMendixIdentifier; +import com.mendix.systemwideinterfaces.core.UserAction; +import oql.implementation.MxCSVWriter; +import oql.implementation.OQL; +import java.io.*; + +/** + * Java action that executes an OQL query and returns the result as a formatted markdown table. + */ +public class ExportOQLToMarkdown extends UserAction +{ + private final java.lang.String query; + + public ExportOQLToMarkdown( + IContext context, + java.lang.String _query + ) + { + super(context); + this.query = _query; + } + + @java.lang.Override + public java.lang.String executeAction() throws Exception + { + // BEGIN USER CODE + throw new com.mendix.systemwideinterfaces.MendixRuntimeException("Java action was not implemented"); + // END USER CODE + } + + /** + * Returns a string representation of this action + * @return a string representation of this action + */ + @java.lang.Override + public java.lang.String toString() + { + return "ExportOQLToMarkdown"; + } + + // BEGIN EXTRA CODE + // END EXTRA CODE +} diff --git a/mprcontents/01/3c/013c411b-c6ba-4fe9-b842-583c4853753f.mxunit b/mprcontents/01/3c/013c411b-c6ba-4fe9-b842-583c4853753f.mxunit deleted file mode 100644 index d10e7e45430094fceb5dfe791c98f1ccb61457d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcma)*ziSjh6vyZG5)DK!g=k^n2m!S)7)wdeOYV+4xg>f~Q7b3AZ|{c8&1`07b9a?! z8dF59#nd)}V5LDp5d!`L!NO7z6(p5*>f71mZUZUYV%hg&KJU%0&)yPm)SBa_?9baM*H8yOMOKMSuAWFY^>!hYk}jX z<_#uda6Yf7{I~_uvV=o65nD1oi@;Dujn!N>=yH-xjiR>6EajH^Owt9Qv4MaJZb364 zy0p!0lg@w)c!w^;Tm)yiq#7E~!FME>4@n&w#xm`BjGmseP0(#_0MS4LB?Qyd@P?#q z6^kG#!X@$}4Hj!LLl>C8h`10mNFR?WY_r9z-=v|^6gsRG2{n;pd%3 z?mWrQa9^uXsCF8y%21K_d#E3`gS%f>zL(d+FSY32^T{15#iT5CKae-gA~&Q%m|SR)PWE`!&j;p1g+vk6osn@mc=b49h)-pHlFKu>#d)&;$ zkce|Eg7Gy^MR1;>s;R?L%r%ZVmv))_G_iET1hsTGNxp}4b9#g+{r+yPhxx4oA1bdl zo;`i?d-(BAeYOI zLb?nz;5rhl2?6C{5}?aUHZ&;O;HD~LgEp{Qg2%!p#Z2@SXkTw%?^2a(if^o;91B{O zis}e_&IHy56)>7Ms@$(qCWLIHv*1kFQ$ZMj!j_Se5h&3d!REe*gQQIh!>=;Md;2SxXCxmNr{Yat%{#i_-gAJ_6zuXf*^n|QK&>j0Hv zQWo_nAZLO_RyQXx*=i&`Gr@p?id0RKMACuo8!j~IF8MO_m|^J0r)_#n)mpAPt3WoT zWp{FjW7T^CE0VUUWJ&%WGF^v+YH}Tw+<%EUn320oT(mlSR0F}z=J&nX&!r!C)~;OL z&78P%kFs~Fjhi_bA|j6-XkYPk3D(n7(hKl7=BP^2l}>pK6IYTOM{;c-%g##-bf$V% zyKqgqf4uc?)0Li$Plbc2&SO%RhjFI4e;6lsgjR+>4DA2fe>?a5#qi$9S@``QTERy7 O1gQuP&SFsM5#WW=3Sc9g=x1I-a+wVD#m!qkOL@F zmf6n}=<>YfVQ!?*jVY?oQVBFAcQ}wC?4T4D+KiiQnA^y9cQQ0J5ydF8rKOv3mNd9- zGWy67WJyb;btfsg6-UWpx`8a}Lu;yPs``aQQgZ1lx*b7AHw-q6OcRNOE+t0Wp)x$C z87U$GDB-cBu;hMBqXBEFq+UH5MH2$fDZLZ8CIl%}aOx(W?igJ>8lJ9QIkqkM>ALUK z1`>s+{G3xkAq?cE3xL1@U9&{Y5E(BWF=GN=m0&MVemP@2*w}v|UEemk(5(4b_8az3 zASJ|;uC0wE4w9MVWfUDRnG~*5KoW^@VP#9sHD>n7s`coe^A88BT zI)A(A(9-+yqSF^fu6X?N+@hlqk(#Qaty#Kfh#RSl*aLVnrCZeVGOyZ768h5yfjr9X z)kR7bnk_%pzWn*-Zg6%n-8!=hcl^4VNmSBoZtGepC*ab$N@!b-f1hr7KG%J1WO8|` zY2}Geb1qpiZP1;6Z*s`14j3x&YHH%!Id#SiJsThW`g!tU?y54P{130HiR)cDx1+z= z^@y?syXIfd?!Zf9`_67(ypbG!yZ2x1(o1OX8m_*$zuexlFwt1v)$_FFFSL*_HH$_p pY)V~bUE37z9U6!?n6)J)+MVKae?k-mD0h_kp4qUDV*Ypn`~rmRhdclP diff --git a/mprcontents/0c/85/0c856a2d-2236-40fb-8155-0f4b6bbff4ef.mxunit b/mprcontents/0c/85/0c856a2d-2236-40fb-8155-0f4b6bbff4ef.mxunit deleted file mode 100644 index 702814ecbc8d9949bf8ce9259df2a257f7e0b050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1187 zcmcJOO-NKx6vvNm#uAH^78OGDh#}e(Hj9)(X~q#hGqEPhBDlSGXXfggd#CsAs3UD$ z7_Ov{$W}&%5Rp&|12;k;8G?(Dh@g-li6{hf6S?TTk7nl0u0?NgdH0-ifA^gKId?h; zP#$WFK{eoatZ#Jp$-}?TjKr%t`WLn~l+cA-hQfYywUYr7(IgYx3KjlAacwc0AX!89 zP?@&#duN`c*4YEgsV(isxVoSabmcT<51B&q#0SA>HtdfP)3-tlMYY= zcH*V2OxG!gfL({1qf=%ST?H-PuV0!Te`ZDJcJ&T*zj<}v)8c@gw9x5aEuumglyC@Y zzP;KTUuvJJd%|99q{h62RE#Y&q_{bGE+|bz(xfnRfJ77|MlH=`8K(=5rJ~L1p*OP3 zM7_$~gv&9INt%X0p5qj`g!Y0;eJiKMyOyn%M+YA-SBy^7c}X3@AfHOaVw#^5aA-Ln z?dg}b)%ES+j@g@Qw`xD$d+E_aCA2(<4O6|DOD1y;tlVDn&Thdtit0}GV*TsJ56?r9 zsh`2G55pvm#6TF1`UGCwoch$Te5!NyZo{1)6W@3IXMycWbSI)z;@dt^<|p4?30Kv0 z&B*z^We+}A{;R|hA8p~+X7pSAT*uhCk@5M_BU>KLe&WRqJ1`)ZPs>7*u?NkLW#;Js9J+qu~$MKyE_- diff --git a/mprcontents/0e/2a/0e2a0433-04d8-4c74-9275-335bd68ff360.mxunit b/mprcontents/0e/2a/0e2a0433-04d8-4c74-9275-335bd68ff360.mxunit deleted file mode 100644 index d52008ab252d13c7c806fb233398fc382f080a4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 939 zcmaJ#}jj3m$v4u;>~sgVT?*stjQ)l&83Kn*&VDj=U|=1fu2DfD{+m5X!z1_ zmIX1IoaIO_4pC^9@W4>gGGA_aLF}UsV3k`9sdN>a7{FetUFE)y0_>z;%4Osqy zvITTFsg07E0qkk+DOnHXgOt)0bqN~-Qnr6rwqG2)JNYF4<>~V2OG_Oog&k7%#eSf2xbMN3G?bbLGC_Gr#nE zr^gG~Xv9c9a4_-|PyfSY@@_PP_hYWeCPS&(0|YcuGa9>hHS1j^L?-Xk!(TsIx812{ z<42FY-F#fy#U__o#Jxct+pygkVB31*eqXuuq4IHzjf>ffwO!c$W4issccUF?3{$I7 S2#`x!^}0u}k8+*=2KWmb0TT8A diff --git a/mprcontents/0f/a2/0fa22ce8-d674-4098-99aa-d522cd2a362c.mxunit b/mprcontents/0f/a2/0fa22ce8-d674-4098-99aa-d522cd2a362c.mxunit deleted file mode 100644 index ecd9661a59825a8114a6318ca9e56864d25e3797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79 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 diff --git a/mprcontents/19/3a/193addff-f779-4e47-a8ea-69fc6922c4f6.mxunit b/mprcontents/19/3a/193addff-f779-4e47-a8ea-69fc6922c4f6.mxunit deleted file mode 100644 index eb030b868216f081de86f6420cf802f748bbdad5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1496 zcmZuxJ!~9B6dvEjF^K<8I z(oiL7oFCDWbWtQ4L=*%@0)c>n0tzG=D3F2>qDm1YghbxV?)_QWYUllY?|Z+$%rZ7R z-)^!wM&JLxo;hCpb9U?AU*bP;>YFFE`R$^I>_t+o^FCimoY2b7kN;V%lr^!-y>u7Q zd84*?juEeXUgXkal+~I#@i{8T0}i`gV{AJU7I?%3E(g4@;4-5JBvgRA3HE|1oYq}% zL&r2C5U^m046riLYGU6 zO9Ka6w=*}g|lG-9ADD6V#p}E3Q z=8Mn?rOl9-QdmVD;kE!84aV_J*03}&27bB&^9c>Cm$AE1Lo3Pn-qE(YSP6GNy&n7qT z4MjN(+N8A@HYat>?p~qIx_YYIfUlB diff --git a/mprcontents/1f/2c/1f2c4703-788f-4bb5-8b58-94088896316a.mxunit b/mprcontents/1f/2c/1f2c4703-788f-4bb5-8b58-94088896316a.mxunit deleted file mode 100644 index 89bed6205172b92088404b51891d5e61d80e5299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeywz`($&;_1R50Aw&QyX(mJS8Vm}j+nyHG0iZGNhPGRAeBKCC>4~NUYe6wH4iKfbqs?bP&h6+QMbxbH_AZQGF~@UTZMtiFEKZjfeR?*9_r}=bZ%+| G0|NjF^hv1z diff --git a/mprcontents/20/9b/209b3fb0-1b92-4e02-a318-21099fb30c07.mxunit b/mprcontents/20/9b/209b3fb0-1b92-4e02-a318-21099fb30c07.mxunit deleted file mode 100644 index 9c7df9bf28dba6af556ecf64160792919d8c00a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmeZdU|?WX@pNGj05TXh*w0p&B+cZvSVEC={$?I_CY6xNf>f|vKv8~HYH~@jid%k8 XN@@`UlV4(PDg!G}lW%5mG6MquK`0Qn diff --git a/mprcontents/21/79/21795fc5-fccd-4f3f-850d-a895791a9695.mxunit b/mprcontents/21/79/21795fc5-fccd-4f3f-850d-a895791a9695.mxunit index 05dd44028b5a6fad49ec64a34968117a6de9e0e8..c325651dc2a6552254e6875123567a97c1b698ca 100644 GIT binary patch delta 1363 zcmZ`(Z){Ul6u*6MR5zCKkT#Ak-QL!&h1#@hw>hcJ9Ilg1z!B_5Fq_G3d$+#%`d;(i z?Y3eJi*Xus0mFq5{%F)dmSx~1RfuBHMN{HFAR(fWk|?56iU0Ya#xLIYX4e+Or}xf1 zzjMy-{O&pTW?wGKcQObA|-VeDBWOD!X82=8c*6EkCl% z6(%!XdzrCOP%GHU0kFc}69V)LK;xm@feqK$?##1SyZSnF$H?yuYspqeCHbJfhWpt* zvC4Jb)P1ymPuX7AtD6a25hoLMmE_5W!GIQ?fXY)bc}(gT&=^vDfbETppeP0&wz$S$ z_sLU1tGxN}!Ff~e@bfCI;dh^-oD0lPQma7f=vy~_`(;w@R~YN8?GkjZ4YwNyOaKHS$F8b z?wN-gKRW*@d2@9$3EDX#RaJ4R9}<6u9ml$646nB|?)&m8nW}0xZbxcL#AMd~2RCG? zTDbW2iA_gl#JAt59UUa68aueUw&RzXN$bX!2Ys=fH48V$HjB9-okZa5%Hlrm`J%-< zd#k$p#qq`JKWD$)OIjSwaX-~9j&V{Ac)c+>s(KPgiV5SMsGRV^WKzYlg1lowY#3qH zn-@5*Y*;H&TTxu(b}o!v2i1`|=e>lp8Ob?^$(=1PR(pTR_1rEj`Nz?^Tf1FdU>;(u z2$2*x8rl@cn6*BNC6~*`= zS>Z7~j>-~766WP0-Na}d^C%|J{@r|=f~X#vGEhs!3o4IgEu4oEpOQo&Az+$HrPQQh zo`N8csWcuk;IypKxG#A&=DCw+oR0x`nXPj{;81OLq1>cSa~L9zku%_O73?}o}=g>FeO>n zCrbOWb9Vt(#zOIXTP7#6W=w97=b4$9H<1vi_^y{yuBLdV3$xT*=7-%918KfG$P2cO{UAa7?GAc=QhTy0lM z?~!3r38^edWssfxUrBuOJ6(>+HOj)a(>~?S``e)HIrrNmpX&x$4$NVRIi;x#mMA7g zH%)W?m?7=Gs%=-u%(E}`p(aU9uGf&6{6bk=U~8=Yt}AR?ygOHK37z1ox_dIeiu2@W ztb78kYksfxmJRaW{$^66keNIC%2 z4s%<@Ry21XDw%viO>%OWnv^~xC|00h3if?6O1NSee?iSsha0E_5vG4oLIORwCZE?e zl>$120q6?`Cg;SG)b#wKN(NS-h)ZHg;$%H-9d?j3Fp4MpYDi&vvR6A~^J$HHjFZn9 zD9eCd%M@Hvnv$6xP?Qfh4kSKV+EBk<9>@qv%}YrwQUF@0ker`alA2ditdIyq3MHTv z#K07unUbDb;+euA3sjs7RGe9%2edx17%UG8?nFppgDLe(%uQwB1uAwfE>mzURsg3& c1`dcheyOP`#jbfJnI)CZ`IC1VDglE707~Nia{vGU diff --git a/mprcontents/23/39/23390396-86a1-431e-ace2-1019f84ae93a.mxunit b/mprcontents/23/39/23390396-86a1-431e-ace2-1019f84ae93a.mxunit deleted file mode 100644 index c4ac724c0cd30704bf1f0a5e4c653f895adec571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80 zcmWGwU|?WX@pNGj05TY+Ff|vKv8~HYH~@jid%k8 eN@@`UlV4(PDgzHtQ*cR9W?p(|NoGzl0|NjdU=?Wq diff --git a/mprcontents/25/26/252623ce-00e2-46ef-9863-fa54edcc933c.mxunit b/mprcontents/25/26/252623ce-00e2-46ef-9863-fa54edcc933c.mxunit deleted file mode 100644 index 194de3e41483e4e832859e8653a386b643357d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1030 zcmZvb&ubG=5XYyR)aD>ksi5G&C&r&h(3^;tG#g1u8*7Y3u_CX#llbsuUwr#ErXtj% zc#sw^;>DAPf;ZcfApW>`5W)XIgnBDIiaj~Io9rgyp5DxS-)DEeGrK1XFrKg4FbVX0 zJ9gsuPuRKq!r5(Xe|>(*$~Trf2nVS&!@Iob7@<5rpPs>rb2c`4AWa=jpuHMzW5kQY z1ug@Oa+a-}ppBm4AqUn7TlItyT#AS2GtQ)HF;BV3no2Xt4QdwnSYX$EYzC4U#e6iO zswKQu7;@HD8kviR3yE$7kl01ZmXH|8%w2*B?Hgu98%gh=Cao7KdDIURKEob5fkC$b zxpL2ufr~DHRql0^HnSlQCg@`;!gbMuOxSHCQ zJv>CB616t)a9Sye+=~E^nG=pyO{pHl<*L_I@OcDVo`1VAwes=G)7!tVu5`BQeJuM2 z`#+FX;+@FwaK1D`KbvCvZ#;cCwAM#o40USGKf~Suo!H0^ zHJ$F@@IEHop}vSnv$WB7w1|B;Nr~{wm}*7~lB^wV)Dkk0?4%31s$a+ZfzY%NV{tqC z={DU68%bZ6NsiG(S4oq$F_nG4y7lKrZT-u|Q?~Rj^xHT>qLG#0zHml4nTS>#p=F-A s8{NZe_Nz0e-z*-zb+%6nf6`&vHKXY#iT8_2+3=LWeb`I6zU=^i0V7H^mH+?% diff --git a/mprcontents/25/90/25905f62-d767-4053-9a17-c4e7b59ba931.mxunit b/mprcontents/25/90/25905f62-d767-4053-9a17-c4e7b59ba931.mxunit deleted file mode 100644 index 3df5af87d07a1e55a336ab96d48c3776d7db8f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmZuu&1w`u5H2@}5(o%_f_SLI=DO^HCx0Ni8_0s2hzaH*gx=|zNlQ=l&|SUkyoKOR z@c}$}${Qqy+y#9DuO2;GGb#bGPfgWVRo@Q|0Im<`Gq?r%mM3qwtFMPU@9&;}Kl|`$ zG8i7U4Z&?~O#>$}ENS@n2ZI@vCVP2hd?wgX&}6K|P~@6ejJUvX?;5~MN)lZmWKjZ6 z##lN}35{Ujg0Kt`7sS@Baq2_1xO#v^s2g3dblyoj!g+~p$jJ12MNP3HtV1M}Q^Qv) z9T$;I>dJ(i>m@}zrAQ+@BoW6|-&l2gJ1UQ#jIk!e2{U_FJ7qZ9+T7aQ4?+*|m~ch0 zMI|4&@-0SES}LuV!9nnU=Q=f}X}l|X0}{r}++BA3ugVeJ++7zwTe1Ly-E|Y9Jf{_T zxS?L|IcteKND~s-qcHVOZB^vHsR`~YWYPJs&;(rL>4h!R$-=Ck%7MBH8+~#+in@yT nf|vKv8~HYH~@jid%k8 jN@@`UlV4(PDuW zIXShUq*x&}x1gj_p}3?dGcO&atUNU*M^Ax)!?hwgr!*xsg@J(yXk~s;iBD=-Y7PTC z&_s{Sl$6vwusGBy3_?KRxadUPDo5QY16|8_-B|4!6$U0hpxq2SKsk`*{za}JyBHV% Di4sZj diff --git a/mprcontents/27/5e/275e8860-72a1-4f65-86a6-6dbd79be6bbb.mxunit b/mprcontents/27/5e/275e8860-72a1-4f65-86a6-6dbd79be6bbb.mxunit deleted file mode 100644 index 5873abd77266f3e60b43e086c8244542e7e42797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmZ{ize~eF6vrQFiw+7!1aUG$L6=IGE`md7O0BjkwRIGar#tBzsU|O~)<^Y}rB?2zQq`82QEFA+rOFG)3n|;Gip6=mSNv zjS*j!C#Z_Rm6n5Qr`1q-mn6$qndjM-5%KFVTOAp8V4?}2R7V~cvVjA%VTO#hEYn06 zGGT48X;ivKsieR1+hpyd{aTwW4_B%irOi}-6>j3RzXK^Ow-=pt9Ang?Z5|774DQO!phk0SJ)T<6;asBAS+O zK(20ZS7(xuK~&sR+YB z=h5@!+~Qih@J#)lnP}dew6e!rHG~m@4)QwB+gb#^$|iTP;#d*OJaqLO>QMSexQ9kB zexBfNh$dzg13UE4*F4gJHIkjhvS!?Om=u+&W?BkQG0qfS{0htID%VV?DJIbi>PV35 zG8IZ0guW9o8dafD)wqq!u5!t3jZzWAt}?Ee=BL#dGcct_RZN3w_c+@&6n96YDl+tH zy49^J%B&vsOodaR35~OKR@AMBPB$+gCD{-P$6;`~X}h6=4uCb?tOZifVjW%BOkbW6 zj)OjAqAA8|X2^Mh5-08qecb=+)I#arpT(#5#}HCZ6aojkP8>6HGWn1>ENmH+-JlVp zCBGcN>vgJ^_kMkR?e^V64_EhGTwQtcwxi03lvdqH$SUxfacwJ+`z%skDg)%z7rKv;zQ8L@Z$Zgoy2QWMV z7BMoDFiNjvj#KR&pWfZro?p6k^-J#h>VwpelPykfbWb<+F;XNSi>PcV;vtyGU`fs4 z*-%Kbxi9W=6A{g#K&B^T+_^$P($)Of!ujQ$?@R4BqaV&)`g@_%)h;5XeK^3Cu-EHk nHrSPuKXN};rasRueQUpb#a?{>k6occ{gF~nTp9N|Qv~=21KUIz diff --git a/mprcontents/2a/63/2a639441-051e-4576-88ce-de5ce43cc281.mxunit b/mprcontents/2a/63/2a639441-051e-4576-88ce-de5ce43cc281.mxunit deleted file mode 100644 index 08f6450ca451a54a2ca5345486032305d49b6147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1586 zcmchXT}TvB6vwZ-S}93AH;iOFkw;1olmgfYzR^bj$Vd=Rp7fRwJ7l4VGA`S%;dy>RK>MTuQ zA~7YdRth*pgiSga$VhQfaZw%DlY%jEEdomysBPIaP>Ur%b#YNbDOXk-hRLana6u@8 z2<1uRkj5jy*cc=X;@UyP@RZFAy%?m8W}*}bCz4P}<`0Wv6R2k4@9j@hAa!0Vb8rV> zi+hfViOP=D6FWOQBbLp;$3;}cb}Viv&a>_PwrEi-O_^tciBKq(_A%^)6fm?<`?uXT zO>j`y_b%g0U~N>Va{lj5uPWpxdtw6zo`xpwHRR3kzlNJI<$tRZwi6G2kBSPP>>FXK12 zJ~-C?ZuH6;V;;aYtSYp67OX8#&iDPi*1zj^>yq|#PptAE!&i^%ZeDvQyGx&)Wi@vSTSrfpO!WO7FS@_J;_I20b=^(thN|jL?U)xY SlM#)9Azi diff --git a/mprcontents/2c/5c/2c5c8be1-3894-4a38-b3b3-5bc84b32647a.mxunit b/mprcontents/2c/5c/2c5c8be1-3894-4a38-b3b3-5bc84b32647a.mxunit deleted file mode 100644 index da1508122de1d6136dba4319f4d2a605f0d41a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1411 zcmb_cT}TvB6h7{1YH8U^Y7kw)!qAoy5-BR&A8bucwk47xxX#?wq1l=3&K=jaAgt^m z3qqE%9#rhD@I{{@Lhwn$qNnn$q95qZBJj0)@9fX4NCb5shPmf__nULR@7%dr0#H&P z4nh_1^=a&4Q@XXaV}Aa^(&=V(*i#=(B?wgWR0kf!Z3@#&!>Z4}gU5*lNetUMix6g0 zqZ`MG^8`)BjuV4n!2>@yZ2;?vtz$+k#0Cg5?06rc$c&*B!PG*1ge3_v z5KEd!6(}F7+eUl_eUccd;ui#E`1M&t?Lgfw(J2lu*t1D@h#m^20DJSQv=nm|dIJHU6C2l>iv zgP2~dIHzd2yW56S)s*<0OU-dh~0>wR;@)2Z&T5#I~P<06S6TF9^rO2)1RQmCa zFT0l8Cx?!WFAp~yceR|KaQC$5cwK#QM($*gSPIn~6}IufS%#@IMNk&DBIJs#QEqvW zQ?bw@J0IZ9u}ZJTc`k4EN=@A;dwxGWarIZ@vypohnG*MMklSoOwlt-X$1B+a1#FSs zrR8rHKD0lby4FDNDiayD+6`=3o1EFe8%$DZ`R3D|tA<>$`#i`|dDy_}ix WSFik~fKV)?%=u%1XdyF|0KWkMU#hDB diff --git a/mprcontents/2e/7a/2e7a6433-d40b-44c1-8bce-7eb8d3245959.mxunit b/mprcontents/2e/7a/2e7a6433-d40b-44c1-8bce-7eb8d3245959.mxunit deleted file mode 100644 index fd85d0eaa54df4787018f97ded3381041275e576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8338 zcmd5?eRLC57JnouL?~EbQBc4N;T+15nzT(pYPU_BK+~oLnzob$mYpWA?a=8=n3)uc z2!d5U1gwC{H;60;D$0l8wp8>8UC`yo3gW6L%EDR%)Lp)G_bBV$H#5o1!~o^P!{(1B znR#>HeZSv*_ub!37sn$MV{toC9D-M}e_CRvqwhGMIW(j3L(AB)21`+G0HYpoE1&l9 zTsgx{5iH@4$n0R?N;b#(f;^8|(KQwOf+EeasGUi=h5h-QKgi%hj==(o1v_z8)Q(JL zb_4=Ut&0_DvDV@9VL?F15Vqv2b@4pMt20T@7{m9K+wc@sfl&k4Qy0-ZaDVLLxpNA( z{B`?=pZj%5Q5Mk&1{L9{qF^C^k;yIMY5}ou6I`-MIAPqR!U0+Hnp6Ki z;JwqID~7tMhIon<7)n~O!9%eXLGUJ<^JCN=#$a}0u@@Pn*(CSjn!(BWg4KYO{E&=< zYpRb4`mrBwyQT&>Ui9D^%%Bc1K8N=EF^f#Y3GnDtN3FB_;AwT$X~kIwTI)~d?rQ8c zBqp_Nz2a<7FcL;luz2z0AZC4-*h8jlO28!)69j7VU>x9JfH%P5QFv2L@7d77WMBRV z*OKWEt?Q8X%?S+-8q)j)bAUEsBQze{X2#V2+8O718h+w5t8#Ymp6pjlXg=5`F&Ot!*Z z)Gd5lx55z9G4gHQ;wIhAc*ZZ7Jbd@egvsLqXcaOhq2oFh=P&8qzsDQn9c$M7@Voan zZaQ>>EE4!t7E5#>E&O-q6F*EEJ-q4SnG-*c*=AKt->(PB#X@-UGIxYdgA^YUD&-V& zU4Frs^tvj)PpxYI<3Ecwx|e?1y>ru`vv0JC-~9>4-urN5ne)lUhQ>KF-}T%ozt*(D z$=Bf5nr5?Km0z+$$SWGZk->|M$>?((zxMpc#%~!_?^^oM_mdu7@}Tbq`Gpjr;kTH$ z5zgIvJxuf9Cpv7%~4=cEI+ z+8dv!q zHE!+q|H@+Axlz8kYnOYL4W4mqas31PkkKB=;-2!|E%{wsOAjA7G<(~y7jGkrUvHb+ zVN=6h1@o)^lJUV&Qz+Db6&5#-{BKd-yw>dPOTOIO(zj}Kn^;_CuRs1=A5V6jd1K2f z7u;QLnZ;k}D2+@s$e0?zVnW^OO|#nE4{9IV4gqbTr+F^x1JUMnfPu;Q^meEv1q&Eu!;QW6i|S^+d& zqB?B>p5g^L1x^d76wIlR9?Q>YJyP>W=N{@y@v;5wYm_-7)sphChZaCEhD|9lRt{`q zA?QAg3U%g<`<}g&>8^4%I4_n|eK&ZkV!oGtNuVqQkzz&Jg4qjxGFT1>(8z|;03}vR zV|WS_61p3n9!J29Pmi|{TqnQSBQQ&9cAQNGWbtjt0$wV3F39>JbV1daVW<%qHLwN#qOs6TxL(FknlH;>3#oE-B|NOU=rz2# z>787Mdv=e*>0b@(dPZ@vHw@B1taXtzbdbRz2%L}Bv{wuc5wclXP?S@=CP^epnaUs~ zG~&4zL%hj)7aA=xD=ax0NGz|_d6(LIUiZd>ecW5lqKWO^-Fx(Qct^TyTJJ_tf-r^S z{m?=pO}JG?klU_` zWoQq=Aafxuhy7XUX0sU@nswyTozAm%ZJr{@&=$(GDN++t-8qp0N5S$Qct*2xyduSm zt{SqssJWf&ZB1q;nGq&TB8lCOmclo6!bqW^O!yo9gf7;vOm`#4%Mh5994~UMCvQ%f zNa?`Qx|NC&bmz_f87(tohnk$*&s7$0Pyh3)id%j4ZiOKkMe(rLNh1=PgVIT~x>DYa9f)($TZni)`C8$&Zm z@tdK;|EH-B*L`idJmTrk7R6l3s3}$!O7e+X?s_2!D#aU6I0RXASeX;)z2mmd9loJo z-PwMpH-B)au_DnYm5xzyBCG>WLvIYGF4kk6&rm0Gw{}{v#d@LP(>A~~6b;hBbohs$ z_~OTdM$~=s+UA}or@eHiVImfnSHCdDvuk`w&nr86&T0c# zk07fKEc!@ntoOUW73}%!g$a$ugLCdQSfqZAIEbP`Ms^{A?7HEV2?NzE*szQmKWye! z&#o)$&Yx*Lazt4!NxSMU%;MlwqGZhq+t6l389K~fo?U7^{OvTyqQ_T{&wYDE>7B+* zt?;7N|0MiuL+x$JSYvcp75j%T`sDRJxy$PhPZ@hE|9I5sl9iB@??Nh%C@;+s58sS7 z8*0|6<;b3bV!Lf>`6C@0bB64EWbl1YXRY7)#Mi@CG%Zw2Mbw}kt|DLlAu?1dUq_3W z-K_M3p9dtHAi_cHt199t(8b6g|MExjn`8r;9kS&jPz9i0FuJV6v9ia7rp?P<%U>NA zSXa>PGgI`nDyctY!W2H~1jK+jwE`!CQVr${A0Gq<5^COmqcA+JSo58eO!?7OIOQqypPAQ zVt*n$SwMbMO@SvXu$YHy2NJmvWTDMLK7fi&1P;g;Au;k!0#x#Mw00v2m}pGU$!JR|?aZ-P%=O!2SUD^V*)gUz`k!xKNtWBu}6R1(?cDCKEyS0|B8iUZgGk3RlosV_q zPU#vyFvbWqB(#J`B0Tt!;#Ul<8Xl^J_|!*YG#b%_64As5Fn(YN4|ryFc6aWE2m8=@ z*z7&$-2XlIcg~#A>JSQr;}U8@@LW83d26nAZ{pxo<9kPT<*o$6sY0HjW^fIVand7m zX6RP9@*f3?Hi>44t@2^YZBrj48g=!G%O{CyQ`Z)d4B6JG&WWRgegxUL0!t|gc zw$m18+~zbzwY*9=ZO3VwW1=V)COTHY!kI=hhN%%Sn^{+_VNJst30x^~^%Y&rmCY~; z`>+>oag*s;ynl?zW0-*>pH~@GoP!vq!{iA%PE}M3w~jFd5=21< zWD%0fxd&X8VvHtUzj?U%gT956-yc|ediCADV)PmcEfr(8do6cA3MQFs8X48tU-ZWH zjDdaiwtK1=g8Ztt5(@N^yj!@<5L~Gh=3cSz7O_D0A=trb z)-VfbowLQwbc8e2LZP^9=uk8Qc6iE5iI~roOd82je@JOvi9rFkuhzqkNA&xLASivq4Eu051GcK=h!+4)ZC;mFI^my4?)s5S4LnyFFk z_|(~Rj~<=g{EMd+u7Y3Y&R(EO6owfuxa>pDZ`nCyFdh1^IA%v)Y|CH$J=Z_ma`Ca# zOYi1EF}MwN378-J?2!-e9i5cspYGk8dw zwp?aC0<&j3f@c~Qo*8&`M_*t6VyNCzb3WF7X8!L3xN3y9w2(7xD|2y=a6)yTdMC70 QoggTBBl$Ln5$$034`ktsBLDyZ diff --git a/mprcontents/32/92/3292aafb-cb40-488d-84b8-2b06f79d3298.mxunit b/mprcontents/32/92/3292aafb-cb40-488d-84b8-2b06f79d3298.mxunit deleted file mode 100644 index 889fcfde6e850846edbefc90c89b4a76c6569f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmcIjO=uHA6n@#HCWzRAND=>5NH3<;7(93oG0m1_ixq8aAkxcpcQ!6=cGKC}B()%j z9y}-&4-%;MXi-8zMHEU=EGiN_cqrPFC`Aywi|E1G+5BvvNI{&#GV|V>Z{PdAZytpJ zx}vfKJ;2tl2e%R@>Nhf1pT)NPxSOa7(eddbhF+E$MkSO~sBW2dw7mzxi%D2RjzLE; zb%=Qi6)?y1j#*?ln8yUkQk()dDROb(ID<`NYK!zd7HwzJrbIXMBGM=(Jf`WyrlO@N z4k6f7uxM!_5^Y>W1W}6&KxC+*7>t759ES zFj6bceRw=UA`MiL75Py&0uoZF$jNc_80+K&Sd!wrMW$h!o8?WNrMh85m#kQ(geYQh zwpvFCkqgaG0p+p3qBI?c;FwPbx1af$KayU) zKD!>@G4p&Aj$u3{AlAXt#Ff4;``*_FA68%1zV8b3{%4-Hx;!udXfr8(a5Y>rV#8`=$A{>aqUZ{M@G4f{@F5OA4F2z2P{3KLa{p+5i9m diff --git a/mprcontents/32/e1/32e1b2e4-2c2f-4da4-9a44-1f93080e702c.mxunit b/mprcontents/32/e1/32e1b2e4-2c2f-4da4-9a44-1f93080e702c.mxunit deleted file mode 100644 index ea75928443489fc32408dab7c0c0b1ec32370045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1921 zcmcgtPi$0093FOyZY!;LAT@C4B(_G9wMvT;3TbS+ZMsdNO=&o&kv`u0ZFkJunRRAf z+pQ*80U>Ze%Ry63Oe0PB8-WP>S&Ygm94nF&a1sF){JtZ)RV2`}ROWME9`S z_xpYCoA39{H?vcZ6SA~1og&K#er}z<(egs_(59JG!@)#dJ{fBqF64pKW2?^@b2?nj z1Xqpa-y~M7r6A)3z8(S{NWR(0f#oYcZgu{18F4psvUl3~bnuqo6~WeSe`#nWl^*^f{Fkf$!1n zNR+XB3bj#4 za2HgPa-kP$rdV36IrM}gk-@kkmt$I+H3KbjIE(A}exaEpx+m<69wD*riM)`yAI88Z z7zWbIJP$aDn@uimpv^!hw#q@t)y@3)>$&-kulK#SHU7*O7sH@Dji4@p-i1Nw6v79G zTLMzEiMdi_d@){Zr+G$@m<`5b<~`#MsTy=7ZjlD5NTQ06|Ob2$`15nE2@;-r>%NvzA!Fe+q$AR`)(0_94Uw~@4!L|P5OTLD97 z$&#W#V~nz~B=HiH9qT-H%Cbh~sY^RQJJR{d+WEHj@0WcS%4$GR#1}^~H_8*YY=sD0 z&9-M}Z`I45*>|UF_n!RgQpna=!B!$-li+o8&2+(%Ej8bz=AghM0kU||zfn6bWIyQd z{dC8T%k97H`2!i_Efp3YA6oU~-|?G$I|q*6uWmTh@IP3r?U8=4#r3;>zumL@oxbYE-}_rv7W-04SW@!$kKbM2)>*Yqy`xG-|k)C zy=LlR&5qt0FF!GT^P|?c2hQxTlOOl5Jr=S(@YX;%RgoMkauI9gd*Stn;L2c!ORPlD j;sY3A3@@QN#6;`nOuP}HuiVs!pf`W85&CT{SRwxa=QLIU diff --git a/mprcontents/33/5d/335d12eb-da1e-4191-b771-a3cffad2d7dc.mxunit b/mprcontents/33/5d/335d12eb-da1e-4191-b771-a3cffad2d7dc.mxunit deleted file mode 100644 index 0a18f7b7fd12a3a243f86c0309dc0b5bcc8b07e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1210 zcmdnR!oa|);_1R5zyJiVg<_56ZcTLDUby)DuS?hOFsX!87NjzW1EstY%Mu-vOEUBG zid7J71}2D@OKMtTX--K{YDsBPo?l{aD%d;-H!LxyG!-nyzS99&u|9C z)Me)V+zs>hI_x(#|1q)er#jSB1)w5iQ?VJu?_3&(6Bj6)VEG4sXuS%aE>|z3 z;k#I8%9GjO3N$DSElXj2tJ6!HToxAnyBU`ELY1h{VqgJ;+CJ2 Yl3K*TM6%D@KHP;mK@q0AUy`xAJ8^e5ZA8$k zw<;on7oi7f6)#dmD|iz02M8(=y!Zo(2N4hYWp>SWyN6}xeQ(~p_hy%}06DW-f&$R< z_|M3hm(||f-7WLPoiE=H80MvJ8{rU*&hrkRwv>=wU?$&SL|6$MJap7Ns?hi5xQkjZ zT3+T(h#E6W(h6Pl6z}W6EXhWcfGIyjCK`-;UFM>@h(2rafN|F8?`Bf92vIHWF`)t` zebE#iccSSysPkkuP;pfjn&Lu zY6Bs06Ya96gz9RsT>m{7)}`>M)aYlF_?j&Ov#VD1vFIDp))>7=pNZUUghJkjP);{mMd%L&C zg^z0QkGsA1<9VL<_j|tH-CT{3KN#;oRR})c{o~fQ;~Re2^-5;pOTBGBd%+V-kLEC{ zfvJQf5H%yK>$IT#hyr05Mxv@B7=&O&kBwl#&?QwtvwUm{iwRXUWZa|5SVLEUoT?C- zMO6jDxtu&2Q*=om4GRL+G=x01Bw;j0h)NtyY>(HTx29niKZwyDkmnp?)tNbi3wJ)> zx%bjF_se6~@3szcIV?)!5nT(?Z{&;XIIAHAM!_U6{CFGCoi0I%XWN$??-ycEO{{;q z>s}*d2?E3lf(Wl@GS3d|SJF^wlEO|1geh2{0L2v%k1(8J3Gx@MS))pdj*01k$HdI+ z!*5=*Vm$rSBL@zCuqhDNm?x~{6;Xyo$h%rnFdB0iShMKWdDpC(PJCz1!~ed$vNCNM zSPP4a426t zK(ybScAYKKTfcw9_diI!Sl@c+%opFULEc96I~R%h>$FdQH2Xku%cbl6= zgg$i9yY=-;>(+Vq5R>39oQ;?$;Om{i5il z*($@!=Z#)i#y&Gf@3p)3f9%_FN9Q<+fBP4+H|)6}esB2r39@Vc50YD|rJGLY_C5Vs z`3DZioihL#z_m*zkEDHpzH^V^Jm>f-mcD{t*tc5G4n!5y#vsefwe!HeYg zTsip6_U(si7oYCjaesTh?eKFCSfXhyDoSw|l!Ms;=^2Z1pes-Pd{ez4cJ@WbUWrX# z-u#Wk1+i%KzwxjC9QQ|dese57abI2M=fEQHR5k~jECRwInLxV5fQT5@9$=%oe zbEsyj)zVQ1Qfvc@y0f#S`OFawaUj;|Bi6bOQd*=eCG*@$QaVrcSRNV~HnDn0H(_qCzLnn-Ks^ zHlt=2Vx>9Kl5s64vSHGKtl`zbWl}j=0uPGvIrGv0%gVOM9;XMCltE_uWv~=(74iTt z43~$2`e0*AONkG*hT59}2c{WXJ5geqv#{1d0@bbw`i|a|*jTwS)x;lJYn>tpi(IG3 z5x9UrZ(AaacJbB>x)SyT-JAhzE$Ac2QI5jWq*NX@Gb7ROJY1TP*ZhyBT?`!FaNtzm zuU?4mt4&-nyyNP7EK!`>_EmhIH@8Q5S+)e77iDJ`qVl3@Hftzg3Vl!&ZE<>tsOx}S zY|`no10uoaazLDh=76nE3*&KF{%ZQM`#yQdpV;*2@<)z->(OJD<@GaJUMd}V>=E>( z^P9IgYuz3pCLpAc4qF^X=HFG__O}yzl4HMr;EBn)mw#g!v(Rl!gx4g2UieG|ZT+T1 zPnZm{%O0X-V1XI3;4WN-mt-t1fI(Dovw;nq!aCfT03S$W8p|6_Qebx`O+*1GP=y?3 z&ca1H5H@tR6Dzc5$95QbA`ldVL^Tu-zQWNtokj*7=M@gqHyfOkfk9q(7IKotfeMb^vlere6_ph!K94m{AQ;LkYy}w@ zbJ@as7*3)uFql@RNHgUndQ)j`09#_tkr^9X%s!dn!*b;kXpNy>Q_u=97P%oq(+`Co zyd*A~xAlWP=*0t^7FK<2J=_RrWyAPgHm?y%J9Te{OKNYvAWSG8BGD9b> IK%a&F3kQICSO5S3 diff --git a/mprcontents/38/0d/380d3f03-fe78-42f4-be74-8b773246f993.mxunit b/mprcontents/38/0d/380d3f03-fe78-42f4-be74-8b773246f993.mxunit deleted file mode 100644 index bd202383e824ed80599beb1de0de9a3b9f21ff79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4033 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 t=t&ytGAW=Ue@+9tp;S8m%bC1Djev003OMK|}xm diff --git a/mprcontents/3d/27/3d276089-410d-437c-8677-c226e99de37d.mxunit b/mprcontents/3d/27/3d276089-410d-437c-8677-c226e99de37d.mxunit deleted file mode 100644 index 71c2398e1cb8e8ab9ba45639c183714c3698e4a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmWGxU|?WX@pNGj05TXl6Vz>a9c!H1$`7f%ocp+zNhPGRAQdbZP?VpQnp{$>;+CJ2 fl3K*TKWk%io)HBvIU|;|MlQTq>xqtlP>M!e$RlL#bAk35NGV3yz8=+)a%-+FDH4mFC3QPk{q~#iGW5P?#n=FVh z(JW8#sEyLFm;+_PHn6R_7&>mf?g$wgCOKKE=`e?*HcUvzSMB(r);EzG$528}6bjjL z)|ufO7%oAsyv>8iM<2i{Z+Db7b?jmQvvfgK_&!RoOM(9%gV=L-6f?0WHJGOy(+j?%|P8v-8I=%@OA?GVy(3EZR1U?Z|4gu zr>x2V>->ZLAIMr}ouo-eDcHjR4LU3cfOLZ`rF)PgM=9+9%+$D&9y5$IIwR9#`p!^l zvlfnr4DBoitYk`g`od3cbm_wBt4z~84eAgsO##fE1B(Le^Kh1|tc5=oKEkKp@7(^} z!IkpC?ABPV*}9Cc&WJl!6A@{I9)?_twERTL)xrjDMMBerr_v9@9)(=znmA9z1z2b=JJ*5AhksbnwTyN1)t>D3C*3Lo%sG`x4VC&{%rU4;eMg? fYCwzsk#X8}qiILeRUy}O{5FDzaE!D;D*^rjkr@No diff --git a/mprcontents/41/1b/411be654-7889-49b2-9659-ae4165865b1c.mxunit b/mprcontents/41/1b/411be654-7889-49b2-9659-ae4165865b1c.mxunit deleted file mode 100644 index 53b89cb7db9bcd1c3afbd064a8998e798d082ebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmb1OWME)b@pNGjU;u)UXVQ+H6`MS#MXqy9ZHty+QVFRnNM%q3N(H5+m*ylExmFYu zr4|=w=I0fwUR!oa`;v^Bq|#3!{ZHHU#6XsAbKN=j-T zSRCpa20fr~Ou4p(hHg!ac1?_)CXl14V@QVoqny&K#MUGt4== z+hU?NqEU!O8-l+0fRZ3lUK)@>RN@P_=!-EyP`t%kLNpQyk;L0SGkYbb!H~|={FnL8 zf4=Yk|5@Gy(Ab_%!cxHJh<^9L(2ei(&m2B74T|x!(w>?0C|r-B2S|Yo=#p_)v{&Cj ziF`?#BY9hnQJMGM5#rDgFESq`cAkblCCT-?LtRM%9Ozg8kg=Fh9V#tus2=eJ6)I5; zBB`45xr6UQ`ph-eB9j(cCM!@E6Q!iSs}f!3z7d2a4^lmc)BsRY6CU^FI$EGMEJA69m|;*CVu36X<)LbW7^+I! zJTmswseRuKzuNN6!s*`Yo+(MY5|akGLCex6k^10PAp*qKGu`Jon-`;a+RbtJv<`Rl z&I_Ao?>X5&yJ>cpx9#93C0z9i-2Vbn28kCo!cCa`U?6^^d~o+j@G=X4sWRjc7GrL? zNN7y!+(nC^6Q7EiB>v{I%ONJMO)1;e98kjUY{f6aD$4MWVb29z1g!)O7{b2Bz7z0K z1HjTwQ1F9T7u<$zT;=)47qbh=%D(&dn;C8NmyR!L_^6Ie?FdzHYc7e1sB@AE-DeR+ zp{FS=#^{zj^RW#UL`64ZqJi8%tb!9t_X_%}MP-}*`SX~&EqP$iB#Z4del8VtGbYuF ze=iYCug8gnXajX^}@N+zqg)mf3JiVY>8U5hr`K@8VQN&hE;V$we)N} zyZnRKhW8jfTdZ3yJUP!q;huxi-k6&!dnld#u3{qI`O}@ZrD4|Tm>^0j9#$X<|Zrq(B)g# zD*fwb#*eo)w;dY2HnQGYVXql4ew&_BpMB)(8Dsa=k<|;Gb!2Tnvv2C+(e&_3gMW;` z``@SMnXDy9mJ$8_!av=WgiT|-I*GThj+r~o6h^kUq^3?E+W+_eC9Hm_f7W*5?CWih i5A6M6_^am@?=JVn+)EwnX$YpWGUx(Y&{tY$0RIBhSZ!Va diff --git a/mprcontents/42/69/4269b76e-7532-4ec5-8f87-3104c3ac35f4.mxunit b/mprcontents/42/69/4269b76e-7532-4ec5-8f87-3104c3ac35f4.mxunit deleted file mode 100644 index 25f8ee0bf71e40d693b226768108d501d0080f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2868 zcmXrvW?*1d@pNGjU;u)=?U_zSrAPhx+YMO`uQC0?q!LnDkjfwql=4a}OLR;w$;{6y zRza{Cm>^;h=f{{XEQ99U& zVg?S^isYQql++Xk1}4{vg8ZTqpVYF{90qovu^yQzK!X{WK`w>30_+h-pcKNl-plVA z%>4SpdGTXUEjiPfhDg43&QD2&`8K$uC^Ih|te=4k;Wltsc;=<$GcbWYrwlY3>VeR_ zvecr?w9M2LgmSP~;*A(s0uqaW;Zu@YRLpRTgMmT7fPo39li85Loe|k_c}5Fb%q_pW z&Q@H!_|m1ENT}l!fNBxJj~o?na~YVN6H8Ll^NT7OfF=S1$0fBmxhS&$9OjZhf!zF* z(wx*hpeyupVL=VzF>rVm2c;I4W)=a%lo8@9K9G8tBCtQ1;TC~|WCBnDB1m8VR@ugq zvEQq`TwAE{&LKyrtL1@;kb~4Iu{bjs)f{Fl5%e$KW7}<}0`Jyxg_Ma`1R{utAYe!u zF=(NL7965@18WB7V(%j*7Jd!w zR#MxQ(k@UISZ3$Utn4l*c<;?Hc3tfA{}^$BWz3+55?Eh)r~my^>h8YMCHHZQybTkL z1B(Y3SjD9&`Of)yC8-r93~1ps5hZas1-XZ7T@vw~{d1-2?2EqwNDVJ16w^4l=P@Zb zz3^D%6ESz1`0w9P(ROZ7GU?RXl|HKkJ~QrFF(;qK z0R~E4z#`C)aO!$$*YROpuB-Qa+f|c4J}8M&|2kgJR?;?!J#ulvHZpoILs}jXDnT@MYr}uqwpVar4b@sud)1aoQpoJE^1k9{TO>qU* zgC&*VbjAuI;gSLQnZV3Z1gW7**8aJ4!sLkm=JmFZN?j*S2AarhhL$9i8FW0tO9Z_( z_f*bI)7>UU<4}esNh88Z@_wq(4*Mb@?&oPs7X?|fiEgqW{2N0sZ)7^ z!d-izrV&Vz=4eUsWa@_5S$A&xH|&)8u~X)e3ylK{nk0>gNRnZxOFU-RF7)kxRrg?h z*s@eoLkl%Y8s6TzG44p7!>$iJLGw-qheJ)HLXw=+A}qaTK8x3aCYx^zDSqdGNs@sD zB?T8VoB@gRD>TNB{OLaz%afq!qmKkJ;>e7W}e z=VE*Q)7=-*!bY)0FvqD?F%pZhlUmt@`VCPP>ryIw=GMu1qppjb0$=rcTV$R>Eb8jm z=cJq{dB8RR*1fVQFqg5>X{L8j*h0laqm}md0=l7aD8oZCF7!v4=afj{C@au}ju!jg zp^b->_>3%<(E&=Qu}^5cLa9PZkuaEg)=F*MVC=RhPdM_)QS~pMH8VGLsf!2g+M2BYR|T2TV>07Vjis2wj%N%EHv0JCoe(7 z_~vE!dq~rR^K)l^e16`2{OV{Q|LlGkYeELqZawJS2`@xTY^8xV1u#GFq)Rq7aw}Lg zL}q$+owmI+ys}26xy8WA1)(`13&Y;wWWBBVy>lP`y_;Kl`1H-A8}~Ymv9gN{I;ddx-`SvoR+x-6&+j(3k@oh@CN18DeB$};vpi%fCg;dZMMi-~T&Yl7m3TT8H#8*D%p+XbQzb@qq*y_Cxt?rKc1jwC zXlh7^_wZ_fyO^zsO9fGpAefTE#fu7cu1#EQi{P5AFn$T%5NVsOa81gQu#OR`$vg{! z9CR1zZV-9Q18@rUs#Io@)mQ*K(25D}c}zeib~ka(nm>lAW{39mE$<&X^tkkBX?0-k z%CDG{~;Y}NM?MvzH>swDJ?|m42e})`e zPqE}5?EgT{IIY@t?nZI!HVG4RiH;os%p2xQwE*2Hn3TSc{y+LJ)6vh*KdvoJ z|2(&P_tWy)i3?jTPjAk7>&!Q}El)!tb~Mklt9asujdU0FG`k*gg$?gWYR#s#+PQ^H z17=&bgvn-QBXb+iUjC31i#zY!yg1zTJFV;hirRWjHFw)N8A}^&qrLmSIkdh=NA91z kefh@2e!us7U$g4~q_agAGGOhq6y&S(x5d-#x8~U6&4rWQZr2IM zEmXn=<~+@%h_bymI7!T<08OYjNgE~Bu|~08;+8Qq6vrG_dZtD~V@C%{R(6F1Dby4( zWD12ZYpjYkV`(LW(jl1Ki^8WJW!=(Fibu#g-$}Fj0^)Df33G4BqMlE@>w;Zs5 zrixT;=pac$JDP_Pq>G*uE^4%KYd@}w>Yy8{VTJlBUBAZxCqCDR%}B}?>`5TCfy!Q1 UlZxWHnK`hZ2O!ni#XlH)0TwW`ivR!s diff --git a/mprcontents/46/4d/464ddf7e-dd1b-4d8e-b7ae-972ca0ba4678.mxunit b/mprcontents/46/4d/464ddf7e-dd1b-4d8e-b7ae-972ca0ba4678.mxunit deleted file mode 100644 index 01b7d4cae0f52b9e2af588d4abad9a069bbbe87f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1289 zcmcJOT}TvB6vvOVT1FNneL+YAX;_JU5J(Y$x~}f(O01y}QCw%vZbP$kw|noJD-l^w zLX<%zJ_Nlem=Zk%eL{p!Jp@Gr_8`@p5IqGwNp)sszeehzhvs2-=A8fj=iJ}_?3yZo zs`_XcHUM3hKE)&37q7=3KbUB`_bf83)t|^^5Vle)#)ep{p)Bsm`qDjUel3himbFy^ zRaQ8?ERCL@|Jcv$EP6F9%#Cas9mQN9I7zk%WTw;&?kFltJt=rvXL`i4v7ptNW9m|I zfl{}WZaLIXQeWqeuFj%vbA#D>qeL-;Vz;McDQt%7j$y;jnrH%O9m5$eR1XfJ4Xf#` zU6yI010nYy{*c}|+o)B7QMd5w=S0Klo|!@W#o*|`hdhjJBx>g-7GSh-ZX<} zL-3@{FZk`KljQI^V7ui|%R=42srbu8LwY3jy(@34udw}-k=D*K9yxagmyyrQqhaRJ z0*Mr+xX8h(yh=h%}r*`%IYMf-9qZMPdbIW7z%LtS?9aq5;b|G0i>+qLew7HoPnADhm*xqqi}w>~8-C*>~?;W`NY z0bCRK?s9H+rgOBmHF~V3=lOrewT`B9H>w!x3SdtHM|_jJxv$c`8@pmJPmRC*diY;~ zSpm1FnX5;3F5QXUFuwhe^OHya;?~X`L(raeILcBv51i)T!zS|U%Snal=D==J87f_6 NF*OM_RLk!uz;CU~ey9Kd diff --git a/mprcontents/48/b4/48b4121a-6dca-47d8-b9e1-12cc7b615b37.mxunit b/mprcontents/48/b4/48b4121a-6dca-47d8-b9e1-12cc7b615b37.mxunit deleted file mode 100644 index c18e5a23abb896fd17855f7e14d39faca28daea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1123 zcmY*ZF>4e-6n@z|F$9H>!h<8=AZdgo7*y_U8IMwQ zF|V!sG)8H8fdl<1fTsqTJrsr&n2b9D#tq}lVw^peQwS$Yl_XW{X2(nVD4|v~TyD^r;E0|kPWh7m%6{Cf z-#;DPoEx4kzaBYdo|0NBz;mZmChS1GN&uQJIgV2rbKX*MT&!hv)#cr9{ePw5;8k>=M%<7?p-1}hZUBY%}@ianIpw8fEDSrJWZHI_>s zVY+K}N}mQWRW>+7IOBCgZA|WlctVepPG1XfY;$`OA`;*zNK$W-YjT$-oF!4)AJsMefVg~XGLo8Aa#YCIwY#Kl% z0njUffNeWuSjO8H;Bwc>m(|CM*?T=N4lXS6g*sqAihcubpEnP}sL$;g-Qb!DJ5gqZ z`kW4lOxbY42qb`Rtk&NLLe^)Yhteb#4OSu+W0pfnt!tMSXfF1d)PxS9;dnPnRh0~o zVX^2_gjV1qmbRc}r7u@a-W_{++)lm{zdmgbdOyx$m-N6Bi%2fc@{%J4x@&X0LjBf8 zj>L=@%%r6GwB`mCNs(nq9w7=ERADJ*u#|l?v^G+ixcXtE|J;G@Gwm6S_J^x3;kOWN z*4oh@`oA+rhfX2#Fp-dV0G`BnpP!ieeEED~{QjXI-#2m(ezwOOjrPo$3#{ClbuVg} zZxP+ojaf?SZT~`+h#Dae!m}81dNucH{rY<5w#z-~4bj>|?!j4&6+60XsjbQT;^g&i zXpXKDJRK4G5L9F6^3lrR%Ee>ZTim-cU48wwJ@h@>&^ayh|3EGiS&GO(zzpFSa@4Ga m+-CSip)qP=!hw)yPRKDcG>j??6&wG*THH0FAkxZYbJ#CY8G4Wa diff --git a/mprcontents/4e/6f/4e6fbfd9-cb0d-4dc7-abb9-2f7c61a48839.mxunit b/mprcontents/4e/6f/4e6fbfd9-cb0d-4dc7-abb9-2f7c61a48839.mxunit deleted file mode 100644 index bcf4001e61789825b0b96dd18f32253b0ae61aea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmZ=@WME)b@pNGjU;u)f`}6&HPapSPy;Hv?aY=_IlS)WsK`Mg?P%5A(KPxr4q*%o_ zKczG$)ibvshk?nlpdh#;zbMtcG&6-k6{yP6z&zPF*}_EEJkiKl*TmS|MAy>7%u+Ws z#n{p!&B#2_G&vQaEg&&DJ25@gGbOmBC^Ijefdy!Sp}7G0ab|uV13O5%ph>@RH%)scE VS{|HVRN|SJl3D>&00JBi3;=krSr7mK diff --git a/mprcontents/4f/6e/4f6e48bf-b665-4910-83a4-ef1370342887.mxunit b/mprcontents/4f/6e/4f6e48bf-b665-4910-83a4-ef1370342887.mxunit deleted file mode 100644 index cb4b7fdeb3fdf3f2a898271c618e28a699b8004f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2499 zcmcImU2GIp6u#`XSc=s)5HUjIwJ9l@y44CX;epV0w{&Y4n*R8ckeItOXLm2mUuW(t zU29Vn6MZsbG-!ef*aVTr1X7xySQ0f#!51XP#1MUHG*J;_LwxYXb7y8}cWNKxf&0+R zJwM+)=Q}^!FV+xJ+nP?2MuO);pRot#8q)`-Z>+PnZh0lvI#RNLY(P~%E3z&{aMN&F zE8isM%aV{|t|o>+xVEvI>EPk{*C(0gf+ve5O~uv05KQ6_H%`bdUIc?OgPPfWpa}d@ zDWd{(OJf4sspDoH!G$Zpp-j_gj)SH;lp9nOAhb)+Vb`)uTcD8;HqT1?c4|WoY%rAQ zH%KddM!{4BGlY|%4fPH6BZ!v=18f$&LY)#uI!?Jm+a|ns4NPpZ%{T9rfk**WF#0TD z)H>){u&J5zVuNvpNkEWTyUa0+jUFg)r9ce;l?qdO+kjz15$|RZG0->+ev1R*L29Cq zTDIx2R1Q5syO0x$i2|l%OB7@c8KpVf)V(OsqsUc+tq_S3A=Bt;&~l7rzPC5jKm4E5 zP@e>5(}|SMxVFcZm7Hvsj7>+I19-jyea)RQ-h*E+EgXl=YTT-bMRaKhFWM~ObJMHV+uInwNE;X)bE_MYWvDCPn zn*nS+jog8A-p5r;pTy;i`}6CqfG$*3_C)Pdb4@RwxjOKUaqa+pX6!=Mp6D@EDDR13 zFD=iX#4}v6&75W)@U>|pXOhbi)R}K~>|Ok2q5tiZ=}Y;KS6>NGDH>Iyt^^e8VV1X3 z)}!%oxHG~9LC`=z-n2{PPHEubZquAUh#go*fogo-=xs7FC(LCMa$89{zv;D zS)D|UkahRAn)wg@IsU}^M_xKjGVNDyGg)gf*KoFBIb9bcbUlCR^Yc?nSG#AIiZ9GJ zf7N`ebd@4#&7Eg&PMu%uIs4a%4WHRtPX}nN%g7IT=g)zf!VM-$9{08KZ>Su^EsTBW z|K4B!{?xCVx_{qwu<4^0H_yIy9TDS?k xB8_gE8Zg7-7geMt!m&f-=BNz$Uc6OiX*uaZ!1tk1^%D`qV7=UhHc>eW{soDN6~+Jn diff --git a/mprcontents/50/1e/501e57e5-98d2-4a47-a0e9-85f75d41d80d.mxunit b/mprcontents/50/1e/501e57e5-98d2-4a47-a0e9-85f75d41d80d.mxunit deleted file mode 100644 index 8c6e6012df2e715254a056f587f647e08f77f99c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1269 zcmey$!oa|);_1R5zyJhK!{q`l&2aZx@Ur!Ltm6${CY6xNf>Z`^pp;i)S)yZdNoIat zu?m9CzyuL(oT=J7kb5rw55<%uLFoLY) zaIHwrDNRXDVPIf#ttiMZD)C7zOU+?m2g-S5rlh3iF))MdgO~+&&Mu%7!p*wprmgsI zHQ#UDT^qOitMzK2ZWaY9a?Vdlg}K=$v$zDTn>iq{2#}mM)IRlJyuSC6!1bfwpsr8=8;$S| zHiMX)6AQor%L`N-TvC*om#$C@vYi1aQ<9pVUsTD!1D6Ud$;>HcVD(JS&vQvENd$@m z0i5fSSdZ{IXO?gCd|lkteCM!3dzriq=uaA;N~Lv44j&nTvCgZi!vd>07+k-#X+fsrI|&* z6vl{fW@cVNX$d5Z7!WA}9GeqB;Q-GPYg2UJZl7-CI^o8xA6vJrl*f@OoDz#Oli|*S zBs4JTh+^8UnkB!MTJ<}0^oUGunmzv^)HF~ALr$y^hk^Bj!pn%k042P3>dZTJ^CO?f zEbgi!|4x58M&t0}2f6{Aj^O^oA7qWEa_3rUn|ig1#|G=DJ58c2$nLAef7|}Z#j}%P cajaM8jQ2zZ83PL_@Zjz(2B&*y@?&5C0P;Y4=Kufz diff --git a/mprcontents/55/19/55194696-b0e5-46c2-bbe7-dd5a5d95e787.mxunit b/mprcontents/55/19/55194696-b0e5-46c2-bbe7-dd5a5d95e787.mxunit deleted file mode 100644 index ee2a88aa299055dc7dd45ce90f45a94d8d01c1fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 953 zcma)4&ubGw6n@=pvBVa7Q&DgTF&6{ct1Z%`n>GolN`H6|B8Dv8~&dw$&UOWi# zqNt!k588t#PlBKnFJkd85cK4&QUyJECE=Jll{{X&5bbbjvr; z08omZrYmF>TWG-%5>zq`107I>Oa--7)X~{jrXndQyU z(=h@ULn~Qnd7%nakl1j=1_YHz(26uI4@Syln8qciJgq^fak17<*}Q>CNI#A-poE=0 zN;jfs!&ir|a6v;LQFw4+2w>toD1=Za;Veb5kH=qjKTSUUU3hlym z>#qy%TT7cgWv2<0>_vflrhbq|J!D?0*MEI4-O0|pnb~yl&)C*~%nLm<954;Yy|9Bl HCjtHe%n27L diff --git a/mprcontents/5b/78/5b78ee28-e066-4098-a180-1a3efda60f8a.mxunit b/mprcontents/5b/78/5b78ee28-e066-4098-a180-1a3efda60f8a.mxunit index b4b12b591360c50303308da20b215cd495b3b749..dba0db5d04b543b67d6b2a8c0ef7ecd8591fd3d5 100644 GIT binary patch delta 1585 zcmZvce^69a6vyv-%Pua4`*s)hha&6}ECvGay?x8F5VFV$DL+y&rr=ePQ_1^v=$j6GNpe35B9?I7jBd ztA4?7M`VHlnt~32%teb26NKJXG3|4L;9S4S@yFoW7w9Imf;e=7Ku8!i--0N7H|pur zti6(EOX**|?5m$o`%Azq&YWpl6su8eAh$aR2#L!^>_HLw+ph`5(d}p z?p$)-qfR~e^TT&Q~viiWD3anfRXQvq1iIk8a9*yvnT_@Ru?br458<$Z- z5u^DZVdYrZFASotO+|}>YLBLDx@-5}?7Vapt4D)SlnEI^3O**4P$rp1om=@@x0X6& z-Bhk$_}g)4!pO(Kwr zswk+>&$ej#7PM>_IJ|XUqw|qM9=0LVGBi5RyD(sHuI&AM| z!Us|j$rzx~PXTXA{a}}z(@!SLFsPAd=5l0Usd!X| zg60yp8+*8D49=C~TVKhVmeX42!b_80rp4z*9K~b?^ve^X}?v&bNQCThSAMfdDQUW2RWIgf< zBM||!AL9MTVE*8_Jlj_3>>s{3ch42;{ht)dgD@0h<^DSzv(`ff3C1Bfcn6O)snR9o tpQZO%3$!=dr(T7g$T=`FOA14=VKNC0oq+3hY?l!Cr^y3L4*qd<{{p(R{2c%Q delta 2076 zcmai!c~DbV6vl5}WRoS2Ez!slHH2Y{c`pfqK?@`zBFa{9qgccT6M=*!U_q;xVnMMw zcwIn&GGL2PL~R6%3$(I0)@nthN-Y&fQM68l%AnOw=}n4ALOcHR=G`~vo%1{2`OZC? zP>_lhc%Q=BX^c910B`}I0|4j*xCnb_H(`S{4%aYPG&StP;^1`#8(y$8h0hrx_=1bW zgLE6*N8YR%S!OBIq(|1NPkr<)yk|WRj!k#KcWGRYzOr)&Z9LoNSJRty34U%OfhY0V zc;l|e&wL`nmNtd;0P|nZ0N7>bg1;Vl5Q8c2tggL0qUmg`uY}v}{NT{ESVUmM5rTdi z07l%UGJqpGkd#7oJf-YH4#{QZ;r34lbv3`Ra=`m7Vy`SM;|Jz5Le~G4o9_<0ta4x% zF2ajB7TzC)m0M^T?_MMR;}G zuAb0O`iJY);{?-Sp6P68X*J(=Duq~6O7Ea?yg{2D%-~mT_GSD*|NO41?Ey@4$%NwM zgKEOYquZ7s#bfc8MaM@<_r-j!*Rz)@J*c0k! zRMb0(Wff^i59sp^0Pn zjouy8H-p&bR)1c6@Qu3@AQl#@gofy7Ed&NmH0r6|ZroZBq#hl+8Eq8sH9}a1Un+f$ z9~AlpmQ~bWy_N0tDKdo@l-sy#-47etIBd6JIprfCzjd@(s%z2%^UUzVlv~ehcl$Ms zb2y_Fm1J&!p~-sJc6++&ysp73Bo zwR<*QC?Mf$cOmZfQ_r=+f%1R~X=nFsiEk@hCyfFe=+Bt}FU@j-V@ylPnP)MVgOrdeQ&Y1Pa#fD@MXAW- zN2xO8ilm?nWonQ-g@Usk>^$ixJ-VOJQ+q$X*3<89c_m}#=$~O#AFo)@%o+I}#yj|h zyS_UyKU0~Nkw5`@Ongcf1r&NojSn6z3ZUhO?6JP@B4F=$1@Ad65?P`Ut~4q}rre}R zQO0jTM>+{c^?v;0q{+sp+gD^oKg2kzA9QEWRiehj;FaMM)X4os#SUUwV0k^SvG;fUu(-)(O;5F_{+I-En87dl0 zpgZ_LD|QM-2;dgB8_gGf$xb#FkzxrcfO%{e^j))X)?PD=(EW)K1RUh9o+T7Z2+^DA zYHfgqOKOKpkZ`TbMNBA$&b%Cq5Nb+!W0)g~{XaLLyrHq)$ diff --git a/mprcontents/5b/c5/5bc5ed62-9161-4f75-a6b7-8e989a4ea6ee.mxunit b/mprcontents/5b/c5/5bc5ed62-9161-4f75-a6b7-8e989a4ea6ee.mxunit deleted file mode 100644 index e1092b2a239963117ccaebcc96d84813ff5e5ea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1682 zcmcJQYe*GA6vt2ZTB#-8!ssb&Bvz1;MNsr5@58!1wA5Zi;kY~3hIV&uyR%ns1QKNw zy)3^(1W}d+QC3Kg4@H3z5=dX7K1xVI^nil=64cq<``9b_A*lJZbIzIn%>2%ov*#xP zOe~9rApkg=*7ZkljND4It)18f^R;H>_GnHhnX-o*J zR6>5FO;#<`2k=GO;@l9MXo9LR8PBwyDGJrWZ(q~BfsVuEiMK;NnD>G2{p66SRdJNx*!AjnssRQJL#uA_!V=WTs(a>`$9C z(n7r<>3KE=d`@bMaD}^PBe&%tZwoQ74g@t!2;>0-mVpmr{8g}Mf|uj5b<<8&&uHIx zx1gf5JACDg=fc@C^Ojsj*K;XU#5{(nDI3gX;8^mbW<5P%F$2>)!9Aya{e)eR;Liv- z$>~H#HoHGoKYspgG!Z&{?bfeDTlA&T-U2T$c^3u!t_0 zNIKko?l+X6UPICpRIBv%543`R1+?dI{q|&gd3T^`(*tcJdc1J(>p$XJihD(464l}& zY4?_YMOS&01KU9O|x`NMhH7C{wXRO d1kn{@D3Mf)HZcew&t9E*HYV7mmg)}xzX98{`e6V7 diff --git a/mprcontents/5c/f0/5cf090fc-d880-4617-b738-ebc8747fa3f8.mxunit b/mprcontents/5c/f0/5cf090fc-d880-4617-b738-ebc8747fa3f8.mxunit deleted file mode 100644 index cf82825c09aa6760b9f4de57ca74818d2cfea309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1580 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 fwgUhPPDVyWGU-pZ3=izO_s1VX<7N35Y- diff --git a/mprcontents/62/b8/62b889da-ec36-4bcc-b7e8-82ad756aa341.mxunit b/mprcontents/62/b8/62b889da-ec36-4bcc-b7e8-82ad756aa341.mxunit deleted file mode 100644 index 644a285d32688ae159ed0cd86f0de053ccf6ec61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1139 zcmah|OKTKC5bn%oNeo01M0{LqVI>M?(L)qLg=8m^XkLUw5n`ZsrZ(HjO!wN|vk&nQ zbCY-xJcxLaTm<#1f`35q0SN@bvx0|+hag_9d1NP>i^DQ(SAG3eef8Doc0#hbQJeG- ze7@a(TRgY*>Drs0E3bmZwLvR4)2IMBgsH2n$_5?7rO>(bKe6JN4J8(MW*SVO#02vp z;){>hnHNA5vux=EJ_y4?9&)pdkQkz=Q2|h1qRdbam^M@jpg#CTQ1m1hju*IGEKpe! z;8Lcwba+IfPf=N-rpz^!#YJ!oEi+A>G7}5n=DWMPyRJw@$3eKfPA}36`GFYBA}MqU zpb{2m&Qiz|-@|}J6zniU-GPdswK53W7eT^S5{yQ%v>Hn6%hO%8E?@dzG3I$Y1@m+! zRDeH56=8Kc}hBm>*3JACBz!8 zSEMpyPz8^4pqC@ubwQ9!=woa^Wb+WF(p`9R!|v!M1Cz@e&t@P0={=F`!eImzqzgN{ zFeD`!CL#jTHO?I+OP;L7=}}RV#EQJ{#e1KKAr2E;UX zT6r=NTcd^Tf%{zzcCXs^UM_z=zWs$JY`HybO(K2=++lRzG$OKW_--brBo{c;_@jo^ z+1LE^-@?k=yRW}*{rG^4q`d{M$r8rW;m_eI)w%b6(%Df2?bg}Cn3%pFF|Bb7`~wT6 BX&wLo diff --git a/mprcontents/63/57/6357efb6-66a6-4fbe-a08b-b6a7c2d34f49.mxunit b/mprcontents/63/57/6357efb6-66a6-4fbe-a08b-b6a7c2d34f49.mxunit deleted file mode 100644 index 650be3db65b2165d6f3a6a06418dab277a8132b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1757 zcmcIlTSyd982;VWlGW{op^(sFF;Z~7l1b1-ceOTkHBF}5uL$Oq?X&wu&O|9}7YpZ&NB zAgjpdg>}Hb_>V)}P~b`H&2#bL=WknmwxWZv2!VX&+K+p29Y+OOQj5~R!DiUJB!HtL zZ6`FUNPZk9I-YUt!eW%@Hk()GqG2LYtl>aS20$C;RfLgB6+sFjSwb{KkRk*_6j7Nu zIHFK2NJu17kcP^T)6uKJp&fdl%pwH|i%2&*9XKpUC2IJ1q6!M(6PZX37|=vzb!vAR zSC%;)0YMZ!A*^7I62-{nl1HtG27YUvyoWHc%DdL*M?*aK%Ze9bEOB}y>N5#d*wjWxsLMj8#$hF z)1W;vPm+T+n$h#Y-Xd^{91!I`!|Rg*GQ6~)KKq(iTNoES!#&43zP_95PM{(dWJX;I z$mYQjT@>qCuyJid28P-{6vnO`#^Uz)Yy{y@elhdU~ zO|7T5#k@HwTvKxlkqy*KR8A2LHgrq2Pi-g1qner_!>E*PE$EsDdkRP&(*Sd%tD>Jy zxVtMynojxiHtn7-a3-qS%!14VsmH3oS#j)3h^D>x@zndV`;DiD$7XV_{2BTW(J-c} zpv1zI|LU#Zqucg2T&#GLJ2Z9V!3r~_t%UI`ET-y$g{r>!jbEN#mi(8uEEG=MKCCR4 zs(K6BU{~dVGjqBAJKw~b9QTWi1X{r&;(Zd6HBpQOV_a23xrM9D1$+6emZqkM`GYgB zPyhO{!d$Ik^~oc;koozNaI*wr6zyoL(+vbr#BIt2bPa(LJrB@v}4M fUrn?m(6s*^vsTSd5_4s0+@++e>hD8hM*;o;Vy_X! diff --git a/mprcontents/64/d6/64d66178-e97d-44d0-8b8d-0b02fa8f4ad7.mxunit b/mprcontents/64/d6/64d66178-e97d-44d0-8b8d-0b02fa8f4ad7.mxunit deleted file mode 100644 index 7d584ab543fa3a849368269af0a84be8362c5a26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1717 zcmcIkTSyd982+8rw5wLojiMo}h-xb(f+$GcHP+W0m2~>X%A!U2B}eR7_Qq-J~ombY@z`nSW5+Sb#=|9TS_V zu(`Q`7*z7P%grQaQyEhNENmOp6vW|ycSsvFHC5<_Zbns$8B{dk-y)S@G|qKXsG^Cg zoLb1O3MN-E7WJ#+$1GOsbc1q-*RR$#F*~NIVa5>~XAY+ePGeNtqMF*Qizc~mJtdaS zX{{h!_#Ltu7OkPXY0R(IVMVMFb5`yya3t0&A@$^-?rco1oj-aksQtxt1WrkASeRXH#`1BZMU8#_PN_ruw zbp`{9G*Th%aOx(Et7hfCNxhM?N7nT3nEUAH zaF_Sk8C!cTp62x&3>k5n0cwT0?kXW81tDt_P1rieVduD=j!AYZjS9XrnHw$6)R}s>&1y< zeW{q@3BU{qHVoU;MQa5!416j5sb>Xq;46g%S>h&s9By2hmm9ov{oUnpg}45<6`k9d ze6B`nn{C9B2}h&dtKV04eA_y7@YTnZb^g(auiGBx+`aH&U0?m2`j4HZ{y#Dzv`pAV{c(E@1T%QAS4PLs{Wl7vH3Uh)Aejf*$P5%(^>c2KnGT?fEa?`Ty_#{PAuaH%PWEM4~vU z@n*u4OmD(*V&U1xR;(q7Ws^cwPR5DOv55m)769zVih(dPI8*f)qB`Q81ZgD75vRf~ z6UMQs3yU7(o#n{q?KaU+jTJ|k8dG(wA2E2QdC`v{AK=PgqX#UAx>pww)3Ak6@TT}39zs}C2L8AC;(D@ zDnS`W@a$A&Mxz?-vAq#JO5wQ+_4nbeW4~5()n9v8SUH;ea5RmIM3578HXtd86P6@Q z724O@A`s+*aB>o(tQQt%ye(YS49JbhR1aZ}gDY%Z7g5 zJ{>svamT<9HhCkBwrU3P5nZU7FnhfOSDRsji>u=u-!J*4fym|0@9!6{S-*ImxiaPN zdJ1P!=2ll<`}vkvFGuT64p-K`y3N92>^b7PW=*eRyGsTll&Lh8j&i~xp(*e4(mI=K; z_WV(Sj}Jbv9(;Z=@Oxq8ot7=GR1x|qb&A#430raD$!z)#S{yU6!~$2%qY8X)mQ^s~ z#qJ_=1B_ytDeRzvo?;;f3WUuIuZF&o1~W{iu*fTDC_&zW$Loe7S1MMi%28u@hPy78 zXbaDghUA`&Ms9?jBNJl>pl7OXyMcoafHqaH3SUiQ4PDqqXB4>Opa*)`cHB}l)g-0T z(XU^*{N>lx{KiW904isK5e43wo#guepYlXR#ZbX%kk z6*CHwwOo_=7n`99D`R^}(@$$ai}tmPzG!ZxD5k?>yUsA5)~nE$a5MwZI|dq6={XoB zFO~CtpV9c!*qmMexMyv6{OQZKxzpRzev?|oif?K98k{B0ZLz$4deCY1^5& z(;ZakkRWsCE}*SIZ_%Pf-JxvSTK}iT^}F9UPG8&q?8evkH*Y7c4N_5Fq??{(lG~je wJ)-41XxX9HbKf2xD!gs{eYLvz=6piiyM@-0G5nuG>k3&dyo8+;OT+~D2RoPzN&o-= diff --git a/mprcontents/6d/ce/6dcea552-d688-4c4f-bf86-d3ebe5a7b4f4.mxunit b/mprcontents/6d/ce/6dcea552-d688-4c4f-bf86-d3ebe5a7b4f4.mxunit deleted file mode 100644 index fd063722d38d4d4cce6b3f21f48636082e353a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmZ`(O-NKx6u!=kHAIMsnO4Y{6Y0uP7Yb^r9h`{bj7cm0hsSAY9{9Ll|B7M6?Hgu*&uFap#Mf{)nTk_O$95&@00 zAP%W526Z)l#i^?&7Vmj$?$+K}+da6LHdSO&XC+g&tAY;CvKm0+GSwBjRZ77xw0da( zqI&5FA?XR26RJ!(Fr&Yg_xsnqX=6?2qnBr*)0wC3Ud_Xp%98=A9TRTYqo>%`J7g@EiqfLCi* zxhE9n!=0STG)Sx+J^iTIttyH!Ao2o-A5T{Kr)K`f&)ba?p|hVqX3TvvlO0B`Sf!dX z_VXV$n{lF%Fw(|NJD8+sdruM+#h5i`Czlxa4B^%giw_hu))2JeVkn?DnAnlC)a9xw zbK%%Jad4-J?ZQ*7*itEkwj!kD4HTciY;QG@8Z zqoBqCVh9ejvqJ$I+xJy24#YO2Uj zRuL0)LSpCyv1RD|UMZq*qc+{JDIcXKN$ZxFEcGZLOjHj*-F*@b3a{c)`tTu<8U9H# zJSHA1(^)CIBjRF46^Y`?T~+1yoNeXNEq@GwaThke>?+)7uIhLoe~B(ny)7nvX=Zlam5PE8 z6)ox^Ny3a0j3DeOOR)&-A?T$iAEGDwcAt6#F7!p(T;>0^}R?JO(Bq$qA z)Cg)y9SKm=&sv@)a*&!a&dr2ifGP%w`alQT)`zGjlL$|EKUJtk3@Y*sZVxZUlzg{j zbn--DMkm$GoxK7>14)q-KaW9PU;&jV5ni`ki5B5~Oyg;o1XP)pKvs2Fkb@!>0l4b0 z$~5B?4N)03;OQqNQKSkuq6JyWn)NzyD*9FVk$TqM7?R3C@wCZ)J7kN@8GYbo!<$ar5{cJ0&lRoq-m5j3P% ztr(IKF?~4e9rDqyIiedhP!?^cT?B?5hoCWq?#Rsi$KHZo@66@f3v*!B ze++9fo!VXTZtmE!^V+?Fo`O4bC96DT}O diff --git a/mprcontents/72/48/72484a2b-ac9a-4e21-9f39-1655e243bba8.mxunit b/mprcontents/72/48/72484a2b-ac9a-4e21-9f39-1655e243bba8.mxunit deleted file mode 100644 index 420a6d220b06108be4480f6083d6dfaf29c674a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1481 zcmchXT}TvB6vwZ-ing$22x?z;g@s7PQhcbVazE15+RRLd!n`|kclXB3-1W|#{U|Vy zUV^9x=>vQ4DT$IIGKdU%O^6<%=pp)`9*Tk@l!APyv$NZNJp@rSEW^$@XMX3L|2cOS zst~I31pTNM!PVN=E2d_fL(|*q54`csUvYSb(s7C!z|}_*q+5}U8>Xl5A33r%KaCJe zlY>-R!Uz$a+Pv)JFwrb(+Z=wbSUNQ%$#Bp|!1{QcQ4F&JDsB(Y^P)tJY=&=K#+N}ug$k~BLD~cbc{9gF>dFMaOz1VTHv+3_7 z=FKe_-<#>1TfO<5d->_&zms^~lKQn?tlxDN{MEJy{*1r+6Hr6!jYtGMOo Xq@)%xF!?3srZTVqHTehmGB5xDC{GnE diff --git a/mprcontents/74/26/7426abea-6dca-4a78-b80f-a81a6faabffb.mxunit b/mprcontents/74/26/7426abea-6dca-4a78-b80f-a81a6faabffb.mxunit deleted file mode 100644 index 454977238c537551c4e4fd79f479cc642a9a58d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2264 zcmbu=eQXnD90%}c-3Da*;X(w1ME1ZMVqht3;!Kv(*mmvKa(lfSWFw;2_Gvk|m*(!e zH^>qV=s;osMHl9Xz<@DOhGH-RnSbC^j7yA0-GULE0?|K&CXx`7>F@gD?P07*+5K_J z-Sa%(=ef^4_q(6wA(U_RRiZ)!#~-Ix=vSq7|0jxnj$W8}>9v>%iii(w#D_; zoZ3C{({1QP@%GfRmqOnuE2Wm5NJY7BK59G>x(;2Px~aVsH$=0G1Jzu3egOJcU?;MysQN}Gm*iX#@ zi`MMV9{G35Mqb$Ewca}9fBl8F_r7hq;mwGA3Wl1!aac)^%rY;he*~fx7lpV zG1LxK2*h;wb;0rQ`pa_7%=CR*j-0gdyY_p#58q?Dcdc$~{N=M>vo{{0Xck``KAw;F zIgj1A)cbP_`&UNeJuuWX-cALL?a^Eh~)nY P0nIZQa!%KDLxlbVnNWWJ diff --git a/mprcontents/74/34/7434faab-9b88-4ea2-8310-1901e04e94c0.mxunit b/mprcontents/74/34/7434faab-9b88-4ea2-8310-1901e04e94c0.mxunit deleted file mode 100644 index 58f455341e1f03955bbf3bac7cc6c5a6f3cc7510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 593 zcmZ{ize~eF6vtna79AXdi?~S8&f*|+E=|!&Q`DB?(7_{lsliJwB$wLGI=JhmIJk;` zKyeZO0#`S|RnWPUFNysHdegn{_uc32y>|x+K%rPOKm%G2qiuP4bKf}ER&(!->u06d z8UzR{WbLsYD_hbPepH<9LCG`&9TszWh%yfS2JXC;-J$X(aA z(FZkoWrk0SD3djFajm^<#K9Q)z{sF|M>JL)Y)7=Rq}HD-;eFXPH~` z9RV+M)Qk1%XXmI{f9z;$SEFI>m#S0JEcGvtQei>bm1RoaK{?+IAX{Qrgaas$Z@Q5M zg_F|82_Ag(WHf~kSrn}CXtAns{~p`>8|GX$IQ%AL~m!_>eS3Uee-5>>0k$m zt_cwx0x7UVC`A+Lm2RxI5i`8KeYNDeXk29?oT%;^@EvF2AeT-n5Jo`Ds^tz^@VRxJS@&q)G_1$ zla8?ZsL5PDZ#hH_hq;&%=c;2eOVTV4%ph%yTWKbwO(@Z*WKuU7k(^MA=$2%|OpqkC znMSxpms&n(78k8jMiE_J*pONQO~Cb_usAo1`LyjYmkd zy{)++8#TElM+)I+Q?$j!HJT|#TcZt7**&frj>a?qrF(po3we~KnE@5pL9ec9%z{8x z6t7`dvn~u3g#GpO{mZ%S2ae3X(QjYATl2>kw#HRJV>w|HUe7K81di#d;3nN#ed2fN5w0 z7a3TGd0BW6ErMV|(1a7zIQHv_&Q5QWCFVr^;jK5Kd@6uYzd{Ogd>G*%=+VNi>QHqTqs9WtV~ab~MR z_jGZQ%7i_@#vEOs^<`eQm6)iZ4#$({AdshWEt|qn!SkyRT0i_As_B`$wEXS(&d(iw zUA34L;|0&VsI9A|JOP(2R>F2h8F)PZx+r=B-Ls8$QG617fL zS6@jkZj8@A`FQ={@TZFZtk!z0FZa`~q1fw^9v5D%%+G+)Gut@Pv9Qp4?Ozqkl(6-; zS<2E#U+?U*pUdHUEA2kpwpEICTX-c2_eOF>Q;GnnbCXTev2>Y7CP^}Gk5oz-JO~J&FswoZ5IJ{jaJGq0{ngW z`logH``(3jzB0e@0(yylJw}g0_3A_5Xw;T?Gj#h zREtCO21(b9mBhCL;YHo5Ahp_@itIyL6;U&!((vH$;CRkVABATzTTCq@_vCb4j4^bv zY@l$slsHdOiE~?IZZ)ZzAZBninN`;L8SRx%I1L_6OpH=!j2&T}e41y{EqSYSJtYU^ z$wo>OXI2h_M2kpC5rzpTGi((6YJRQKEpv}BtB~VF)_vriHXc_99cib$YB7hQdD9{j zP>8Z2be-I>5)90&$}kQn04U6?HjVWQ)S?h}^GN4Z5RisqI?jAlX{9j5u8t(WoPPLw zZh8CS+Qh4^q5f|N+LGAMLDQV;za*xN2}$S-0E1N}t*M3PLGG^bkf4xBV3_Zc$L8~fI&|~z<+snq*XPPtkGJbUj_t^?Tbesu zC`=1abz>7?BKM(8PFmH>G?-ZiDsGYP$I5b>`tmyWa9~F)P~4$qFMP`0PH9`Wm(Rca z{Bid6_S%sbzaGD7mv)eYdRio$lD(W_Mw{%RJ^K0M)`?PU{{7~Km2;mqnqB{3H!YV_ T-fzC&pYC?x4u;s)ZY97!P=q{< diff --git a/mprcontents/7a/90/7a90a204-9d71-46a2-a681-525a4a73a7fa.mxunit b/mprcontents/7a/90/7a90a204-9d71-46a2-a681-525a4a73a7fa.mxunit deleted file mode 100644 index 65f6d3e8a5882b10f16ae81d352fbd753e21ec2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1471 zcmZ`(OHUI~6uz_tSr9@{!MKoy6i^dM0TUKrp!6Y+@~|MH_`0+Q9Gu=McV=o!)Mzj! zVq#>c@ew6aH!hS!O$Z5YOpGoRU6`;U{sd#9A(43Q%+PkQcGLErbHDR_=X~cb7ZOtF z=?aiCf*;rX?dhop^P#6#BPY7mXX_5nP&xrdtXGP1Wn5M+sGf)}11a_;5^_4oG)YVQ zqES#)LL31ls>gw8RFf1&3It?vFcp>c7{o9fOeGYqg&_$t*@m%BDHa1pTp*PC0ReRlSB`guM5Z9$jYq5Bj8hiByhP&J7e3jGRW5EWXxSPW7I zbxa|JIXMH0#5CY$e@g;iTR*Hw-A_ipT`SQ?_ZN4mLCzK4Nm)$BB;pK949FFMkr~Rd z-H$)d_`ZZ6-Wyt5deqiz5v;_d9PJ%2EdlrIJP9}l8%K>R@-XsLIC0@6Zwq#!pGy-G zLjie$q&yR~$us6DsF`7#vf9a^>O}Q{_SyQ8M3FCb1P9+s`FWpuR28FlW|&4m(>XJ2 z)h@6yGUsouZg}t4gl3)oGj}@PoU&wAU{Zi;RNPQK9f~3YHLnv#AB_Vk#RP0)JfWor zH7>CU;_M%rM7e%Nmd)vqWt@Dr(#!Zr{bJ9n(865X#mcq%1*=jG0%d5bp3KjG&|Kz; zN+u9C>)0uqoUIMXk&{7IJ%bwMS}=(#LmUy1(N#(4#jTLR=q@Qn%m%NwrO}Hs8ZIy0ZHkDC(KP2y zrpepVgiqLJ9mD2rn3y$RMO9VpuNx!&TR#pyy>#;OJ4@zHOv>8atZUrHb72j!G@Gb~ I?agKU3wrFKYybcN diff --git a/mprcontents/7b/82/7b82f74b-ca76-4b6c-8193-c07b7c859f53.mxunit b/mprcontents/7b/82/7b82f74b-ca76-4b6c-8193-c07b7c859f53.mxunit deleted file mode 100644 index 6b078e8674b6fe0518ec96ae7b41f1a52f869bb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1223 zcmZ8hJ!lj`7@h1T7=sA`i-?6zafqS@MN){BxjW4zMne*!!GKP7zq=i?JF}Ucz1$fK zBZ{>Igj8aom0%&k!p2UC2qG4eMo|#OMi3D!#BXQU+q+z`?0!FQ-+S}+UUU-Dl`j`b zKf&MF?;Fdt4R35^_4)F(Tlc1{{B$D#GJvg7R%0h^&7}zQ**&q6S`jKN^7JI=NQtw| z2ZNV9&M+?mQ?rWFj(iZB#W>_{2O-lg4{0S52ASH@_qh%!6I9M$0b5fpD5D_+pqK{i z3k`LReTQnrM99qEA?mXQE~+$)6i}{d6%Yh>LLO>xVi4^Db(m)JECjk=L6s>d-dJ+E z?NX@Q5X79Q%Ypy|GN@=!xLA|6A$wr3x2Lyf!h?8UNaUhjrtyOG6A~2f0wo1@Bz1r} zp0pPR=_#oYp80`?%qp}Yqf}+PNVAtIN));vXoT-;eG7soE*VK7TD{dOW~^$lXONyp z@iL}O6~x;R`-hIi;Ih(+Z)B40Qr-3<2OL7IQazALpMe^9WE%!yggXuhl8Zx-9I(mA zFt)NFZN73hcC4HQC${O5EzBU^fae4*GT6CwtT>&3&|p;tN#eGa5Z<7%;Qr=@8*xWx4*szr?1~$ zTY7x#-DpaW;%t`f)|@wSiB-TLR;6kXL_~Xv5Za2H@FbP)aySW#5m)G5M?!x)4*KRBI#@!56J@7vICgIr%dP8{gl~m9BO6OhL~od4`_V-R6*HV<#p^rflojV5p%3BV0C#4NMWkmWT{RL{>%DF{4BlRa{02mWhru zQAL(2+7>YiB2%%L8ji-#jHRNH!~JdwX$6xKrs~j>D9f6yU1L%4)B*u+1T zB8q|y@He`5J991<<*5#V_mSD$7yt9Yhxe=D#F5399s+Sw!7Tz~yho$poCp6fk*S&2 z%yVuwZRAaO)1|t6=SoigK9i}jV))S2k3v&bOIrI*4G4~V+xUrA10D+?a1v4O zIK$L}f&kDP2L1&90odpBqSflR`aoJsJ}$p{eecHu)dQh3P~PEc>w0d;6}hz%wq#0N zE>5H;ZH?lyHlf^kpW7}UY?#6o@V8|gyRP$a$8KeToXW1w4_wsmu7&!B=9)e2;YD6! zV#p$Lw~l|E;hC7o&)!}+n5<6U*!ymmvVQ}^!#PDD+{MZFVteG+%JJCT=TDdBt0U+C zGp8;5uBFB=I&LNmnO2JI@5pZYmOo5ho{l||YO6E9$-=)OJ8^U%J1MD|+OKQjuS>hP TZU`9!8t~hGSkBxx#}42R+AM9j diff --git a/mprcontents/80/72/8072a112-065f-4090-8437-59ec3aeb3039.mxunit b/mprcontents/80/72/8072a112-065f-4090-8437-59ec3aeb3039.mxunit deleted file mode 100644 index 619c5d73f1c91ba2d6adbd7d98a4350c8c042809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmZWjyGjH>5NsEGfQcAt(!rXj3zx|mDcpevVxWSkoJ%{?x&w1F%S?}V8X5Qj{(|49 zA7LYx*-=rCuG(DzSgj``*aE%nuk_xoeV%+A-ToYZ4~A8J{n|6^sdUND#ZwwD`ouZA z7;^oOf@%~^nQ;&jb-<10u1ep>BpJ!~9R*dBGiW+WWQ3FQ!D0zkp^1qP(Pa!#)b8V) zElR{JlmzEaIwaH&kDOp*yfD64wg8oG(uQ+>VGrwCdFHI;@W(H=!j94p_td-npqJ5 diff --git a/mprcontents/80/de/80de880e-544f-4a2c-9f03-54c477f7b6bc.mxunit b/mprcontents/80/de/80de880e-544f-4a2c-9f03-54c477f7b6bc.mxunit deleted file mode 100644 index 3735b0abc70d20555c23cf44f721cc4ff1274888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 zcma)4&ubG=5T5L|TA|inL~mV6z=MK{63|m?HqaDnB}T9E+)Tp5&3o~^w@G`cxwQ1q zgP>BVpi%_!M=u2{h~P#4f*$lFc7+1FjCW%U1e!qYE!NMyizk2b=U6ZM*&IvuBt~#Y1RFNoIGpT ziHuP4rL<`v%3w{Zc^D=xZt1$=p@zX?AcfBiBb;78^qIQdgX*k?>6Bia3$M^}F=?e0vaTqjqOzL>sl z${H!sE`8L2;_)CXGE~$hyc2OntIouI9-zc#=bpgr3)v0bBO>W4_wdi!*30dQwVNB? z9*=MS?RGUrN$FjXV;=0)are2GmFF+kAH6#{(_Y#9z4+`)=|Ap;3Jr9W`r_K|uRBG6 EfBFsu3<3<7|kVV=}i$Y6U6ou-_jrD6Gf+eepb>T(?TZ(Qx_rA$|1S7?TZ!x@k z&UwFk&i|Y<(RP5|fkFtofu7Ifm(H$T|M}QrWncZztE+`zV6IU`*h{Ws{1hLFtWeSn zwBI4fY#|nTn%G&isg_f`f}WQhU*JiK-WG%^N-HQWcN}=92Oys)iH6xSvPelwKEqUz zk&zWef-G)+!GyGmaj7U$53~NhC%k`7c>p`?2}Y$l%06@fkz>zsT|!F%ToOZA!4vTY z#@+NGa9e_HW`!bu9{{p zWgauBTD1+4Ppg_?SdXykRB$(Q*4x%mo61cZ!X253|bQgeM;Q7kNLt#NSA)Y-EGT4mWE;HSUpP87-N87tX@^xPU0y{ zU{m7m-%QMAb5PK^7H!*@b1>Kf3wI`1Him!WWP3TDW(wiDjFx{{#y1+=~n@hcK-s zBI0(_WB~B=>wi&KzSuAP;*8_mv2Z4SecL<)R-DoTO?(g-fo+AgITmIqn$M3y;{#J(s?Op8L z%NDnzIwDeMLo|^VnJV70vtVZN^;FQ1Lr<3Q0~FXXUyy6zeA7N5cRM$A^7hy37mkd) zwHVD;OLo4Q+hY{e)pc$})Xm9xn&_hKpE>*fomXERS$Rf(cIKPCH@2YBIz+T}I3}&I z4bKU(cX*I^CmP0LWw=XgGUuM$r0e3R@%**RV*K*6YwK5*55D<7=-Tn8^zXWUcq9Dw ztLmNUg_FPZUVM3NatkF!?@!kc9{TR_)!%MTpZk90_D?_Fy}AYMzv&9wTnAdsHQ)xQ IIm-Zl1Job?zW@LL diff --git a/mprcontents/82/e9/82e92749-f8b2-44fc-bff0-d5cb54c1a5be.mxunit b/mprcontents/82/e9/82e92749-f8b2-44fc-bff0-d5cb54c1a5be.mxunit deleted file mode 100644 index 466af30e276c6f599631e85dc0c33a8a2b11b2b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601 zcmaJY5FOS8Ei8f}mIet}DPpCi)Ae}P}$bf$4#LMp4`-gGedc3dP9AA-K zC9ETi>d-Q6(0QgD!Tns%1`=Zi)@b0WRaAlGW$Iz17rRyJ1{h()5G?SJE85n95iPrj zDr?2bS(kD99LJNQtnsp&n5gX`2zfM?kEDJgGwR?#5qZUzzdUIUZ+pn{? zGYk7W;_3O6ZFJ@s)1jsMIG_D18{zl*}~fUjvY8Z|sj4 Fd;(&_vn2ok diff --git a/mprcontents/83/f8/83f86cae-04cf-4177-93a1-cbdb75896b6d.mxunit b/mprcontents/83/f8/83f86cae-04cf-4177-93a1-cbdb75896b6d.mxunit deleted file mode 100644 index a37026503c0f14519ed2d87d95e52f6ba210c399..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2698 zcmchZZEO@p7{`aZ7TRi)#t*gDq9bX7iC1l{m0Hoz>v7z|_3faT5M!9`&h4%2?p$Yg zd&MA>D~aKZC2|@lq%jQ*x!^R2%KPc-h#yO|g}3+8)HiW{tP~9*NRcWK z1!_7astAKf(?Wy_kS8o%QY98cPzz#S@=I8N3JWQQ0#!q4#S{`h6eLm7H3u|;K}>n1 zVF#2+$hw70+nS7I$OjNbypE~%cz#}fUIWo_O}!;2V^!1xPzw-47GNuexXoZQ2!%4D zB72V>Kq_pYjs7|mlyoFZuVA4rspl|%I%=h{f5Jd~_kYEfG?Xh|^ON?> zGtIYx&9Ew9uV5ByiaYEDNe?7j2C|x%ITRdo2WV#83(A3wO|(}42XkwR^wpOO`v-=~ zxwFo{>JJWF|0s<~YIUTql%#Ij_cBG+X&2UbDp{D!NDim@nDHdajIhKio~=^AJnA+5 z3G7KRvxjf8!Bk~CMsF1FxiZX!qgBgyl{AxhWe>BY^lmwkCh?g%c2munp*FSVWHiv+ z>F&MSzT>mX@UL;TqFHL3%36r2WhsX1$yvA@A0Ilix9qYfTz#QvFgr5(f8atL^T8#S zhqy=cK6MUH^&Wp`cg@Jca2@N}vX1!M)_mw4z9mM*>3QO+1gkULWjk@I?CmEmc#f&B zkIk%Xd1#Sw6|-*s=cYEd+rAn3{N|5^hWlvio{6)4dSY+5OSfHj_zDhw#e4fD?c!Tg ztG=HnzNbJ<2EO0ko%BAqX}`N?U}EV5{fAd9GQQYih~Z1_B57OtoJ;j|)AD`SO1`b@ z`J~{*$Jz#`;&t97yf<>Qj<4$c!P9-H_}p`we;=PGyed$Z0dMIqTfZz@J;NQi@^kfg z?x=T>;oTF5XC01nn@#l%MMiIY=lq~>aC+uM_p*iY(mG$dRMOwmc<%iA=fmNOgmv$< zwLJ~0GkD2euZ_V8w4v)rAS-r0B+nepJn!QNECBxi1Ohk} diff --git a/mprcontents/87/07/870735ab-b61c-43a5-8a12-f9f94a19352f.mxunit b/mprcontents/87/07/870735ab-b61c-43a5-8a12-f9f94a19352f.mxunit deleted file mode 100644 index 9c0eba22880f5598b0931055b2f033ddd23b6836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1383 zcmYdiWnf@c@pNGjU;u*ErtIx9+mfr(7#NsbD+=<9N_cVZg%KflJ`4u@7v|Hwq5EqOWdem+RHWF>-Z0Y;r? zF3>TM7==U^+zrquf&?PSK@(8I&!${{k>xrTpUE56zkV3(BtUw6h@qI5d-{6cis>01 zle+_Y)Pki~;*F16K&K<(1DFJn;-i&GCh1oXgG3JXQpaiD88tCBPDbAtkXA93iNd?EAJ*TXMFV^Q_c<_Z=t2i%GNuIYJF|9LJx#T8m&AC`v@VVhw|mQVjAC?z$_h_zyEHu;4lKo86bQ^R}5cu8I)_ zUaEr^K_aNA&`T82MMCHjbQOgPIuv&D5_Sn8sNcLa zsfczZNHxLV^yjm8Ki&J%ztHo(#;hy55{eE@=77{;s+*0om?pWfoM>rHLVhd(26Ih0 z2-3B!K9&W=^IwOV>4J)d5<+vcU`gh2$e}VqIx?V*IW(UEnE{(JnuY8rE;7uaT83F^ z(5b^M4JhWR$s9>Fk&f8JY&!Z}T+9OtpK=xgc$BrJJfM zt13@XE+I?X6j6*`2Tf8bkmKZV>E-<%`~nLPLxrJ=3%!+!n`obqUTaKJL)g>?18l%< zos<3tLU&D|ieUlhjP>Y%HBe3dX|yO=SykKIHf$qB!VkWg|WCv4dR<6x4# zXh(|cI#?v^S>XeeQ*lg{?2J74_?#VE?3}w*y}W79Xazg#v8Y4nux)2t2osp40Hm^) zYql^?cH^Cd_zr^7dgln*c)C6Zt}WIjYl^=X1n5|Ia)<733V_DX<<(iB%&4xa5S6e)C{Req{|tE8!op& zCuM%GIM&3onS_fRb-oW6FEwRE9+8HX`>~~sjjeZY*Z&lnI)X(3ftbU!ASbM7lL6Yw z@##IA;(Kbj?Ph!P(eqCWwCFBc5yYoJPg;`8Nd>F$p2g&V;1-JN-^IV|T&7?6PaLd>H%S$hM`<~3N)^6QdkNszXy&?36VYkGy0Z}@i(c1QvnfOAg zb!=$8g8!?;u>kGd>hHzQ!?)vet2On>6HDy{n)e5_(=h+GD^)Q=$^*(eWDH}aIUT{b a(n#!-Y$$G~5CPNnGp diff --git a/mprcontents/8b/28/8b285504-0ea9-4457-81f1-5672867385c6.mxunit b/mprcontents/8b/28/8b285504-0ea9-4457-81f1-5672867385c6.mxunit deleted file mode 100644 index 3462a383f5601a19b8570864806b4e6cc7809c66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 934 zcmZ{j!D|yi6vkh78(UCpMWOa$7Y(Q&tw9kFUTQYlXj^Mqr|g zLT^g{0S}_Yvv~0!NEH;kc`bVJB1#XQ_3do3y8)fk&U@ed=6&zYKC=Nb*`f>MfNS{L zv5gmduerY?~tne{XiTxFAQu%ehtt0eGsiRwV|MN+4R7j4VL z52%S*uJD37<(h;XIE&c4;7uyEatL<jUe0xXkF3l+`E>P4ZfxylkLsW(P5l?h z%9Dm^%YGD}N87P$(+-Xo3-3@zy1BtsknB8cj?3`$Pkl zna(~u5#3ubV+gN+;Uyw*oSI4nt3v?eC&5CUor6W(CGGt4b!Ot=<@d$sof|*4cTTla z#*^2QemOBWWekZpPM0cAvZxm(GFnt6dN*Jar#%$ann7XsNWhLcW=5|uo)q=DyZL?Q z%jUw%uKVWa1J>;oHHD(|G|)8j206B&u>sl2!0a+zo$CRj&pdd>TY)ds{ zfht%?q{GqC!9+ONx6f@MO*V;26&>1QMM<->I19kVig}aJ0bIZutYhd2HJil-@D;)? z8E2m`Yc-ZGwO@W>Egwojv>O_rkGeD za{wK^z}~2$MHhbzIMy43T*(VoM^bE09xZ zOIjIx-c|{VK#R+ng&M|i3HUmUc zDmCNqtEA{&JXHR1P)JQL-5H*E`8=?O6fvEG(A%U_&*RhIw(t0oyb+o&EC-ZV|5>Mv zY}Z2N_Z%`~hD1tv`gh3|u78>@|6Dop;J9`wezy4H-z2+VxSbx^^gS{YT-y1ehwopL RWZwFD~>k$@K$2^bNIB6tzR<_DU_#u^(>LYeHoq@$aebau98MT&?8 zK`OloB4RIs2M>Zh2znO}9#krb;7L4rs2~Wr^kp|@6Tv;bdGDKVzVCZ`Ck~LvlnRgn z`Zl`u`dmF-+~_W*#!n@V8kq&ZjgY3%EL&mImgZ8pnWzRM>=m%VJV#eidrDMT3j@CJ zc$qmK20f!7Ew6<_vmOu35^V@^O}&Js=c1y5Y12~3G}Qc^LZ&qp2nikT>Al!5!SGmpqG4CV{58LUI3DF z+)}dP$m`+ll4wXUf-LqEwuw3)I?egPg|T_2C_IhI1rY;CodAPy@sqGfr$}n-#gA8~ z-~YPsviy0oTwA`_mueC=+RgBu2E1V8DcPn}J`f{CRY2ELyd5kg=uDK{DlU6mQIfGx z>o@`R5*JN~4~PQeZ)p&z`tbe!*PU#6=JmnO*>}fPlhI68)y&hB+;WB4Cf^mlxp~w?@T|wn|=5xx8*%}@@3)o nEnv)2o)74 diff --git a/mprcontents/90/a6/90a6952e-7573-4453-8c35-e852178f6048.mxunit b/mprcontents/90/a6/90a6952e-7573-4453-8c35-e852178f6048.mxunit deleted file mode 100644 index 0c19ee1080999c23212c2a691e6073bcb9452905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1405 zcmb_cPe>F|7=OF#ru|cI)**d_hk{yC2_os>?riK@Yob=vA$rcdSqEq4ZExPVS{PA> zE=4u;h$6Z~nNnm?QB?HJoBb;xLCs-!@B4o5_rCA<`(}p2 z2!$Jy3aUl$M9yA1gH>cllg z7ZonIJBURkpTFHhOqa@7P+_WTQCkp?2Ym$E7%^4XB!W6v^igcPRxjn4>DXen=yPx{ z68k#Os);QAeyV06ehDtPJ5)f#W{hp(?XA ziHYE(j^nA$o_!l6lj?E~1xZz-n65A`C2zi{O zsaL$$idU^H5m0KrOD%$`;)AN`YE(lg7$3|qE_PDjLzSRL!q7BoqmU=CFP_vt3aO$= zfob=1YhpfrvU<(hy0D$inY7ANlW8<>QqmSQO}QjMp_HL=rkgD5r<1nM(7iI+ZTj}v zTgS%QCfg@xM&2~+&C%iow0|NB#z;mwS_9xznQ;hmPzU2fXelH;4?Iy&I0+WOjzAEe z!d4-?KOeF{%~D8yU&NrGoU3X$;a?l|#|2e%5)M-+D0k3s5TV*l2;L~vgjxcnTK>B7 z^jhcs`5o71j~_n&^UJrAri(*fI`9SFlE#1$yi};8a>LhQIRv@|;r<+h z(*u6VO90_bND~SbD5X^+kSKcn{Y6K^!&mp)FWmfe_0j9fqq+JT095LAlsJZ3&J&Vs zu`;&d%MWfp9{ZZO`!-cu-yeOJV_Us|EpL)PI-puJ+ES)kZ$>Ds=V)U5M*WG4Q$L>n zC)K=PP)vTShQn<60WBt7^WxIIZ+Y^rCh#FPx_jcl+;r94ze#5YUfzjzMt4n&9+^s4 XkB|JNbg04;vEYn@RzQ!rVMORR|1_F|9LImos##bqDJUd4gc21kS{=F+xb9l(KV;WBNSD{l+uet=^YqP|)x8%& z5U3rxmSG(VDuPG|4`LUgpdf-G=+H?)LWmGN^qW6ByCZh!&>WVT-}}yIf4}eVJJC9T zx{g!=qJY<>)g$vKhi}H8Y_OM2(Xl&9$7pGSLJJ=ClOpNSB;%&lQMm`jt0icb*oI6~ zX$y0h6sXJd98{ zWKp9|<(ZaOnT78NYH?d=GzJaHY0a>8sskv==?O06AT3e@_Tm3sVY*IDh&Us7?YR@i z@u*_M^wGH=t@Y~zkJb+B3l|O@@NH;CQ7_kN*@igh1|_BofXEQj1kW0L$~#V(Sq>jU z*rm?G*E63t<8wcE7W9wVRUfPF!tMo9ddYLUDpff)%`i#{?1M>%xL0BT2wzzj$# zESOgSqFsQ$5b1_fHPt@1%r0(z-#(qXI|)r=}+qSEZUnQRpS)DU|ZNvX+7z@$1&M(~h z9oyvm%t>i51eT%JQ3hMHpb=|+ HLIM5&#!7({ diff --git a/mprcontents/92/a1/92a16b06-4320-4bef-b613-4d5e75eaafca.mxunit b/mprcontents/92/a1/92a16b06-4320-4bef-b613-4d5e75eaafca.mxunit deleted file mode 100644 index 0cc23d4b7c4b14093742aad4dab9ac22201b49ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmZ`%u};G<5Iv<0Fm$K@f!HF{1qK9PfU2f~77D1Kj!0H=DOM9Za-7nB00N1P39$e_ z02>1{bYSBTSYTk`7q}*r76hJr@4b8WJ$u^#FbfqM@<3~>b$w=)J~r;AYWwl~?UPa1 z>xKxkL{(Xv6&=l`hzi3!7%66>$6{aCQO8Pbu>cdlv}`ax#so8L>BIpF&H6sDLbj?a}kz}{%!Gn7UGyi$}&%EFN?az9E zhK`g5ZGg|6OIM~FmrC&$>8|N_?c}l2aiUycuoaI6X^Hmh(&V<&QCoxJYZ}YZq9rp- z7KMG3=9%Z`Z%3$AWS*vITrcLCEvf4R8MGbZ)NlwTIn!b!CwQL7vy50=rxxjQm?$x^ zlQ@zKI>rdK4R6gHVoGA#j%lDslK5`Lxd)mP6S`G2m;s<9CJJ20Ay#4*G~vGun1;b@ zP~8Un%X$69@TdlXOx}2|HttQ%9$4;f{oc7LfY6Rbac-~*gc#=*qqb)N>Jd{HJZJF> z{&C9Aad;K6Jvq)lWDkE!Uj0n>?O)nh7ub?@wtq5G;D<<+q^RIi-D*^fSEM|W4VP5*wHi>o^tRv|Vbn=X%iTl$aVju!$%F$_ z3P9U#z+X`NptCLvwtKbrS8TNun=0J>s0@yV3DhPkJY7}aP;=;r!D`IWh3P}_l;)I^ zVdsmcz})Nn`!-;qM@FsscwyZ_y_WXcneCsNl*RP3!S{2`U!L3xV%dR3k+i8}>QNun zbL)?|U7wwpdEL4^^k{PNX6E2@U+4o0yA4ZW+GGCcAgDbs5&`v~Wp-gk&Bq^JdvpKL z<#Q{cQTZRBHUyw5-w><=HXmv6>+N)Wp)Yf6eiv*@ubfK!D=;(SmOY*Q!Je*ab1&as z99UcE{fk?i+q%FBOW4wsWe=RH&btnPj^2D0dH}yCZ~mAM58N96_Q$th*IsXandmLe_zX6o>j*tVM=i~Tr+S!-w(N%_k(j@Vv(83bVPW0PEMg=IswINZ+?Nw5w zyQ{lvhy>ChBcz0ZhDHkmj&d8o5b=f5=+Bxm(0Pgxg_RQSMY$xK4j2MX3410*@?~^t zOi3ocD3*{Yc81(>>Vfu7BCtjoa>WpKIM+mRg*`AkE-P1~uJ15YoEpJ82C7>7Y9yU@ zYh@t=H-+P}c`aoLH?0_zRy93PMq<6sQv z?rJ28+BCC{vT?r{k(OvBgC+FWGQ<5dnc)HG%+)L>u$c{z$kluybpf~Jz&ez|IJa%) zLDI+|UU8(7QFJw>^xc)|*Ml#2Do-~|E=sc%(s(y9kcede5k@q$X7aU9Qi&&`nN&a%06oKi zzmVJoeRvVg5w-=7gM~+DkKVXk8^5u*SZrywd4a9hxWe1g5;EcnvrJi%$Nfi^&b*pJ z)pCg&Zi~xoM<8kdk}EXPTISH)tm(JkgQb&S6+ips&YfqcZ|}G3HElsq>jK88;?`=O zr`@n))tnyZH@@3+;??IrJ^4779&_*i&vROj zy_zdBNA%%g&3<`26c7IyU3_#wpSb(?(tjJ)_I=krJv+Cd@bkSFd+%QQ;pv)&1?^_+ NE1OVY#8?*`z`vMkN|CAmX??cNwxbv(C<*IgN$I zp-nikv(UmqFcB3wK`lfSYr#K2u(9<|i0@|hZa0u3Q_Xwtn{U4NzSpt=hKdyrMgY&l zf4`o7_UFCU-#0H8K3yzX#VgH-!fq^`BMnmW6%#xzW_Pem&ZAY5gldMWMDh!yPBoti zuaYpKI%j#pPwJE_(&d5ENb3sTpi;#Sac+^A9-nY1_eDShCsva2nxllH=BX2fgz<4l zNLFKARNG&T8xBL=V^n6um!2lvLK)w?5-e%3qu+x)&3q}Up}1qJ64zSX3%yjG z)My^ki!%&Z+NJII!hGzRe+MrSiIyrVV>mGYFmePe#Mnn+KStRsJMG^)M>`M7&sXQX zr5D5da$RQ|li!{`Z>}|DL@zxW`;wVK=uDv!&(PZmlW6sT(OE!Xx-4M#skBFrv6SgL z_Uh~V!_mDnZ|4rK+&wV6E7diMpu8K{GxOK;*c)t2Yi#THoA-ZCFJD{R`>6fx&?Ytp QKN{>Z^~q!HU^+*D|NcY;!2kdN diff --git a/mprcontents/9b/d2/9bd23e92-f195-433e-b6b4-ae5f16991a5f.mxunit b/mprcontents/9b/d2/9bd23e92-f195-433e-b6b4-ae5f16991a5f.mxunit deleted file mode 100644 index b77080bbeb909b8c27fbbca82df4f7587134efd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5063 zcmc&&dvFx>9sjX+fipaNyfhB5luL>7@N&taF$BEaUC1T5fLszrrH#w&?~)~ZyT?9` z1Z76U=twJAXo9t3c^D{E2dopB4mg0M4pMY#8K)y9+K2RE5s})d&?(b?f4h6Tx5q_5 z>Gb}%+xz{#zwhhwef{?Mc!UZ(kq{b(;InzbspoqyE(jjz-`6_nxuRCe)6|v1Xd-My zxws@IcyYDtF&~jDz{5&V6ymBRVL=IZ;<&1CqJV}uwJpp>MONkUQjy0p8U=jDdC@Q; z$`weZ_^z;^a7tGo9>=nb5M^?TcZDTMlq^Zw8Hc%VY{Mz04Wpj|Kg)<0KDctro|hjE z9H=<{#M>`^^c%y7kwDahI~CbOzL7Jc;G~QMSOt|F@Z%^&tu{vQjPRW~yZ7bD*2FAj z-NFjNVC1$KNsJ)#jAk&^zzA(BXcH7!jD`aZ7FwHQh|;8K>cbip660zTJf$DfJrVAV z^D2v3*baB5L`iADY0RS$KwrzTEEbTnhBzLzz>=lxF*t2meRRe<%jQn{UTE+Bi5FjD zPJCo2dn+(8y(oKPc$JEUI41m%Gswueh2d3zrXJ{kH3dK5hxzbhvA%V}{waUm*V?fD z?3_3Hdgn*8{E)@EQ6%i(pgV+Rg%dOj0Wbl_iGv~ni#s(x0|_d~qFEwxf`TPI0>!ll z9*OGA88KtY+v-F5gR|ha&|+%!TNT)kHP{(r=&wi(4@5RKm|ahNb1){cS_w~ z9%bEZW6#v}AKyQI_s@qwcb!f1V=V*UJ+Tef^san$+p4w4&;1Y4C3b4qe-(IhLl-&9 z&<8enUz>lJ?Y=m*Zqt~KOWeYzZxmkQek(^?Y)<+Iv$<&C?1sFBeSy zy7+o4=adbRy#!xxWvPG2^d`xf^sf9NNt zSC>6=T_|=JA65E$`QV0sy*4~lT6gLupa?kSt-(5qfbmdS`ei8QhA2!TQAX+r$jvh8 zz=fta14i3Qh{$0sF2#x}3EEIpMO=aESP5+?DDu4CHPQZCvZc&GOCn_#9KmNU zuc>G`D1T;1DF!~Kidpm7RotBVij0;4TWgY7WiutWO&LNa*@eUuMpD9Q7-bN(6q6w+ zjiWHF@K}o_eL!dhF~yxa^o@n{1ARN$f`Uv+zcv6_-XWQ?ra(?;({zUrMsTm- zS1|F8{B9sI==1w?VsM_fvK;)NNrvH$&{#O*v10~q^P^9pN?8JP%Tj)~={1Rbr{UU!9QuFcvay=j zM;&=z{jA~H(^U7b_nyw^PTO^_W73R%Jjn38!RVS^woW0!FDNFHssO5x2T_pcHnmIQ zY5*7Oa5~L|h%%`Z04Jj<5G~daGsYG>>fm>t-}UUa`yT&vTCw=y<);lNd}}DpbGakR zTtOw*R&Q?7xIaQpKuV#<;E07t)$8j6g_rh3UileU-1YV&M+{}|uq#u|$XuLU`E(DO z@^y|>Kx)&jduSRQo2jQPgbSTuI3Bb2(lhBrW92T3DPEss=z{Hfh!J43!^+)nMbmT*q{ZL zE5ym9Bta3%cViv0)N09AktsS_6@rRCk5v45ITb&5$S~Y{Qz|}DqudK>WIROBg-8Qy z%xakFM0cZUwip~M)NDRqe7L@+e!#zzb=Dht<#fM*Ac)2t-mG2QfPbtVuJ2I4Svny~ zbi5tMI{-;q7NIM&!_#b<>?tHm$T}m?n7rqpxdbdSibY6sG7TbVa_gE)k1iZt7-P~{ zrsEQZRtrag2gYGSJTv*sVIZdSmc480pU z?m;Cs4{@_!ts9>5*X}NPZ~2{%eR0(A(EqI`5^Xa%ls7W9IK0Py?QXabI9UbYjjf)Q zA0G8q@7iAS%{%|ym$8$)470jnOpyQ$eW-&CGvcx`RtvlWn3o`-BCP(JWB1NKbF&{V uitSL{yCcnhoR0b}fCg=RT;*!L?l41r100ra}(EtDd diff --git a/mprcontents/9f/9c/9f9c9b78-c67c-4283-8d6f-62dcf933276a.mxunit b/mprcontents/9f/9c/9f9c9b78-c67c-4283-8d6f-62dcf933276a.mxunit index c361c0670bddeabca420130a451a36c66f2b58f2..45db1235155d4dffc7b8ed01b327d59acbc3b3a0 100644 GIT binary patch delta 110 zcmX?BcczZfXCvckcK-S13=9GW49pA+49tcMJd<~``|`hKLKeF>S)Ah$ zoIH!OYVtBJKDMCL;?kUw$*Np88O=8T=SpW}jGCOz)5FCMGzcoUfLmg-5U+_50DIOS AMgRZ+ delta 109 zcmX?8cdU-lZ6o7qcK(^>3=9GW49pA+49tcMY?F7h`|`hHLKeF{S)Ah$>uc(7g(BFRH^4295z{l>n5Y|W+v`*M#k{TSv)=LEI=hdiA}sdMga1n B8`S^+ diff --git a/mprcontents/9f/c0/9fc0c7d0-2733-40fe-b6ce-b8e0a26061fb.mxunit b/mprcontents/9f/c0/9fc0c7d0-2733-40fe-b6ce-b8e0a26061fb.mxunit deleted file mode 100644 index 444ec806a7fb89cff3453fca131151777f8749b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2605 zcmdPpVqjoZ@pNGjU;u&(#}CXmR{!U)?c9zBixLulGpU4B7Njyr0;OE@N^?_-5=%1k z^NLlFI1EfK`N=@3yb`b+10%>B4%dq0oYIuk6b1$+*NTGtq7t9fveX;~cA%U`W=cwG z9s`qKVs0t}Cs4pAKOG{=6_lErUy>S}Us{x$%D@tqm{Xcs%+Li?BVfS53{=T%$S?tD zKEk~h=f1dcE7ZbepZ1L+2bsDasC(srYLT3X;$E<+49w1n1t705h@qIr!tlAlB*wvc z*CWaBYgbO5hnmL?G%qBzqNG>_L^7~=mZatuGu#4-A{++vDw4yPKN!ZcdX{@MD%br= zj+*=$YLF1ZprXXQ;v7hjG5I9srI#kAr#k1Sq%yDp)uiUdhXyk+fo%ivLy8iCA;Q3H z#DHpzYTmkCJ1tm!w;y9xs#Lr6ltgRta^n4bFs%VbnrAN1Igq%7L=?gm&{%?mBgjdp zQL=Y#k)zuCTIZInOZumJf~*R9jX}uV-?2!{D*b zjD6nk{oEf&v;{dv5Vl~85V$N_e3&pyLkYjBDJu>5mcH^@{>PzaA#;EO>G2_jVqSx? zm(h;-9iDAm9}O}ZV@;vvVULe{DDjbo5+4pXPhOPl;d9z7ddp8!!8?h>kV1|R4xqu| ziA8ytd5}zkYSD8B(If7u`rccgA6TTE!r4orMaWTtViC4jK~{hkF{Wr`7sFZAzB=V3 z*B*(Ox=E!gcaa`3sMU$-iXRVCj%NEc%vD+AaVfq7Z^YoMPCO>e-Zx=6FueLN^?sWbAe^x2Rpc!}wp`Z^M=L5>zAYp_KMLK-bf%ot{( zr0w$Ou`jLeWV$cj>0O<|?g#TZ2{pV7ig{lSy8PWSSJiJfv(?8VDml~eM#%$USRu+T zU_wSJyN;O_+H9Eh)nm%EG-=Ji!Wa_63OPzZjUeZu%#zIH#2j#}pxP9D=!O5b4q?~b c75tn}`+mG4(I(_rLA426#Gt4^jT;6A037ediU0rr diff --git a/mprcontents/a0/85/a0851786-be34-44ab-9850-e330885a0459.mxunit b/mprcontents/a0/85/a0851786-be34-44ab-9850-e330885a0459.mxunit deleted file mode 100644 index 7f713d75603bac03c5506cb050201b738ac4a547..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 zcmeZeU|?WX@pNGj05TZb#9J4b>|5fr(7#NsbD+=<9N_6%YfCQw(&0~MjfbYgL4GO9VuVAC8?OpD^3 z^`Oo`#d+f&L!KSqXSG621EqCj(}GKiGV{_Q$p#owMhrSAA+@LSkx$5hh2FDwyo$72 zxZIh>A;krB9XJ&gXI7=6ht@pE^hQ$-(FC4?ApP7G!8CME+|jT zED6mk$;@%f%*!m!0H!*$M1~q{*>7!UX#H8|v!HSB{Y}M7nJ5dkx16DM-GVNzlPYFt z?$TAM#u02Ng%dE9nV_XIyDtti`X;9ObQI}4->80W8;yevl*$r|lT-6jfJq;JaBaNE z^sOs!n)eoI!~!7z diff --git a/mprcontents/a3/c6/a3c6f007-8a21-452b-9170-ab11fd5e27b8.mxunit b/mprcontents/a3/c6/a3c6f007-8a21-452b-9170-ab11fd5e27b8.mxunit deleted file mode 100644 index 0b426598da2a3affeb825d4f59e82b4028fca2d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3153 zcmcJSYiv|S6vv0%^2mnP@+gllIL2yeSeJ)rw1y8|`e17dLaBxj#MygiyCe6`EHiU= zyGD#iVubjh(Evs?A%GA8KVYIrkQj(oVu&H4m|y~liN?ejhy;?FCZ4&s`)Z-V0Q+fo z9%ugZJO6X0T{#({@%4!oREyv<@yfS*AJ{gpwLf!c%Fy!-$3pe1^BIa}!c+&zl4eUY z!Bu_fI|>D3Ei^?uN3WvVlYBXGsUI)+`7Cif>W_t5gyp%EYhvP{i&Y3Ecvftn3KQ%y zONx{ua+qaYhP@Dh0dXaODy+8c4u%lf;Y*?nm=S6?=&` zMsY69;Cz=D{W{GQPI=rXgtKrM_7qKd4%VU&9Xmw!QcPUoaX4F~%4F!Y@HA{;ycfHk z2}@mJ6gPtu+tAgZGflD#?ybxMqOc`gmuXD1fD{l)h@Hte4AjCTY+^jPP+oYlL@}W7 z43Ur~O{Hq8jyw`jYQk-v0->l9eFKueDCJv$5Yo=9^6!SbyyyTwWSB5{IMv;MWLloNxjhD5JUt#EmT>O zW&BscADNU;tLR3LNuW0_kPk|b-;PkY7|6f#c9~nwcG-hi9<5tT@J5gUAhig!SCE=L zJ$~_2_fY5lEp-o`d?A#*OQdFlRM+oK9Qs+T*eA^|bQ6L#W_`gPz9q&a`R9x&Rr{`A z@BDb}Z-1w9qh7w24UJS<`t{S{Ol8>Tj1<4DiroPoZp|ka?ff-k0 zpXC0%OC)dQxd;#|_V|&$>#uOi;a9HhdHlzBTMu5_sCIq+>#YAvtFrXbwojLJP9E$! zbb9m5SO2lr3`ZMT`UwtYL}k%w~cOkC5ymd&{{Y!@~St+=%7hmI|^11D-%_S) jo^Vfj@$KO!=gc2GeDwBkp(^9IV((N4{)H$!5(xbVl-==8 diff --git a/mprcontents/a4/e3/a4e3f1ec-8f10-43ed-b33c-9fe2a30a490f.mxunit b/mprcontents/a4/e3/a4e3f1ec-8f10-43ed-b33c-9fe2a30a490f.mxunit deleted file mode 100644 index de1a6be45177d7416d2ae0184bda3ba44524358f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3979 zcmc(hYiv|S6vwAq8cSnojYJJEhlW@l?e@XDDTVEBAKP}@(p@ct4`zCIcK5P(?_BPk z-F8Vy^aB!7d5DGz6bY0@3>d@$35IHd2x=l2H4%dvN+VJ%7Bre*LgKl1AKh)RhLnc= z(B3<9=0E5B&Y3f}BMYIlId&V$M(`WDJ8(FA$8BqG>4EFr8TKsG99LMO=vkPmAt7QB zxX5H}&d4(|MaFE@LxK`-qCBX|^&~(Iy~yiJL<&-4%w%IiFhFHabRE>0ick{`un^TS zktD1z4s#-ru$#zUs`_?&6RdGnl)YGEnEMFFBF6%eaSO#7@lYv@-J+&Q zBuw2{l)=13Wvv=j%{Vh7GsEQ*HS7t>Mg&;%v7qGEml8#hL|DO@;exSUt4|bs80?b- zxsS#q^DvR!vCY9{s)9mG7|#vLTn%cRy652_Y^|B~t@Di_O0WwAd^{lOduc=#xww() zvkH?$AzWlOo1>3QN-&ctW-1OamEw@jPs7ZEozYclqp`${*RmiEkT8}g2~nUzH5%2x z3Q-{q;F^YMK;dC5dTdzACn3 zqEL%2B*t~@4og+Vh##e5z*{!5&Zv%Rm#Z-kK)V{9k?g2cf+_bvm)4G6lv&NRd9w!xCMQ1If(6 z5TGiy1i7)f%Tk^sW3bdPCoK|<$70k=Wi0Wc9Ki&c$-^O06M2bVPd?6-l7fQua3I}G zFpI1J{uMxS%wER45*3)6nprE+lziPLU$43RSiz|U|2)bi1jHQuQtnIpIc=u)x$vCz;t-a&qU5A=}YEdw>1y$j@~N zox}?M#X5=8IMT*?lsGQFdbV%+3$T^#m}onbVoF@8eP&B+L57a|jwq!ytUQW8nN`r**PVEbG4Gne0JIpLqb zI3ebdKAhN-Hv~oKUnnKwW*Qjk6@yaaI!1bS!uUvf z=YBu;Xo0P-_NckIMmoD=Ueu}Q!6-2i=(JUZ+*?~f#JUX zTRp!-)nOvGqNRRyr*yDbxwGyOrC4uyxpI7um#u0 z$9t{o()Mj8Q|;zWE57^8xl5i<-it=@9<~n*9dDRn+pjFWuwhUCy~o3Q;n=*NnfjIZ z$4XyS*Oomm51eVo5P~MA2@jkiLld}2rVC8$h-0owp zu4#{l_oA_RU-{yizpJ^+ad7tA`I&b%_KuJDwC3{0j^#g9b+jMMTGyOXKcT#rjN*MP zyRF;5ZfWhlJ<}#{vUP?Y5AVfe^PauR@$U3DD;%#)UwF2%u=(!zc%T2~{({!~hw2Yx z*}mO3d@ekpyqAvRol?5K#JX%-O;7IW%yS?85Nl=_`tNwYH6F5mFBzM6#hPYwr~k+5 x?UQoCRVOT0$H%*@O|724^ZnXgr_%hxlV@$6NZx3Ye%Hpohcx4ZGy2_!(7%b6*0}%x diff --git a/mprcontents/aa/3c/aa3cc804-dc1c-4fa0-ad46-e726c21fe3da.mxunit b/mprcontents/aa/3c/aa3cc804-dc1c-4fa0-ad46-e726c21fe3da.mxunit deleted file mode 100644 index b4801027d1873eaada9421ca991faeb28a696393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3058 zcmcguYiv|S6dtyv;zAKMf)5fVq=A-fmsaZ|MUu9Z!dBWMr9ebYX78Qt9XfkwnVGxo z8Uw*ZlOhTjz-U5(6{D1(;9H}K(fA1ds2YA4G&V?#e@uvgi6$C7bMN-<-c||5V1KnU zXTI~D?|kRno}Y=(^qN#VnuFk{^0T`~=YM;s=UB&&i#}X%_H?XfeIZBDJhaYjf?iRHk7&GO9l2**s*ES5e8h)5T(hSx(m zq8+@|qq301)$!`MffVU2)Y1wMGR|?D;+zx~RSI4~a+M|KG@yWM)5M$$*GKbD6?=%* zCGeobAb*w^{@P&*XFS(e2Q*LzC~S#rmT64$ASp;F0XvuD4A{aYJYsH8P(gUIq++1L zS|XuMno8AN9j^~mYQ`NN=LHapaF#JRW#U1JMEh!6MEey}tf($8!^mA~qk@t+w1I{_ z6K)cBn7$2>Y>rb%ym;x--hzU*CHoYWn~jF%S@Nbo z1%aB&aAQM5UFhfx0a+!sJ-`>3gSoK)TRN23Nu%l@VY<)NjCU}XDTmt4CN*dw120=< z1}2zuVGZC~^P~=gcNxd#c4COYc-8R|Mx3s-9(DTZL@#HVXZG0mHtq?Yy*v4%_ za7tVs0L8l|)@X2@ax((O{Ox-)yrV8Wk_spz6ili{amOcyRpNJ3_#a6)l^uty|fC!?rQ)Nk(^S=fD z$&8d*N4I)Rf@aeK(p3=XFCkPB0{NBhfs2w?->KR-Hd17@0D>Y? z5yh-1PKA%w8bRwlacbc@%Rsl9k%?&k4l zdyX%x-!68~ef|n76^G>Es+_FW#t5@R+d4ZRK5+1!9r2SbeZ$qqip=UEsJw@vOG<}P z?V#w}P$FWFqxBW9kBoY)k5?`@@@LESqyIzE;S!!)^xjC(M;7iUr(5sr-h1Efxyzs2 z^{*`woy{c|pIY>U^>gZA%kYdNeFwG_>zq8BDHj}1W$2M6)D)3x{N+u3OHg~uz5^Ap z?{8Q=?+VLx9VjwoyyskG%bu*LY}X#XC3kYu`>P-Q z%Gvq*^sVpxgKUwN1}?jOlFMG*aiVKv*K?iEyfAIq@MBk3U18bGXc1*m_)pXAzqDMj z&avM8zs+nPZv5!G$P z@a+BWqvDgHv)kDR-%eWjN~4Z2NUqC#gIip|THdqyX-q7Rhct3qkWEfFHHo@Xe1gxf^ zuej#=VHK+YR&lK^m6@e?d^k#JPK#<41F)mYld9sz6v&l!Z+GgGfBVPY^u0HC=Z>9v znr(LPbX2CSVyk-vDShNYOaOLSxJr7yTut1iz?1O0i}u&(mzUz__nGZKGsBf~<#Cgi z{X=^gku}NdajTC|a9lPJWN<;M24n~;3++Ot+q$;6ksy#`9{S+9>AsRi{ZL)YC8{|wg8~i#k{Ci~Y%2v4a zqVaibsF~Rr3hEjt*TU`Qu@8}lXXU(uS39%!_jf+7=j@ID$fFd{d{8CwpqF~1Q=45w Kmat|k0saF0^c`RT diff --git a/mprcontents/ac/75/ac754e40-2cda-4bdd-95a4-1def12d18dfd.mxunit b/mprcontents/ac/75/ac754e40-2cda-4bdd-95a4-1def12d18dfd.mxunit deleted file mode 100644 index 3e1114cbd5f526880064f8cd1f9849cf8362219b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 961 zcmZ{j&ubGw6vtmTEvCWNB7!1{bI3&~K`(j}O|ocOO+#DkrGnGlSu=LClkChS-5dlF zix))@Pl_M}@!&zki&zidJXY}}2o>?*N&f+Vyv(lIrr;iSXWsk15AS^+`!)kGmamjy z3h+5y)z3anf1bVHJN#qs``f>){9@E(upd)1v`x=Aii<$z(=%9ctjs*BeKpUN4udLf zFvE+l7pbqAiCJag=mrZE?Q`HUVoRdY;7Sr25V3NVIcl1$Xhk|))dhZ88`ZKvCUO(G zYN1#li*+uErvuXo!E+!KX|pgQS~5@jq*G@Baj5Szmw2IQ5LIWSAzbFiWUl&E{}Ve} zDy-=bNE|FGK-OM!eC;w9z_QnxB2?$GDIa!W^XIthvH&uDc|5DJtB9%8(_0@l#G7$G zd&BuA#`Bxs6HgDA;a&F6)1nYQqk#cH?gDp0;rXHyrz?Rcz%m~0!#c;9wiJ708;fAH zMnm*nu~0&D1YqhISSZaL2a30}o!wtHt{<9QIQyb!|2*~Tq)6H!s7=?peZ>PVSS701 z6%j^&M6{#Kq!aR{*`=0(yVawQF7Ig}5k`mP5>_#m`oD~~bk3diNoNO9 Rw0+JYVzT;4)C|Wl@E7M;D<=Q| diff --git a/mprcontents/b0/20/b02094ef-defa-402f-ac93-59effd58ae2b.mxunit b/mprcontents/b0/20/b02094ef-defa-402f-ac93-59effd58ae2b.mxunit deleted file mode 100644 index c95db4799a0c212bfa9c56e964b8dbf43946563c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmZ{i%SyvQ7=?dgi(M#`QqbiriWh_`;sewsg~nPD5m9$T@}~}_Gi5UA#Yb>!!AEc- zqFdeh9OA|YC@vKQCyBj@&T9U1PCjN%=F$L27i5VLKpQn0b_BPmqFT^vG+I=i52Yq;;ACVtk27G5 g{BAr(bz)q{AFHcd1st<=N{6$K}|Uz)|uPC7f=Hs18o zgMtd;LA_OlMxwO}f)W)4K|#c8#UJQFD+KYR2T^Bdn`A3R3gR4=oj2dS{l53!R)PS{ zkz@>7L97q@&D-D4&-6YDzWUiVlxtBU2a5%Swc@CkjFN7R8`QERjdxHyEQVR)m^_8t zVb*?3x!7ODcL6g{ArJCk2 zhL(mZ&8kGTu|OE%lyyK$d|Wdf9d!UDK3<@V_u(j-utG2=3|&VH0&cTjBXX8*anu+% zHS^8FRd@RzRLf^K-O#JPfqSTqwSm*JGkG5Z{f5S9)}&+JY0}D4c)5tR@M-YP)A#N1 z(#ej{$AQB~7g$wMc2R}T;+9ET|@!fLlhwl>HO(}w1xMy(j( zMBrl8w=u$w*PuKZMt@0d->3maniUo|>J3DtCw=bcg9AeSJaS|B|2?e9DHiovw3{Mw{v?T2mjyMJr&Nq4O ziX4Lo5CrNp(yns?ZrHu;?ddO9e_TjZst+e8CJ)Rn^t3?~`HhJZ+t3#C1eOTTSjN26 zmD{|x91gF4{cg+DGQuNt+6h}1>C|~;B>Lp*wM6Cev0|2#*8OLlLat7=Kj`mjwaq=F yv#Gx1)aR9Ry%+D?|2MTxC`V?WPoRz|PmXTjb9KdgDTx#b4 diff --git a/mprcontents/b3/fb/b3fbd897-33ae-4056-b2ff-4493b3f7c31d.mxunit b/mprcontents/b3/fb/b3fbd897-33ae-4056-b2ff-4493b3f7c31d.mxunit deleted file mode 100644 index 6657f44813378e38c5d4ad284e1cd64c35a82466..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2332 zcmchYZDQZ&@u-CA?;a^}T^;0N1rckXU+cjr30 zn>Q6{P_$a8i7!Dyh=+wL7Aw9qP{DU>zbGmyEor4ti%KmirNy=}*ynaP_hM}#gmgdM zJoC(d=6?S_Gq1jYP;OCBKwbo2*EfSFjxK5_KmJ76ed5u@S+1hht#OJ9V5*Wd5ua$t zOw)_fzmdzX2{b}X#i*r*$+a+1sikKR8;D|3tL74zXsT2*NKywq09m_5#{_etNleAM z!I>7taiZ(Zj7wN#&@O8-)Ckt&RFoq!m9PpW)l{)&s_Q7nEP^FDDjRw+Hsf*1MWRy- zg7ylcU@=BG5e>@q1^IdTd0}SIB~`YDLba$7!+MOFiiFouOy4(Q1>;yDJPP7QjA%H_ zS49FOE*nIV+o%*s=@na3g0;J~WwNs_c~GLHyO3vji>R0ql@M|*Z;3N*glH30&?JCR zAxjd~kUPoM24Z3N!BpCt#K}bM&LsoQ@8w6(sVi2gqml_I$uOBX{BuX<|hR5k1jEM+&Uq>$Jb-#g%b28zs-EcIA-@Xz0P;70PI#Bjo28MLlGlQSf&G?I; z2<8e@7rAVcu_~URUJH?uIe4FApEnO0A$=h$dB~j-vux{t$+Ycj?l;W(dE()UkLULF zudTcFo^!I-pefTJKhb3|TgPpw`LonKJFlN>$o(#Ow(PS0#J~76NA0Dj)PfqgM!B6L zz_suxTp`~pf%_Nshfn>o77ioDOT%Yz<4@~;2H_-j%z)Z@x1&Ts6O* zFBr^k^BwuxdrzqDd|q6OP+3;G&Ua7${@V7^m3tB!wlDL0=8QA0LU8jxud9*MwzTuo z2PI87bc)q~b!m3v+hfCbw|;;7#?x*7LtF05KKuE!ZI0S#X?qjR&%(EBSHD_XTDT(7 zz3tnYlKz|HjBm1o&%V+}=G9fW;=ysjTh(*BeRbbQ@u9Kt`m^N1fgk_4TfU>`%HWJd z`|vF^8n4CZtt?)#gZGYY>aMK#_AVVb u6dm&V#)hu7r}1)UQLyr0&)<7J)0W+E)J8#vCM2)8)U~NwuaxsfAoLHeLB|gO diff --git a/mprcontents/b4/bc/b4bcdd4c-2e90-4adf-a6b3-68e3bcf097f9.mxunit b/mprcontents/b4/bc/b4bcdd4c-2e90-4adf-a6b3-68e3bcf097f9.mxunit deleted file mode 100644 index 45e9b9e996dd50986d2e7fa7a0d79a6f236e62ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 900 zcmZvaJ!lj`6vtn76B8lo6@sbE7FQUHBk9tZkGlLmI7gukw#`<39SW}U=^ZTNbFsqWNS9H^l5ep(COl)_ zVo{8V&vJzy*O6=1PO*O8-S8kNHw$#@{@4vQK!#wkyRzN54ZdDRgWN7v8^P=yi$ zCqiD;wE|47HT@_KFaWUDnhhcKCT?Q{lSIB81_5%gd&QbUl3rFRls5e5L}58PepYzY~^2cmtL*6_d2=O z$5tp zy_@~A(porw=BWFr)h}z7lCokHnF{?;j-AkoBeYAm_g@!&ZFvu`Roh2rS3dS>Gyl*$ WPEw&X8$+@2-fc)%iGuw(0{jKGCJQtG diff --git a/mprcontents/b7/de/b7dec694-362f-48ae-8fa5-c64e0fc507d8.mxunit b/mprcontents/b7/de/b7dec694-362f-48ae-8fa5-c64e0fc507d8.mxunit deleted file mode 100644 index 3124b294e00aeccefbe815565d27f1192d9cc1b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmZ{gu}T9$5QfL|BqBo6X}QILji8l0FEH@x@sulvL5n(+xdOH26$dUocAttuT4v9X zS;KY7!xNickR=;Sr5I{aPrrOdh8Zkqgp9M2`!Xb{Ez1oRfpzZCA(Q!EF!NN6r9}bD z=_FH5_zt3UG9+UUafAvQ{#RWo1Zr5U7Oj^EIkdes536yvag|RW(_1-xjdx$3zQbA% zTM7ILt4*Yk>i~e2Bbgb>6^(1Vr*ncRgwyo*QY{Aa6d*q4#%F2Kl(6dU);2`GKwQE8 G@!$(SfszaW diff --git a/mprcontents/b9/02/b90235b9-1e35-492e-8f46-07c792c3a6ce.mxunit b/mprcontents/b9/02/b90235b9-1e35-492e-8f46-07c792c3a6ce.mxunit deleted file mode 100644 index c033e3d0aa18956cce6b8f2d5888c9dfc3ec3d13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3933 zcmds4e@qi+82&hlFmW4dCTuLIwR1)z0{)o6xKP?cD{Wygek^3uYwx36Z10-8t55>N zp;NNKP~4QbO$IC|GK0Zz224fuqGpm?^P<;{(Ub5<&$>vO zv9J_&@|vIlQfV266-a?*86M4m$e1J)E`q7FJkQ$cP)~Fm%kvXHCiJY`% z#NtThdxj}c6sFE)#p$zwC#WYbm`Fx*;Y-K5TporNyy6cKI8jTvXoltmjuco95h-X+ zsHl7%bAX}8C8WnGSg^~6IhhyjC>3}#9p1{tBvr`KKqjQ%!EXUKJFt>>7G&>$_XE<{ zj&6Cg?q+*>_qDlk8(WwKvNTUYkV5ugNJRV-p`hH5_MgxS0!Q0Cz;;on6`Ne71M6wX z8eUAqL?ad#icok8I-ua1k)XPGAy>WblR4d&*+a#zJY25NPKIkCO$ntCNEGFeLa7eu z!}ijQAg_GfT^;EbYfXA6R+(QI9(5?v*9x~ zSZPnft+>qBR?P5zfM9?7s#60Dp|39mS?hYD*Rnw)1pYI>&T>g{!(U7e+MZ(w63Ii~?9DQzZDv!r^d=|bfd%dXnbZ(oYr zYnuW!o8Q=+e&y1zxvlz?HM(o@6A!Lt$kb99HbKi*TF4~Q?Z<)Yp1eDwnOk!QYY&go zjfAfgNYxP`bp=u&K`yvdCWgZ0(9D8uiZHWwpGTo62uWFyv?k>_a4-w$wc$+6V2*Us z6;ePe1OyWHmy(EI2VdhYug^>ET6oI3Q`RE^f)o{HWyirp8A)DON-_>irF+FZMkwf( z9?T->rq4Vm<<0Cepe4uTV2%erAZ<y7(gXnk}|YryTA*-LWp4G46nm?eMQ0ojJ6Xea{h2LG^N<{MKIF?iCyhL}lNL+@b|w0%#@7Rt zBrCpM_}$2n!{+z1)$8MSp5F7Xl9c-O6qsnYB4d?ZKjm1IuAu*9TH8%)Gpg$Kd(_mM zXx;DYPkSm>8+N;=tsUB?J{IWu(q>H1^_d*oqSfDPtaW5K_vPIc{%Tc^Z%Oyzp^5Kk zvhus)jZI7X(D|04z49hMn1{Zk@X+BKZH*%ze4W)f=hgW2TO1Y{dg|4@F}$xer~8bl zVS3AneooJ<*q@<1}n zj2Q=<>duRYB=M3DC84E(5-p2b1X&`Y5F~^J5pCK<^aE{*OpJ;)b>7_f8@g*2mpkX@J7>Oc=A0@6D65Sb zuoiGd+9s#RH_o+BR9;?xP#zgF6Fve0gd#&pE>tTU zUeH?Kti+K=EA1!EGpS&4ed3t_bsrtO3ci*uG7tJ)IBX zHpdj)PVm9N8}n=qvqh+NFBkfZM!S7#k$y~$R8MD62?iCSE(H{7p-D~UIt&iV5?gRr zGY05Yte=Y%tUz}ZNt93)L!J$)C|YpkwgwevvL=`Iv%-++rd2&zW0Xu1HD zc2I%xD<&ko4*{&*3HXKZF6byJqVns^x6#Rpw$U2#F1|Q_py1H?+f{hea<~P@LPV6( zVA2#$z=O7w$7Clv>pKFKE(tnKODwrBOa|c`l2&L6J$Z$#-jP~oY_Rp}%-HTl`Rrz< ztr`p})Z!48j#-Qo)@V)%mPI_}sFcPD1^-Zm zc=41}%xy^1n|(iMg>WNWD5CVy{ynQ+eR+KF`j6MqlOHDL{}ZKKuvW|_%uT9P`t31E ztl+hi?yl&Ly|4t`6_}HKk^d6@9DRAho2q}$HVylSZ@p-KxNwP|UxuP(2|rhaCQ6L% z&J%O(7w@)(Z~qzY%Ajq=phEc~9!?>lhftR7oB_7!VAu6M6r+W^E>66LxWchQg%!z+ V8HqsvrRnV4HIT3xZJ7%X@D~=Xp?&}W diff --git a/mprcontents/bc/c7/bcc73544-a623-4ef4-b11e-a8356ee45b7a.mxunit b/mprcontents/bc/c7/bcc73544-a623-4ef4-b11e-a8356ee45b7a.mxunit deleted file mode 100644 index 84bd1d71dc9fcfe66fafbd14d405adffac9e898a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1642 zcmcIkUr19?7(Z?kwjAZgFO`X;6p`ESqX-{)JqQ$fe?N7&vv)ri%|FBa?f|Z^ZS0^`Tg$K zy$vCo-R(ey2p&i6>*t3ie)?vMr)s73_JqaW8jny^1Y1ocM(PAE%93I?zmY|cIcR`H zL%fCZD3g37Of@`xd76ZxREt?0vJeeZi4zqEIRUnn^iT!!E{eGv!4eiZ4J%jwZrGx=>B)kfocA*n(3(`4fwAfuhOHWLP2a>`IV1E{a0 z?Z8~$TkpXAFOl)du^$GIJqsvxTue}Zqr^oX*Klp>JGI#?i;`MG)28Fk;?VJ?+x3GN z#Zph~#!-ZpBPf4!L9Awcfk`E`e zTZUS>sf$pM+lo+OHL}3A^$1$dNf+<@gNaz_{43||xld&|cQ?MJHEB9E-L)y)v~~ay z%;TVnz(l?8VuK3wjXBsRjBQ183$YKL>#ou5 z-$$A&4YaLWcxAZ2H}-DXcWr5=`(`3mWdQvb3xk?9D3oz47dnRJ^=FB?`N8r#&dSHr z|47Y~aI3y(xRWw6EtIQ%rQD>TE{K^w)>&AYgtJGEQDQ$NrI*M+H2&kP{{T+>16v-y3=9AR0TjCc diff --git a/mprcontents/c4/2f/c42f512f-fc1f-461c-94df-fb58a2c39e83.mxunit b/mprcontents/c4/2f/c42f512f-fc1f-461c-94df-fb58a2c39e83.mxunit deleted file mode 100644 index 86ee5225a73113180974092f9819a1b0d404f067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmcgtU2GIp6u#`X*i@@cP{3&9nlv<;?N+HZm4rxlXG^!CwJnX5m=JGg&hB2Fy>~lv zhwWmb#u79^A(~1I0b)SmK>}$YF@Oq0;saI_<;8%6M5DeKAJhi}+IZ&9{>Ner!FjrK z&YAC=^WE>9`L>CW#4T2R_|D9cmjZrB> zq)tLt>nyJH922y|4>0}wW6Vi|!T=^P4Og7md@EQws9ZnO1-S42V5(t9Q)XegQmm%^%#BwO=)<>Hb>B_}U`I%yUoJL_C%?o<0Gj76=#rSe z;-E3)+AqK0=T;dm(oxcsm@;k80*jDPVk##cwH~&BO>RSl^mEGsLBhT|0v5D*V(6+U z?9_wzUA~fkGWPQ3kKg`@Gz}CLwj6`v(t?u0Vp7_`ga#ntL2f!SWy^fvPKuNy7iwUa z9i3mB+cdNO;F=G5zV3Xgy9i6`VE+jy6la=baxVrOUe4wwYN}3s1fvwBrBfh_F{}?S z-zAMnl&rxNLkm9TSA#jvmrTBft3yifl^7Dzv*FKJIeSuv6_rmKhM9vSrND8?U5$ja zK0-nm9e$Jy;RIE<-F#}k;p|%vC(rEYGY&0z_k}7FDid2hy=C00_7D;8)&SRZc)*Lc zG$q|pnDjWxoGc0|z5@fR6h^{jIDKui=&sbZhvmG)FU8V-bsa|a2bxGHFzP;e$Kh_|8O zD#%7P+4xGrtLg~d?JbVZT)j51r}eudqt9*|`5y?a+DA7gbo)2q(8beV^&Tw@8t~D` zoi|75b9;A1+h}O;%+|z^dHC8r3!wd1Lc2&utwPTo+_PlUOyZST`1-5q-;Up6LT|@Q z)jx)f+)|l(KHo%dMWBCuF}{4;$#(`%{Ce8B&^;{{U?8@TKx@~WmFQagd;EdK?A*rT z^YO{Mi)i(0E{T7TJ2Fny`CAO3|f(%@59-WM+M KJ1DM4LjDG3{j#(G diff --git a/mprcontents/c5/a1/c5a1acc8-f0c3-4492-8748-615dfc5f1089.mxunit b/mprcontents/c5/a1/c5a1acc8-f0c3-4492-8748-615dfc5f1089.mxunit deleted file mode 100644 index 9b60fa7ca14db41e38dd32c1b07a5183236549a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1072 zcmZ8gzfTlF6dv{CafvpZXkueSfI~s?BnO(9Xmpr;3!{5G$IL9SHk3w< zjfsVg@kC89CKfh?_#?&`uvFt8V5C4|VXsEt&F;FvrRjAM%|YogLjsqzwzO;5Z$h61v_5 zSD^-5D_m?LyvR1R&83&XG{%^r0mR4&s5b&PPfw)1XoYDlf=Qa=p;AbPdKH}&zF#k( z4A*0kHc-y@aW2Ea9MpNzJ~+qy&;^$eXK=0}l^KB<@X0nbU`V*AjAUxVj|XeL>Bm%R z;HQ0$$Jbttjl5ba{oMGs@Fg*D4}u1y3v~ngrSyRXmVk7e5nM^nm$Pwt7)MGRYuHY# zOJ+IX!+W5dsnQ^pL|h0lwC>m zP{gK}X!C_?@DgW$8JLtRBFKpID1hclRP4>Mk@jI-g6U8w99K)McRK>>4wFoS%bs%; zbEz=*clGw0M{C99UA;dpyyk8q>;QtA2F0}C%{&>)7B#Wme|q>%@7up4)z9-QJK*E7 zge|v)twAKNgFA?~%tV%~t@dstN2LgGu<;*x@7dyF_k*v+TkGE+E-dX|Mn=-w1lQym f#!>?=;x0Ys*7`)*UIcAEXA@&$eivez;~4l4ONUxs diff --git a/mprcontents/ce/24/ce24ce2d-531f-4cc6-89f3-b8788a6308d0.mxunit b/mprcontents/ce/24/ce24ce2d-531f-4cc6-89f3-b8788a6308d0.mxunit deleted file mode 100644 index 63da737a3e385b2c37b0168e90b1a85eda52b769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 611 zcmYdhVqjoZ@pNGjU;qN$b1LWLgOB-ie%?{hmCSL0NhPGRAeBK9DCL@0nwwgbSdy8a zSFD1>VPJB}PX3;bssl^OjL8-acV!Dwz!# zHUfDF_tyWOz;<&>f%irM*FE*u|FA>dD+g4Iz z4!dtLuby{H`Nb-zdE7wrLQ*SAid8@)1B+)#YHl&Z2cRgzVfjEF!eN&8_FVY1-phAm zP>9SW!>|ufgM<(U6(!~s=Rkst$tN){y)-dB)fpHJ3~WF(sd@3C!3<1b+XR7p=ltB< z(!9))N)Q7W0l=UzVnDT#+iijW%@gyTcc@6TKgm6)K%$L#Iq`lzcx?nmrDrbCk&qaM QL?2eSL8B28&_Krn0PGj81^@s6 diff --git a/mprcontents/ce/49/ce4916a7-4aa0-4a65-b5d4-cbb83d0ca02c.mxunit b/mprcontents/ce/49/ce4916a7-4aa0-4a65-b5d4-cbb83d0ca02c.mxunit deleted file mode 100644 index 0cd764ff5bb3161e089cc60665312cad1194617f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1580 zcmcIjPe>F|9DeRv>7vjj^`wtluwq@ZPDzpOA99y6(=wu@#+l#f!0fzr-W%PGf+8q_ zgggWtf;6ZO2@3r$=@Ol^PF;cmJyZl9N;-u>zc;(?%u1II&gsqj{oeP!@B4i(vXPJt z;Z%ZbCip$5OTC{+L;A^wx##<9CL)3Gv3wRtJ(kkSh|-}7gIPT6tx2G;mjGRHOwj|v zv8^s811?_Sw@)!0aQ6ZUraBq0gd%asxe7v(IZzz|oQff!gT@G0G-IeX(@i!?6;2J^ zt%Oy_w(+3D!KOx`J8QEMLj#Svo7*)oVbBHM5v9jDQ0{0f&MW~rK?S242(UAT1roDa z$!5(wMMOj7siLaDc{Alh%rP}O01{H8wV~Qji$_OFXmi=Baron1hdWCIRgYJ0}I=njDLN#USj0D_l$cz;g zdQDt9Mk>1%8y&*&adIX|$mU%nfZf4XvRp<;kG?*=ck23)+x=(npPUIV6bVsm@)GM$ zZwZ$K;y9i`X6FfJ5)DZJS8XHf#?;-ZO7R{Tb_^T+swglHVPk0yBv=A-rJlf|XVv8^ zfdfwm=Gz~$zPiZ^zqb{cwP2H8D>TUh{V*W*9 zY~Sa`FW>6tifA%5el&mB(5yWqT4vV6*sVw3U(KZNR~^+SV%DQ|Hme5N`5xz5zsAe_ z3PrA+@4gsK-rKcwH?r9J@_+q`m7%?z+_Ga~%wDFHp`&3w~b8q!LnDkjfwdlnPEwE-lI|sZ{aJ zPbtkwg>e~JApD^GoYZ25n?QvE1`NzVirJ7M9!Md~UhgC@*ZJKV=bdlY+&2HSN)c+d z2&UN}vly6MQj3#|G7CyF^Ya*hj$~k9@=MH3WncxeLW@(2fHoL0WB@q`8xEW@OulVo k?bK#fcI={iKn$5S@Bs~VOv%m6%PcM_N-W6-TE)Ns0O*NP@c;k- diff --git a/mprcontents/d5/17/d51747fb-2f79-427b-9111-4f9146a8c321.mxunit b/mprcontents/d5/17/d51747fb-2f79-427b-9111-4f9146a8c321.mxunit deleted file mode 100644 index bf5e3af9ed402e063719bf988cf6466d90c78550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 850 zcmZ9KPiPZC6vkgSjg2CuJ(LDPIzkQ#;-9J~5lx!7uEbh`@ucEp_oa?*cGB6|+Ewr% zf)_8nco3wB2R(S{O{ks(@#>+1_u8AF2fYa5%j}v>nnTFE_sx&*`zDPXK)&QuVFKv$ z$DZDdkKV7WPF`L;|N6rLt8^vqB23fjB46fZR|^@0rR+CY$*hWP9{IX~I#R(r@1Wr& z$E)0r(9Eo=bfXRin)f(RCaf|yLZ)vavwhj(K5GVIDMIFWBou9diXF6@PW3R8iV5!! zlWoQWCR?}B)kmOETXFr!Ll3~Jt#qZ*bzDXt#t42vcm#o5&u`+z#Hr9K%lvib%lwOu zIJdSj`QAQrdM(XdB+;Do@PB3}(71@o0ASB0;VRko<=tfM1Z@eH$ylI!i>P~!VRV5j z>O!Lmp)&$7aSSY4=Z?b-I%O8#Y|g%`KiqJhY@MzDzFGX3T41EjsvfMp&jo9alP{@a zAR<*z#n4rvYx*^lf)h4yDH4hr8c8hXNhmaSAlK)ZSf6N~nTop)e%fO#``Od)R)G~C zr>15|G}udphr%7^sib%yb#iDPb4u?LOF&xYaLA9NgsexxQ08$di(|EgZ;~d0YZc-f zwTiZZLJxRmA)rDAkODrWjdL1ml~C&tssl~Bcidx!nJiFoSGah=S?u5rtz~khk3VN} z$y@U23^F)0gZFSqEkZI&1^#9mV5pKnneKSvbSn}(qFW-49j}xbgRBtMMlc|OTS9gy zUKm5*7?qq7(TS`(ml+5%&n8g;#57bI?`BCF1I<;YsoIjX%`A@`j>(OMWQJl8-lQ{0 z+0b1=B2{FGC#H(XX=*i-rckv>*K5>J4!n`&NZZ|tiN?T;rN?Jy6Q@096M^)%YzZ4t zSAuKeVvdc~0~wIYF{oU6*Zlu-89WKn2rIfUO`+Loo}foo@@1ioT~R?6L$m+Z@17%0jDkYx2CCXGVM&KL zU^iFIQwSEREDrvwdqhZmlH3W>qzi>yzB2eY4_Y}l)Y{S&*koy{G}@_22jzhP6T%+y zhAGLRf7%MIT@~5Q57(L43BH*#2|X0iIkOEB>!SOcu8E6zhPrC>C$cm=0w+v>cXJNL zc(I#gY^lfNEP#NJ#!}CbIt5*b$sU}ePl^Di5gBnaw7~Ntb{@9|b9npOhHX#WyZYJX z!|{W?+h@x;e776XI57HicwQ-_EIj}j9}G3`mX-_^Y52K&Kb|W`Xcg3w^Vn-0tuh&q z(KFZ^*ejq7*=P{5f0p2rj2t7s*LZ#RNax_G_s=a|x_R#Mtv}y8S@NP7H25YAe;+Db z(pX>?I!fnc7eOTa2Wvpe^U^5dMW!qKo9>>6{NMxh}^9i5D&4FTje)(zT z(y!mneUjgJ=)>!;KUy+7ib2E7s`LkobyQ6HIO!mv0rcj|wRawthgaYH?bZ7x;;XOy z&q?n?%4Ij5_RX|2@vF7OzkK|KAKv|H-@@A;bZ#8@`LRDrb`M}s%___YUQczz%b3^D zNay;?Z?x}PxOnHr7at${T$gB*JJ2d1aUOyt{I=TMgY9R_G yH?KVL^+&hA-?q12L_{)L3rFkW+Q51)WKe~j=SyZ27&M$`4Y9PpQ?$O03x5Ol@&DHV diff --git a/mprcontents/d8/3d/d83dcc11-b9f3-4ea3-932a-82bb6c9e6ca3.mxunit b/mprcontents/d8/3d/d83dcc11-b9f3-4ea3-932a-82bb6c9e6ca3.mxunit deleted file mode 100644 index 156d1f701d71cef26d9d4c76bd26b922cc9587e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcmZuxJBU+36ul-cin!pXP!aJK3#+mQKZptn?(P$eKg3;J1e?jrO)~CeCeF-D_E~PB zrGlks;SbbC?9@i=MA1gX&O)%XQA@@9CfU41eS|QdGw0rW?wPqd0x&XGj$jS&xAyJf zPv4*2J$+-x;tO?K-7SpGrY(XEymef(#boTI(QYgsL!rACQB5SupCzAIeOfdr@O7u> zgi0u^6(SQSP10UuJg}nxux*MOqAiWZhHw}+gsxK+ozyX5o2+9T?k(*p;cSDD7Gi2; zM^QS|rh_eOT4Yrk2BI!JpY;YkV`Is2wwG{p)#$3(hBY0BLgx%6WJYG;ABRaXaa2nb z%33(wl(986#SwTv7D_R1B}IW9syMQ38B+<%HB3#ycqZq6M$SuJMN`Y8xQQ%ikOrIN zoTw9aq*7QRtdk}iGL||7HHmK}egdU-oWUaBKtTxV~ zN|mIJirS>I=&@-w6D@rjM%=Hg2uD6sW;|fWL%hJ@`uQl66`EpOI$2SK+>Q<@HGziZ zv>oY)CHGk)xL&F2Lu%wDqvP(9;|PKyawBrdxUx0}2@UKpJvZ4{OEK5X%>RI!Ek%8^ zlwjr2g;*t3ssa>_F0_pGC$oxS1)KAjtX4@wF*9b@biub%yp@~#^`qq4%*`t&?mhl` z;Jo|jd*FPUvozb#?zzl?q_z8cUWe=i2#jy~@|eay)1jmX7TcBKg`E6eUIT}q_o?l0@+yqbaGVmWWw zjZo~9E!TgQzI{FRP+#j@TtAoga@)$Fq1Fp0<6)j+V4ECb`zi15oWAiO mx^v+D+`5^~?|N+6D>=wE6B6tCh_{w!qdvKVtbm@D0Dk~1@xsgi diff --git a/mprcontents/d9/ae/d9ae85dd-d8ec-419f-9848-185c6a0b5397.mxunit b/mprcontents/d9/ae/d9ae85dd-d8ec-419f-9848-185c6a0b5397.mxunit deleted file mode 100644 index 0d132ce8202bbf8782dbf0bee5581fe7faea95a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmZvbJ!lkB5XUFGxtyR#KqRrz2Od@uVkKx1F1Nwkn202&U`X?_J9~M_-oDGew`UG3 zkyr@^M6^>PqJ>;(<40{_QY)HD%Yb0~C~TbD-MhULw|Z}8-jA98{P&p&kSo|03eNGY$c4436F86bSQ!!|%4SwA_NB6z zo4I}Nb$R>S>_R&8C>52Yi=CM#rSy>pF#yb2;e^uj<@F?O2cCrYeb|$a^IyN`ymD*o z<^7wx&8-y6{=xnaWR!S47U(Dy+p42XCJ9i5#;OdPaEMCgW96=B;Va15jtnfWImPMg zUM(K3c0x5?#om(6J*xpD-q#U&VXFi`-(3g{UgjaKSYxPQdH`T}91N;7&%k-QWy=0J z_2bv}`2K~BYo|x@YlnAwB*+}p>!vQZXFwv-W-U~-@l2Hp86q`|mdsg3XO*mAt2tbY zL`Y^BNG2Gf$7Gra!R*506>d@@>-6W@&39XOKbKy;{r&vd#J#<=(-TzG=K-#S)6X$u vTCtDz;`qgZg!GuZtF*eCpG6Q6)4j7gc<-HU?p)h_jDqw* z%8H5}qAv)eh>%FgN+=1Tmx7WC)TdtRE$~Hx&fdG9+P(zcr#ol<^P6-2=geX;Ld6ZC zAgVy{UHRIxIM(<$JmK53z4={jtD#cMQaDl-qGuG;a4w?`0UrHE``Nwuzv$70TOfiQwd_n z1#F~jz%lRvfk4thE)r-1C_0i2L&YKRBuFHI2z;4kkci=Q$RL9>SCU?5HAr#hWDA^F zXFn?HA%YlGQemMoFG3YQq=3-djBa~!9esZ`)?u{li=1b>mS%5wmvc(b4sPxcXSg|) z0TDVHq?Rg}>xL644OxBkw9N!G+~X#@351RZ1Ki0Oc{4nxTS{JX2OCRP{G-1j<5d+` zt!2@fO0EtddF>_^Q}a1qhc*Sm?C^N@K3SNo?+Q%*zI9-Sr;Mj)Ti4LS%#zOOY-)(* zfm-Ls%X#_n?n`ez{y5P;e78Va0eF-GI?!%PczbSn?mtQnOMe0$lF^iOBmL4L3N30u z$MRg*t<`iZ&mRV6D(6=&T->?zpIfvUa&UU1Wzxzz;Z!jVima_QA1=R*Rk!-5+0U2P xf_J_YaKm4yN%`KAZ}&gT)rsJkKJzIQfBK*R?H|1@O6H%L6bo&HN>VQap+9lq!>s@S diff --git a/mprcontents/e4/20/e420ec5a-aabc-464b-8adf-3fc2c2c9e323.mxunit b/mprcontents/e4/20/e420ec5a-aabc-464b-8adf-3fc2c2c9e323.mxunit deleted file mode 100644 index a795c1bb7bb96ff14c82711106ff22f935562da4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 zcmZ{jJxmlq6vrQXfF}{fh*2xXK(vrt1Um~2+y|Z?Xn;^yXolUl$A-NfoS8j13VV&w z7&{ANOl-6vRum*8#Ky*0S!pOh6B7y(jdtjp+53X%Rx|It`OSac|LyH|fR2G;4tjvT zo7-$__0^Ta{f&$3>+d%Eoq?(9Ji;+bUFH=&;_5&|YM{9WCyC|I=W(bfP{%SF=Vi3K zWIN5n7;VhS2{$fdq`Be1FTy4zis@Noeh{JxmXHabal2z)?EniRHdEE8GTmL>T?Hx1 ztb$Szg$-xUF%bcZ_ynYod)(qUT+>HMM_ z#vXbAPJVG-NPQJ67{Wg4$fdyZFoKk6a?%~^!6>DgMt$^7-71W}&OZ6J{N+Qx%GZoK zPDNSaVcn==q_Kq30w8rQaHa4=v5=&TkuP9v7q)s~>15mCt-|V$)$gpcaY*|(VQWc!->d=0 z&eZ`rQ9^CVljg$q8(h*1YMKz>Z2&!I!J(4W5KPdn*~JIThd#Z(w>iG@`^Cc}cmF(U zd2VyWTgSb@ZFv(B$;BKhR|ZK3Y$RP&6L=>MB$?cn$lOnb^|^plgJs=WprHxeDCfoRp;nyJ+eD#~VLOpGV&G4OdR&7vKJemKBjp pLymcxRb90lCs{);@g}QEV>x4*T>p(J3eavU8zK}KGinV7_zNVTRf7Nk diff --git a/mprcontents/e5/55/e555196b-c0ca-497e-b581-bf190d744b58.mxunit b/mprcontents/e5/55/e555196b-c0ca-497e-b581-bf190d744b58.mxunit deleted file mode 100644 index 477bb91eea6634ada6c6cca083a1915f74725b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861 zcmZ9K&ui2`6vtnaF0NWjZ?;7+;DU-EdiLaQ7P@V%b^U<{J#5 zu^>iMvs~%LAqvfU9B>JnNR*?a7#-ep^kuFb*_cC5JG2tmb`A)s9Z!ZK*BX6?3lgE@ zGtC-I;laaDtaiL0_R$Bhs-2dM^fWGF0NaQ^!F?YE*u9aHZy85rYGt+`tgp1ZWj=MU zAzn-`{rH&L9wkvl`uN{=S;_#JFaX$bf_sr{2C|*BYoaN^GB$_kTw&o9qm^4j;ngp%>o?Oe9MWcqZ%)6@1*^g|UXoE4 zh)6NGsJw``Ow6WItf@LK#5|&u29hzilQ8U@G+Be)XBm6z)XN6@wLHAf-t(;d_~|1o ztX_MW4z`y>xqO)7UY=tcS~o}g{rBCW`|saYm+n4)a%XK#rL@u(S|7x(pkEc5>#l(n zdhdR7R&qhXCcp2eH%06A#@ysX`R(+v?`%I2VK66GFi*AY0xr-l^SSkWI@vghHv7yG M(>os~O}2lauCd=4Wo>(mbJ8 zql##fkC6&O%0pu?0C53<$zc#sn7B|8gGotLvmG3oLqkw4970B*B!Ve1p@PKZ2r5PV z_WB~R3XDjA6A?maG377~gJTUKg2FT;94BH>lEg$v3`#_a@OUXgqG8dPJ)p9b!f1sE z69GVBDP=f8`eJcdw6-L+L?ptbKv&bkY_-}BJzz}>G_uBvP?W8;jI~W;xo$vDtiITJbnnOk4 z(Th>v1w`>gWm@huUt+c;ElVVhaOau_Fo(p%IFSJKU=rjI=yQa)l!=lk*a!;&pZoK? zjhC)l3WvrVHj@wE=9-&Iflqw(*$VhtB4Zzr1F-z2=GJM#f7Ec;#$kF0l$})q?w-iK zrjyXDe`1%o>)OE|+UhgLU%ot&=~conOHED9 z@fn<+R@&#?eD?V9;|hoDo{?=Ud#$XjNX3<)@$qq$O7$qZ+JDn`ZNqA{y0Wq|)RCGN zS8MFo_*L{pHD2SFefDr>#?`&wug22mjN|fvqI*OCC@<v zN?C1pR8-W9sb>y0@#Z&zf`WdZoMF=+nAHZBcaFxLYmaowcgjEJU%<%76!^HBesQa{ zwbiSnRi9D4YSk(?H#c>7w$9q1pG@Av4C`b`^e>MeuiYJ425HiL(t9T@dYG3U7qM`7XPbvTW zC0b>0g=fjo(2zZ?=3Djsdd41$p5ESjckiBwSN0DNFEKMPFsQzK`G8Z$=xBL;Xh(PV z=*L^vW%78u+&fs7K7-5URt0YD3l0gfc`!CM*4*6O)zvjJviV9;LBR$~%jV})ThF_U zy^f4)vAgnebHge-1_y1o*Cemqv2*9@c2U!$*U`3T^Tf{po<6SI{(dlNBA5q$+RJ1u=b#>|w!g7klqK?jq?!L?~D$CKnQt zS;yD_0|IEB3#JN9BMf_OxFSI1$oW{TLP9{l)R}F?0PfKmFwmVpL~C;=;KD-1+2%J2 zZ}q48oeU?RIc;K>%~h=7bg`i^P`O0-CXVhqOm~ZT+|FW8JL7C!hboO7LHi%33lGxM zAkBlzffU9T7!G-(UY_;7YW)clR^lf)7qEXVo##$i_g1}cAkKYU6PV*AiN;?4lWFUR GvHt*Y{i`bg literal 0 HcmV?d00001 diff --git a/mprcontents/ea/14/ea145d49-84cb-4328-a50b-b8d8b35317ab.mxunit b/mprcontents/ea/14/ea145d49-84cb-4328-a50b-b8d8b35317ab.mxunit deleted file mode 100644 index 534fe28157600ce110bc05d729949b331039544e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 zcmZ{iKWx)L6vkhilvXK$B0!Z`upmM~LKRGv7?7GcKp-tuTmB3ndbOX^1Lw~5o!h!I zOt5qVMA;BX2q6_!Wnt>TzojD^5=$j!#8`N-L!2Pt>F&MHKY#CgewGF3E7mL+0(xq< z4*mFYuT*(H`0nf5>ETyKaVGK+hN*RlEwV9Nb176YJ%f?dEOc4u=_%AYnqf&hY@*Pt#erGECK6@pc{D?X0Uek&J*Kp2&oj|Lhbml|a_$b=+GNU{j+Dmc z$kmp(kT2v*GBB~}>&WD;DI{rp-{Ur$^YG*d3{;nGFLclWFsjSG40IhA(Sv^a_C@YE zC?MM!C-D(a%czw`a%y9AZFlRyl}9_}(*CU_w;jn*5>=#we?LWJX@LAVw*%>Vaw&PcCR_*EVwZ3!C5n6JnVuZufGs zF)iw$O{|Y@UO)d}{Hb+L?HoUQuuUtHsCy+H5MM#3YcG8*WT!bPxu8^&|G(M)@+Z!G wsIA}l^kO&jeu0RP>yazCOSLrpn{-R({P+E~vm+$xcGg2|Z+;(Xdh1m91F5zfDF6Tf diff --git a/mprcontents/eb/0c/eb0c3cf5-4c0b-4cd9-9642-0106c40e6cb1.mxunit b/mprcontents/eb/0c/eb0c3cf5-4c0b-4cd9-9642-0106c40e6cb1.mxunit deleted file mode 100644 index a24667f3ed4d1ed39eb40901ad0f7812ce5b95b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2014 zcmcb|&cMK`;_1R5zyJhaZFpXD``q-I=ETT$gfC|!lS)WsK`MhJP|7v0G&i*bTE^g!nUa#4 z$H3&5n48KV1QZA^Nz6-0EJ|_BOU_Tp%u6q3;0j93%`Zs}&Mz%WPGw*TOUx-vEoLwR z>J~6yUj;J zhD|`F2=mr6)%FJL)^eEp)Y4e?WP=jaJZ_+(kkpEjVigd{z~Whwnp@0J1{6g&EFHxl zkH^iem0^4i+qNjIyuJEnDbyg4zo7;dCFT|9K*Em6CowO*G%-EZIX@+pfeol8H7`Ci zn1Kmw8z+z-8m#LW?Cj|YWHK;$<^q*M0vr;W5Ebzd70^J0c$0zIh`|^o#8|g89=x_; zmVdwBmWzVASyiNm*cPB05FsXiL`NZG-*xY4YQ0}Y8{bCb4Y3NKRz!$pq8PN~JNwq~ zr#GCZv@Vv5e0X^~1tA8CF3(_pT?-3SOI<@C2TPbi)x?9;#2dnr9xT+188lHs&E-|0 zW-reKr){otS1VLZFeg3K)}wgVu-m>#@y$!WIpLc{Hfnfy;0?86pjJev0rM78@c(1I z7+-dLt?PD~?A5ckeo3Yv)IjMjG{jBU0!U*CFsO9A1$tPSpykQ(l{R80*)v^xF4;%6 z^M2tcJ*-gk4HZdn;4s2AXuxA?xr{i1DdtGa6FjhpC6!=d>p1M5>^OepQWwCO z?6kR1=V?rR7{Sn>LtZ|3FVr@Lz^gqdHk}_CSqxj3P_6CN>iLt=U@U?h%v5+rIHjb{p zc=E0ObZK^KW^3(sf7uaiD#|oYBy+aom^)bM_vfvTm1BSGm-lb}+&py4{|_tSpi+XA MflDoH|F{7E09axS(f|Me diff --git a/mprcontents/ed/97/ed97f4c1-6f14-4e8c-b9a5-84410d40aa31.mxunit b/mprcontents/ed/97/ed97f4c1-6f14-4e8c-b9a5-84410d40aa31.mxunit deleted file mode 100644 index 4afbe8511e348d9b49194e723b377d9d6cc5567d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2087 zcmcJQYe*DP6vwZ-Tdmr|pcffA&{7b+c6%W9!DihRw{p|Uz9h&rb618PXSR9Rt_0ZlVY(dXeQ0f{~ySGdMU>DuS#?$T}bm$+{@Cq)CFoL=J;~NJ=8irb(Xj zFx(zo$P*yH4BI7%m`He`fLSquFH|Ie+36=4iGmaW2B+W0@#1D!3>h#5sb(gjAj z&`1$VA2@oYHJe;j_r7JIGAroI%x^pJE+eYh432`M&2AHUnk`iJg9NQK1%-?CaKNDS zwg_pf_2;q0kf%K~q_lLUlL9L+=L%Z-4e|sc5#vF zr=!H8QS3@T#xX&q^QzGSWM#Ae z5f+7aeShX_bT!QGZa3dAwfrBf^rcsS9^Aiu!;xXZpO$`Q^Y~z`1}k*1GCMvu)uxuY zTazC*TZ3PT35GQl!4f2j%ivfM`o&mYL7lmVy%(I_x%rv(Ib{~pjVpuy%FC`(>ty>1 z-rp+6>yl?;LuW$0s@go1q_Zl=F_2&*pE+{ZnizM{czeaB#UXo3>C5Hk@EP?J3`}+x zy6LQcch{*mc_%%u&Sqab7)Y$Sy6?`v(!zDLq}#TXles+v3iqG?6n zi3rwOKulM<>co-bRj%6;3@br}RV)vhSZ_Vi_4oEJHs|YLkNw0(+w$=1 z@aQp)`{D}d)G9kt5>Ix0*izH?<6>y2;Gx>5C5G164M>+j%8ACE7*KpRNq&yK%;9MC zaqy8r+!QRlH$RuiI(>dY=Z&=ZA*2XQx^w|}QA`^j`DmqG(6Rf~%I2e_=yTL5s)I}( J1^PG&`~u~2f06(I diff --git a/mprcontents/ed/c0/edc0beb2-d305-40a5-80db-696738eaf052.mxunit b/mprcontents/ed/c0/edc0beb2-d305-40a5-80db-696738eaf052.mxunit deleted file mode 100644 index fca82b5692de654d03e5ff8006c882f228bebec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmbQsz`($&;_1R50Aw(1+IQeB>*b{m4YxDXEna;HVp0jIEJ$S#2TFP7CZ?wrtAHuz z{G6QBHIIP>VjKexP)NXlff=NY$uBWC6|4v<$p8Sctt$Wk diff --git a/mprcontents/ee/3d/ee3dc1fc-fa9d-469f-ab56-1c763276eba2.mxunit b/mprcontents/ee/3d/ee3dc1fc-fa9d-469f-ab56-1c763276eba2.mxunit deleted file mode 100644 index 96ce7473384b5b5a2e06c55e3b3453f4bf9cb27e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 934 zcmZ9LJ!lj`6vtooF6Ok5h#vtFoXAx{LR7S~xa3YfN#uwcED~YdeR~??^Bs(Kn1t%%5|zEtXNDil&DwnMJNN=AG~xlGvo$8%#-n`b6B=DyTcwr-tn3p+|h z-4=~=E!IB_tV} zeg^~Jj=daN8!oT^9zGbXzu!kh$oG_MSfE(8fLS_abMEYKD?3a@-E;O3+k4+jHN9~P F`~#k>B3=Lh diff --git a/mprcontents/ef/28/ef288b8a-0371-48c4-9db4-8ac2f0ae39d4.mxunit b/mprcontents/ef/28/ef288b8a-0371-48c4-9db4-8ac2f0ae39d4.mxunit deleted file mode 100644 index 6a3991c6f870403a8d7fcf9f25dedebdb656ed87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1247 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

Sx88G8}t4|>g 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 Date: Mon, 6 Jul 2026 17:15:46 +0200 Subject: [PATCH 2/8] Implement ExportOQLToMarkdown similar to how ExportOQLToCSV works Skip creating a FileDocument, do not accept DataSet, consider a markdown table as just a fancy CSV with | as separator (plus start end end characters on each line and a header separator). --- .../oql/actions/ExportOQLToMarkdown.java | 78 ++++++++++++++++++- .../oql/implementation/MxCSVWriter.java | 16 +++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/javasource/oql/actions/ExportOQLToMarkdown.java b/javasource/oql/actions/ExportOQLToMarkdown.java index 492f1dd..94bdcaa 100644 --- a/javasource/oql/actions/ExportOQLToMarkdown.java +++ b/javasource/oql/actions/ExportOQLToMarkdown.java @@ -22,6 +22,14 @@ import oql.implementation.MxCSVWriter; import oql.implementation.OQL; import java.io.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * Java action that executes an OQL query and returns the result as a formatted markdown table. @@ -43,7 +51,38 @@ public ExportOQLToMarkdown( public java.lang.String executeAction() throws Exception { // BEGIN USER CODE - throw new com.mendix.systemwideinterfaces.MendixRuntimeException("Java action was not implemented"); + final int PAGE_SIZE = 10000; + + try (ByteArrayOutputStream os = new ByteArrayOutputStream(); + MxCSVWriter writer = new MxCSVWriter(new OutputStreamWriter(os), '|', Optional.empty(), Optional.empty(), Optional.of('|'), Optional.of('|'))) { + + int offset = 0; + while (true) { + + IContext context = getContext().createSudoClone(); + IDataTable results = Core.retrieveOQLDataTable(context, buildRequest(query, offset, PAGE_SIZE)); + + if (offset == 0) { + List headers = results.getSchema() + .getColumnSchemas() + .stream() + .map(IDataColumnSchema::getName) + .collect(Collectors.toCollection(ArrayList::new)); + writer.writeRow(headers); + writer.writeRow(Collections.nCopies(headers.size(), "-")); + } + + writeResults(results, writer); + + if (results.getRowCount() != PAGE_SIZE) { + break; + } + offset += PAGE_SIZE; + } + OQL.resetParameters(); + + return os.toString(); + } // END USER CODE } @@ -58,5 +97,42 @@ public java.lang.String toString() } // BEGIN EXTRA CODE + private IOQLTextGetRequest buildRequest(String statement, int offset, int pagesize) { + IOQLTextGetRequest request = Core.createOQLTextGetRequest(); + request.setQuery(statement); + + IParameterMap parameterMap = request.createParameterMap(); + IRetrievalSchema schema = Core.createRetrievalSchema(); + schema.setAmount(pagesize); + schema.setOffset(offset); + request.setRetrievalSchema(schema); + for (Entry entry : OQL.getNextParameters().entrySet()) { + parameterMap.put(entry.getKey(), entry.getValue()); + } + request.setParameters(parameterMap); + return request; + } + + private void writeResults(IDataTable results, MxCSVWriter writer) throws IOException { + for (IDataRow row : results.getRows()) { + List values = IntStream + .range(0, results.getSchema().getColumnCount()) + .mapToObj(index -> row.getValue(getContext(), index)) + .map(value -> { + if (value == null) return ""; + else { + if (value instanceof Date) { + return Long.toString(((Date) value).getTime()); // use timestamp to export for more precision than just seconds. + } else if (value instanceof IMendixIdentifier) { + return Long.toString(((IMendixIdentifier) value).toLong()); + } else { + return value.toString().replaceAll("(\r\n|\n|\r)", " "); + } + } + }) + .collect(Collectors.toCollection(ArrayList::new)); + writer.writeRow(values); + } + } // END EXTRA CODE } diff --git a/javasource/oql/implementation/MxCSVWriter.java b/javasource/oql/implementation/MxCSVWriter.java index 9db632b..481455e 100644 --- a/javasource/oql/implementation/MxCSVWriter.java +++ b/javasource/oql/implementation/MxCSVWriter.java @@ -17,19 +17,31 @@ public class MxCSVWriter implements Closeable { protected char separatorChar; protected Optional quoteChar; protected Optional escapeChar; + protected Optional initialChar; + protected Optional endChar; protected String lineEnd = "\r\n"; - public MxCSVWriter(Writer writer, char separatorChar, Optional quoteChar, Optional escapeChar) { + public MxCSVWriter(Writer writer, char separatorChar, Optional quoteChar, Optional escapeChar, + Optional initialChar, Optional endChar) { this.writer = writer; this.separatorChar = separatorChar; this.quoteChar = quoteChar; this.escapeChar = escapeChar; + this.initialChar = initialChar; + this.endChar = endChar; specialCharactersToEscape = defineSpecialCharactersToEscape(); } + public MxCSVWriter(Writer writer, char separatorChar, Optional quoteChar, + Optional escapeChar) { + this(writer, separatorChar, quoteChar, escapeChar, Optional.empty(), Optional.empty()); + } + public void writeRow(List columns) throws IOException { StringBuilder rowBuilder = new StringBuilder(1024); + initialChar.ifPresent(rowBuilder::append); + for (int columnIndex = 0; columnIndex < columns.size(); columnIndex++) { if (columnIndex != 0) { @@ -42,6 +54,8 @@ public void writeRow(List columns) throws IOException { writeValue(rowBuilder, nextValue); quoteChar.ifPresent(rowBuilder::append); } + + endChar.ifPresent(rowBuilder::append); rowBuilder.append(lineEnd); writer.write(rowBuilder.toString()); From 9a763ff3976ef4237d95787b85e5d73b5973eed3 Mon Sep 17 00:00:00 2001 From: Augusto Passalacqua Date: Mon, 6 Jul 2026 17:29:36 +0200 Subject: [PATCH 3/8] Move the new markdown widget to the correct container This ensures the same conditional viz. is applied to both the existing label and the result. --- OQLModule.mpr | Bin 61440 -> 61440 bytes ...1795fc5-fccd-4f3f-850d-a895791a9695.mxunit | Bin 12763 -> 12763 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/OQLModule.mpr b/OQLModule.mpr index d3eb7ddc460d9758a96d0efd1ddacc3732e58c2d..2df82671333ee9c1acd52088ec6a63c1179099e3 100644 GIT binary patch delta 109 zcmZp8z})bFd4e>fz(g5mMuCk9HU27=siqbdX_ltCrsf7Ix+ZBB#=4dUMrOLH#)+23 z=H_X}sb-d&0x7&vMhnui7XnFgd~ NR+vR@W{Ukc2>|IFAx!`P delta 109 zcmZp8z})bFd4e<}|3n#QM*fWnHU27zW+{f|$!TV~rl!W`x+Z3Z7P^)umWH}17G^0X zsg}m(X~u?|0=kzBG3Q; diff --git a/mprcontents/21/79/21795fc5-fccd-4f3f-850d-a895791a9695.mxunit b/mprcontents/21/79/21795fc5-fccd-4f3f-850d-a895791a9695.mxunit index c325651dc2a6552254e6875123567a97c1b698ca..2cd107b69f83b9d823e870a4befacf74da88cec1 100644 GIT binary patch delta 34 qcmcbed^>r=E-5Bi@y&arUNSQo3U6L6cZrFK*=TdEVw?aI0|Nl=p9?ks delta 33 pcmcbed^>r=E-9viY@7E;y<}#(%Cvd8+$AO!1_ox+&DDx=0s!~h3|#;K From e467f6182bac732997d7786d6d18c15f724243eb Mon Sep 17 00:00:00 2001 From: Augusto Passalacqua Date: Tue, 7 Jul 2026 15:24:53 +0200 Subject: [PATCH 4/8] Move the ExportOQLTo*.writeResult to MxCSVWriter and avoid duplicating code --- javasource/oql/actions/ExportOQLToCSV.java | 34 +---------- .../oql/actions/ExportOQLToMarkdown.java | 30 +--------- .../oql/implementation/MxCSVWriter.java | 56 +++++++++++++++---- .../oqlmodule/test/MxCSVWriterTest.java | 6 +- 4 files changed, 53 insertions(+), 73 deletions(-) diff --git a/javasource/oql/actions/ExportOQLToCSV.java b/javasource/oql/actions/ExportOQLToCSV.java index 0910072..7cf7537 100644 --- a/javasource/oql/actions/ExportOQLToCSV.java +++ b/javasource/oql/actions/ExportOQLToCSV.java @@ -12,13 +12,11 @@ import com.mendix.core.Core; import com.mendix.logging.ILogNode; import com.mendix.systemwideinterfaces.connectionbus.data.IDataColumnSchema; -import com.mendix.systemwideinterfaces.connectionbus.data.IDataRow; import com.mendix.systemwideinterfaces.connectionbus.data.IDataTable; import com.mendix.systemwideinterfaces.connectionbus.requests.IParameterMap; import com.mendix.systemwideinterfaces.connectionbus.requests.IRetrievalSchema; import com.mendix.systemwideinterfaces.connectionbus.requests.types.IOQLTextGetRequest; import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixIdentifier; import com.mendix.systemwideinterfaces.core.IMendixObject; import com.mendix.systemwideinterfaces.core.UserAction; import oql.implementation.MxCSVWriter; @@ -26,12 +24,10 @@ import system.proxies.FileDocument; import java.io.*; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Collectors; -import java.util.stream.IntStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -100,7 +96,8 @@ public IMendixObject executeAction() throws Exception MxCSVWriter writer = new MxCSVWriter(new OutputStreamWriter(os), this.separatorChar.charAt(0), this.quoteChar != null ? Optional.of(this.quoteChar.charAt(0)) : Optional.empty(), - this.escapeChar != null ? Optional.of(this.escapeChar.charAt(0)) : Optional.empty()); + this.escapeChar != null ? Optional.of(this.escapeChar.charAt(0)) : Optional.empty(), + this.removeNewLinesFromValues); IMendixObject result = Core.instantiate(getContext(), this.returnEntity); @@ -124,7 +121,7 @@ public IMendixObject executeAction() throws Exception writer.writeRow(headers); } - writeResults(results, writer); + writer.writeDataTable(results, getContext()); if (results.getRowCount() != PAGE_SIZE) { break; @@ -171,30 +168,5 @@ private IOQLTextGetRequest buildRequest(String statement, int offset, int pagesi request.setParameters(parameterMap); return request; } - - private void writeResults(IDataTable results, MxCSVWriter writer) throws IOException { - for (IDataRow row : results.getRows()) { - List values = IntStream - .range(0, results.getSchema().getColumnCount()) - .mapToObj(index -> row.getValue(getContext(), index)) - .map(value -> { - if (value == null) return ""; - else { - if (value instanceof Date) { - return Long.toString(((Date) value).getTime()); // use timestamp to export for more precision than just seconds. - } else if (value instanceof IMendixIdentifier) { - return Long.toString(((IMendixIdentifier) value).toLong()); - } else { - return value.toString(); - } - } - }) - .map(value -> this.removeNewLinesFromValues ? value.replaceAll("(\r\n|\n|\r)", " ") : value) - .collect(Collectors.toCollection(ArrayList::new)); - writer.writeRow(values); - } - } - - // END EXTRA CODE } diff --git a/javasource/oql/actions/ExportOQLToMarkdown.java b/javasource/oql/actions/ExportOQLToMarkdown.java index 94bdcaa..9d3c27f 100644 --- a/javasource/oql/actions/ExportOQLToMarkdown.java +++ b/javasource/oql/actions/ExportOQLToMarkdown.java @@ -11,25 +11,21 @@ import com.mendix.core.Core; import com.mendix.systemwideinterfaces.connectionbus.data.IDataColumnSchema; -import com.mendix.systemwideinterfaces.connectionbus.data.IDataRow; import com.mendix.systemwideinterfaces.connectionbus.data.IDataTable; import com.mendix.systemwideinterfaces.connectionbus.requests.IParameterMap; import com.mendix.systemwideinterfaces.connectionbus.requests.IRetrievalSchema; import com.mendix.systemwideinterfaces.connectionbus.requests.types.IOQLTextGetRequest; import com.mendix.systemwideinterfaces.core.IContext; -import com.mendix.systemwideinterfaces.core.IMendixIdentifier; import com.mendix.systemwideinterfaces.core.UserAction; import oql.implementation.MxCSVWriter; import oql.implementation.OQL; import java.io.*; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Collectors; -import java.util.stream.IntStream; /** * Java action that executes an OQL query and returns the result as a formatted markdown table. @@ -54,7 +50,7 @@ public java.lang.String executeAction() throws Exception final int PAGE_SIZE = 10000; try (ByteArrayOutputStream os = new ByteArrayOutputStream(); - MxCSVWriter writer = new MxCSVWriter(new OutputStreamWriter(os), '|', Optional.empty(), Optional.empty(), Optional.of('|'), Optional.of('|'))) { + MxCSVWriter writer = new MxCSVWriter(new OutputStreamWriter(os), '|', Optional.empty(), Optional.empty(), Optional.of('|'), Optional.of('|'), true)) { int offset = 0; while (true) { @@ -72,7 +68,7 @@ public java.lang.String executeAction() throws Exception writer.writeRow(Collections.nCopies(headers.size(), "-")); } - writeResults(results, writer); + writer.writeDataTable(results, getContext()); if (results.getRowCount() != PAGE_SIZE) { break; @@ -112,27 +108,5 @@ private IOQLTextGetRequest buildRequest(String statement, int offset, int pagesi request.setParameters(parameterMap); return request; } - - private void writeResults(IDataTable results, MxCSVWriter writer) throws IOException { - for (IDataRow row : results.getRows()) { - List values = IntStream - .range(0, results.getSchema().getColumnCount()) - .mapToObj(index -> row.getValue(getContext(), index)) - .map(value -> { - if (value == null) return ""; - else { - if (value instanceof Date) { - return Long.toString(((Date) value).getTime()); // use timestamp to export for more precision than just seconds. - } else if (value instanceof IMendixIdentifier) { - return Long.toString(((IMendixIdentifier) value).toLong()); - } else { - return value.toString().replaceAll("(\r\n|\n|\r)", " "); - } - } - }) - .collect(Collectors.toCollection(ArrayList::new)); - writer.writeRow(values); - } - } // END EXTRA CODE } diff --git a/javasource/oql/implementation/MxCSVWriter.java b/javasource/oql/implementation/MxCSVWriter.java index 481455e..35b27a9 100644 --- a/javasource/oql/implementation/MxCSVWriter.java +++ b/javasource/oql/implementation/MxCSVWriter.java @@ -5,36 +5,68 @@ import java.io.Closeable; import java.io.IOException; import java.io.Writer; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; +import com.mendix.systemwideinterfaces.connectionbus.data.IDataRow; +import com.mendix.systemwideinterfaces.connectionbus.data.IDataTable; +import com.mendix.systemwideinterfaces.core.IContext; +import com.mendix.systemwideinterfaces.core.IMendixIdentifier; + public class MxCSVWriter implements Closeable { - protected Writer writer; - protected List specialCharactersToEscape; - protected char separatorChar; - protected Optional quoteChar; - protected Optional escapeChar; - protected Optional initialChar; - protected Optional endChar; - protected String lineEnd = "\r\n"; + private Writer writer; + private List specialCharactersToEscape; + private char separatorChar; + private boolean removeNewLinesFromValues; + private Optional quoteChar; + private Optional escapeChar; + private Optional initialChar; + private Optional endChar; + private String lineEnd = "\r\n"; public MxCSVWriter(Writer writer, char separatorChar, Optional quoteChar, Optional escapeChar, - Optional initialChar, Optional endChar) { + Optional initialChar, Optional endChar, boolean removeNewLinesFromValues) { this.writer = writer; this.separatorChar = separatorChar; this.quoteChar = quoteChar; this.escapeChar = escapeChar; this.initialChar = initialChar; this.endChar = endChar; + this.removeNewLinesFromValues = removeNewLinesFromValues; specialCharactersToEscape = defineSpecialCharactersToEscape(); } - public MxCSVWriter(Writer writer, char separatorChar, Optional quoteChar, - Optional escapeChar) { - this(writer, separatorChar, quoteChar, escapeChar, Optional.empty(), Optional.empty()); + public MxCSVWriter(Writer writer, char separatorChar, Optional quoteChar, Optional escapeChar, boolean removeNewLinesFromValues) { + this(writer, separatorChar, quoteChar, escapeChar, Optional.empty(), Optional.empty(), removeNewLinesFromValues); + } + + public void writeDataTable(IDataTable results, IContext context) throws IOException { + for (IDataRow row : results.getRows()) { + List values = IntStream + .range(0, results.getSchema().getColumnCount()) + .mapToObj(index -> row.getValue(context, index)) + .map(value -> { + if (value == null) return ""; + else { + if (value instanceof Date) { + return Long.toString(((Date) value).getTime()); // use timestamp to export for more precision than just seconds. + } else if (value instanceof IMendixIdentifier) { + return Long.toString(((IMendixIdentifier) value).toLong()); + } else { + return value.toString(); + } + } + }) + .map(value -> removeNewLinesFromValues ? value.replaceAll("(\r\n|\n|\r)", " ") : value) + .collect(Collectors.toCollection(ArrayList::new)); + writeRow(values); + } } public void writeRow(List columns) throws IOException { diff --git a/src/test/java/com/mendix/oqlmodule/test/MxCSVWriterTest.java b/src/test/java/com/mendix/oqlmodule/test/MxCSVWriterTest.java index 24dce7f..2bb4ba9 100644 --- a/src/test/java/com/mendix/oqlmodule/test/MxCSVWriterTest.java +++ b/src/test/java/com/mendix/oqlmodule/test/MxCSVWriterTest.java @@ -25,7 +25,8 @@ public void setup() { defaultWriter = new MxCSVWriter(new OutputStreamWriter(output), ',', Optional.of('"'), - Optional.of('\\')); + Optional.of('\\'), + true); } String writeAndGetResult(MxCSVWriter writer, List> columns) throws IOException { @@ -66,7 +67,8 @@ public void testEscapedSpecialCharacters() throws IOException { MxCSVWriter writerWithoutQuote = new MxCSVWriter(new OutputStreamWriter(output), ',', Optional.empty(), - Optional.of('\\')); + Optional.of('\\'), + true); List> toWrite = List.of(List.of(",", "\r\n"), List.of("\\", "\"")); From 4a4dc11744d9240e3eb40751fbc5b45fdc47104b Mon Sep 17 00:00:00 2001 From: Augusto Passalacqua Date: Tue, 7 Jul 2026 15:41:23 +0200 Subject: [PATCH 5/8] Set the error handling in the TABLE branch in the ACT_ExecuteOQL microflow Same as the DOWNLOAD branch. --- OQLModule.mpr | Bin 61440 -> 61440 bytes ...b78ee28-e066-4098-a180-1a3efda60f8a.mxunit | Bin 12730 -> 13648 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/OQLModule.mpr b/OQLModule.mpr index 2df82671333ee9c1acd52088ec6a63c1179099e3..4100789df0051d053dfd278175d921624537f3df 100644 GIT binary patch delta 109 zcmZp8z})bFd4e>f;6xc`M!}59m~Aa68*Bw10y3d1JY6)-TZt@ER4)5U5wp~Ogw#j N%96`Bd&KOR3;-F|B3u9f delta 109 zcmZp8z})bFd4e>fz(g5mMuCk9HU27=siqbdX_ltCrsf7Ix+ZBB#=4dUMrOLH#)+23 z=H_X}sb-d&0%Uo#^Mmw5OUlZNQd}!c4E-a$157-_-GlPeqsk46szOS$U0fpzDt&zN Ny)x1_d&KOR3;^ueB8>n5 diff --git a/mprcontents/5b/78/5b78ee28-e066-4098-a180-1a3efda60f8a.mxunit b/mprcontents/5b/78/5b78ee28-e066-4098-a180-1a3efda60f8a.mxunit index dba0db5d04b543b67d6b2a8c0ef7ecd8591fd3d5..13aba982fde1caa58c53bc9f0c8a86d6b7fab72f 100644 GIT binary patch delta 455 zcmdm$d?AY|z;q+i5k{sWvCStKjoAdkZm(EY_|naHep#VOxx~>6lesx6CiC-zPF^P{ zwD}c>Esqkjp%Ft1BLf4gil+;M00R&d3uf6)Za(SL`fG!4nUi|)+s?pj zXpCl=qsLO7lIy14`yNje;?0@s1hvc)o6A)N8hkED|Ku}rnImrVO_-s;9BO0C!7jK3%E(2Jh@R9bDb zj=l&JFz`$mN`XO!2t0HzPhPJr#^+j*oKsqyS(fUXT9lqTIbKRi%*4pl+Q`y?fhjn% SDwTl^XoiV_waH{#!&(5(0hR9n delta 161 zcmcbRwJVuvm*GaHBaBQ*!kbSp8naEF$0abCo1PUe(t1CkSDr-4b;%|3F|IDyQ^>cv1ZT;mo{ zrIBV8GqaJY>E!h~EsVyK`()K8N9%3|O7QFDGBaM8Tx;mX_-^tE!|2KUQoNgOjTD$B IUo)u!0Jq^Zr~m)} From 967a479262c4161335876c9f09ea966d54ff386d Mon Sep 17 00:00:00 2001 From: Augusto Passalacqua Date: Tue, 7 Jul 2026 16:24:01 +0200 Subject: [PATCH 6/8] Use a StringWriter directly in Export to Markdown and escape pipes correctly when rendering so tables are well formed --- javasource/oql/actions/ExportOQLToMarkdown.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/javasource/oql/actions/ExportOQLToMarkdown.java b/javasource/oql/actions/ExportOQLToMarkdown.java index 9d3c27f..177f027 100644 --- a/javasource/oql/actions/ExportOQLToMarkdown.java +++ b/javasource/oql/actions/ExportOQLToMarkdown.java @@ -49,8 +49,8 @@ public java.lang.String executeAction() throws Exception // BEGIN USER CODE final int PAGE_SIZE = 10000; - try (ByteArrayOutputStream os = new ByteArrayOutputStream(); - MxCSVWriter writer = new MxCSVWriter(new OutputStreamWriter(os), '|', Optional.empty(), Optional.empty(), Optional.of('|'), Optional.of('|'), true)) { + try (StringWriter stringWriter = new StringWriter(); + MxCSVWriter writer = new MxCSVWriter(stringWriter, '|', Optional.empty(), Optional.of('\\'), Optional.of('|'), Optional.of('|'), true)) { int offset = 0; while (true) { @@ -77,7 +77,7 @@ public java.lang.String executeAction() throws Exception } OQL.resetParameters(); - return os.toString(); + return stringWriter.toString(); } // END USER CODE } From f9890d0ccc9f51f33550ae8c546af11f24fcb9f9 Mon Sep 17 00:00:00 2001 From: Augusto Passalacqua Date: Tue, 7 Jul 2026 16:24:58 +0200 Subject: [PATCH 7/8] Remove unnecessary Type parameter in ExportOQLToMarkdown --- OQLModule.mpr | Bin 61440 -> 61440 bytes ...a11f719-67e4-4944-873f-174f182338c4.mxunit | Bin 1855 -> 1757 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/OQLModule.mpr b/OQLModule.mpr index 4100789df0051d053dfd278175d921624537f3df..1481eb35c39f6076f3f04af56d184a44c7dfc757 100644 GIT binary patch delta 113 zcmZp8z})bFd4e>f&_o$$Mxl)fHU285CTSMtsg{YlrfI3hx+Vr`$-0&%X_mT{i76Io zDMm>KhL$Ot0#UhqC)v&oz@!2kekCr|(Y delta 69 zcmZp8z})bFd4e>f;6xc`M!}5Uj$tntEQ|= z{U>M4q!LnDkjfwhlyc5bNp(yv$;{6y1`7rx7A5AUmZTOjF!=!)41z#4Zkai$F8Rr& Mxv6<2V2waA04&ZRLI3~& From 4fc6a7e374f0df97a5782502a8d7c5d5a92c67c7 Mon Sep 17 00:00:00 2001 From: Augusto Passalacqua Date: Wed, 8 Jul 2026 10:41:24 +0200 Subject: [PATCH 8/8] Bump version to 5.1.0.txt --- OQLModule.mpr | Bin 61440 -> 61440 bytes gradle.properties | 2 +- marketplace/release-notes/5.1.0.txt | 3 +++ ...cde8514-afb6-4c49-8dae-6e930c9e52a1.mxunit | Bin 84 -> 84 bytes 4 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 marketplace/release-notes/5.1.0.txt diff --git a/OQLModule.mpr b/OQLModule.mpr index 1481eb35c39f6076f3f04af56d184a44c7dfc757..3302863d4e8be4ba8d5cb634b5950fbf4aa6ae76 100644 GIT binary patch delta 109 zcmZp8z})bFd4e>f@I)DBM&XSKHU27z=BCM}7G{RJW`=1-x+VtZX}Xq%rpdadMy4hv z$!TT=7M6*d0{VHiz1-a@{Y~;M3e8f&sw^$CwEctgoc;VG3&V;d{gcf6D-H7vlOw}i N3%ngS?}~Ms1OVVaA-(_r delta 109 zcmZp8z})bFd4e>f&_o$$Mxl)fHU285CTSMtsg{YlrfI3hx+Vr`$-0&%X_mT{i76Io zDMm>KhL$Ot0{VHi-BUfwoC8yWjD7uzT*5OWvO`lMLL!n=LxMcY%RF;TQ*-k?Tzq`} NgUa$Z?}~Ms1OP~nBhvr? diff --git a/gradle.properties b/gradle.properties index f81469e..0e24ef5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=5.0.0 \ No newline at end of file +version=5.1.0 \ No newline at end of file diff --git a/marketplace/release-notes/5.1.0.txt b/marketplace/release-notes/5.1.0.txt new file mode 100644 index 0000000..fba2041 --- /dev/null +++ b/marketplace/release-notes/5.1.0.txt @@ -0,0 +1,3 @@ +- We removed the CsvAsTable widget and replaced it with the Markdown viewer, which is a platform supported widget and can be downloaded from the marketplace. +- We added an ExportOQLToMarkdown java action that generates a Markdown formatted table from the result of executing an OQL query. +- We removed the dependency on the Community Commons module. \ No newline at end of file diff --git a/mprcontents/9c/de/9cde8514-afb6-4c49-8dae-6e930c9e52a1.mxunit b/mprcontents/9c/de/9cde8514-afb6-4c49-8dae-6e930c9e52a1.mxunit index 332b3405ae0a22bce2583082a1c1c2761247fbc2..851c8267cf2d8fb114575011256a9b957e093292 100644 GIT binary patch delta 10 RcmWFunc&ZAsAs^y000k40vrGU delta 10 RcmWFunc&ZApl86q000j~0viAT

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 L81;i61HgX(DC{{# literal 0 HcmV?d00001 diff --git a/widgets/mendix.CsvAsTable.mpk b/widgets/mendix.CsvAsTable.mpk deleted file mode 100644 index b7b1178b684ec9ceea69a4fb72817969f34ea55a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155898 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