text-to-map 1.1.45 → 1.1.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +69 -69
  3. package/dist/bin/address-points.d.ts +1 -1
  4. package/dist/bin/address-points.js +16 -16
  5. package/dist/bin/cities.d.ts +1 -1
  6. package/dist/bin/cities.js +10 -10
  7. package/dist/bin/clear-all.d.ts +1 -1
  8. package/dist/bin/clear-all.js +13 -13
  9. package/dist/bin/constants.d.ts +2 -2
  10. package/dist/bin/constants.js +4 -4
  11. package/dist/bin/generate-syntax-diagrams.d.ts +1 -1
  12. package/dist/bin/generate-syntax-diagrams.js +20 -20
  13. package/dist/bin/init-db.d.ts +1 -1
  14. package/dist/bin/init-db.js +8 -8
  15. package/dist/bin/knex.d.ts +1 -1
  16. package/dist/bin/knex.js +10 -10
  17. package/dist/bin/parse-ordinance.d.ts +1 -1
  18. package/dist/bin/parse-ordinance.js +74 -74
  19. package/dist/bin/polygons.d.ts +1 -1
  20. package/dist/bin/polygons.js +27 -27
  21. package/dist/bin/regions.d.ts +1 -1
  22. package/dist/bin/regions.js +10 -10
  23. package/dist/bin/schools.d.ts +1 -1
  24. package/dist/bin/schools.js +10 -10
  25. package/dist/bin/streets.d.ts +1 -1
  26. package/dist/bin/streets.js +19 -19
  27. package/dist/bin/sync-all.d.ts +1 -1
  28. package/dist/bin/sync-all.js +4 -4
  29. package/dist/db/address-points.d.ts +59 -59
  30. package/dist/db/address-points.js +401 -399
  31. package/dist/db/cities.d.ts +7 -7
  32. package/dist/db/cities.js +95 -95
  33. package/dist/db/db.d.ts +37 -37
  34. package/dist/db/db.js +191 -191
  35. package/dist/db/founders.d.ts +14 -14
  36. package/dist/db/founders.js +461 -461
  37. package/dist/db/meta.d.ts +4 -4
  38. package/dist/db/meta.js +26 -26
  39. package/dist/db/migrations/20230704125715_initial.js +304 -304
  40. package/dist/db/migrations/20230731232915_city_positions.js +13 -13
  41. package/dist/db/migrations/20240106224603_city_polygon.js +11 -11
  42. package/dist/db/migrations/20240320200534_district_polygon.js +11 -11
  43. package/dist/db/migrations/20250316162700_kindergartens.js +12 -12
  44. package/dist/db/regions.d.ts +31 -31
  45. package/dist/db/regions.js +81 -81
  46. package/dist/db/schools.d.ts +7 -7
  47. package/dist/db/schools.js +95 -95
  48. package/dist/db/street-sync.d.ts +6 -6
  49. package/dist/db/street-sync.js +22 -22
  50. package/dist/db/sync-log.d.ts +9 -9
  51. package/dist/db/sync-log.js +66 -66
  52. package/dist/db/types.d.ts +59 -59
  53. package/dist/db/types.js +26 -26
  54. package/dist/index.d.ts +23 -23
  55. package/dist/index.js +32 -32
  56. package/dist/open-data-sync/address-points.d.ts +2 -2
  57. package/dist/open-data-sync/address-points.js +68 -68
  58. package/dist/open-data-sync/cities.d.ts +2 -2
  59. package/dist/open-data-sync/cities.js +32 -32
  60. package/dist/open-data-sync/common.d.ts +2 -2
  61. package/dist/open-data-sync/common.js +22 -22
  62. package/dist/open-data-sync/regions.d.ts +2 -2
  63. package/dist/open-data-sync/regions.js +37 -37
  64. package/dist/open-data-sync/schools.d.ts +3 -3
  65. package/dist/open-data-sync/schools.js +207 -207
  66. package/dist/open-data-sync/streets.d.ts +2 -2
  67. package/dist/open-data-sync/streets.js +132 -132
  68. package/dist/smd-to-csv/json-to-csv.d.ts +1 -1
  69. package/dist/smd-to-csv/json-to-csv.js +154 -154
  70. package/dist/smd-to-csv/ordinance-to-csv-rules.d.ts +1 -1
  71. package/dist/smd-to-csv/ordinance-to-csv-rules.js +23 -23
  72. package/dist/smd-to-csv/txt-to-json.d.ts +1 -1
  73. package/dist/smd-to-csv/txt-to-json.js +92 -92
  74. package/dist/souradnice.csv +6260 -6260
  75. package/dist/street-markdown/municipality.d.ts +11 -11
  76. package/dist/street-markdown/municipality.js +116 -116
  77. package/dist/street-markdown/polygons.d.ts +7 -7
  78. package/dist/street-markdown/polygons.js +261 -261
  79. package/dist/street-markdown/roman-numerals.d.ts +1 -1
  80. package/dist/street-markdown/roman-numerals.js +68 -68
  81. package/dist/street-markdown/smd-line-parser.d.ts +4 -4
  82. package/dist/street-markdown/smd-line-parser.js +40 -40
  83. package/dist/street-markdown/smd-parser.d.ts +23 -23
  84. package/dist/street-markdown/smd-parser.js +393 -393
  85. package/dist/street-markdown/smd.d.ts +24 -24
  86. package/dist/street-markdown/smd.js +440 -440
  87. package/dist/street-markdown/token-definition.d.ts +25 -25
  88. package/dist/street-markdown/token-definition.js +168 -168
  89. package/dist/street-markdown/types.d.ts +148 -148
  90. package/dist/street-markdown/types.js +13 -13
  91. package/dist/utils/atom.d.ts +2 -2
  92. package/dist/utils/atom.js +57 -57
  93. package/dist/utils/helpers.d.ts +28 -28
  94. package/dist/utils/helpers.js +176 -176
  95. package/dist/utils/jtsk2wgs84.d.ts +17 -17
  96. package/dist/utils/jtsk2wgs84.js +82 -82
  97. package/package.json +109 -109
@@ -1,132 +1,132 @@
1
- import AdmZip from "adm-zip";
2
- import { createWriteStream, existsSync, mkdirSync, rmSync } from "fs";
3
- import fetch from "node-fetch";
4
- import parseDBF from "parsedbf";
5
- import { join } from "path";
6
- import ShpToGeoJson from "shp-to-geojson";
7
- import { pipeline } from "stream/promises";
8
- import { coordEach } from "@turf/meta";
9
- import { setCityPolygonGeojson } from "../db/cities";
10
- import { clearStreetSyncTable, deleteStreets, getAllSyncedStreets, insertStreetsFromDbf, setStreetAsSynced, } from "../db/street-sync";
11
- import { SyncPart } from "../db/types";
12
- import { getAllUrlsFromAtomFeed, getLatestUrlFromAtomFeed, } from "../utils/atom";
13
- import { prepareOptions, } from "../utils/helpers";
14
- import jtsk2wgs84 from "../utils/jtsk2wgs84";
15
- import { runSyncPart } from "./common";
16
- const prepareFolders = (options) => {
17
- const tempFolder = getTempFolder(options);
18
- if (!existsSync(tempFolder)) {
19
- mkdirSync(tempFolder);
20
- }
21
- };
22
- const getTempFolder = (options) => {
23
- return join(options.tmpDir, options.streetZipFolderName);
24
- };
25
- const downloadZipAndParseFiles = async (url, index, options) => {
26
- const response = await fetch(url);
27
- if (response.status !== 200) {
28
- throw new Error(`The ZIP file from '${url}' could not be downloaded. HTTP Code: ${response.status}`);
29
- }
30
- const zipFilePath = join(getTempFolder(options), `street${index}.zip`);
31
- await pipeline(response.body, createWriteStream(zipFilePath));
32
- const zip = new AdmZip(zipFilePath);
33
- const folderName = zip.getEntries()[0].entryName;
34
- const cityCode = folderName.substring(0, 6);
35
- const dbfEntryName = `${folderName}${options.streetDbfFileName}`;
36
- const streetData = parseDBF(zip.getEntry(dbfEntryName).getData(), "win1250");
37
- const shpEntryName = `${folderName}${options.polygonShpFileName}`;
38
- const polygonData = convertShpToGeoJson(zip.getEntry(shpEntryName).getData());
39
- const districtShpEntryName = `${folderName}${options.districtPolygonShpFileName}`;
40
- const districtShpEntry = zip.getEntry(districtShpEntryName);
41
- let districtsPolygonData = undefined;
42
- if (districtShpEntry !== null) {
43
- const districtDbfEntryName = `${folderName}${options.districtPolygonDbfFileName}`;
44
- districtsPolygonData = convertShpToGeoJson(districtShpEntry.getData(), zip.getEntry(districtDbfEntryName).getData());
45
- }
46
- rmSync(zipFilePath);
47
- return { streetData, polygonData, districtsPolygonData, cityCode };
48
- };
49
- const convertShpToGeoJson = (shpBuffer, dbfBuffer) => {
50
- const shp = new ShpToGeoJson({
51
- arraybuffers: {
52
- shpBuffer,
53
- ...(dbfBuffer ? { dbfBuffer } : {}),
54
- },
55
- });
56
- const geoJson = shp.getGeoJson();
57
- delete geoJson.bbox;
58
- coordEach(geoJson, (currentCoord) => {
59
- const [y, x] = currentCoord;
60
- const { lat, lon } = jtsk2wgs84(-x, -y);
61
- currentCoord[0] = lon;
62
- currentCoord[1] = lat;
63
- });
64
- return geoJson;
65
- };
66
- const importDataToDb = async ({ streetData, cityCode, polygonData, districtsPolygonData, }) => {
67
- if (streetData.length > 0) {
68
- await insertStreetsFromDbf(streetData);
69
- }
70
- await setCityPolygonGeojson(cityCode, polygonData, districtsPolygonData);
71
- };
72
- const attempts = 5;
73
- export const downloadAndImportStreets = async (options = {}, noCache = false) => {
74
- await runSyncPart(SyncPart.Streets, [SyncPart.AddressPoints], async () => {
75
- console.log("Starting to download and import streets. This takes up to 1 hour.");
76
- const completeOptions = prepareOptions(options);
77
- prepareFolders(completeOptions);
78
- // Clear street sync table if no-cache flag is set
79
- if (noCache) {
80
- console.log("Clearing street sync cache...");
81
- await clearStreetSyncTable();
82
- }
83
- const allDatasetFeedLinks = await getAllUrlsFromAtomFeed(completeOptions.streetsAtomUrl);
84
- console.log(`Total of ${allDatasetFeedLinks.length} links to ZIP files.`);
85
- const syncedStreetLinks = await getAllSyncedStreets();
86
- const toDelete = [];
87
- // remove all deprecated links (not in the new list)
88
- syncedStreetLinks.forEach((link) => {
89
- if (!allDatasetFeedLinks.includes(link)) {
90
- toDelete.push(link);
91
- delete syncedStreetLinks[link];
92
- }
93
- });
94
- await deleteStreets(toDelete);
95
- let done = syncedStreetLinks.size;
96
- console.log(`Total of ${done} links to ZIP files already stored.`);
97
- // get all links not yet stored
98
- const newLinks = allDatasetFeedLinks.filter((link) => !syncedStreetLinks.has(link));
99
- let delay = 0;
100
- console.log(`Loading ${newLinks.length} new links to ZIP files.`);
101
- for (const link of newLinks) {
102
- for (let i = 0; i < attempts; i++) {
103
- try {
104
- const zipLink = await getLatestUrlFromAtomFeed(link);
105
- const data = await downloadZipAndParseFiles(zipLink, done, completeOptions);
106
- await importDataToDb(data);
107
- await setStreetAsSynced(link);
108
- done++;
109
- console.log(`Loaded links: ${done}/${allDatasetFeedLinks.length}`);
110
- await wait(delay);
111
- break;
112
- }
113
- catch (error) {
114
- if (i < attempts - 1) {
115
- delay += 100; // if error occured, it is likely to repeat so we wait a bit longer
116
- const waitTime = (i + 1) * 3;
117
- console.error(`Error connecting to CUZK servers, retrying in ${waitTime} seconds...`);
118
- console.log(error);
119
- await wait(waitTime * 1000);
120
- }
121
- else {
122
- throw error;
123
- }
124
- }
125
- }
126
- }
127
- });
128
- };
129
- const wait = async (ms) => {
130
- await new Promise((resolve) => setTimeout(resolve, ms));
131
- };
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuLWRhdGEtc3luYy9zdHJlZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUU3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDdEUsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVCLE9BQU8sWUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixHQUNsQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBYSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix3QkFBd0IsR0FDekIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGNBQWMsR0FDZixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdkMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxPQUE0QixFQUFFLEVBQUU7SUFDdEQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FB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QyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBVSxFQUFpQixFQUFFO0lBQy9DLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQWRtWmlwIGZyb20gXCJhZG0temlwXCI7XHJcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXJcIjtcclxuaW1wb3J0IHsgY3JlYXRlV3JpdGVTdHJlYW0sIGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcm1TeW5jIH0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xyXG5pbXBvcnQgcGFyc2VEQkYgZnJvbSBcInBhcnNlZGJmXCI7XHJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgU2hwVG9HZW9Kc29uIGZyb20gXCJzaHAtdG8tZ2VvanNvblwiO1xyXG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gXCJzdHJlYW0vcHJvbWlzZXNcIjtcclxuXHJcbmltcG9ydCB7IEZlYXR1cmVDb2xsZWN0aW9uIH0gZnJvbSBcIkB0dXJmL2hlbHBlcnNcIjtcclxuaW1wb3J0IHsgY29vcmRFYWNoIH0gZnJvbSBcIkB0dXJmL21ldGFcIjtcclxuaW1wb3J0IHsgc2V0Q2l0eVBvbHlnb25HZW9qc29uIH0gZnJvbSBcIi4uL2RiL2NpdGllc1wiO1xyXG5pbXBvcnQge1xyXG4gIGNsZWFyU3RyZWV0U3luY1RhYmxlLFxyXG4gIGRlbGV0ZVN0cmVldHMsXHJcbiAgZ2V0QWxsU3luY2VkU3RyZWV0cyxcclxuICBpbnNlcnRTdHJlZXRzRnJvbURiZixcclxuICBzZXRTdHJlZXRBc1N5bmNlZCxcclxufSBmcm9tIFwiLi4vZGIvc3RyZWV0LXN5bmNcIjtcclxuaW1wb3J0IHsgRGJmU3RyZWV0LCBTeW5jUGFydCB9IGZyb20gXCIuLi9kYi90eXBlc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldEFsbFVybHNGcm9tQXRvbUZlZWQsXHJcbiAgZ2V0TGF0ZXN0VXJsRnJvbUF0b21GZWVkLFxyXG59IGZyb20gXCIuLi91dGlscy9hdG9tXCI7XHJcbmltcG9ydCB7XHJcbiAgT3BlbkRhdGFTeW5jT3B0aW9ucyxcclxuICBPcGVuRGF0YVN5bmNPcHRpb25zUGFydGlhbCxcclxuICBwcmVwYXJlT3B0aW9ucyxcclxufSBmcm9tIFwiLi4vdXRpbHMvaGVscGVyc1wiO1xyXG5pbXBvcnQganRzazJ3Z3M4NCBmcm9tIFwiLi4vdXRpbHMvanRzazJ3Z3M4NFwiO1xyXG5pbXBvcnQgeyBydW5TeW5jUGFydCB9IGZyb20gXCIuL2NvbW1vblwiO1xyXG5cclxuY29uc3QgcHJlcGFyZUZvbGRlcnMgPSAob3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9ucykgPT4ge1xyXG4gIGNvbnN0IHRlbXBGb2xkZXIgPSBnZXRUZW1wRm9sZGVyKG9wdGlvbnMpO1xyXG4gIGlmICghZXhpc3RzU3luYyh0ZW1wRm9sZGVyKSkge1xyXG4gICAgbWtkaXJTeW5jKHRlbXBGb2xkZXIpO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldFRlbXBGb2xkZXIgPSAob3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9ucykgPT4ge1xyXG4gIHJldHVybiBqb2luKG9wdGlvbnMudG1wRGlyLCBvcHRpb25zLnN0cmVldFppcEZvbGRlck5hbWUpO1xyXG59O1xyXG5cclxuY29uc3QgZG93bmxvYWRaaXBBbmRQYXJzZUZpbGVzID0gYXN5bmMgKFxyXG4gIHVybDogc3RyaW5nLFxyXG4gIGluZGV4OiBudW1iZXIsXHJcbiAgb3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9uc1xyXG4pOiBQcm9taXNlPHtcclxuICBzdHJlZXREYXRhOiBEYmZTdHJlZXRbXTtcclxuICBwb2x5Z29uRGF0YTogRmVhdHVyZUNvbGxlY3Rpb247XHJcbiAgZGlzdHJpY3RzUG9seWdvbkRhdGE/OiBGZWF0dXJlQ29sbGVjdGlvbjtcclxuICBjaXR5Q29kZTogc3RyaW5nO1xyXG59PiA9PiB7XHJcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xyXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICBgVGhlIFpJUCBmaWxlIGZyb20gJyR7dXJsfScgY291bGQgbm90IGJlIGRvd25sb2FkZWQuIEhUVFAgQ29kZTogJHtyZXNwb25zZS5zdGF0dXN9YFxyXG4gICAgKTtcclxuICB9XHJcbiAgY29uc3QgemlwRmlsZVBhdGggPSBqb2luKGdldFRlbXBGb2xkZXIob3B0aW9ucyksIGBzdHJlZXQke2luZGV4fS56aXBgKTtcclxuICBhd2FpdCBwaXBlbGluZShyZXNwb25zZS5ib2R5LCBjcmVhdGVXcml0ZVN0cmVhbSh6aXBGaWxlUGF0aCkpO1xyXG5cclxuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKHppcEZpbGVQYXRoKTtcclxuICBjb25zdCBmb2xkZXJOYW1lID0gemlwLmdldEVudHJpZXMoKVswXS5lbnRyeU5hbWU7XHJcbiAgY29uc3QgY2l0eUNvZGUgPSBmb2xkZXJOYW1lLnN1YnN0cmluZygwLCA2KTtcclxuICBjb25zdCBkYmZFbnRyeU5hbWUgPSBgJHtmb2xkZXJOYW1lfSR7b3B0aW9ucy5zdHJlZXREYmZGaWxlTmFtZX1gO1xyXG4gIGNvbnN0IHN0cmVldERhdGEgPSBwYXJzZURCRjxEYmZTdHJlZXQ+KFxyXG4gICAgemlwLmdldEVudHJ5KGRiZkVudHJ5TmFtZSkuZ2V0RGF0YSgpLFxyXG4gICAgXCJ3aW4xMjUwXCJcclxuICApO1xyXG5cclxuICBjb25zdCBzaHBFbnRyeU5hbWUgPSBgJHtmb2xkZXJOYW1lfSR7b3B0aW9ucy5wb2x5Z29uU2hwRmlsZU5hbWV9YDtcclxuICBjb25zdCBwb2x5Z29uRGF0YSA9IGNvbnZlcnRTaHBUb0dlb0pzb24oemlwLmdldEVudHJ5KHNocEVudHJ5TmFtZSkuZ2V0RGF0YSgpKTtcclxuXHJcbiAgY29uc3QgZGlzdHJpY3RTaHBFbnRyeU5hbWUgPSBgJHtmb2xkZXJOYW1lfSR7b3B0aW9ucy5kaXN0cmljdFBvbHlnb25TaHBGaWxlTmFtZX1gO1xyXG4gIGNvbnN0IGRpc3RyaWN0U2hwRW50cnkgPSB6aXAuZ2V0RW50cnkoZGlzdHJpY3RTaHBFbnRyeU5hbWUpO1xyXG5cclxuICBsZXQgZGlzdHJpY3RzUG9seWdvbkRhdGE6IEZlYXR1cmVDb2xsZWN0aW9uID0gdW5kZWZpbmVkO1xyXG4gIGlmIChkaXN0cmljdFNocEVudHJ5ICE9PSBudWxsKSB7XHJcbiAgICBjb25zdCBkaXN0cmljdERiZkVudHJ5TmFtZSA9IGAke2ZvbGRlck5hbWV9JHtvcHRpb25zLmRpc3RyaWN0UG9seWdvbkRiZkZpbGVOYW1lfWA7XHJcbiAgICBkaXN0cmljdHNQb2x5Z29uRGF0YSA9IGNvbnZlcnRTaHBUb0dlb0pzb24oXHJcbiAgICAgIGRpc3RyaWN0U2hwRW50cnkuZ2V0RGF0YSgpLFxyXG4gICAgICB6aXAuZ2V0RW50cnkoZGlzdHJpY3REYmZFbnRyeU5hbWUpLmdldERhdGEoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJtU3luYyh6aXBGaWxlUGF0aCk7XHJcbiAgcmV0dXJuIHsgc3RyZWV0RGF0YSwgcG9seWdvbkRhdGEsIGRpc3RyaWN0c1BvbHlnb25EYXRhLCBjaXR5Q29kZSB9O1xyXG59O1xyXG5cclxuY29uc3QgY29udmVydFNocFRvR2VvSnNvbiA9IChcclxuICBzaHBCdWZmZXI6IEJ1ZmZlcixcclxuICBkYmZCdWZmZXI/OiBCdWZmZXJcclxuKTogRmVhdHVyZUNvbGxlY3Rpb24gPT4ge1xyXG4gIGNvbnN0IHNocCA9IG5ldyBTaHBUb0dlb0pzb24oe1xyXG4gICAgYXJyYXlidWZmZXJzOiB7XHJcbiAgICAgIHNocEJ1ZmZlcixcclxuICAgICAgLi4uKGRiZkJ1ZmZlciA/IHsgZGJmQnVmZmVyIH0gOiB7fSksXHJcbiAgICB9LFxyXG4gIH0pO1xyXG4gIGNvbnN0IGdlb0pzb24gPSBzaHAuZ2V0R2VvSnNvbigpO1xyXG4gIGRlbGV0ZSBnZW9Kc29uLmJib3g7XHJcblxyXG4gIGNvb3JkRWFjaChnZW9Kc29uIGFzIGFueSwgKGN1cnJlbnRDb29yZCkgPT4ge1xyXG4gICAgY29uc3QgW3ksIHhdID0gY3VycmVudENvb3JkO1xyXG4gICAgY29uc3QgeyBsYXQsIGxvbiB9ID0ganRzazJ3Z3M4NCgteCwgLXkpO1xyXG4gICAgY3VycmVudENvb3JkWzBdID0gbG9uO1xyXG4gICAgY3VycmVudENvb3JkWzFdID0gbGF0O1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gZ2VvSnNvbiBhcyBGZWF0dXJlQ29sbGVjdGlvbjtcclxufTtcclxuXHJcbmNvbnN0IGltcG9ydERhdGFUb0RiID0gYXN5bmMgKHtcclxuICBzdHJlZXREYXRhLFxyXG4gIGNpdHlDb2RlLFxyXG4gIHBvbHlnb25EYXRhLFxyXG4gIGRpc3RyaWN0c1BvbHlnb25EYXRhLFxyXG59OiB7XHJcbiAgc3RyZWV0RGF0YTogRGJmU3RyZWV0W107XHJcbiAgY2l0eUNvZGU6IHN0cmluZztcclxuICBwb2x5Z29uRGF0YTogRmVhdHVyZUNvbGxlY3Rpb247XHJcbiAgZGlzdHJpY3RzUG9seWdvbkRhdGE/OiBGZWF0dXJlQ29sbGVjdGlvbjtcclxufSkgPT4ge1xyXG4gIGlmIChzdHJlZXREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgIGF3YWl0IGluc2VydFN0cmVldHNGcm9tRGJmKHN0cmVldERhdGEpO1xyXG4gIH1cclxuICBhd2FpdCBzZXRDaXR5UG9seWdvbkdlb2pzb24oY2l0eUNvZGUsIHBvbHlnb25EYXRhLCBkaXN0cmljdHNQb2x5Z29uRGF0YSk7XHJcbn07XHJcblxyXG5jb25zdCBhdHRlbXB0cyA9IDU7XHJcblxyXG5leHBvcnQgY29uc3QgZG93bmxvYWRBbmRJbXBvcnRTdHJlZXRzID0gYXN5bmMgKFxyXG4gIG9wdGlvbnM6IE9wZW5EYXRhU3luY09wdGlvbnNQYXJ0aWFsID0ge30sXHJcbiAgbm9DYWNoZTogYm9vbGVhbiA9IGZhbHNlXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGF3YWl0IHJ1blN5bmNQYXJ0KFN5bmNQYXJ0LlN0cmVldHMsIFtTeW5jUGFydC5BZGRyZXNzUG9pbnRzXSwgYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgIFwiU3RhcnRpbmcgdG8gZG93bmxvYWQgYW5kIGltcG9ydCBzdHJlZXRzLiBUaGlzIHRha2VzIHVwIHRvIDEgaG91ci5cIlxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBjb21wbGV0ZU9wdGlvbnMgPSBwcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcclxuICAgIHByZXBhcmVGb2xkZXJzKGNvbXBsZXRlT3B0aW9ucyk7XHJcblxyXG4gICAgLy8gQ2xlYXIgc3RyZWV0IHN5bmMgdGFibGUgaWYgbm8tY2FjaGUgZmxhZyBpcyBzZXRcclxuICAgIGlmIChub0NhY2hlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQ2xlYXJpbmcgc3RyZWV0IHN5bmMgY2FjaGUuLi5cIik7XHJcbiAgICAgIGF3YWl0IGNsZWFyU3RyZWV0U3luY1RhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsRGF0YXNldEZlZWRMaW5rcyA9IGF3YWl0IGdldEFsbFVybHNGcm9tQXRvbUZlZWQoXHJcbiAgICAgIGNvbXBsZXRlT3B0aW9ucy5zdHJlZXRzQXRvbVVybFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhgVG90YWwgb2YgJHthbGxEYXRhc2V0RmVlZExpbmtzLmxlbmd0aH0gbGlua3MgdG8gWklQIGZpbGVzLmApO1xyXG5cclxuICAgIGNvbnN0IHN5bmNlZFN0cmVldExpbmtzID0gYXdhaXQgZ2V0QWxsU3luY2VkU3RyZWV0cygpO1xyXG5cclxuICAgIGNvbnN0IHRvRGVsZXRlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLy8gcmVtb3ZlIGFsbCBkZXByZWNhdGVkIGxpbmtzIChub3QgaW4gdGhlIG5ldyBsaXN0KVxyXG4gICAgc3luY2VkU3RyZWV0TGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xyXG4gICAgICBpZiAoIWFsbERhdGFzZXRGZWVkTGlua3MuaW5jbHVkZXMobGluaykpIHtcclxuICAgICAgICB0b0RlbGV0ZS5wdXNoKGxpbmspO1xyXG4gICAgICAgIGRlbGV0ZSBzeW5jZWRTdHJlZXRMaW5rc1tsaW5rXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgYXdhaXQgZGVsZXRlU3RyZWV0cyh0b0RlbGV0ZSk7XHJcblxyXG4gICAgbGV0IGRvbmUgPSBzeW5jZWRTdHJlZXRMaW5rcy5zaXplO1xyXG4gICAgY29uc29sZS5sb2coYFRvdGFsIG9mICR7ZG9uZX0gbGlua3MgdG8gWklQIGZpbGVzIGFscmVhZHkgc3RvcmVkLmApO1xyXG5cclxuICAgIC8vIGdldCBhbGwgbGlua3Mgbm90IHlldCBzdG9yZWRcclxuICAgIGNvbnN0IG5ld0xpbmtzID0gYWxsRGF0YXNldEZlZWRMaW5rcy5maWx0ZXIoXHJcbiAgICAgIChsaW5rKSA9PiAhc3luY2VkU3RyZWV0TGlua3MuaGFzKGxpbmspXHJcbiAgICApO1xyXG5cclxuICAgIGxldCBkZWxheSA9IDA7XHJcbiAgICBjb25zb2xlLmxvZyhgTG9hZGluZyAke25ld0xpbmtzLmxlbmd0aH0gbmV3IGxpbmtzIHRvIFpJUCBmaWxlcy5gKTtcclxuICAgIGZvciAoY29uc3QgbGluayBvZiBuZXdMaW5rcykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGVtcHRzOyBpKyspIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgemlwTGluayA9IGF3YWl0IGdldExhdGVzdFVybEZyb21BdG9tRmVlZChsaW5rKTtcclxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkb3dubG9hZFppcEFuZFBhcnNlRmlsZXMoXHJcbiAgICAgICAgICAgIHppcExpbmssXHJcbiAgICAgICAgICAgIGRvbmUsXHJcbiAgICAgICAgICAgIGNvbXBsZXRlT3B0aW9uc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGF3YWl0IGltcG9ydERhdGFUb0RiKGRhdGEpO1xyXG4gICAgICAgICAgYXdhaXQgc2V0U3RyZWV0QXNTeW5jZWQobGluayk7XHJcblxyXG4gICAgICAgICAgZG9uZSsrO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRlZCBsaW5rczogJHtkb25lfS8ke2FsbERhdGFzZXRGZWVkTGlua3MubGVuZ3RofWApO1xyXG4gICAgICAgICAgYXdhaXQgd2FpdChkZWxheSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgaWYgKGkgPCBhdHRlbXB0cyAtIDEpIHtcclxuICAgICAgICAgICAgZGVsYXkgKz0gMTAwOyAvLyBpZiBlcnJvciBvY2N1cmVkLCBpdCBpcyBsaWtlbHkgdG8gcmVwZWF0IHNvIHdlIHdhaXQgYSBiaXQgbG9uZ2VyXHJcbiAgICAgICAgICAgIGNvbnN0IHdhaXRUaW1lID0gKGkgKyAxKSAqIDM7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgICAgYEVycm9yIGNvbm5lY3RpbmcgdG8gQ1VaSyBzZXJ2ZXJzLCByZXRyeWluZyBpbiAke3dhaXRUaW1lfSBzZWNvbmRzLi4uYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIGF3YWl0IHdhaXQod2FpdFRpbWUgKiAxMDAwKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG59O1xyXG5cclxuY29uc3Qgd2FpdCA9IGFzeW5jIChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxufTtcclxuIl19
1
+ import AdmZip from "adm-zip";
2
+ import { createWriteStream, existsSync, mkdirSync, rmSync } from "fs";
3
+ import fetch from "node-fetch";
4
+ import parseDBF from "parsedbf";
5
+ import { join } from "path";
6
+ import ShpToGeoJson from "shp-to-geojson";
7
+ import { pipeline } from "stream/promises";
8
+ import { coordEach } from "@turf/meta";
9
+ import { setCityPolygonGeojson } from "../db/cities";
10
+ import { clearStreetSyncTable, deleteStreets, getAllSyncedStreets, insertStreetsFromDbf, setStreetAsSynced, } from "../db/street-sync";
11
+ import { SyncPart } from "../db/types";
12
+ import { getAllUrlsFromAtomFeed, getLatestUrlFromAtomFeed, } from "../utils/atom";
13
+ import { prepareOptions, } from "../utils/helpers";
14
+ import jtsk2wgs84 from "../utils/jtsk2wgs84";
15
+ import { runSyncPart } from "./common";
16
+ const prepareFolders = (options) => {
17
+ const tempFolder = getTempFolder(options);
18
+ if (!existsSync(tempFolder)) {
19
+ mkdirSync(tempFolder);
20
+ }
21
+ };
22
+ const getTempFolder = (options) => {
23
+ return join(options.tmpDir, options.streetZipFolderName);
24
+ };
25
+ const downloadZipAndParseFiles = async (url, index, options) => {
26
+ const response = await fetch(url);
27
+ if (response.status !== 200) {
28
+ throw new Error(`The ZIP file from '${url}' could not be downloaded. HTTP Code: ${response.status}`);
29
+ }
30
+ const zipFilePath = join(getTempFolder(options), `street${index}.zip`);
31
+ await pipeline(response.body, createWriteStream(zipFilePath));
32
+ const zip = new AdmZip(zipFilePath);
33
+ const folderName = zip.getEntries()[0].entryName;
34
+ const cityCode = folderName.substring(0, 6);
35
+ const dbfEntryName = `${folderName}${options.streetDbfFileName}`;
36
+ const streetData = parseDBF(zip.getEntry(dbfEntryName).getData(), "win1250");
37
+ const shpEntryName = `${folderName}${options.polygonShpFileName}`;
38
+ const polygonData = convertShpToGeoJson(zip.getEntry(shpEntryName).getData());
39
+ const districtShpEntryName = `${folderName}${options.districtPolygonShpFileName}`;
40
+ const districtShpEntry = zip.getEntry(districtShpEntryName);
41
+ let districtsPolygonData = undefined;
42
+ if (districtShpEntry !== null) {
43
+ const districtDbfEntryName = `${folderName}${options.districtPolygonDbfFileName}`;
44
+ districtsPolygonData = convertShpToGeoJson(districtShpEntry.getData(), zip.getEntry(districtDbfEntryName).getData());
45
+ }
46
+ rmSync(zipFilePath);
47
+ return { streetData, polygonData, districtsPolygonData, cityCode };
48
+ };
49
+ const convertShpToGeoJson = (shpBuffer, dbfBuffer) => {
50
+ const shp = new ShpToGeoJson({
51
+ arraybuffers: {
52
+ shpBuffer,
53
+ ...(dbfBuffer ? { dbfBuffer } : {}),
54
+ },
55
+ });
56
+ const geoJson = shp.getGeoJson();
57
+ delete geoJson.bbox;
58
+ coordEach(geoJson, (currentCoord) => {
59
+ const [y, x] = currentCoord;
60
+ const { lat, lon } = jtsk2wgs84(-x, -y);
61
+ currentCoord[0] = lon;
62
+ currentCoord[1] = lat;
63
+ });
64
+ return geoJson;
65
+ };
66
+ const importDataToDb = async ({ streetData, cityCode, polygonData, districtsPolygonData, }) => {
67
+ if (streetData.length > 0) {
68
+ await insertStreetsFromDbf(streetData);
69
+ }
70
+ await setCityPolygonGeojson(cityCode, polygonData, districtsPolygonData);
71
+ };
72
+ const attempts = 5;
73
+ export const downloadAndImportStreets = async (options = {}, noCache = false) => {
74
+ await runSyncPart(SyncPart.Streets, [SyncPart.AddressPoints], async () => {
75
+ console.log("Starting to download and import streets. This takes up to 1 hour.");
76
+ const completeOptions = prepareOptions(options);
77
+ prepareFolders(completeOptions);
78
+ // Clear street sync table if no-cache flag is set
79
+ if (noCache) {
80
+ console.log("Clearing street sync cache...");
81
+ await clearStreetSyncTable();
82
+ }
83
+ const allDatasetFeedLinks = await getAllUrlsFromAtomFeed(completeOptions.streetsAtomUrl);
84
+ console.log(`Total of ${allDatasetFeedLinks.length} links to ZIP files.`);
85
+ const syncedStreetLinks = await getAllSyncedStreets();
86
+ const toDelete = [];
87
+ // remove all deprecated links (not in the new list)
88
+ syncedStreetLinks.forEach((link) => {
89
+ if (!allDatasetFeedLinks.includes(link)) {
90
+ toDelete.push(link);
91
+ delete syncedStreetLinks[link];
92
+ }
93
+ });
94
+ await deleteStreets(toDelete);
95
+ let done = syncedStreetLinks.size;
96
+ console.log(`Total of ${done} links to ZIP files already stored.`);
97
+ // get all links not yet stored
98
+ const newLinks = allDatasetFeedLinks.filter((link) => !syncedStreetLinks.has(link));
99
+ let delay = 0;
100
+ console.log(`Loading ${newLinks.length} new links to ZIP files.`);
101
+ for (const link of newLinks) {
102
+ for (let i = 0; i < attempts; i++) {
103
+ try {
104
+ const zipLink = await getLatestUrlFromAtomFeed(link);
105
+ const data = await downloadZipAndParseFiles(zipLink, done, completeOptions);
106
+ await importDataToDb(data);
107
+ await setStreetAsSynced(link);
108
+ done++;
109
+ console.log(`Loaded links: ${done}/${allDatasetFeedLinks.length}`);
110
+ await wait(delay);
111
+ break;
112
+ }
113
+ catch (error) {
114
+ if (i < attempts - 1) {
115
+ delay += 100; // if error occured, it is likely to repeat so we wait a bit longer
116
+ const waitTime = (i + 1) * 3;
117
+ console.error(`Error connecting to CUZK servers, retrying in ${waitTime} seconds...`);
118
+ console.log(error);
119
+ await wait(waitTime * 1000);
120
+ }
121
+ else {
122
+ throw error;
123
+ }
124
+ }
125
+ }
126
+ }
127
+ });
128
+ };
129
+ const wait = async (ms) => {
130
+ await new Promise((resolve) => setTimeout(resolve, ms));
131
+ };
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuLWRhdGEtc3luYy9zdHJlZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUU3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDdEUsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVCLE9BQU8sWUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixHQUNsQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBYSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix3QkFBd0IsR0FDekIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGNBQWMsR0FDZixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdkMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxPQUE0QixFQUFFLEVBQUU7SUFDdEQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FB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QyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBVSxFQUFpQixFQUFFO0lBQy9DLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQWRtWmlwIGZyb20gXCJhZG0temlwXCI7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyXCI7XG5pbXBvcnQgeyBjcmVhdGVXcml0ZVN0cmVhbSwgZXhpc3RzU3luYywgbWtkaXJTeW5jLCBybVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0IHBhcnNlREJGIGZyb20gXCJwYXJzZWRiZlwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgU2hwVG9HZW9Kc29uIGZyb20gXCJzaHAtdG8tZ2VvanNvblwiO1xuaW1wb3J0IHsgcGlwZWxpbmUgfSBmcm9tIFwic3RyZWFtL3Byb21pc2VzXCI7XG5cbmltcG9ydCB7IEZlYXR1cmVDb2xsZWN0aW9uIH0gZnJvbSBcIkB0dXJmL2hlbHBlcnNcIjtcbmltcG9ydCB7IGNvb3JkRWFjaCB9IGZyb20gXCJAdHVyZi9tZXRhXCI7XG5pbXBvcnQgeyBzZXRDaXR5UG9seWdvbkdlb2pzb24gfSBmcm9tIFwiLi4vZGIvY2l0aWVzXCI7XG5pbXBvcnQge1xuICBjbGVhclN0cmVldFN5bmNUYWJsZSxcbiAgZGVsZXRlU3RyZWV0cyxcbiAgZ2V0QWxsU3luY2VkU3RyZWV0cyxcbiAgaW5zZXJ0U3RyZWV0c0Zyb21EYmYsXG4gIHNldFN0cmVldEFzU3luY2VkLFxufSBmcm9tIFwiLi4vZGIvc3RyZWV0LXN5bmNcIjtcbmltcG9ydCB7IERiZlN0cmVldCwgU3luY1BhcnQgfSBmcm9tIFwiLi4vZGIvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldEFsbFVybHNGcm9tQXRvbUZlZWQsXG4gIGdldExhdGVzdFVybEZyb21BdG9tRmVlZCxcbn0gZnJvbSBcIi4uL3V0aWxzL2F0b21cIjtcbmltcG9ydCB7XG4gIE9wZW5EYXRhU3luY09wdGlvbnMsXG4gIE9wZW5EYXRhU3luY09wdGlvbnNQYXJ0aWFsLFxuICBwcmVwYXJlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3V0aWxzL2hlbHBlcnNcIjtcbmltcG9ydCBqdHNrMndnczg0IGZyb20gXCIuLi91dGlscy9qdHNrMndnczg0XCI7XG5pbXBvcnQgeyBydW5TeW5jUGFydCB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5jb25zdCBwcmVwYXJlRm9sZGVycyA9IChvcHRpb25zOiBPcGVuRGF0YVN5bmNPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHRlbXBGb2xkZXIgPSBnZXRUZW1wRm9sZGVyKG9wdGlvbnMpO1xuICBpZiAoIWV4aXN0c1N5bmModGVtcEZvbGRlcikpIHtcbiAgICBta2RpclN5bmModGVtcEZvbGRlcik7XG4gIH1cbn07XG5cbmNvbnN0IGdldFRlbXBGb2xkZXIgPSAob3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9ucykgPT4ge1xuICByZXR1cm4gam9pbihvcHRpb25zLnRtcERpciwgb3B0aW9ucy5zdHJlZXRaaXBGb2xkZXJOYW1lKTtcbn07XG5cbmNvbnN0IGRvd25sb2FkWmlwQW5kUGFyc2VGaWxlcyA9IGFzeW5jIChcbiAgdXJsOiBzdHJpbmcsXG4gIGluZGV4OiBudW1iZXIsXG4gIG9wdGlvbnM6IE9wZW5EYXRhU3luY09wdGlvbnNcbik6IFByb21pc2U8e1xuICBzdHJlZXREYXRhOiBEYmZTdHJlZXRbXTtcbiAgcG9seWdvbkRhdGE6IEZlYXR1cmVDb2xsZWN0aW9uO1xuICBkaXN0cmljdHNQb2x5Z29uRGF0YT86IEZlYXR1cmVDb2xsZWN0aW9uO1xuICBjaXR5Q29kZTogc3RyaW5nO1xufT4gPT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgWklQIGZpbGUgZnJvbSAnJHt1cmx9JyBjb3VsZCBub3QgYmUgZG93bmxvYWRlZC4gSFRUUCBDb2RlOiAke3Jlc3BvbnNlLnN0YXR1c31gXG4gICAgKTtcbiAgfVxuICBjb25zdCB6aXBGaWxlUGF0aCA9IGpvaW4oZ2V0VGVtcEZvbGRlcihvcHRpb25zKSwgYHN0cmVldCR7aW5kZXh9LnppcGApO1xuICBhd2FpdCBwaXBlbGluZShyZXNwb25zZS5ib2R5LCBjcmVhdGVXcml0ZVN0cmVhbSh6aXBGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IHppcCA9IG5ldyBBZG1aaXAoemlwRmlsZVBhdGgpO1xuICBjb25zdCBmb2xkZXJOYW1lID0gemlwLmdldEVudHJpZXMoKVswXS5lbnRyeU5hbWU7XG4gIGNvbnN0IGNpdHlDb2RlID0gZm9sZGVyTmFtZS5zdWJzdHJpbmcoMCwgNik7XG4gIGNvbnN0IGRiZkVudHJ5TmFtZSA9IGAke2ZvbGRlck5hbWV9JHtvcHRpb25zLnN0cmVldERiZkZpbGVOYW1lfWA7XG4gIGNvbnN0IHN0cmVldERhdGEgPSBwYXJzZURCRjxEYmZTdHJlZXQ+KFxuICAgIHppcC5nZXRFbnRyeShkYmZFbnRyeU5hbWUpLmdldERhdGEoKSxcbiAgICBcIndpbjEyNTBcIlxuICApO1xuXG4gIGNvbnN0IHNocEVudHJ5TmFtZSA9IGAke2ZvbGRlck5hbWV9JHtvcHRpb25zLnBvbHlnb25TaHBGaWxlTmFtZX1gO1xuICBjb25zdCBwb2x5Z29uRGF0YSA9IGNvbnZlcnRTaHBUb0dlb0pzb24oemlwLmdldEVudHJ5KHNocEVudHJ5TmFtZSkuZ2V0RGF0YSgpKTtcblxuICBjb25zdCBkaXN0cmljdFNocEVudHJ5TmFtZSA9IGAke2ZvbGRlck5hbWV9JHtvcHRpb25zLmRpc3RyaWN0UG9seWdvblNocEZpbGVOYW1lfWA7XG4gIGNvbnN0IGRpc3RyaWN0U2hwRW50cnkgPSB6aXAuZ2V0RW50cnkoZGlzdHJpY3RTaHBFbnRyeU5hbWUpO1xuXG4gIGxldCBkaXN0cmljdHNQb2x5Z29uRGF0YTogRmVhdHVyZUNvbGxlY3Rpb24gPSB1bmRlZmluZWQ7XG4gIGlmIChkaXN0cmljdFNocEVudHJ5ICE9PSBudWxsKSB7XG4gICAgY29uc3QgZGlzdHJpY3REYmZFbnRyeU5hbWUgPSBgJHtmb2xkZXJOYW1lfSR7b3B0aW9ucy5kaXN0cmljdFBvbHlnb25EYmZGaWxlTmFtZX1gO1xuICAgIGRpc3RyaWN0c1BvbHlnb25EYXRhID0gY29udmVydFNocFRvR2VvSnNvbihcbiAgICAgIGRpc3RyaWN0U2hwRW50cnkuZ2V0RGF0YSgpLFxuICAgICAgemlwLmdldEVudHJ5KGRpc3RyaWN0RGJmRW50cnlOYW1lKS5nZXREYXRhKClcbiAgICApO1xuICB9XG5cbiAgcm1TeW5jKHppcEZpbGVQYXRoKTtcbiAgcmV0dXJuIHsgc3RyZWV0RGF0YSwgcG9seWdvbkRhdGEsIGRpc3RyaWN0c1BvbHlnb25EYXRhLCBjaXR5Q29kZSB9O1xufTtcblxuY29uc3QgY29udmVydFNocFRvR2VvSnNvbiA9IChcbiAgc2hwQnVmZmVyOiBCdWZmZXIsXG4gIGRiZkJ1ZmZlcj86IEJ1ZmZlclxuKTogRmVhdHVyZUNvbGxlY3Rpb24gPT4ge1xuICBjb25zdCBzaHAgPSBuZXcgU2hwVG9HZW9Kc29uKHtcbiAgICBhcnJheWJ1ZmZlcnM6IHtcbiAgICAgIHNocEJ1ZmZlcixcbiAgICAgIC4uLihkYmZCdWZmZXIgPyB7IGRiZkJ1ZmZlciB9IDoge30pLFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCBnZW9Kc29uID0gc2hwLmdldEdlb0pzb24oKTtcbiAgZGVsZXRlIGdlb0pzb24uYmJveDtcblxuICBjb29yZEVhY2goZ2VvSnNvbiBhcyBhbnksIChjdXJyZW50Q29vcmQpID0+IHtcbiAgICBjb25zdCBbeSwgeF0gPSBjdXJyZW50Q29vcmQ7XG4gICAgY29uc3QgeyBsYXQsIGxvbiB9ID0ganRzazJ3Z3M4NCgteCwgLXkpO1xuICAgIGN1cnJlbnRDb29yZFswXSA9IGxvbjtcbiAgICBjdXJyZW50Q29vcmRbMV0gPSBsYXQ7XG4gIH0pO1xuXG4gIHJldHVybiBnZW9Kc29uIGFzIEZlYXR1cmVDb2xsZWN0aW9uO1xufTtcblxuY29uc3QgaW1wb3J0RGF0YVRvRGIgPSBhc3luYyAoe1xuICBzdHJlZXREYXRhLFxuICBjaXR5Q29kZSxcbiAgcG9seWdvbkRhdGEsXG4gIGRpc3RyaWN0c1BvbHlnb25EYXRhLFxufToge1xuICBzdHJlZXREYXRhOiBEYmZTdHJlZXRbXTtcbiAgY2l0eUNvZGU6IHN0cmluZztcbiAgcG9seWdvbkRhdGE6IEZlYXR1cmVDb2xsZWN0aW9uO1xuICBkaXN0cmljdHNQb2x5Z29uRGF0YT86IEZlYXR1cmVDb2xsZWN0aW9uO1xufSkgPT4ge1xuICBpZiAoc3RyZWV0RGF0YS5sZW5ndGggPiAwKSB7XG4gICAgYXdhaXQgaW5zZXJ0U3RyZWV0c0Zyb21EYmYoc3RyZWV0RGF0YSk7XG4gIH1cbiAgYXdhaXQgc2V0Q2l0eVBvbHlnb25HZW9qc29uKGNpdHlDb2RlLCBwb2x5Z29uRGF0YSwgZGlzdHJpY3RzUG9seWdvbkRhdGEpO1xufTtcblxuY29uc3QgYXR0ZW1wdHMgPSA1O1xuXG5leHBvcnQgY29uc3QgZG93bmxvYWRBbmRJbXBvcnRTdHJlZXRzID0gYXN5bmMgKFxuICBvcHRpb25zOiBPcGVuRGF0YVN5bmNPcHRpb25zUGFydGlhbCA9IHt9LFxuICBub0NhY2hlOiBib29sZWFuID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBydW5TeW5jUGFydChTeW5jUGFydC5TdHJlZXRzLCBbU3luY1BhcnQuQWRkcmVzc1BvaW50c10sIGFzeW5jICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiU3RhcnRpbmcgdG8gZG93bmxvYWQgYW5kIGltcG9ydCBzdHJlZXRzLiBUaGlzIHRha2VzIHVwIHRvIDEgaG91ci5cIlxuICAgICk7XG5cbiAgICBjb25zdCBjb21wbGV0ZU9wdGlvbnMgPSBwcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBwcmVwYXJlRm9sZGVycyhjb21wbGV0ZU9wdGlvbnMpO1xuXG4gICAgLy8gQ2xlYXIgc3RyZWV0IHN5bmMgdGFibGUgaWYgbm8tY2FjaGUgZmxhZyBpcyBzZXRcbiAgICBpZiAobm9DYWNoZSkge1xuICAgICAgY29uc29sZS5sb2coXCJDbGVhcmluZyBzdHJlZXQgc3luYyBjYWNoZS4uLlwiKTtcbiAgICAgIGF3YWl0IGNsZWFyU3RyZWV0U3luY1RhYmxlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsRGF0YXNldEZlZWRMaW5rcyA9IGF3YWl0IGdldEFsbFVybHNGcm9tQXRvbUZlZWQoXG4gICAgICBjb21wbGV0ZU9wdGlvbnMuc3RyZWV0c0F0b21VcmxcbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coYFRvdGFsIG9mICR7YWxsRGF0YXNldEZlZWRMaW5rcy5sZW5ndGh9IGxpbmtzIHRvIFpJUCBmaWxlcy5gKTtcblxuICAgIGNvbnN0IHN5bmNlZFN0cmVldExpbmtzID0gYXdhaXQgZ2V0QWxsU3luY2VkU3RyZWV0cygpO1xuXG4gICAgY29uc3QgdG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgLy8gcmVtb3ZlIGFsbCBkZXByZWNhdGVkIGxpbmtzIChub3QgaW4gdGhlIG5ldyBsaXN0KVxuICAgIHN5bmNlZFN0cmVldExpbmtzLmZvckVhY2goKGxpbmspID0+IHtcbiAgICAgIGlmICghYWxsRGF0YXNldEZlZWRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICB0b0RlbGV0ZS5wdXNoKGxpbmspO1xuICAgICAgICBkZWxldGUgc3luY2VkU3RyZWV0TGlua3NbbGlua107XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCBkZWxldGVTdHJlZXRzKHRvRGVsZXRlKTtcblxuICAgIGxldCBkb25lID0gc3luY2VkU3RyZWV0TGlua3Muc2l6ZTtcbiAgICBjb25zb2xlLmxvZyhgVG90YWwgb2YgJHtkb25lfSBsaW5rcyB0byBaSVAgZmlsZXMgYWxyZWFkeSBzdG9yZWQuYCk7XG5cbiAgICAvLyBnZXQgYWxsIGxpbmtzIG5vdCB5ZXQgc3RvcmVkXG4gICAgY29uc3QgbmV3TGlua3MgPSBhbGxEYXRhc2V0RmVlZExpbmtzLmZpbHRlcihcbiAgICAgIChsaW5rKSA9PiAhc3luY2VkU3RyZWV0TGlua3MuaGFzKGxpbmspXG4gICAgKTtcblxuICAgIGxldCBkZWxheSA9IDA7XG4gICAgY29uc29sZS5sb2coYExvYWRpbmcgJHtuZXdMaW5rcy5sZW5ndGh9IG5ldyBsaW5rcyB0byBaSVAgZmlsZXMuYCk7XG4gICAgZm9yIChjb25zdCBsaW5rIG9mIG5ld0xpbmtzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGVtcHRzOyBpKyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB6aXBMaW5rID0gYXdhaXQgZ2V0TGF0ZXN0VXJsRnJvbUF0b21GZWVkKGxpbmspO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkb3dubG9hZFppcEFuZFBhcnNlRmlsZXMoXG4gICAgICAgICAgICB6aXBMaW5rLFxuICAgICAgICAgICAgZG9uZSxcbiAgICAgICAgICAgIGNvbXBsZXRlT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RGF0YVRvRGIoZGF0YSk7XG4gICAgICAgICAgYXdhaXQgc2V0U3RyZWV0QXNTeW5jZWQobGluayk7XG5cbiAgICAgICAgICBkb25lKys7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRlZCBsaW5rczogJHtkb25lfS8ke2FsbERhdGFzZXRGZWVkTGlua3MubGVuZ3RofWApO1xuICAgICAgICAgIGF3YWl0IHdhaXQoZGVsYXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChpIDwgYXR0ZW1wdHMgLSAxKSB7XG4gICAgICAgICAgICBkZWxheSArPSAxMDA7IC8vIGlmIGVycm9yIG9jY3VyZWQsIGl0IGlzIGxpa2VseSB0byByZXBlYXQgc28gd2Ugd2FpdCBhIGJpdCBsb25nZXJcbiAgICAgICAgICAgIGNvbnN0IHdhaXRUaW1lID0gKGkgKyAxKSAqIDM7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRXJyb3IgY29ubmVjdGluZyB0byBDVVpLIHNlcnZlcnMsIHJldHJ5aW5nIGluICR7d2FpdFRpbWV9IHNlY29uZHMuLi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgYXdhaXQgd2FpdCh3YWl0VGltZSAqIDEwMDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3Qgd2FpdCA9IGFzeW5jIChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59O1xuIl19
@@ -1 +1 @@
1
- export function districtsToCsvRules(districts: any, includeDistrictName?: boolean): string;
1
+ export function districtsToCsvRules(districts: any, includeDistrictName?: boolean): string;