text-to-map 1.1.43 → 1.1.44

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.
@@ -1,13 +1,13 @@
1
1
  import { clearDb, disconnectKnex } from "../db/db";
2
- import { deleteSchoolsXmlFile } from "../open-data-sync/schools";
2
+ import { deleteSchoolsJsonldFile } from "../open-data-sync/schools";
3
3
  import { defaultBinOptions } from "./constants";
4
4
  async function main() {
5
5
  console.log("Clearing all data...");
6
6
  await clearDb();
7
7
  console.log("DB cleared. Now deleting schools XML file...");
8
- deleteSchoolsXmlFile(defaultBinOptions);
8
+ deleteSchoolsJsonldFile(defaultBinOptions);
9
9
  await disconnectKnex();
10
10
  console.log("Everything cleared, ready for a new sync.");
11
11
  }
12
12
  main();
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXItYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9jbGVhci1hbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWhELEtBQUssVUFBVSxJQUFJO0lBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNwQyxNQUFNLE9BQU8sRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUM1RCxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sY0FBYyxFQUFFLENBQUM7SUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsZWFyRGIsIGRpc2Nvbm5lY3RLbmV4IH0gZnJvbSBcIi4uL2RiL2RiXCI7XHJcbmltcG9ydCB7IGRlbGV0ZVNjaG9vbHNYbWxGaWxlIH0gZnJvbSBcIi4uL29wZW4tZGF0YS1zeW5jL3NjaG9vbHNcIjtcclxuaW1wb3J0IHsgZGVmYXVsdEJpbk9wdGlvbnMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XHJcbiAgY29uc29sZS5sb2coXCJDbGVhcmluZyBhbGwgZGF0YS4uLlwiKTtcclxuICBhd2FpdCBjbGVhckRiKCk7XHJcbiAgY29uc29sZS5sb2coXCJEQiBjbGVhcmVkLiBOb3cgZGVsZXRpbmcgc2Nob29scyBYTUwgZmlsZS4uLlwiKTtcclxuICBkZWxldGVTY2hvb2xzWG1sRmlsZShkZWZhdWx0QmluT3B0aW9ucyk7XHJcbiAgYXdhaXQgZGlzY29ubmVjdEtuZXgoKTtcclxuICBjb25zb2xlLmxvZyhcIkV2ZXJ5dGhpbmcgY2xlYXJlZCwgcmVhZHkgZm9yIGEgbmV3IHN5bmMuXCIpO1xyXG59XHJcblxyXG5tYWluKCk7XHJcbiJdfQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXItYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi9jbGVhci1hbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWhELEtBQUssVUFBVSxJQUFJO0lBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNwQyxNQUFNLE9BQU8sRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUM1RCx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sY0FBYyxFQUFFLENBQUM7SUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsZWFyRGIsIGRpc2Nvbm5lY3RLbmV4IH0gZnJvbSBcIi4uL2RiL2RiXCI7XHJcbmltcG9ydCB7IGRlbGV0ZVNjaG9vbHNKc29ubGRGaWxlIH0gZnJvbSBcIi4uL29wZW4tZGF0YS1zeW5jL3NjaG9vbHNcIjtcclxuaW1wb3J0IHsgZGVmYXVsdEJpbk9wdGlvbnMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XHJcbiAgY29uc29sZS5sb2coXCJDbGVhcmluZyBhbGwgZGF0YS4uLlwiKTtcclxuICBhd2FpdCBjbGVhckRiKCk7XHJcbiAgY29uc29sZS5sb2coXCJEQiBjbGVhcmVkLiBOb3cgZGVsZXRpbmcgc2Nob29scyBYTUwgZmlsZS4uLlwiKTtcclxuICBkZWxldGVTY2hvb2xzSnNvbmxkRmlsZShkZWZhdWx0QmluT3B0aW9ucyk7XHJcbiAgYXdhaXQgZGlzY29ubmVjdEtuZXgoKTtcclxuICBjb25zb2xlLmxvZyhcIkV2ZXJ5dGhpbmcgY2xlYXJlZCwgcmVhZHkgZm9yIGEgbmV3IHN5bmMuXCIpO1xyXG59XHJcblxyXG5tYWluKCk7XHJcbiJdfQ==
@@ -1,26 +1,18 @@
1
1
  import { wholeLineError } from "../street-markdown/smd";
2
2
  import { findClosestString } from "../utils/helpers";
3
3
  import { getKnexDb, insertMultipleRows } from "./db";
4
+ const BATCH_SIZE = 500;
4
5
  export const insertSchools = async (schools) => {
5
6
  const knex = getKnexDb();
6
7
  const uniqueSchools = filterOutDuplicates(schools);
7
- const existingIzo = (await knex.select("izo").from("school")).map((row) => row.izo);
8
- const schoolsWithoutLocationIzos = (await knex("school")
8
+ // Fetch all existing schools with their current location in one query
9
+ const existing = await knex("school")
9
10
  .leftJoin("school_location", "school.izo", "school_location.school_izo")
10
- .whereNull("school_location.school_izo")
11
- .select("school.izo")).map((row) => row.izo);
12
- const toInsert = uniqueSchools.filter((school) => !existingIzo.includes(school.izo));
13
- const toUpdate = uniqueSchools.filter((school) => existingIzo.includes(school.izo));
14
- const toInsertLocation = [
15
- ...toInsert,
16
- ...toUpdate.filter((school) => schoolsWithoutLocationIzos.includes(school.izo)),
17
- ];
18
- for (const school of toUpdate) {
19
- await knex.from("school").where("izo", school.izo).update({
20
- name: school.name,
21
- capacity: school.capacity,
22
- });
23
- }
11
+ .select("school.izo", "school.name", "school.capacity", "school_location.address_point_id");
12
+ const existingMap = new Map(existing.map((r) => [r.izo, r]));
13
+ const toInsert = uniqueSchools.filter((s) => !existingMap.has(s.izo));
14
+ const toUpdate = uniqueSchools.filter((s) => existingMap.has(s.izo));
15
+ // --- Insert new schools ---
24
16
  const insertedSchools = await insertMultipleRows(toInsert.map((school) => [
25
17
  school.izo,
26
18
  school.redizo,
@@ -28,20 +20,44 @@ export const insertSchools = async (schools) => {
28
20
  school.capacity.toString(),
29
21
  school.type.toString(),
30
22
  ]), "school", ["izo", "redizo", "name", "capacity", "type"]);
31
- const locations = toInsertLocation
32
- .filter((school) => school.locations.length > 0)
33
- .map((school) => [
34
- school.izo,
35
- school.locations[0].addressPointId.toString(), // add only first location
36
- ]);
23
+ // --- Update existing schools (name + capacity) in batches ---
24
+ const toUpdateFields = toUpdate.filter((s) => {
25
+ const row = existingMap.get(s.izo);
26
+ return row.name !== s.name || Number(row.capacity) !== s.capacity;
27
+ });
28
+ for (let i = 0; i < toUpdateFields.length; i += BATCH_SIZE) {
29
+ const batch = toUpdateFields.slice(i, i + BATCH_SIZE);
30
+ await Promise.all(batch.map((s) => knex("school").where("izo", s.izo).update({ name: s.name, capacity: s.capacity })));
31
+ }
32
+ // --- Handle locations ---
33
+ // New schools and existing schools without any location need an insert
34
+ const toInsertLocation = [
35
+ ...toInsert,
36
+ ...toUpdate.filter((s) => existingMap.get(s.izo).address_point_id === null),
37
+ ].filter((s) => s.locations.length > 0);
38
+ // Existing schools whose first location changed need a delete + insert
39
+ // Guard against reordering: only update if the old RUIAN is gone entirely from the new locations
40
+ const toUpdateLocation = toUpdate.filter((s) => {
41
+ const row = existingMap.get(s.izo);
42
+ const newRuians = s.locations.map((l) => l.addressPointId);
43
+ return (row.address_point_id !== null &&
44
+ newRuians.length > 0 &&
45
+ !newRuians.includes(row.address_point_id));
46
+ });
47
+ // Delete outdated locations in batches
48
+ for (let i = 0; i < toUpdateLocation.length; i += BATCH_SIZE) {
49
+ const batch = toUpdateLocation.slice(i, i + BATCH_SIZE);
50
+ await knex("school_location")
51
+ .whereIn("school_izo", batch.map((s) => s.izo))
52
+ .delete();
53
+ }
37
54
  let insertedLocations = 0;
38
- // plus filter out duplicate locations (same address id + izo)
39
- for (const location of locations) {
55
+ for (const school of [...toInsertLocation, ...toUpdateLocation]) {
40
56
  try {
41
- insertedLocations += await insertMultipleRows([location], "school_location", ["school_izo", "address_point_id"], true);
57
+ insertedLocations += await insertMultipleRows([[school.izo, school.locations[0].addressPointId.toString()]], "school_location", ["school_izo", "address_point_id"], true);
42
58
  }
43
59
  catch (error) {
44
- console.log(`Cannot add location with RUIAN code ${location[1]} (school IZO = ${location[0]}): code does not exist.`);
60
+ console.log(`Cannot add location with RUIAN code ${school.locations[0].addressPointId} (school IZO = ${school.izo}): code does not exist.`);
45
61
  }
46
62
  }
47
63
  return insertedSchools + insertedLocations;
@@ -76,4 +92,4 @@ const filterOutDuplicates = (schools) => {
76
92
  return !duplicate;
77
93
  });
78
94
  };
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi9zY2hvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsT0FBaUIsRUFBbUIsRUFBRTtJQUN4RSxNQUFNLElBQUksR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUV6QixNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQy9ELENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNqQixDQUFDO0lBQ0YsTUFBTSwwQkFBMEIsR0FBRyxDQUNqQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDakIsUUFBUSxDQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSw0QkFBNEIsQ0FBQztTQUN2RSxTQUFTLENBQUMsNEJBQTRCLENBQUM7U0FDdkMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUN4QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXhCLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ25DLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUM5QyxDQUFD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QztRQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2hvbGVMaW5lRXJyb3IgfSBmcm9tIFwiLi4vc3RyZWV0LW1hcmtkb3duL3NtZFwiO1xyXG5pbXBvcnQgeyBTbWRFcnJvciB9IGZyb20gXCIuLi9zdHJlZXQtbWFya2Rvd24vdHlwZXNcIjtcclxuaW1wb3J0IHsgZmluZENsb3Nlc3RTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHMvaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBnZXRLbmV4RGIsIGluc2VydE11bHRpcGxlUm93cyB9IGZyb20gXCIuL2RiXCI7XHJcbmltcG9ydCB7IFNjaG9vbCB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0U2Nob29scyA9IGFzeW5jIChzY2hvb2xzOiBTY2hvb2xbXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgY29uc3Qga25leCA9IGdldEtuZXhEYigpO1xyXG5cclxuICBjb25zdCB1bmlxdWVTY2hvb2xzID0gZmlsdGVyT3V0RHVwbGljYXRlcyhzY2hvb2xzKTtcclxuICBjb25zdCBleGlzdGluZ0l6byA9IChhd2FpdCBrbmV4LnNlbGVjdChcIml6b1wiKS5mcm9tKFwic2Nob29sXCIpKS5tYXAoXHJcbiAgICAocm93KSA9PiByb3cuaXpvXHJcbiAgKTtcclxuICBjb25zdCBzY2hvb2xzV2l0aG91dExvY2F0aW9uSXpvcyA9IChcclxuICAgIGF3YWl0IGtuZXgoXCJzY2hvb2xcIilcclxuICAgICAgLmxlZnRKb2luKFwic2Nob29sX2xvY2F0aW9uXCIsIFwic2Nob29sLml6b1wiLCBcInNjaG9vbF9sb2NhdGlvbi5zY2hvb2xfaXpvXCIpXHJcbiAgICAgIC53aGVyZU51bGwoXCJzY2hvb2xfbG9jYXRpb24uc2Nob29sX2l6b1wiKVxyXG4gICAgICAuc2VsZWN0KFwic2Nob29sLml6b1wiKVxyXG4gICkubWFwKChyb3cpID0+IHJvdy5pem8pO1xyXG5cclxuICBjb25zdCB0b0luc2VydCA9IHVuaXF1ZVNjaG9vbHMuZmlsdGVyKFxyXG4gICAgKHNjaG9vbCkgPT4gIWV4aXN0aW5nSXpvLmluY2x1ZGVzKHNjaG9vbC5pem8pXHJcbiAgKTtcclxuICBjb25zdCB0b1VwZGF0ZSA9IHVuaXF1ZVNjaG9vbHMuZmlsdGVyKChzY2hvb2wpID0+XHJcbiAgICBleGlzdGluZ0l6by5pbmNsdWRlcyhzY2hvb2wuaXpvKVxyXG4gICk7XHJcbiAgY29uc3QgdG9JbnNlcnRMb2NhdGlvbiA9IFtcclxuICAgIC4uLnRvSW5zZXJ0LFxyXG4gICAgLi4udG9VcGRhdGUuZmlsdGVyKChzY2hvb2wpID0+XHJcbiAgICAgIHNjaG9vbHNXaXRob3V0TG9jYXRpb25Jem9zLmluY2x1ZGVzKHNjaG9vbC5pem8pXHJcbiAgICApLFxyXG4gIF07XHJcblxyXG4gIGZvciAoY29uc3Qgc2Nob29sIG9mIHRvVXBkYXRlKSB7XHJcbiAgICBhd2FpdCBrbmV4LmZyb20oXCJzY2hvb2xcIikud2hlcmUoXCJpem9cIiwgc2Nob29sLml6bykudXBkYXRlKHtcclxuICAgICAgbmFtZTogc2Nob29sLm5hbWUsXHJcbiAgICAgIGNhcGFjaXR5OiBzY2hvb2wuY2FwYWNpdHksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGluc2VydGVkU2Nob29scyA9IGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIHRvSW5zZXJ0Lm1hcCgoc2Nob29sKSA9PiBbXHJcbiAgICAgIHNjaG9vbC5pem8sXHJcbiAgICAgIHNjaG9vbC5yZWRpem8sXHJcbiAgICAgIHNjaG9vbC5uYW1lLFxyXG4gICAgICBzY2hvb2wuY2FwYWNpdHkudG9TdHJpbmcoKSxcclxuICAgICAgc2Nob29sLnR5cGUudG9TdHJpbmcoKSxcclxuICAgIF0pLFxyXG4gICAgXCJzY2hvb2xcIixcclxuICAgIFtcIml6b1wiLCBcInJlZGl6b1wiLCBcIm5hbWVcIiwgXCJjYXBhY2l0eVwiLCBcInR5cGVcIl1cclxuICApO1xyXG5cclxuICBjb25zdCBsb2NhdGlvbnMgPSB0b0luc2VydExvY2F0aW9uXHJcbiAgICAuZmlsdGVyKChzY2hvb2wpID0+IHNjaG9vbC5sb2NhdGlvbnMubGVuZ3RoID4gMClcclxuICAgIC5tYXAoKHNjaG9vbCkgPT4gW1xyXG4gICAgICBzY2hvb2wuaXpvLFxyXG4gICAgICBzY2hvb2wubG9jYXRpb25zWzBdLmFkZHJlc3NQb2ludElkLnRvU3RyaW5nKCksIC8vIGFkZCBvbmx5IGZpcnN0IGxvY2F0aW9uXHJcbiAgICBdKTtcclxuXHJcbiAgbGV0IGluc2VydGVkTG9jYXRpb25zID0gMDtcclxuXHJcbiAgLy8gcGx1cyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZSBsb2NhdGlvbnMgKHNhbWUgYWRkcmVzcyBpZCArIGl6bylcclxuICBmb3IgKGNvbnN0IGxvY2F0aW9uIG9mIGxvY2F0aW9ucykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaW5zZXJ0ZWRMb2NhdGlvbnMgKz0gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgICAgIFtsb2NhdGlvbl0sXHJcbiAgICAgICAgXCJzY2hvb2xfbG9jYXRpb25cIixcclxuICAgICAgICBbXCJzY2hvb2xfaXpvXCIsIFwiYWRkcmVzc19wb2ludF9pZFwiXSxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBgQ2Fubm90IGFkZCBsb2NhdGlvbiB3aXRoIFJVSUFOIGNvZGUgJHtsb2NhdGlvblsxXX0gKHNjaG9vbCBJWk8gPSAke2xvY2F0aW9uWzBdfSk6IGNvZGUgZG9lcyBub3QgZXhpc3QuYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGluc2VydGVkU2Nob29scyArIGluc2VydGVkTG9jYXRpb25zO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGZpbmRTY2hvb2wgPSAoXHJcbiAgbmFtZTogc3RyaW5nLFxyXG4gIHNjaG9vbHM6IFNjaG9vbFtdLFxyXG4gIG1heERpc3RhbmNlPzogbnVtYmVyXHJcbik6IHsgc2Nob29sOiBTY2hvb2wgfCBudWxsOyBlcnJvcnM6IFNtZEVycm9yW10gfSA9PiB7XHJcbiAgaWYgKHNjaG9vbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzY2hvb2w6IG51bGwsXHJcbiAgICAgIGVycm9yczogW3dob2xlTGluZUVycm9yKFwiQWt0dcOhbG7DrSB6xZlpem92YXRlbCBuZW3DoSDFvsOhZG7DqSDFoWtvbHkuXCIsIG5hbWUpXSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBlcnJvcnM6IFNtZEVycm9yW10gPSBbXTtcclxuXHJcbiAgY29uc3QgZXhhY3RTY2hvb2wgPSBzY2hvb2xzLmZpbmQoKHNjaG9vbCkgPT4gc2Nob29sLm5hbWUgPT09IG5hbWUpO1xyXG4gIGlmIChleGFjdFNjaG9vbCkge1xyXG4gICAgcmV0dXJuIHsgc2Nob29sOiBleGFjdFNjaG9vbCwgZXJyb3JzIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBuYW1lc0xpc3QgPSBzY2hvb2xzLm1hcCgoc2Nob29sKSA9PiBzY2hvb2wubmFtZSk7XHJcbiAgY29uc3QgYmVzdE1hdGNoID0gZmluZENsb3Nlc3RTdHJpbmcobmFtZSwgbmFtZXNMaXN0LCBtYXhEaXN0YW5jZSk7XHJcbiAgaWYgKGJlc3RNYXRjaCA9PT0gbnVsbCkge1xyXG4gICAgZXJyb3JzLnB1c2god2hvbGVMaW5lRXJyb3IoYMWga29sYSBzIG7DoXp2ZW0gJyR7bmFtZX0nIG5lZXhpc3R1amUuYCwgbmFtZSkpO1xyXG4gICAgcmV0dXJuIHsgc2Nob29sOiBudWxsLCBlcnJvcnMgfTtcclxuICB9XHJcbiAgY29uc3QgY2xvc2VzdFNjaG9vbCA9IHNjaG9vbHMuZmluZCgoc2Nob29sKSA9PiBiZXN0TWF0Y2ggPT09IHNjaG9vbC5uYW1lKTtcclxuXHJcbiAgZXJyb3JzLnB1c2goXHJcbiAgICB3aG9sZUxpbmVFcnJvcihcclxuICAgICAgYMWga29sYSBzIG7DoXp2ZW0gJyR7bmFtZX0nIG5lZXhpc3R1amUsIG15c2xlbGkganN0ZSAnJHtiZXN0TWF0Y2h9Jz9gLFxyXG4gICAgICBuYW1lXHJcbiAgICApXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHsgc2Nob29sOiBjbG9zZXN0U2Nob29sLCBlcnJvcnMgfTtcclxufTtcclxuXHJcbmNvbnN0IGZpbHRlck91dER1cGxpY2F0ZXMgPSAoc2Nob29sczogU2Nob29sW10pOiBTY2hvb2xbXSA9PiB7XHJcbiAgY29uc3QgaXpvU2V0ID0gbmV3IFNldCgpO1xyXG4gIHJldHVybiBzY2hvb2xzLmZpbHRlcigoc2Nob29sKSA9PiB7XHJcbiAgICBjb25zdCBkdXBsaWNhdGUgPSBpem9TZXQuaGFzKHNjaG9vbC5pem8pO1xyXG4gICAgaXpvU2V0LmFkZChzY2hvb2wuaXpvKTtcclxuICAgIHJldHVybiAhZHVwbGljYXRlO1xyXG4gIH0pO1xyXG59O1xyXG4iXX0=
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi9zY2hvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUV2QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLE9BQWlCLEVBQW1CLEVBQUU7SUFDeEUsTUFBTSxJQUFJLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFFekIsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFbkQsc0VBQXNFO0lBQ3RFLE1BQU0sUUFBUSxHQUNaLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNqQixRQUFRLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLDRCQUE0QixDQUFDO1NBQ3ZFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGtDQUFrQyxDQUFDLENBQUM7SUFFaEcsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3RCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMs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RUYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE9BQWlCLEVBQVksRUFBRTtJQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQy9CLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB3aG9sZUxpbmVFcnJvciB9IGZyb20gXCIuLi9zdHJlZXQtbWFya2Rvd24vc21kXCI7XHJcbmltcG9ydCB7IFNtZEVycm9yIH0gZnJvbSBcIi4uL3N0cmVldC1tYXJrZG93bi90eXBlc1wiO1xyXG5pbXBvcnQgeyBmaW5kQ2xvc2VzdFN0cmluZyB9IGZyb20gXCIuLi91dGlscy9oZWxwZXJzXCI7XHJcbmltcG9ydCB7IGdldEtuZXhEYiwgaW5zZXJ0TXVsdGlwbGVSb3dzIH0gZnJvbSBcIi4vZGJcIjtcclxuaW1wb3J0IHsgU2Nob29sIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmNvbnN0IEJBVENIX1NJWkUgPSA1MDA7XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0U2Nob29scyA9IGFzeW5jIChzY2hvb2xzOiBTY2hvb2xbXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgY29uc3Qga25leCA9IGdldEtuZXhEYigpO1xyXG5cclxuICBjb25zdCB1bmlxdWVTY2hvb2xzID0gZmlsdGVyT3V0RHVwbGljYXRlcyhzY2hvb2xzKTtcclxuXHJcbiAgLy8gRmV0Y2ggYWxsIGV4aXN0aW5nIHNjaG9vbHMgd2l0aCB0aGVpciBjdXJyZW50IGxvY2F0aW9uIGluIG9uZSBxdWVyeVxyXG4gIGNvbnN0IGV4aXN0aW5nOiB7IGl6bzogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGNhcGFjaXR5OiBudW1iZXI7IGFkZHJlc3NfcG9pbnRfaWQ6IG51bWJlciB8IG51bGwgfVtdID1cclxuICAgIGF3YWl0IGtuZXgoXCJzY2hvb2xcIilcclxuICAgICAgLmxlZnRKb2luKFwic2Nob29sX2xvY2F0aW9uXCIsIFwic2Nob29sLml6b1wiLCBcInNjaG9vbF9sb2NhdGlvbi5zY2hvb2xfaXpvXCIpXHJcbiAgICAgIC5zZWxlY3QoXCJzY2hvb2wuaXpvXCIsIFwic2Nob29sLm5hbWVcIiwgXCJzY2hvb2wuY2FwYWNpdHlcIiwgXCJzY2hvb2xfbG9jYXRpb24uYWRkcmVzc19wb2ludF9pZFwiKTtcclxuXHJcbiAgY29uc3QgZXhpc3RpbmdNYXAgPSBuZXcgTWFwKGV4aXN0aW5nLm1hcCgocikgPT4gW3IuaXpvLCByXSkpO1xyXG5cclxuICBjb25zdCB0b0luc2VydCA9IHVuaXF1ZVNjaG9vbHMuZmlsdGVyKChzKSA9PiAhZXhpc3RpbmdNYXAuaGFzKHMuaXpvKSk7XHJcbiAgY29uc3QgdG9VcGRhdGUgPSB1bmlxdWVTY2hvb2xzLmZpbHRlcigocykgPT4gZXhpc3RpbmdNYXAuaGFzKHMuaXpvKSk7XHJcblxyXG4gIC8vIC0tLSBJbnNlcnQgbmV3IHNjaG9vbHMgLS0tXHJcbiAgY29uc3QgaW5zZXJ0ZWRTY2hvb2xzID0gYXdhaXQgaW5zZXJ0TXVsdGlwbGVSb3dzKFxyXG4gICAgdG9JbnNlcnQubWFwKChzY2hvb2wpID0+IFtcclxuICAgICAgc2Nob29sLml6byxcclxuICAgICAgc2Nob29sLnJlZGl6byxcclxuICAgICAgc2Nob29sLm5hbWUsXHJcbiAgICAgIHNjaG9vbC5jYXBhY2l0eS50b1N0cmluZygpLFxyXG4gICAgICBzY2hvb2wudHlwZS50b1N0cmluZygpLFxyXG4gICAgXSksXHJcbiAgICBcInNjaG9vbFwiLFxyXG4gICAgW1wiaXpvXCIsIFwicmVkaXpvXCIsIFwibmFtZVwiLCBcImNhcGFjaXR5XCIsIFwidHlwZVwiXVxyXG4gICk7XHJcblxyXG4gIC8vIC0tLSBVcGRhdGUgZXhpc3Rpbmcgc2Nob29scyAobmFtZSArIGNhcGFjaXR5KSBpbiBiYXRjaGVzIC0tLVxyXG4gIGNvbnN0IHRvVXBkYXRlRmllbGRzID0gdG9VcGRhdGUuZmlsdGVyKChzKSA9PiB7XHJcbiAgICBjb25zdCByb3cgPSBleGlzdGluZ01hcC5nZXQocy5pem8pO1xyXG4gICAgcmV0dXJuIHJvdy5uYW1lICE9PSBzLm5hbWUgfHwgTnVtYmVyKHJvdy5jYXBhY2l0eSkgIT09IHMuY2FwYWNpdHk7XHJcbiAgfSk7XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9VcGRhdGVGaWVsZHMubGVuZ3RoOyBpICs9IEJBVENIX1NJWkUpIHtcclxuICAgIGNvbnN0IGJhdGNoID0gdG9VcGRhdGVGaWVsZHMuc2xpY2UoaSwgaSArIEJBVENIX1NJWkUpO1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIGJhdGNoLm1hcCgocykgPT5cclxuICAgICAgICBrbmV4KFwic2Nob29sXCIpLndoZXJlKFwiaXpvXCIsIHMuaXpvKS51cGRhdGUoeyBuYW1lOiBzLm5hbWUsIGNhcGFjaXR5OiBzLmNhcGFjaXR5IH0pXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gSGFuZGxlIGxvY2F0aW9ucyAtLS1cclxuICAvLyBOZXcgc2Nob29scyBhbmQgZXhpc3Rpbmcgc2Nob29scyB3aXRob3V0IGFueSBsb2NhdGlvbiBuZWVkIGFuIGluc2VydFxyXG4gIGNvbnN0IHRvSW5zZXJ0TG9jYXRpb24gPSBbXHJcbiAgICAuLi50b0luc2VydCxcclxuICAgIC4uLnRvVXBkYXRlLmZpbHRlcigocykgPT4gZXhpc3RpbmdNYXAuZ2V0KHMuaXpvKS5hZGRyZXNzX3BvaW50X2lkID09PSBudWxsKSxcclxuICBdLmZpbHRlcigocykgPT4gcy5sb2NhdGlvbnMubGVuZ3RoID4gMCk7XHJcblxyXG4gIC8vIEV4aXN0aW5nIHNjaG9vbHMgd2hvc2UgZmlyc3QgbG9jYXRpb24gY2hhbmdlZCBuZWVkIGEgZGVsZXRlICsgaW5zZXJ0XHJcbiAgLy8gR3VhcmQgYWdhaW5zdCByZW9yZGVyaW5nOiBvbmx5IHVwZGF0ZSBpZiB0aGUgb2xkIFJVSUFOIGlzIGdvbmUgZW50aXJlbHkgZnJvbSB0aGUgbmV3IGxvY2F0aW9uc1xyXG4gIGNvbnN0IHRvVXBkYXRlTG9jYXRpb24gPSB0b1VwZGF0ZS5maWx0ZXIoKHMpID0+IHtcclxuICAgIGNvbnN0IHJvdyA9IGV4aXN0aW5nTWFwLmdldChzLml6byk7XHJcbiAgICBjb25zdCBuZXdSdWlhbnMgPSBzLmxvY2F0aW9ucy5tYXAoKGwpID0+IGwuYWRkcmVzc1BvaW50SWQpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgcm93LmFkZHJlc3NfcG9pbnRfaWQgIT09IG51bGwgJiZcclxuICAgICAgbmV3UnVpYW5zLmxlbmd0aCA+IDAgJiZcclxuICAgICAgIW5ld1J1aWFucy5pbmNsdWRlcyhyb3cuYWRkcmVzc19wb2ludF9pZClcclxuICAgICk7XHJcbiAgfSk7XHJcblxyXG4gIC8vIERlbGV0ZSBvdXRkYXRlZCBsb2NhdGlvbnMgaW4gYmF0Y2hlc1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9VcGRhdGVMb2NhdGlvbi5sZW5ndGg7IGkgKz0gQkFUQ0hfU0laRSkge1xyXG4gICAgY29uc3QgYmF0Y2ggPSB0b1VwZGF0ZUxvY2F0aW9uLnNsaWNlKGksIGkgKyBCQVRDSF9TSVpFKTtcclxuICAgIGF3YWl0IGtuZXgoXCJzY2hvb2xfbG9jYXRpb25cIilcclxuICAgICAgLndoZXJlSW4oXHJcbiAgICAgICAgXCJzY2hvb2xfaXpvXCIsXHJcbiAgICAgICAgYmF0Y2gubWFwKChzKSA9PiBzLml6bylcclxuICAgICAgKVxyXG4gICAgICAuZGVsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBsZXQgaW5zZXJ0ZWRMb2NhdGlvbnMgPSAwO1xyXG5cclxuICBmb3IgKGNvbnN0IHNjaG9vbCBvZiBbLi4udG9JbnNlcnRMb2NhdGlvbiwgLi4udG9VcGRhdGVMb2NhdGlvbl0pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGluc2VydGVkTG9jYXRpb25zICs9IGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgICAgICBbW3NjaG9vbC5pem8sIHNjaG9vbC5sb2NhdGlvbnNbMF0uYWRkcmVzc1BvaW50SWQudG9TdHJpbmcoKV1dLFxyXG4gICAgICAgIFwic2Nob29sX2xvY2F0aW9uXCIsXHJcbiAgICAgICAgW1wic2Nob29sX2l6b1wiLCBcImFkZHJlc3NfcG9pbnRfaWRcIl0sXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgYENhbm5vdCBhZGQgbG9jYXRpb24gd2l0aCBSVUlBTiBjb2RlICR7c2Nob29sLmxvY2F0aW9uc1swXS5hZGRyZXNzUG9pbnRJZH0gKHNjaG9vbCBJWk8gPSAke3NjaG9vbC5pem99KTogY29kZSBkb2VzIG5vdCBleGlzdC5gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaW5zZXJ0ZWRTY2hvb2xzICsgaW5zZXJ0ZWRMb2NhdGlvbnM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZmluZFNjaG9vbCA9IChcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgc2Nob29sczogU2Nob29sW10sXHJcbiAgbWF4RGlzdGFuY2U/OiBudW1iZXJcclxuKTogeyBzY2hvb2w6IFNjaG9vbCB8IG51bGw7IGVycm9yczogU21kRXJyb3JbXSB9ID0+IHtcclxuICBpZiAoc2Nob29scy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNjaG9vbDogbnVsbCxcclxuICAgICAgZXJyb3JzOiBbd2hvbGVMaW5lRXJyb3IoXCJBa3R1w6FsbsOtIHrFmWl6b3ZhdGVsIG5lbcOhIMW+w6FkbsOpIMWha29seS5cIiwgbmFtZSldLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGVycm9yczogU21kRXJyb3JbXSA9IFtdO1xyXG5cclxuICBjb25zdCBleGFjdFNjaG9vbCA9IHNjaG9vbHMuZmluZCgoc2Nob29sKSA9PiBzY2hvb2wubmFtZSA9PT0gbmFtZSk7XHJcbiAgaWYgKGV4YWN0U2Nob29sKSB7XHJcbiAgICByZXR1cm4geyBzY2hvb2w6IGV4YWN0U2Nob29sLCBlcnJvcnMgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5hbWVzTGlzdCA9IHNjaG9vbHMubWFwKChzY2hvb2wpID0+IHNjaG9vbC5uYW1lKTtcclxuICBjb25zdCBiZXN0TWF0Y2ggPSBmaW5kQ2xvc2VzdFN0cmluZyhuYW1lLCBuYW1lc0xpc3QsIG1heERpc3RhbmNlKTtcclxuICBpZiAoYmVzdE1hdGNoID09PSBudWxsKSB7XHJcbiAgICBlcnJvcnMucHVzaCh3aG9sZUxpbmVFcnJvcihgxaBrb2xhIHMgbsOhenZlbSAnJHtuYW1lfScgbmVleGlzdHVqZS5gLCBuYW1lKSk7XHJcbiAgICByZXR1cm4geyBzY2hvb2w6IG51bGwsIGVycm9ycyB9O1xyXG4gIH1cclxuICBjb25zdCBjbG9zZXN0U2Nob29sID0gc2Nob29scy5maW5kKChzY2hvb2wpID0+IGJlc3RNYXRjaCA9PT0gc2Nob29sLm5hbWUpO1xyXG5cclxuICBlcnJvcnMucHVzaChcclxuICAgIHdob2xlTGluZUVycm9yKFxyXG4gICAgICBgxaBrb2xhIHMgbsOhenZlbSAnJHtuYW1lfScgbmVleGlzdHVqZSwgbXlzbGVsaSBqc3RlICcke2Jlc3RNYXRjaH0nP2AsXHJcbiAgICAgIG5hbWVcclxuICAgIClcclxuICApO1xyXG5cclxuICByZXR1cm4geyBzY2hvb2w6IGNsb3Nlc3RTY2hvb2wsIGVycm9ycyB9O1xyXG59O1xyXG5cclxuY29uc3QgZmlsdGVyT3V0RHVwbGljYXRlcyA9IChzY2hvb2xzOiBTY2hvb2xbXSk6IFNjaG9vbFtdID0+IHtcclxuICBjb25zdCBpem9TZXQgPSBuZXcgU2V0KCk7XHJcbiAgcmV0dXJuIHNjaG9vbHMuZmlsdGVyKChzY2hvb2wpID0+IHtcclxuICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGl6b1NldC5oYXMoc2Nob29sLml6byk7XHJcbiAgICBpem9TZXQuYWRkKHNjaG9vbC5pem8pO1xyXG4gICAgcmV0dXJuICFkdXBsaWNhdGU7XHJcbiAgfSk7XHJcbn07XHJcbiJdfQ==
@@ -1,3 +1,3 @@
1
1
  import { OpenDataSyncOptionsPartial } from "../utils/helpers";
2
2
  export declare const downloadAndImportSchools: (options?: OpenDataSyncOptionsPartial, saveFoundersToCsv?: boolean, saveSchoolsWithoutRuianToCsv?: boolean) => Promise<void>;
3
- export declare const deleteSchoolsXmlFile: (options?: OpenDataSyncOptionsPartial) => void;
3
+ export declare const deleteSchoolsJsonldFile: (options?: OpenDataSyncOptionsPartial) => void;
@@ -1,40 +1,28 @@
1
1
  import { createReadStream, createWriteStream, existsSync, rmSync } from "fs";
2
2
  import fetch from "node-fetch";
3
3
  import { join } from "path";
4
- import sax from "sax";
4
+ import parser from "stream-json";
5
+ import Pick from "stream-json/filters/Pick";
6
+ import StreamArray from "stream-json/streamers/StreamArray";
5
7
  import { pipeline } from "stream/promises";
6
8
  import { insertFounders } from "../db/founders";
7
9
  import { insertSchools } from "../db/schools";
10
+ import { getKnexDb } from "../db/db";
8
11
  import { MunicipalityType, SchoolType, SyncPart, } from "../db/types";
9
12
  import { prepareOptions, } from "../utils/helpers";
10
13
  import { runSyncPart } from "./common";
11
- const downloadXml = async (options) => {
12
- if (existsSync(getXmlFilePath(options))) {
14
+ const downloadJsonld = async (options) => {
15
+ if (existsSync(getJsonldFilePath(options))) {
13
16
  return;
14
17
  }
15
- console.log("Downloading a large XML file with school data...");
16
- const response = await fetch(options.schoolsXmlUrl);
18
+ console.log("Downloading a large JSON-LD file with school data...");
19
+ const response = await fetch(options.schoolsJsonldUrl);
17
20
  if (response.status !== 200) {
18
- throw new Error(`The XML file could not be downloaded. HTTP Code: ${response.status}`);
21
+ throw new Error(`The JSON-LD file could not be downloaded. HTTP Code: ${response.status}`);
19
22
  }
20
- await pipeline(response.body, createWriteStream(getXmlFilePath(options)));
23
+ await pipeline(response.body, createWriteStream(getJsonldFilePath(options)));
21
24
  console.log("Finished downloading.");
22
25
  };
23
- var XMLState;
24
- (function (XMLState) {
25
- XMLState[XMLState["None"] = 0] = "None";
26
- XMLState[XMLState["RedIzo"] = 1] = "RedIzo";
27
- XMLState[XMLState["SchoolName"] = 2] = "SchoolName";
28
- XMLState[XMLState["Izo"] = 3] = "Izo";
29
- XMLState[XMLState["Ico"] = 4] = "Ico";
30
- XMLState[XMLState["SchoolType"] = 5] = "SchoolType";
31
- XMLState[XMLState["Capacity"] = 6] = "Capacity";
32
- XMLState[XMLState["RuianCode"] = 7] = "RuianCode";
33
- XMLState[XMLState["Address"] = 8] = "Address";
34
- XMLState[XMLState["FounderName"] = 9] = "FounderName";
35
- XMLState[XMLState["FounderType"] = 10] = "FounderType";
36
- XMLState[XMLState["FounderIco"] = 11] = "FounderIco";
37
- })(XMLState || (XMLState = {}));
38
26
  const SCHOOL_TYPE_KINDERGARTEN = "A00";
39
27
  const SCHOOL_TYPE_ELEMENTARY = "B00";
40
28
  const getCorrectFounderType = (founderType) => {
@@ -47,219 +35,97 @@ const getMunicipalityType = (founderType) => {
47
35
  ? MunicipalityType.District
48
36
  : MunicipalityType.Other;
49
37
  };
50
- const processSchoolRegisterXml = async (options) => {
51
- let currentSchools;
52
- let currentRedizo;
53
- let currentName;
54
- let currentIzo;
55
- let currentIco;
56
- let currentType = null;
57
- let currentCapacity;
58
- let currentLocations = [];
59
- let state = XMLState.None;
60
- let currentFounders = [];
61
- let currentFounderIco;
62
- let currentFounderName;
63
- let currentFounderType;
64
- let isRuianCodeSet = false;
65
- let isRuianCodeMissing = false;
66
- let currentAddress = [];
38
+ const processSchoolRegisterJsonld = async (options) => {
67
39
  const founders = new Map();
68
40
  const schools = [];
69
41
  const schoolsWithoutRuian = [];
70
- const streamPromise = new Promise((resolve, reject) => {
71
- const saxStream = sax
72
- .createStream(true)
73
- .on("opentag", (tag) => {
74
- switch (tag.name) {
75
- case "PravniSubjekt":
76
- currentSchools = [];
77
- currentRedizo = "";
78
- currentName = "";
79
- currentIzo = "";
80
- currentCapacity = 0;
81
- isRuianCodeMissing = false;
82
- break;
83
- case "RedIzo":
84
- state = XMLState.RedIzo;
85
- break;
86
- case "RedPlnyNazev":
87
- state = XMLState.SchoolName;
88
- break;
89
- case "IZO":
90
- state = XMLState.Izo;
91
- break;
92
- case "ICO":
93
- state = XMLState.Ico;
94
- break;
95
- case "SkolaDruhTyp":
96
- state = XMLState.SchoolType;
97
- break;
98
- case "SkolaKapacita":
99
- state = XMLState.Capacity;
100
- break;
101
- case "MistoRUAINKod":
102
- isRuianCodeSet = false;
103
- currentAddress = [];
104
- state = XMLState.RuianCode;
105
- break;
106
- case "ZrizNazev":
107
- state = XMLState.FounderName;
108
- break;
109
- case "ZrizPravniForma":
110
- state = XMLState.FounderType;
111
- break;
112
- case "MistoAdresa1":
113
- case "MistoAdresa2":
114
- case "MistoAdresa3":
115
- state = XMLState.Address;
116
- break;
117
- case "ZrizDatumNarozeni":
118
- case "ZrizICO":
119
- state = XMLState.FounderIco;
120
- break;
42
+ const stream = createReadStream(getJsonldFilePath(options))
43
+ .pipe(parser())
44
+ .pipe(new Pick({ filter: "list" }))
45
+ .pipe(new StreamArray());
46
+ for await (const { value: entity } of stream) {
47
+ const redizo = entity.redIzo ?? "";
48
+ const ico = entity.ico ?? "";
49
+ const entityName = entity.uplnyNazev ?? "";
50
+ const currentSchools = [];
51
+ for (const school of entity.skolyAZarizeni ?? []) {
52
+ const type = school.druh === SCHOOL_TYPE_KINDERGARTEN
53
+ ? SchoolType.Kindergarten
54
+ : school.druh === SCHOOL_TYPE_ELEMENTARY
55
+ ? SchoolType.Elementary
56
+ : null;
57
+ if (type === null)
58
+ continue;
59
+ const capacityEntry = school.kapacity?.find((k) => k.mernaJednotka === "01") ??
60
+ school.kapacity?.[0];
61
+ const capacity = capacityEntry?.nejvyssiPovolenyPocet ?? 0;
62
+ const allPlaces = school.mistaVyuky ?? [];
63
+ const locationsWithRuian = allPlaces.filter((p) => p.adresa?.kodRUIAN != null);
64
+ // Prefer the main building (IDmista matches school IZO), fall back to first available
65
+ const mainPlace = locationsWithRuian.find((p) => p.IDmista === school.izo) ??
66
+ locationsWithRuian[0];
67
+ const locations = mainPlace
68
+ ? [{ addressPointId: mainPlace.adresa.kodRUIAN }]
69
+ : [];
70
+ if (!mainPlace && allPlaces.length > 0) {
71
+ const addr = allPlaces[0].adresa ?? {};
72
+ const addressParts = [
73
+ addr.ulice,
74
+ addr.cisloDomovni?.toString(),
75
+ addr.obec,
76
+ ].filter(Boolean);
77
+ schoolsWithoutRuian.push({ izo: school.izo, address: addressParts, type });
121
78
  }
122
- })
123
- .on("closetag", (tagName) => {
124
- switch (tagName) {
125
- case "PravniSubjekt":
126
- if (currentSchools.length > 0) {
127
- schools.push(...currentSchools);
128
- currentFounders.forEach((founder) => {
129
- const key = founder.name + founder.ico;
130
- if (founders.has(key)) {
131
- founders.get(key).schools.push(...currentSchools);
132
- }
133
- else {
134
- founders.set(key, {
135
- name: founder.name,
136
- ico: founder.ico,
137
- originalType: founder.type,
138
- municipalityType: getMunicipalityType(founder.type),
139
- schools: [...currentSchools],
140
- });
141
- }
142
- });
143
- }
144
- currentIco = "";
145
- currentFounders = [];
146
- break;
147
- case "Zrizovatel":
148
- if (currentFounderIco === "" || currentFounderName === "") {
149
- currentFounders.push({
150
- ico: currentIco,
151
- name: currentName,
152
- type: "224", // s.r.o (not all are those, but we don't need to differentiate here)
153
- });
154
- }
155
- else {
156
- currentFounders.push({
157
- ico: currentFounderIco,
158
- name: currentFounderName,
159
- type: getCorrectFounderType(currentFounderType),
160
- });
161
- }
162
- currentFounderIco = "";
163
- currentFounderName = "";
164
- currentFounderType = "";
165
- break;
166
- case "SkolaZarizeni":
167
- if (currentType !== null) {
168
- currentSchools.push({
169
- izo: currentIzo,
170
- name: currentName,
171
- redizo: currentRedizo,
172
- capacity: currentCapacity,
173
- type: currentType,
174
- locations: currentLocations,
175
- });
176
- }
177
- currentLocations = [];
178
- currentType = null;
179
- break;
180
- case "SkolaMistoVykonuCinnosti":
181
- if (isRuianCodeMissing) {
182
- schoolsWithoutRuian.push({
183
- izo: currentIzo,
184
- address: currentAddress,
185
- type: currentType,
186
- });
187
- }
188
- break;
189
- case "MistoRUAINKod":
190
- isRuianCodeMissing = !isRuianCodeSet;
191
- case "RedPlnyNazev":
192
- case "RedIzo":
193
- case "ICO":
194
- case "IZO":
195
- case "SkolaDruhTyp":
196
- case "SkolaKapacita":
197
- case "ZrizNazev":
198
- case "ZrizICO":
199
- case "ZrizDatumNarozeni":
200
- case "ZrizPravniForma":
201
- case "MistoAdresa1":
202
- case "MistoAdresa2":
203
- case "MistoAdresa3":
204
- state = XMLState.None;
205
- break;
79
+ currentSchools.push({
80
+ izo: school.izo,
81
+ name: entityName || school.uplnyNazev || "",
82
+ redizo,
83
+ capacity,
84
+ type,
85
+ locations,
86
+ });
87
+ }
88
+ schools.push(...currentSchools);
89
+ for (const z of entity.zrizovatele ?? []) {
90
+ let founderIco;
91
+ let founderName;
92
+ let founderType;
93
+ if (z.druhOsoby === "PO") {
94
+ founderIco = z.Ico ?? "";
95
+ founderName = z.nazevOsoby ?? "";
96
+ founderType = getCorrectFounderType(z.pravniForma ?? "");
97
+ }
98
+ else {
99
+ founderIco = z.datumNarozeni ?? "";
100
+ founderName = z.nazevOsoby ?? "";
101
+ founderType = getCorrectFounderType("");
102
+ }
103
+ if (founderIco === "" || founderName === "") {
104
+ founderIco = ico;
105
+ founderName = entityName;
106
+ founderType = "224";
206
107
  }
207
- })
208
- .on("text", (text) => {
209
- switch (state) {
210
- case XMLState.RedIzo:
211
- currentRedizo = text;
212
- case XMLState.SchoolName:
213
- currentName = text;
214
- break;
215
- case XMLState.Izo:
216
- currentIzo = text;
217
- break;
218
- case XMLState.Ico:
219
- currentIco = text;
220
- break;
221
- case XMLState.SchoolType:
222
- if (text === SCHOOL_TYPE_KINDERGARTEN) {
223
- currentType = SchoolType.Kindergarten;
224
- }
225
- else if (text === SCHOOL_TYPE_ELEMENTARY) {
226
- currentType = SchoolType.Elementary;
227
- }
228
- break;
229
- case XMLState.RuianCode:
230
- isRuianCodeSet = true;
231
- currentLocations.push({
232
- addressPointId: parseInt(text),
108
+ if (currentSchools.length > 0) {
109
+ const key = founderName + founderIco;
110
+ if (founders.has(key)) {
111
+ founders.get(key).schools.push(...currentSchools);
112
+ }
113
+ else {
114
+ founders.set(key, {
115
+ name: founderName,
116
+ ico: founderIco,
117
+ originalType: parseInt(founderType),
118
+ municipalityType: getMunicipalityType(founderType),
119
+ schools: [...currentSchools],
233
120
  });
234
- break;
235
- case XMLState.Address:
236
- currentAddress.push(text);
237
- break;
238
- case XMLState.FounderName:
239
- currentFounderName = text;
240
- break;
241
- case XMLState.FounderIco:
242
- currentFounderIco = text;
243
- break;
244
- case XMLState.FounderType:
245
- currentFounderType = text;
246
- break;
247
- case XMLState.Capacity:
248
- currentCapacity = parseInt(text);
249
- break;
121
+ }
250
122
  }
251
- })
252
- .on("error", reject)
253
- .on("end", resolve);
254
- // wanted to use 'await pipeline(createReadStream(getXmlFilePath(options)), saxStream)'
255
- // but the program would quit spontaneously after finishing stream - using Promise instead.
256
- createReadStream(getXmlFilePath(options)).pipe(saxStream);
257
- });
258
- await streamPromise;
123
+ }
124
+ }
259
125
  return { schools, founders, schoolsWithoutRuian };
260
126
  };
261
127
  const importDataToDb = async (options, saveFoundersToCsv = false, saveSchoolsWithoutRuianToCsv = false) => {
262
- const { schools, founders, schoolsWithoutRuian } = await processSchoolRegisterXml(options);
128
+ const { schools, founders, schoolsWithoutRuian } = await processSchoolRegisterJsonld(options);
263
129
  if (saveFoundersToCsv) {
264
130
  const csvFile = "founders.csv";
265
131
  if (existsSync(csvFile)) {
@@ -288,24 +154,54 @@ const importDataToDb = async (options, saveFoundersToCsv = false, saveSchoolsWit
288
154
  });
289
155
  csv.end();
290
156
  }
157
+ const knex = getKnexDb();
158
+ const schoolsBefore = (await knex("school").count("izo as count").first()).count;
159
+ const foundersBefore = (await knex("founder").count("id as count").first()).count;
160
+ // Compute change stats before inserting (uses same logic as insertSchools)
161
+ const existingSnap = await knex("school")
162
+ .leftJoin("school_location", "school.izo", "school_location.school_izo")
163
+ .select("school.izo", "school.name", "school.capacity", "school_location.address_point_id");
164
+ const existingSnapMap = new Map(existingSnap.map((r) => [r.izo, r]));
165
+ const statsFieldUpdates = schools.filter((s) => {
166
+ const row = existingSnapMap.get(s.izo);
167
+ return row && (row.name !== s.name || row.capacity !== s.capacity);
168
+ }).length;
169
+ const statsLocationUpdates = schools.filter((s) => {
170
+ const row = existingSnapMap.get(s.izo);
171
+ const newRuians = s.locations.map((l) => l.addressPointId);
172
+ return row && row.address_point_id !== null && newRuians.length > 0 && !newRuians.includes(row.address_point_id);
173
+ }).length;
291
174
  await insertSchools(schools);
292
175
  await insertFounders(Array.from(founders.values()));
176
+ const schoolsAfter = (await knex("school").count("izo as count").first()).count;
177
+ const foundersAfter = (await knex("founder").count("id as count").first()).count;
178
+ const kindergartens = schools.filter((s) => s.type === SchoolType.Kindergarten).length;
179
+ const elementary = schools.filter((s) => s.type === SchoolType.Elementary).length;
180
+ console.log(`\n=== School sync statistics ===`);
181
+ console.log(`Schools parsed: ${schools.length} (${kindergartens} kindergartens, ${elementary} elementary)`);
182
+ console.log(`Founders parsed: ${founders.size}`);
183
+ console.log(`New schools inserted: ${schoolsAfter - schoolsBefore}`);
184
+ console.log(`New founders inserted: ${foundersAfter - foundersBefore}`);
185
+ console.log(`Field updates: ${statsFieldUpdates} (name/capacity changed)`);
186
+ console.log(`Location updates: ${statsLocationUpdates} (first location changed)`);
187
+ console.log(`Total schools in DB: ${schoolsAfter}`);
188
+ console.log(`Total founders in DB: ${foundersAfter}`);
293
189
  };
294
- const getXmlFilePath = (options) => {
295
- return join(options.tmpDir, options.schoolsXmlFileName);
190
+ const getJsonldFilePath = (options) => {
191
+ return join(options.tmpDir, options.schoolsJsonldFileName);
296
192
  };
297
193
  export const downloadAndImportSchools = async (options = {}, saveFoundersToCsv = false, saveSchoolsWithoutRuianToCsv = false) => {
298
194
  await runSyncPart(SyncPart.Schools, [SyncPart.AddressPoints], async () => {
299
195
  const runOptions = prepareOptions(options);
300
- await downloadXml(runOptions);
196
+ await downloadJsonld(runOptions);
301
197
  await importDataToDb(runOptions, saveFoundersToCsv, saveSchoolsWithoutRuianToCsv);
302
- deleteSchoolsXmlFile(runOptions);
198
+ deleteSchoolsJsonldFile(runOptions);
303
199
  });
304
200
  };
305
- export const deleteSchoolsXmlFile = (options = {}) => {
201
+ export const deleteSchoolsJsonldFile = (options = {}) => {
306
202
  const runOptions = prepareOptions(options);
307
- if (existsSync(getXmlFilePath(runOptions))) {
308
- rmSync(getXmlFilePath(runOptions));
203
+ if (existsSync(getJsonldFilePath(runOptions))) {
204
+ rmSync(getJsonldFilePath(runOptions));
309
205
  }
310
206
  };
311
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuLWRhdGEtc3luYy9zY2hvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzdFLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVCLE9BQU8sR0FBWSxNQUFNLEtBQUssQ0FBQztBQUUvQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUVMLGdCQUFnQixFQUdoQixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFHTCxjQUFjLEdBQ2YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXZDLE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxPQUE0QixFQUFpQixFQUFFO0lBQ3hFLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFO1FBQ3ZDLE9BQU87S0FDUjtJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUNoRSxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDcEQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtRQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLG9EQUFvRCxRQUFRLENBQUMsTUFBTSxFQUFFLENBQ3RFLENBQUM7S0FD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bEMsVUFBc0MsRUFBRSxFQUN4QyxFQUFFO0lBQ0YsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTNDLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1FBQzFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztLQUNwQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIGNyZWF0ZVdyaXRlU3RyZWFtLCBleGlzdHNTeW5jLCBybVN5bmMgfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XHJcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgc2F4LCB7IFRhZyB9IGZyb20gXCJzYXhcIjtcclxuXHJcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSBcInN0cmVhbS9wcm9taXNlc1wiO1xyXG5pbXBvcnQgeyBpbnNlcnRGb3VuZGVycyB9IGZyb20gXCIuLi9kYi9mb3VuZGVyc1wiO1xyXG5pbXBvcnQgeyBpbnNlcnRTY2hvb2xzIH0gZnJvbSBcIi4uL2RiL3NjaG9vbHNcIjtcclxuaW1wb3J0IHtcclxuICBGb3VuZGVyLFxyXG4gIE11bmljaXBhbGl0eVR5cGUsXHJcbiAgU2Nob29sLFxyXG4gIFNjaG9vbExvY2F0aW9uLFxyXG4gIFNjaG9vbFR5cGUsXHJcbiAgU3luY1BhcnQsXHJcbn0gZnJvbSBcIi4uL2RiL3R5cGVzXCI7XHJcbmltcG9ydCB7XHJcbiAgT3BlbkRhdGFTeW5jT3B0aW9ucyxcclxuICBPcGVuRGF0YVN5bmNPcHRpb25zUGFydGlhbCxcclxuICBwcmVwYXJlT3B0aW9ucyxcclxufSBmcm9tIFwiLi4vdXRpbHMvaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBydW5TeW5jUGFydCB9IGZyb20gXCIuL2NvbW1vblwiO1xyXG5cclxuY29uc3QgZG93bmxvYWRYbWwgPSBhc3luYyAob3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGlmIChleGlzdHNTeW5jKGdldFhtbEZpbGVQYXRoKG9wdGlvbnMpKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc29sZS5sb2coXCJEb3dubG9hZGluZyBhIGxhcmdlIFhNTCBmaWxlIHdpdGggc2Nob29sIGRhdGEuLi5cIik7XHJcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChvcHRpb25zLnNjaG9vbHNYbWxVcmwpO1xyXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICBgVGhlIFhNTCBmaWxlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLiBIVFRQIENvZGU6ICR7cmVzcG9uc2Uuc3RhdHVzfWBcclxuICAgICk7XHJcbiAgfVxyXG4gIGF3YWl0IHBpcGVsaW5lKHJlc3BvbnNlLmJvZHksIGNyZWF0ZVdyaXRlU3RyZWFtKGdldFhtbEZpbGVQYXRoKG9wdGlvbnMpKSk7XHJcbiAgY29uc29sZS5sb2coXCJGaW5pc2hlZCBkb3dubG9hZGluZy5cIik7XHJcbn07XHJcblxyXG5lbnVtIFhNTFN0YXRlIHtcclxuICBOb25lLFxyXG4gIFJlZEl6byxcclxuICBTY2hvb2xOYW1lLFxyXG4gIEl6byxcclxuICBJY28sXHJcbiAgU2Nob29sVHlwZSxcclxuICBDYXBhY2l0eSxcclxuICBSdWlhbkNvZGUsXHJcbiAgQWRkcmVzcyxcclxuICBGb3VuZGVyTmFtZSxcclxuICBGb3VuZGVyVHlwZSxcclxuICBGb3VuZGVySWNvLFxyXG59XHJcblxyXG5jb25zdCBTQ0hPT0xfVFlQRV9LSU5ERVJHQVJURU4gPSBcIkEwMFwiO1xyXG5jb25zdCBTQ0hPT0xfVFlQRV9FTEVNRU5UQVJZID0gXCJCMDBcIjtcclxuXHJcbmNvbnN0IGdldENvcnJlY3RGb3VuZGVyVHlwZSA9IChmb3VuZGVyVHlwZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICByZXR1cm4gZm91bmRlclR5cGUgPT09IFwiXCIgPyBcIjEwMVwiIDogZm91bmRlclR5cGU7XHJcbn07XHJcblxyXG5jb25zdCBnZXRNdW5pY2lwYWxpdHlUeXBlID0gKGZvdW5kZXJUeXBlOiBzdHJpbmcpOiBNdW5pY2lwYWxpdHlUeXBlID0+IHtcclxuICByZXR1cm4gZm91bmRlclR5cGUgPT09IFwiMjYxXCJcclxuICAgID8gTXVuaWNpcGFsaXR5VHlwZS5DaXR5XHJcbiAgICA6IGZvdW5kZXJUeXBlID09PSBcIjI2M1wiXHJcbiAgICA/IE11bmljaXBhbGl0eVR5cGUuRGlzdHJpY3RcclxuICAgIDogTXVuaWNpcGFsaXR5VHlwZS5PdGhlcjtcclxufTtcclxuXHJcbnR5cGUgU2Nob29sQWRkcmVzcyA9IHtcclxuICBpem86IHN0cmluZztcclxuICBhZGRyZXNzOiBzdHJpbmdbXTtcclxuICB0eXBlOiBTY2hvb2xUeXBlO1xyXG59O1xyXG5cclxuY29uc3QgcHJvY2Vzc1NjaG9vbFJlZ2lzdGVyWG1sID0gYXN5bmMgKFxyXG4gIG9wdGlvbnM6IE9wZW5EYXRhU3luY09wdGlvbnNcclxuKTogUHJvbWlzZTx7XHJcbiAgc2Nob29sczogU2Nob29sW107XHJcbiAgZm91bmRlcnM6IE1hcDxzdHJpbmcsIEZvdW5kZXI+O1xyXG4gIHNjaG9vbHNXaXRob3V0UnVpYW46IFNjaG9vbEFkZHJlc3NbXTtcclxufT4gPT4ge1xyXG4gIGxldCBjdXJyZW50U2Nob29sczogU2Nob29sW107XHJcbiAgbGV0IGN1cnJlbnRSZWRpem86IHN0cmluZztcclxuICBsZXQgY3VycmVudE5hbWU6IHN0cmluZztcclxuICBsZXQgY3VycmVudEl6bzogc3RyaW5nO1xyXG4gIGxldCBjdXJyZW50SWNvOiBzdHJpbmc7XHJcbiAgbGV0IGN1cnJlbnRUeXBlOiBTY2hvb2xUeXBlIHwgbnVsbCA9IG51bGw7XHJcbiAgbGV0IGN1cnJlbnRDYXBhY2l0eTogbnVtYmVyO1xyXG4gIGxldCBjdXJyZW50TG9jYXRpb25zOiBTY2hvb2xMb2NhdGlvbltdID0gW107XHJcbiAgbGV0IHN0YXRlOiBYTUxTdGF0ZSA9IFhNTFN0YXRlLk5vbmU7XHJcbiAgbGV0IGN1cnJlbnRGb3VuZGVycyA9IFtdO1xyXG4gIGxldCBjdXJyZW50Rm91bmRlckljbzogc3RyaW5nO1xyXG4gIGxldCBjdXJyZW50Rm91bmRlck5hbWU6IHN0cmluZztcclxuICBsZXQgY3VycmVudEZvdW5kZXJUeXBlOiBzdHJpbmc7XHJcbiAgbGV0IGlzUnVpYW5Db2RlU2V0ID0gZmFsc2U7XHJcbiAgbGV0IGlzUnVpYW5Db2RlTWlzc2luZyA9IGZhbHNlO1xyXG4gIGxldCBjdXJyZW50QWRkcmVzcyA9IFtdO1xyXG4gIGNvbnN0IGZvdW5kZXJzID0gbmV3IE1hcDxzdHJpbmcsIEZvdW5kZXI+KCk7XHJcbiAgY29uc3Qgc2Nob29sczogU2Nob29sW10gPSBbXTtcclxuICBjb25zdCBzY2hvb2xzV2l0aG91dFJ1aWFuOiBTY2hvb2xBZGRyZXNzW10gPSBbXTtcclxuXHJcbiAgY29uc3Qgc3RyZWFtUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGNvbnN0IHNheFN0cmVhbSA9IHNheFxyXG4gICAgICAuY3JlYXRlU3RyZWFtKHRydWUpXHJcbiAgICAgIC5vbihcIm9wZW50YWdcIiwgKHRhZzogVGFnKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoICh0YWcubmFtZSkge1xyXG4gICAgICAgICAgY2FzZSBcIlByYXZuaVN1Ympla3RcIjpcclxuICAgICAgICAgICAgY3VycmVudFNjaG9vbHMgPSBbXTtcclxuICAgICAgICAgICAgY3VycmVudFJlZGl6byA9IFwiXCI7XHJcbiAgICAgICAgICAgIGN1cnJlbnROYW1lID0gXCJcIjtcclxuICAgICAgICAgICAgY3VycmVudEl6byA9IFwiXCI7XHJcbiAgICAgICAgICAgIGN1cnJlbnRDYXBhY2l0eSA9IDA7XHJcbiAgICAgICAgICAgIGlzUnVpYW5Db2RlTWlzc2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJSZWRJem9cIjpcclxuICAgICAgICAgICAgc3RhdGUgPSBYTUxTdGF0ZS5SZWRJem87XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIlJlZFBsbnlOYXpldlwiOlxyXG4gICAgICAgICAgICBzdGF0ZSA9IFhNTFN0YXRlLlNjaG9vbE5hbWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIklaT1wiOlxyXG4gICAgICAgICAgICBzdGF0ZSA9IFhNTFN0YXRlLkl6bztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiSUNPXCI6XHJcbiAgICAgICAgICAgIHN0YXRlID0gWE1MU3RhdGUuSWNvO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJTa29sYURydWhUeXBcIjpcclxuICAgICAgICAgICAgc3RhdGUgPSBYTUxTdGF0ZS5TY2hvb2xUeXBlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJTa29sYUthcGFjaXRhXCI6XHJcbiAgICAgICAgICAgIHN0YXRlID0gWE1MU3RhdGUuQ2FwYWNpdHk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIk1pc3RvUlVBSU5Lb2RcIjpcclxuICAgICAgICAgICAgaXNSdWlhbkNvZGVTZXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgY3VycmVudEFkZHJlc3MgPSBbXTtcclxuICAgICAgICAgICAgc3RhdGUgPSBYTUxTdGF0ZS5SdWlhbkNvZGU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIlpyaXpOYXpldlwiOlxyXG4gICAgICAgICAgICBzdGF0ZSA9IFhNTFN0YXRlLkZvdW5kZXJOYW1lO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJacml6UHJhdm5pRm9ybWFcIjpcclxuICAgICAgICAgICAgc3RhdGUgPSBYTUxTdGF0ZS5Gb3VuZGVyVHlwZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiTWlzdG9BZHJlc2ExXCI6XHJcbiAgICAgICAgICBjYXNlIFwiTWlzdG9BZHJlc2EyXCI6XHJcbiAgICAgICAgICBjYXNlIFwiTWlzdG9BZHJlc2EzXCI6XHJcbiAgICAgICAgICAgIHN0YXRlID0gWE1MU3RhdGUuQWRkcmVzcztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiWnJpekRhdHVtTmFyb3plbmlcIjpcclxuICAgICAgICAgIGNhc2UgXCJacml6SUNPXCI6XHJcbiAgICAgICAgICAgIHN0YXRlID0gWE1MU3RhdGUuRm91bmRlckljbztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAub24oXCJjbG9zZXRhZ1wiLCAodGFnTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7XHJcbiAgICAgICAgICBjYXNlIFwiUHJhdm5pU3ViamVrdFwiOlxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFNjaG9vbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHNjaG9vbHMucHVzaCguLi5jdXJyZW50U2Nob29scyk7XHJcbiAgICAgICAgICAgICAgY3VycmVudEZvdW5kZXJzLmZvckVhY2goKGZvdW5kZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGZvdW5kZXIubmFtZSArIGZvdW5kZXIuaWNvO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kZXJzLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZvdW5kZXJzLmdldChrZXkpLnNjaG9vbHMucHVzaCguLi5jdXJyZW50U2Nob29scyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBmb3VuZGVycy5zZXQoa2V5LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZm91bmRlci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGljbzogZm91bmRlci5pY28sXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUeXBlOiBmb3VuZGVyLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbXVuaWNpcGFsaXR5VHlwZTogZ2V0TXVuaWNpcGFsaXR5VHlwZShmb3VuZGVyLnR5cGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjaG9vbHM6IFsuLi5jdXJyZW50U2Nob29sc10sXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRJY28gPSBcIlwiO1xyXG4gICAgICAgICAgICBjdXJyZW50Rm91bmRlcnMgPSBbXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBcIlpyaXpvdmF0ZWxcIjpcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRGb3VuZGVySWNvID09PSBcIlwiIHx8IGN1cnJlbnRGb3VuZGVyTmFtZSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRGb3VuZGVycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGljbzogY3VycmVudEljbyxcclxuICAgICAgICAgICAgICAgIG5hbWU6IGN1cnJlbnROYW1lLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCIyMjRcIiwgLy8gcy5yLm8gKG5vdCBhbGwgYXJlIHRob3NlLCBidXQgd2UgZG9uJ3QgbmVlZCB0byBkaWZmZXJlbnRpYXRlIGhlcmUpXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudEZvdW5kZXJzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaWNvOiBjdXJyZW50Rm91bmRlckljbyxcclxuICAgICAgICAgICAgICAgIG5hbWU6IGN1cnJlbnRGb3VuZGVyTmFtZSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IGdldENvcnJlY3RGb3VuZGVyVHlwZShjdXJyZW50Rm91bmRlclR5cGUpLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRGb3VuZGVySWNvID0gXCJcIjtcclxuICAgICAgICAgICAgY3VycmVudEZvdW5kZXJOYW1lID0gXCJcIjtcclxuICAgICAgICAgICAgY3VycmVudEZvdW5kZXJUeXBlID0gXCJcIjtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIlNrb2xhWmFyaXplbmlcIjpcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRUeXBlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudFNjaG9vbHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBpem86IGN1cnJlbnRJem8sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBjdXJyZW50TmFtZSxcclxuICAgICAgICAgICAgICAgIHJlZGl6bzogY3VycmVudFJlZGl6byxcclxuICAgICAgICAgICAgICAgIGNhcGFjaXR5OiBjdXJyZW50Q2FwYWNpdHksXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBjdXJyZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uczogY3VycmVudExvY2F0aW9ucyxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50TG9jYXRpb25zID0gW107XHJcbiAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gbnVsbDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiU2tvbGFNaXN0b1Z5a29udUNpbm5vc3RpXCI6XHJcbiAgICAgICAgICAgIGlmIChpc1J1aWFuQ29kZU1pc3NpbmcpIHtcclxuICAgICAgICAgICAgICBzY2hvb2xzV2l0aG91dFJ1aWFuLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaXpvOiBjdXJyZW50SXpvLFxyXG4gICAgICAgICAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBjdXJyZW50VHlwZSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJNaXN0b1JVQUlOS29kXCI6XHJcbiAgICAgICAgICAgIGlzUnVpYW5Db2RlTWlzc2luZyA9ICFpc1J1aWFuQ29kZVNldDtcclxuICAgICAgICAgIGNhc2UgXCJSZWRQbG55TmF6ZXZcIjpcclxuICAgICAgICAgIGNhc2UgXCJSZWRJem9cIjpcclxuICAgICAgICAgIGNhc2UgXCJJQ09cIjpcclxuICAgICAgICAgIGNhc2UgXCJJWk9cIjpcclxuICAgICAgICAgIGNhc2UgXCJTa29sYURydWhUeXBcIjpcclxuICAgICAgICAgIGNhc2UgXCJTa29sYUthcGFjaXRhXCI6XHJcbiAgICAgICAgICBjYXNlIFwiWnJpek5hemV2XCI6XHJcbiAgICAgICAgICBjYXNlIFwiWnJpeklDT1wiOlxyXG4gICAgICAgICAgY2FzZSBcIlpyaXpEYXR1bU5hcm96ZW5pXCI6XHJcbiAgICAgICAgICBjYXNlIFwiWnJpelByYXZuaUZvcm1hXCI6XHJcbiAgICAgICAgICBjYXNlIFwiTWlzdG9BZHJlc2ExXCI6XHJcbiAgICAgICAgICBjYXNlIFwiTWlzdG9BZHJlc2EyXCI6XHJcbiAgICAgICAgICBjYXNlIFwiTWlzdG9BZHJlc2EzXCI6XHJcbiAgICAgICAgICAgIHN0YXRlID0gWE1MU3RhdGUuTm9uZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAub24oXCJ0ZXh0XCIsICh0ZXh0OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgICAgICBjYXNlIFhNTFN0YXRlLlJlZEl6bzpcclxuICAgICAgICAgICAgY3VycmVudFJlZGl6byA9IHRleHQ7XHJcbiAgICAgICAgICBjYXNlIFhNTFN0YXRlLlNjaG9vbE5hbWU6XHJcbiAgICAgICAgICAgIGN1cnJlbnROYW1lID0gdGV4dDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTFN0YXRlLkl6bzpcclxuICAgICAgICAgICAgY3VycmVudEl6byA9IHRleHQ7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxTdGF0ZS5JY286XHJcbiAgICAgICAgICAgIGN1cnJlbnRJY28gPSB0ZXh0O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MU3RhdGUuU2Nob29sVHlwZTpcclxuICAgICAgICAgICAgaWYgKHRleHQgPT09IFNDSE9PTF9UWVBFX0tJTkRFUkdBUlRFTikge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gU2Nob29sVHlwZS5LaW5kZXJnYXJ0ZW47XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PT0gU0NIT09MX1RZUEVfRUxFTUVOVEFSWSkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gU2Nob29sVHlwZS5FbGVtZW50YXJ5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxTdGF0ZS5SdWlhbkNvZGU6XHJcbiAgICAgICAgICAgIGlzUnVpYW5Db2RlU2V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgY3VycmVudExvY2F0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICBhZGRyZXNzUG9pbnRJZDogcGFyc2VJbnQodGV4dCksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MU3RhdGUuQWRkcmVzczpcclxuICAgICAgICAgICAgY3VycmVudEFkZHJlc3MucHVzaCh0ZXh0KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTFN0YXRlLkZvdW5kZXJOYW1lOlxyXG4gICAgICAgICAgICBjdXJyZW50Rm91bmRlck5hbWUgPSB0ZXh0O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MU3RhdGUuRm91bmRlckljbzpcclxuICAgICAgICAgICAgY3VycmVudEZvdW5kZXJJY28gPSB0ZXh0O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgWE1MU3RhdGUuRm91bmRlclR5cGU6XHJcbiAgICAgICAgICAgIGN1cnJlbnRGb3VuZGVyVHlwZSA9IHRleHQ7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBYTUxTdGF0ZS5DYXBhY2l0eTpcclxuICAgICAgICAgICAgY3VycmVudENhcGFjaXR5ID0gcGFyc2VJbnQodGV4dCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLm9uKFwiZXJyb3JcIiwgcmVqZWN0KVxyXG4gICAgICAub24oXCJlbmRcIiwgcmVzb2x2ZSk7XHJcblxyXG4gICAgLy8gd2FudGVkIHRvIHVzZSAnYXdhaXQgcGlwZWxpbmUoY3JlYXRlUmVhZFN0cmVhbShnZXRYbWxGaWxlUGF0aChvcHRpb25zKSksIHNheFN0cmVhbSknXHJcbiAgICAvLyBidXQgdGhlIHByb2dyYW0gd291bGQgcXVpdCBzcG9udGFuZW91c2x5IGFmdGVyIGZpbmlzaGluZyBzdHJlYW0gLSB1c2luZyBQcm9taXNlIGluc3RlYWQuXHJcbiAgICBjcmVhdGVSZWFkU3RyZWFtKGdldFhtbEZpbGVQYXRoKG9wdGlvbnMpKS5waXBlKHNheFN0cmVhbSk7XHJcbiAgfSk7XHJcblxyXG4gIGF3YWl0IHN0cmVhbVByb21pc2U7XHJcblxyXG4gIHJldHVybiB7IHNjaG9vbHMsIGZvdW5kZXJzLCBzY2hvb2xzV2l0aG91dFJ1aWFuIH07XHJcbn07XHJcblxyXG5jb25zdCBpbXBvcnREYXRhVG9EYiA9IGFzeW5jIChcclxuICBvcHRpb25zOiBPcGVuRGF0YVN5bmNPcHRpb25zLFxyXG4gIHNhdmVGb3VuZGVyc1RvQ3N2OiBib29sZWFuID0gZmFsc2UsXHJcbiAgc2F2ZVNjaG9vbHNXaXRob3V0UnVpYW5Ub0NzdjogYm9vbGVhbiA9IGZhbHNlXHJcbikgPT4ge1xyXG4gIGNvbnN0IHsgc2Nob29scywgZm91bmRlcnMsIHNjaG9vbHNXaXRob3V0UnVpYW4gfSA9XHJcbiAgICBhd2FpdCBwcm9jZXNzU2Nob29sUmVnaXN0ZXJYbWwob3B0aW9ucyk7XHJcblxyXG4gIGlmIChzYXZlRm91bmRlcnNUb0Nzdikge1xyXG4gICAgY29uc3QgY3N2RmlsZSA9IFwiZm91bmRlcnMuY3N2XCI7XHJcblxyXG4gICAgaWYgKGV4aXN0c1N5bmMoY3N2RmlsZSkpIHtcclxuICAgICAgcm1TeW5jKGNzdkZpbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjc3YgPSBjcmVhdGVXcml0ZVN0cmVhbShjc3ZGaWxlLCB7XHJcbiAgICAgIGZsYWdzOiBcImFcIixcclxuICAgIH0pO1xyXG4gICAgY3N2LndyaXRlKFwiScSMTztaxZlpem92YXRlbDtQcsOhdm7DrSBmb3JtYTtQb8SNZXQgxaFrb2w7xaBrb2x5XFxuXCIpO1xyXG4gICAgZm91bmRlcnMuZm9yRWFjaCgoZm91bmRlcikgPT4ge1xyXG4gICAgICBjc3Yud3JpdGUoXHJcbiAgICAgICAgYCMke2ZvdW5kZXIuaWNvfTske2ZvdW5kZXIubmFtZX07JHtmb3VuZGVyLm9yaWdpbmFsVHlwZX07JHtcclxuICAgICAgICAgIGZvdW5kZXIuc2Nob29scy5sZW5ndGhcclxuICAgICAgICB9OyR7Zm91bmRlci5zY2hvb2xzLm1hcCgoc2Nob29sKSA9PiBzY2hvb2wubmFtZSkuam9pbihcIi0tLVwiKX1cXG5gXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICAgIGNzdi5lbmQoKTtcclxuICB9XHJcblxyXG4gIGlmIChzYXZlU2Nob29sc1dpdGhvdXRSdWlhblRvQ3N2KSB7XHJcbiAgICBjb25zdCBjc3ZGaWxlID0gXCJzY2hvb2xzV2l0aG91dFJ1aWFuLmNzdlwiO1xyXG5cclxuICAgIGlmIChleGlzdHNTeW5jKGNzdkZpbGUpKSB7XHJcbiAgICAgIHJtU3luYyhjc3ZGaWxlKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY3N2ID0gY3JlYXRlV3JpdGVTdHJlYW0oY3N2RmlsZSwge1xyXG4gICAgICBmbGFnczogXCJhXCIsXHJcbiAgICB9KTtcclxuICAgIGNzdi53cml0ZShcIklaTztKZSBtYXRlxZlza8OhO0plIHrDoWtsYWRuw607YWRyZXNhMTthZHJlc2EyO2FkcmVzYTNcXG5cIik7XHJcbiAgICBzY2hvb2xzV2l0aG91dFJ1aWFuLmZvckVhY2goKHNjaG9vbEFkZHJlc3MpID0+IHtcclxuICAgICAgY3N2LndyaXRlKFxyXG4gICAgICAgIGAjJHtzY2hvb2xBZGRyZXNzLml6b307JHtcclxuICAgICAgICAgIHNjaG9vbEFkZHJlc3MudHlwZSA9PT0gU2Nob29sVHlwZS5LaW5kZXJnYXJ0ZW4gPyBcIlRSVUVcIiA6IFwiRkFMU0VcIlxyXG4gICAgICAgIH07JHtcclxuICAgICAgICAgIHNjaG9vbEFkZHJlc3MudHlwZSA9PT0gU2Nob29sVHlwZS5FbGVtZW50YXJ5ID8gXCJUUlVFXCIgOiBcIkZBTFNFXCJcclxuICAgICAgICB9OyR7c2Nob29sQWRkcmVzcy5hZGRyZXNzLmpvaW4oXCI7XCIpfVxcbmBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgY3N2LmVuZCgpO1xyXG4gIH1cclxuXHJcbiAgYXdhaXQgaW5zZXJ0U2Nob29scyhzY2hvb2xzKTtcclxuXHJcbiAgYXdhaXQgaW5zZXJ0Rm91bmRlcnMoQXJyYXkuZnJvbShmb3VuZGVycy52YWx1ZXMoKSkpO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0WG1sRmlsZVBhdGggPSAob3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9uc1BhcnRpYWwpOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBqb2luKG9wdGlvbnMudG1wRGlyLCBvcHRpb25zLnNjaG9vbHNYbWxGaWxlTmFtZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZG93bmxvYWRBbmRJbXBvcnRTY2hvb2xzID0gYXN5bmMgKFxyXG4gIG9wdGlvbnM6IE9wZW5EYXRhU3luY09wdGlvbnNQYXJ0aWFsID0ge30sXHJcbiAgc2F2ZUZvdW5kZXJzVG9Dc3Y6IGJvb2xlYW4gPSBmYWxzZSxcclxuICBzYXZlU2Nob29sc1dpdGhvdXRSdWlhblRvQ3N2OiBib29sZWFuID0gZmFsc2VcclxuKSA9PiB7XHJcbiAgYXdhaXQgcnVuU3luY1BhcnQoU3luY1BhcnQuU2Nob29scywgW1N5bmNQYXJ0LkFkZHJlc3NQb2ludHNdLCBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBydW5PcHRpb25zID0gcHJlcGFyZU9wdGlvbnMob3B0aW9ucyk7XHJcblxyXG4gICAgYXdhaXQgZG93bmxvYWRYbWwocnVuT3B0aW9ucyk7XHJcbiAgICBhd2FpdCBpbXBvcnREYXRhVG9EYihcclxuICAgICAgcnVuT3B0aW9ucyxcclxuICAgICAgc2F2ZUZvdW5kZXJzVG9Dc3YsXHJcbiAgICAgIHNhdmVTY2hvb2xzV2l0aG91dFJ1aWFuVG9Dc3ZcclxuICAgICk7XHJcbiAgICBkZWxldGVTY2hvb2xzWG1sRmlsZShydW5PcHRpb25zKTtcclxuICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWxldGVTY2hvb2xzWG1sRmlsZSA9IChcclxuICBvcHRpb25zOiBPcGVuRGF0YVN5bmNPcHRpb25zUGFydGlhbCA9IHt9XHJcbikgPT4ge1xyXG4gIGNvbnN0IHJ1bk9wdGlvbnMgPSBwcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcclxuXHJcbiAgaWYgKGV4aXN0c1N5bmMoZ2V0WG1sRmlsZVBhdGgocnVuT3B0aW9ucykpKSB7XHJcbiAgICBybVN5bmMoZ2V0WG1sRmlsZVBhdGgocnVuT3B0aW9ucykpO1xyXG4gIH1cclxufTtcclxuIl19
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuLWRhdGEtc3luYy9zY2hvb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzdFLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLElBQUksTUFBTSwwQkFBMEIsQ0FBQztBQUM1QyxPQUFPLFdBQVcsTUFBTSxtQ0FBbUMsQ0FBQztBQUU1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNyQyxPQUFPLEVBRUwsZ0JBQWdCLEVBR2hCLFVBQVUsRUFDVixRQUFRLEdBQ1QsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUdMLGNBQWMsR0FDZixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdkMsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUFFLE9BQTRCLEVBQWlCLEVBQUU7SUFDM0UsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtRQUMxQyxPQUFPO0tBQ1I7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENB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QixFQUNqQiw0QkFBNEIsQ0FDN0IsQ0FBQztRQUNGLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FDckMsVUFBc0MsRUFBRSxFQUN4QyxFQUFFO0lBQ0YsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTNDLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUU7UUFDN0MsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7S0FDdkM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZWFkU3RyZWFtLCBjcmVhdGVXcml0ZVN0cmVhbSwgZXhpc3RzU3luYywgcm1TeW5jIH0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xyXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHBhcnNlciBmcm9tIFwic3RyZWFtLWpzb25cIjtcclxuaW1wb3J0IFBpY2sgZnJvbSBcInN0cmVhbS1qc29uL2ZpbHRlcnMvUGlja1wiO1xyXG5pbXBvcnQgU3RyZWFtQXJyYXkgZnJvbSBcInN0cmVhbS1qc29uL3N0cmVhbWVycy9TdHJlYW1BcnJheVwiO1xyXG5cclxuaW1wb3J0IHsgcGlwZWxpbmUgfSBmcm9tIFwic3RyZWFtL3Byb21pc2VzXCI7XHJcbmltcG9ydCB7IGluc2VydEZvdW5kZXJzIH0gZnJvbSBcIi4uL2RiL2ZvdW5kZXJzXCI7XHJcbmltcG9ydCB7IGluc2VydFNjaG9vbHMgfSBmcm9tIFwiLi4vZGIvc2Nob29sc1wiO1xyXG5pbXBvcnQgeyBnZXRLbmV4RGIgfSBmcm9tIFwiLi4vZGIvZGJcIjtcclxuaW1wb3J0IHtcclxuICBGb3VuZGVyLFxyXG4gIE11bmljaXBhbGl0eVR5cGUsXHJcbiAgU2Nob29sLFxyXG4gIFNjaG9vbExvY2F0aW9uLFxyXG4gIFNjaG9vbFR5cGUsXHJcbiAgU3luY1BhcnQsXHJcbn0gZnJvbSBcIi4uL2RiL3R5cGVzXCI7XHJcbmltcG9ydCB7XHJcbiAgT3BlbkRhdGFTeW5jT3B0aW9ucyxcclxuICBPcGVuRGF0YVN5bmNPcHRpb25zUGFydGlhbCxcclxuICBwcmVwYXJlT3B0aW9ucyxcclxufSBmcm9tIFwiLi4vdXRpbHMvaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBydW5TeW5jUGFydCB9IGZyb20gXCIuL2NvbW1vblwiO1xyXG5cclxuY29uc3QgZG93bmxvYWRKc29ubGQgPSBhc3luYyAob3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGlmIChleGlzdHNTeW5jKGdldEpzb25sZEZpbGVQYXRoKG9wdGlvbnMpKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc29sZS5sb2coXCJEb3dubG9hZGluZyBhIGxhcmdlIEpTT04tTEQgZmlsZSB3aXRoIHNjaG9vbCBkYXRhLi4uXCIpO1xyXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gob3B0aW9ucy5zY2hvb2xzSnNvbmxkVXJsKTtcclxuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYFRoZSBKU09OLUxEIGZpbGUgY291bGQgbm90IGJlIGRvd25sb2FkZWQuIEhUVFAgQ29kZTogJHtyZXNwb25zZS5zdGF0dXN9YFxyXG4gICAgKTtcclxuICB9XHJcbiAgYXdhaXQgcGlwZWxpbmUocmVzcG9uc2UuYm9keSwgY3JlYXRlV3JpdGVTdHJlYW0oZ2V0SnNvbmxkRmlsZVBhdGgob3B0aW9ucykpKTtcclxuICBjb25zb2xlLmxvZyhcIkZpbmlzaGVkIGRvd25sb2FkaW5nLlwiKTtcclxufTtcclxuXHJcbmNvbnN0IFNDSE9PTF9UWVBFX0tJTkRFUkdBUlRFTiA9IFwiQTAwXCI7XHJcbmNvbnN0IFNDSE9PTF9UWVBFX0VMRU1FTlRBUlkgPSBcIkIwMFwiO1xyXG5cclxuY29uc3QgZ2V0Q29ycmVjdEZvdW5kZXJUeXBlID0gKGZvdW5kZXJUeXBlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBmb3VuZGVyVHlwZSA9PT0gXCJcIiA/IFwiMTAxXCIgOiBmb3VuZGVyVHlwZTtcclxufTtcclxuXHJcbmNvbnN0IGdldE11bmljaXBhbGl0eVR5cGUgPSAoZm91bmRlclR5cGU6IHN0cmluZyk6IE11bmljaXBhbGl0eVR5cGUgPT4ge1xyXG4gIHJldHVybiBmb3VuZGVyVHlwZSA9PT0gXCIyNjFcIlxyXG4gICAgPyBNdW5pY2lwYWxpdHlUeXBlLkNpdHlcclxuICAgIDogZm91bmRlclR5cGUgPT09IFwiMjYzXCJcclxuICAgID8gTXVuaWNpcGFsaXR5VHlwZS5EaXN0cmljdFxyXG4gICAgOiBNdW5pY2lwYWxpdHlUeXBlLk90aGVyO1xyXG59O1xyXG5cclxudHlwZSBTY2hvb2xBZGRyZXNzID0ge1xyXG4gIGl6bzogc3RyaW5nO1xyXG4gIGFkZHJlc3M6IHN0cmluZ1tdO1xyXG4gIHR5cGU6IFNjaG9vbFR5cGU7XHJcbn07XHJcblxyXG5jb25zdCBwcm9jZXNzU2Nob29sUmVnaXN0ZXJKc29ubGQgPSBhc3luYyAoXHJcbiAgb3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9uc1xyXG4pOiBQcm9taXNlPHtcclxuICBzY2hvb2xzOiBTY2hvb2xbXTtcclxuICBmb3VuZGVyczogTWFwPHN0cmluZywgRm91bmRlcj47XHJcbiAgc2Nob29sc1dpdGhvdXRSdWlhbjogU2Nob29sQWRkcmVzc1tdO1xyXG59PiA9PiB7XHJcbiAgY29uc3QgZm91bmRlcnMgPSBuZXcgTWFwPHN0cmluZywgRm91bmRlcj4oKTtcclxuICBjb25zdCBzY2hvb2xzOiBTY2hvb2xbXSA9IFtdO1xyXG4gIGNvbnN0IHNjaG9vbHNXaXRob3V0UnVpYW46IFNjaG9vbEFkZHJlc3NbXSA9IFtdO1xyXG5cclxuICBjb25zdCBzdHJlYW0gPSBjcmVhdGVSZWFkU3RyZWFtKGdldEpzb25sZEZpbGVQYXRoKG9wdGlvbnMpKVxyXG4gICAgLnBpcGUocGFyc2VyKCkpXHJcbiAgICAucGlwZShuZXcgUGljayh7IGZpbHRlcjogXCJsaXN0XCIgfSkpXHJcbiAgICAucGlwZShuZXcgU3RyZWFtQXJyYXkoKSk7XHJcblxyXG4gIGZvciBhd2FpdCAoY29uc3QgeyB2YWx1ZTogZW50aXR5IH0gb2Ygc3RyZWFtKSB7XHJcbiAgICBjb25zdCByZWRpem86IHN0cmluZyA9IGVudGl0eS5yZWRJem8gPz8gXCJcIjtcclxuICAgIGNvbnN0IGljbzogc3RyaW5nID0gZW50aXR5LmljbyA/PyBcIlwiO1xyXG4gICAgY29uc3QgZW50aXR5TmFtZTogc3RyaW5nID0gZW50aXR5LnVwbG55TmF6ZXYgPz8gXCJcIjtcclxuICAgIGNvbnN0IGN1cnJlbnRTY2hvb2xzOiBTY2hvb2xbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc2Nob29sIG9mIGVudGl0eS5za29seUFaYXJpemVuaSA/PyBbXSkge1xyXG4gICAgICBjb25zdCB0eXBlID1cclxuICAgICAgICBzY2hvb2wuZHJ1aCA9PT0gU0NIT09MX1RZUEVfS0lOREVSR0FSVEVOXHJcbiAgICAgICAgICA/IFNjaG9vbFR5cGUuS2luZGVyZ2FydGVuXHJcbiAgICAgICAgICA6IHNjaG9vbC5kcnVoID09PSBTQ0hPT0xfVFlQRV9FTEVNRU5UQVJZXHJcbiAgICAgICAgICA/IFNjaG9vbFR5cGUuRWxlbWVudGFyeVxyXG4gICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgaWYgKHR5cGUgPT09IG51bGwpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgY29uc3QgY2FwYWNpdHlFbnRyeSA9XHJcbiAgICAgICAgc2Nob29sLmthcGFjaXR5Py5maW5kKChrKSA9PiBrLm1lcm5hSmVkbm90a2EgPT09IFwiMDFcIikgPz9cclxuICAgICAgICBzY2hvb2wua2FwYWNpdHk/LlswXTtcclxuICAgICAgY29uc3QgY2FwYWNpdHk6IG51bWJlciA9IGNhcGFjaXR5RW50cnk/Lm5lanZ5c3NpUG92b2xlbnlQb2NldCA/PyAwO1xyXG4gICAgICBjb25zdCBhbGxQbGFjZXMgPSBzY2hvb2wubWlzdGFWeXVreSA/PyBbXTtcclxuICAgICAgY29uc3QgbG9jYXRpb25zV2l0aFJ1aWFuID0gYWxsUGxhY2VzLmZpbHRlcihcclxuICAgICAgICAocCkgPT4gcC5hZHJlc2E/LmtvZFJVSUFOICE9IG51bGxcclxuICAgICAgKTtcclxuICAgICAgLy8gUHJlZmVyIHRoZSBtYWluIGJ1aWxkaW5nIChJRG1pc3RhIG1hdGNoZXMgc2Nob29sIElaTyksIGZhbGwgYmFjayB0byBmaXJzdCBhdmFpbGFibGVcclxuICAgICAgY29uc3QgbWFpblBsYWNlID1cclxuICAgICAgICBsb2NhdGlvbnNXaXRoUnVpYW4uZmluZCgocCkgPT4gcC5JRG1pc3RhID09PSBzY2hvb2wuaXpvKSA/P1xyXG4gICAgICAgIGxvY2F0aW9uc1dpdGhSdWlhblswXTtcclxuXHJcbiAgICAgIGNvbnN0IGxvY2F0aW9uczogU2Nob29sTG9jYXRpb25bXSA9IG1haW5QbGFjZVxyXG4gICAgICAgID8gW3sgYWRkcmVzc1BvaW50SWQ6IG1haW5QbGFjZS5hZHJlc2Eua29kUlVJQU4gfV1cclxuICAgICAgICA6IFtdO1xyXG5cclxuICAgICAgaWYgKCFtYWluUGxhY2UgJiYgYWxsUGxhY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBhZGRyID0gYWxsUGxhY2VzWzBdLmFkcmVzYSA/PyB7fTtcclxuICAgICAgICBjb25zdCBhZGRyZXNzUGFydHMgPSBbXHJcbiAgICAgICAgICBhZGRyLnVsaWNlLFxyXG4gICAgICAgICAgYWRkci5jaXNsb0RvbW92bmk/LnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBhZGRyLm9iZWMsXHJcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICAgICAgc2Nob29sc1dpdGhvdXRSdWlhbi5wdXNoKHsgaXpvOiBzY2hvb2wuaXpvLCBhZGRyZXNzOiBhZGRyZXNzUGFydHMsIHR5cGUgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGN1cnJlbnRTY2hvb2xzLnB1c2goe1xyXG4gICAgICAgIGl6bzogc2Nob29sLml6byxcclxuICAgICAgICBuYW1lOiBlbnRpdHlOYW1lIHx8IHNjaG9vbC51cGxueU5hemV2IHx8IFwiXCIsXHJcbiAgICAgICAgcmVkaXpvLFxyXG4gICAgICAgIGNhcGFjaXR5LFxyXG4gICAgICAgIHR5cGUsXHJcbiAgICAgICAgbG9jYXRpb25zLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzY2hvb2xzLnB1c2goLi4uY3VycmVudFNjaG9vbHMpO1xyXG5cclxuICAgIGZvciAoY29uc3QgeiBvZiBlbnRpdHkuenJpem92YXRlbGUgPz8gW10pIHtcclxuICAgICAgbGV0IGZvdW5kZXJJY286IHN0cmluZztcclxuICAgICAgbGV0IGZvdW5kZXJOYW1lOiBzdHJpbmc7XHJcbiAgICAgIGxldCBmb3VuZGVyVHlwZTogc3RyaW5nO1xyXG5cclxuICAgICAgaWYgKHouZHJ1aE9zb2J5ID09PSBcIlBPXCIpIHtcclxuICAgICAgICBmb3VuZGVySWNvID0gei5JY28gPz8gXCJcIjtcclxuICAgICAgICBmb3VuZGVyTmFtZSA9IHoubmF6ZXZPc29ieSA/PyBcIlwiO1xyXG4gICAgICAgIGZvdW5kZXJUeXBlID0gZ2V0Q29ycmVjdEZvdW5kZXJUeXBlKHoucHJhdm5pRm9ybWEgPz8gXCJcIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm91bmRlckljbyA9IHouZGF0dW1OYXJvemVuaSA/PyBcIlwiO1xyXG4gICAgICAgIGZvdW5kZXJOYW1lID0gei5uYXpldk9zb2J5ID8/IFwiXCI7XHJcbiAgICAgICAgZm91bmRlclR5cGUgPSBnZXRDb3JyZWN0Rm91bmRlclR5cGUoXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmb3VuZGVySWNvID09PSBcIlwiIHx8IGZvdW5kZXJOYW1lID09PSBcIlwiKSB7XHJcbiAgICAgICAgZm91bmRlckljbyA9IGljbztcclxuICAgICAgICBmb3VuZGVyTmFtZSA9IGVudGl0eU5hbWU7XHJcbiAgICAgICAgZm91bmRlclR5cGUgPSBcIjIyNFwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY3VycmVudFNjaG9vbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGZvdW5kZXJOYW1lICsgZm91bmRlckljbztcclxuICAgICAgICBpZiAoZm91bmRlcnMuaGFzKGtleSkpIHtcclxuICAgICAgICAgIGZvdW5kZXJzLmdldChrZXkpLnNjaG9vbHMucHVzaCguLi5jdXJyZW50U2Nob29scyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZvdW5kZXJzLnNldChrZXksIHtcclxuICAgICAgICAgICAgbmFtZTogZm91bmRlck5hbWUsXHJcbiAgICAgICAgICAgIGljbzogZm91bmRlckljbyxcclxuICAgICAgICAgICAgb3JpZ2luYWxUeXBlOiBwYXJzZUludChmb3VuZGVyVHlwZSksXHJcbiAgICAgICAgICAgIG11bmljaXBhbGl0eVR5cGU6IGdldE11bmljaXBhbGl0eVR5cGUoZm91bmRlclR5cGUpLFxyXG4gICAgICAgICAgICBzY2hvb2xzOiBbLi4uY3VycmVudFNjaG9vbHNdLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyBzY2hvb2xzLCBmb3VuZGVycywgc2Nob29sc1dpdGhvdXRSdWlhbiB9O1xyXG59O1xyXG5cclxuY29uc3QgaW1wb3J0RGF0YVRvRGIgPSBhc3luYyAoXHJcbiAgb3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9ucyxcclxuICBzYXZlRm91bmRlcnNUb0NzdjogYm9vbGVhbiA9IGZhbHNlLFxyXG4gIHNhdmVTY2hvb2xzV2l0aG91dFJ1aWFuVG9Dc3Y6IGJvb2xlYW4gPSBmYWxzZVxyXG4pID0+IHtcclxuICBjb25zdCB7IHNjaG9vbHMsIGZvdW5kZXJzLCBzY2hvb2xzV2l0aG91dFJ1aWFuIH0gPVxyXG4gICAgYXdhaXQgcHJvY2Vzc1NjaG9vbFJlZ2lzdGVySnNvbmxkKG9wdGlvbnMpO1xyXG5cclxuICBpZiAoc2F2ZUZvdW5kZXJzVG9Dc3YpIHtcclxuICAgIGNvbnN0IGNzdkZpbGUgPSBcImZvdW5kZXJzLmNzdlwiO1xyXG5cclxuICAgIGlmIChleGlzdHNTeW5jKGNzdkZpbGUpKSB7XHJcbiAgICAgIHJtU3luYyhjc3ZGaWxlKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY3N2ID0gY3JlYXRlV3JpdGVTdHJlYW0oY3N2RmlsZSwge1xyXG4gICAgICBmbGFnczogXCJhXCIsXHJcbiAgICB9KTtcclxuICAgIGNzdi53cml0ZShcIknEjE87WsWZaXpvdmF0ZWw7UHLDoXZuw60gZm9ybWE7UG/EjWV0IMWha29sO8Wga29seVxcblwiKTtcclxuICAgIGZvdW5kZXJzLmZvckVhY2goKGZvdW5kZXIpID0+IHtcclxuICAgICAgY3N2LndyaXRlKFxyXG4gICAgICAgIGAjJHtmb3VuZGVyLmljb307JHtmb3VuZGVyLm5hbWV9OyR7Zm91bmRlci5vcmlnaW5hbFR5cGV9OyR7XHJcbiAgICAgICAgICBmb3VuZGVyLnNjaG9vbHMubGVuZ3RoXHJcbiAgICAgICAgfTske2ZvdW5kZXIuc2Nob29scy5tYXAoKHNjaG9vbCkgPT4gc2Nob29sLm5hbWUpLmpvaW4oXCItLS1cIil9XFxuYFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICBjc3YuZW5kKCk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2F2ZVNjaG9vbHNXaXRob3V0UnVpYW5Ub0Nzdikge1xyXG4gICAgY29uc3QgY3N2RmlsZSA9IFwic2Nob29sc1dpdGhvdXRSdWlhbi5jc3ZcIjtcclxuXHJcbiAgICBpZiAoZXhpc3RzU3luYyhjc3ZGaWxlKSkge1xyXG4gICAgICBybVN5bmMoY3N2RmlsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGNzdiA9IGNyZWF0ZVdyaXRlU3RyZWFtKGNzdkZpbGUsIHtcclxuICAgICAgZmxhZ3M6IFwiYVwiLFxyXG4gICAgfSk7XHJcbiAgICBjc3Yud3JpdGUoXCJJWk87SmUgbWF0ZcWZc2vDoTtKZSB6w6FrbGFkbsOtO2FkcmVzYTE7YWRyZXNhMjthZHJlc2EzXFxuXCIpO1xyXG4gICAgc2Nob29sc1dpdGhvdXRSdWlhbi5mb3JFYWNoKChzY2hvb2xBZGRyZXNzKSA9PiB7XHJcbiAgICAgIGNzdi53cml0ZShcclxuICAgICAgICBgIyR7c2Nob29sQWRkcmVzcy5pem99OyR7XHJcbiAgICAgICAgICBzY2hvb2xBZGRyZXNzLnR5cGUgPT09IFNjaG9vbFR5cGUuS2luZGVyZ2FydGVuID8gXCJUUlVFXCIgOiBcIkZBTFNFXCJcclxuICAgICAgICB9OyR7XHJcbiAgICAgICAgICBzY2hvb2xBZGRyZXNzLnR5cGUgPT09IFNjaG9vbFR5cGUuRWxlbWVudGFyeSA/IFwiVFJVRVwiIDogXCJGQUxTRVwiXHJcbiAgICAgICAgfTske3NjaG9vbEFkZHJlc3MuYWRkcmVzcy5qb2luKFwiO1wiKX1cXG5gXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICAgIGNzdi5lbmQoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBjb25zdCBzY2hvb2xzQmVmb3JlID0gKGF3YWl0IGtuZXgoXCJzY2hvb2xcIikuY291bnQoXCJpem8gYXMgY291bnRcIikuZmlyc3QoKSkuY291bnQgYXMgbnVtYmVyO1xyXG4gIGNvbnN0IGZvdW5kZXJzQmVmb3JlID0gKGF3YWl0IGtuZXgoXCJmb3VuZGVyXCIpLmNvdW50KFwiaWQgYXMgY291bnRcIikuZmlyc3QoKSkuY291bnQgYXMgbnVtYmVyO1xyXG5cclxuICAvLyBDb21wdXRlIGNoYW5nZSBzdGF0cyBiZWZvcmUgaW5zZXJ0aW5nICh1c2VzIHNhbWUgbG9naWMgYXMgaW5zZXJ0U2Nob29scylcclxuICBjb25zdCBleGlzdGluZ1NuYXA6IHsgaXpvOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgY2FwYWNpdHk6IG51bWJlcjsgYWRkcmVzc19wb2ludF9pZDogbnVtYmVyIHwgbnVsbCB9W10gPVxyXG4gICAgYXdhaXQga25leChcInNjaG9vbFwiKVxyXG4gICAgICAubGVmdEpvaW4oXCJzY2hvb2xfbG9jYXRpb25cIiwgXCJzY2hvb2wuaXpvXCIsIFwic2Nob29sX2xvY2F0aW9uLnNjaG9vbF9pem9cIilcclxuICAgICAgLnNlbGVjdChcInNjaG9vbC5pem9cIiwgXCJzY2hvb2wubmFtZVwiLCBcInNjaG9vbC5jYXBhY2l0eVwiLCBcInNjaG9vbF9sb2NhdGlvbi5hZGRyZXNzX3BvaW50X2lkXCIpO1xyXG4gIGNvbnN0IGV4aXN0aW5nU25hcE1hcCA9IG5ldyBNYXAoZXhpc3RpbmdTbmFwLm1hcCgocikgPT4gW3IuaXpvLCByXSkpO1xyXG4gIGNvbnN0IHN0YXRzRmllbGRVcGRhdGVzID0gc2Nob29scy5maWx0ZXIoKHMpID0+IHtcclxuICAgIGNvbnN0IHJvdyA9IGV4aXN0aW5nU25hcE1hcC5nZXQocy5pem8pO1xyXG4gICAgcmV0dXJuIHJvdyAmJiAocm93Lm5hbWUgIT09IHMubmFtZSB8fCByb3cuY2FwYWNpdHkgIT09IHMuY2FwYWNpdHkpO1xyXG4gIH0pLmxlbmd0aDtcclxuICBjb25zdCBzdGF0c0xvY2F0aW9uVXBkYXRlcyA9IHNjaG9vbHMuZmlsdGVyKChzKSA9PiB7XHJcbiAgICBjb25zdCByb3cgPSBleGlzdGluZ1NuYXBNYXAuZ2V0KHMuaXpvKTtcclxuICAgIGNvbnN0IG5ld1J1aWFucyA9IHMubG9jYXRpb25zLm1hcCgobCkgPT4gbC5hZGRyZXNzUG9pbnRJZCk7XHJcbiAgICByZXR1cm4gcm93ICYmIHJvdy5hZGRyZXNzX3BvaW50X2lkICE9PSBudWxsICYmIG5ld1J1aWFucy5sZW5ndGggPiAwICYmICFuZXdSdWlhbnMuaW5jbHVkZXMocm93LmFkZHJlc3NfcG9pbnRfaWQpO1xyXG4gIH0pLmxlbmd0aDtcclxuXHJcbiAgYXdhaXQgaW5zZXJ0U2Nob29scyhzY2hvb2xzKTtcclxuICBhd2FpdCBpbnNlcnRGb3VuZGVycyhBcnJheS5mcm9tKGZvdW5kZXJzLnZhbHVlcygpKSk7XHJcblxyXG4gIGNvbnN0IHNjaG9vbHNBZnRlciA9IChhd2FpdCBrbmV4KFwic2Nob29sXCIpLmNvdW50KFwiaXpvIGFzIGNvdW50XCIpLmZpcnN0KCkpLmNvdW50IGFzIG51bWJlcjtcclxuICBjb25zdCBmb3VuZGVyc0FmdGVyID0gKGF3YWl0IGtuZXgoXCJmb3VuZGVyXCIpLmNvdW50KFwiaWQgYXMgY291bnRcIikuZmlyc3QoKSkuY291bnQgYXMgbnVtYmVyO1xyXG5cclxuICBjb25zdCBraW5kZXJnYXJ0ZW5zID0gc2Nob29scy5maWx0ZXIoKHMpID0+IHMudHlwZSA9PT0gU2Nob29sVHlwZS5LaW5kZXJnYXJ0ZW4pLmxlbmd0aDtcclxuICBjb25zdCBlbGVtZW50YXJ5ID0gc2Nob29scy5maWx0ZXIoKHMpID0+IHMudHlwZSA9PT0gU2Nob29sVHlwZS5FbGVtZW50YXJ5KS5sZW5ndGg7XHJcblxyXG4gIGNvbnNvbGUubG9nKGBcXG49PT0gU2Nob29sIHN5bmMgc3RhdGlzdGljcyA9PT1gKTtcclxuICBjb25zb2xlLmxvZyhgU2Nob29scyBwYXJzZWQ6ICAgICAgICAgJHtzY2hvb2xzLmxlbmd0aH0gKCR7a2luZGVyZ2FydGVuc30ga2luZGVyZ2FydGVucywgJHtlbGVtZW50YXJ5fSBlbGVtZW50YXJ5KWApO1xyXG4gIGNvbnNvbGUubG9nKGBGb3VuZGVycyBwYXJzZWQ6ICAgICAgICAke2ZvdW5kZXJzLnNpemV9YCk7XHJcbiAgY29uc29sZS5sb2coYE5ldyBzY2hvb2xzIGluc2VydGVkOiAgICR7c2Nob29sc0FmdGVyIC0gc2Nob29sc0JlZm9yZX1gKTtcclxuICBjb25zb2xlLmxvZyhgTmV3IGZvdW5kZXJzIGluc2VydGVkOiAgJHtmb3VuZGVyc0FmdGVyIC0gZm91bmRlcnNCZWZvcmV9YCk7XHJcbiAgY29uc29sZS5sb2coYEZpZWxkIHVwZGF0ZXM6ICAgICAgICAgICR7c3RhdHNGaWVsZFVwZGF0ZXN9IChuYW1lL2NhcGFjaXR5IGNoYW5nZWQpYCk7XHJcbiAgY29uc29sZS5sb2coYExvY2F0aW9uIHVwZGF0ZXM6ICAgICAgICR7c3RhdHNMb2NhdGlvblVwZGF0ZXN9IChmaXJzdCBsb2NhdGlvbiBjaGFuZ2VkKWApO1xyXG4gIGNvbnNvbGUubG9nKGBUb3RhbCBzY2hvb2xzIGluIERCOiAgICAke3NjaG9vbHNBZnRlcn1gKTtcclxuICBjb25zb2xlLmxvZyhgVG90YWwgZm91bmRlcnMgaW4gREI6ICAgJHtmb3VuZGVyc0FmdGVyfWApO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0SnNvbmxkRmlsZVBhdGggPSAob3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9uc1BhcnRpYWwpOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBqb2luKG9wdGlvbnMudG1wRGlyLCBvcHRpb25zLnNjaG9vbHNKc29ubGRGaWxlTmFtZSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZG93bmxvYWRBbmRJbXBvcnRTY2hvb2xzID0gYXN5bmMgKFxyXG4gIG9wdGlvbnM6IE9wZW5EYXRhU3luY09wdGlvbnNQYXJ0aWFsID0ge30sXHJcbiAgc2F2ZUZvdW5kZXJzVG9Dc3Y6IGJvb2xlYW4gPSBmYWxzZSxcclxuICBzYXZlU2Nob29sc1dpdGhvdXRSdWlhblRvQ3N2OiBib29sZWFuID0gZmFsc2VcclxuKSA9PiB7XHJcbiAgYXdhaXQgcnVuU3luY1BhcnQoU3luY1BhcnQuU2Nob29scywgW1N5bmNQYXJ0LkFkZHJlc3NQb2ludHNdLCBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBydW5PcHRpb25zID0gcHJlcGFyZU9wdGlvbnMob3B0aW9ucyk7XHJcblxyXG4gICAgYXdhaXQgZG93bmxvYWRKc29ubGQocnVuT3B0aW9ucyk7XHJcbiAgICBhd2FpdCBpbXBvcnREYXRhVG9EYihcclxuICAgICAgcnVuT3B0aW9ucyxcclxuICAgICAgc2F2ZUZvdW5kZXJzVG9Dc3YsXHJcbiAgICAgIHNhdmVTY2hvb2xzV2l0aG91dFJ1aWFuVG9Dc3ZcclxuICAgICk7XHJcbiAgICBkZWxldGVTY2hvb2xzSnNvbmxkRmlsZShydW5PcHRpb25zKTtcclxuICB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWxldGVTY2hvb2xzSnNvbmxkRmlsZSA9IChcclxuICBvcHRpb25zOiBPcGVuRGF0YVN5bmNPcHRpb25zUGFydGlhbCA9IHt9XHJcbikgPT4ge1xyXG4gIGNvbnN0IHJ1bk9wdGlvbnMgPSBwcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcclxuXHJcbiAgaWYgKGV4aXN0c1N5bmMoZ2V0SnNvbmxkRmlsZVBhdGgocnVuT3B0aW9ucykpKSB7XHJcbiAgICBybVN5bmMoZ2V0SnNvbmxkRmlsZVBhdGgocnVuT3B0aW9ucykpO1xyXG4gIH1cclxufTtcclxuIl19
@@ -13,8 +13,8 @@ export interface OpenDataSyncOptions {
13
13
  polygonShpFileName: string;
14
14
  districtPolygonShpFileName: string;
15
15
  districtPolygonDbfFileName: string;
16
- schoolsXmlUrl: string;
17
- schoolsXmlFileName: string;
16
+ schoolsJsonldUrl: string;
17
+ schoolsJsonldFileName: string;
18
18
  regionsCsvUrl: string;
19
19
  regionsSchemaUrl: string;
20
20
  regionsCsvFileName: string;
@@ -33,8 +33,8 @@ export const prepareOptions = (options) => {
33
33
  polygonShpFileName: "OBEC_P.shp",
34
34
  districtPolygonShpFileName: "MOMC_P.shp",
35
35
  districtPolygonDbfFileName: "MOMC_P.dbf",
36
- schoolsXmlUrl: "https://rejstriky.msmt.cz/opendata/vrejcelk.xml",
37
- schoolsXmlFileName: "school-register.xml",
36
+ schoolsJsonldUrl: "https://lkod-ftp.msmt.gov.cz/00022985/88a7c12b-6084-4e47-8b50-46097c6e683f/RSSZ-cela-CR.jsonld",
37
+ schoolsJsonldFileName: "school-register.jsonld",
38
38
  regionsCsvUrl: "https://www.czso.cz/documents/10180/23208674/struktura_uzemi_cr.csv",
39
39
  regionsSchemaUrl: "https://www.czso.cz/documents/10180/23208674/struktura_uzemi_cr-metadata.json",
40
40
  regionsCsvFileName: "struktura_uzemi_cr.csv",
@@ -173,4 +173,4 @@ export function roundToNDecimalPlaces(toRound, decimalPlaces) {
173
173
  return (Math.round(toRound * Math.pow(10, decimalPlaces)) /
174
174
  Math.pow(10, decimalPlaces));
175
175
  }
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNwQyxPQUFPLEVBQVcsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO0FBeUI5QixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFXLEVBQUUsQ0FDNUMsSUFBSSxDQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTztJQUNqQixDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksUUFBUTtRQUMzQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsc0JBQXNCO1FBQzNDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsRUFDekMsT0FBTyxDQUNSLENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsT0FBbUMsRUFDZCxFQUFFO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksaUJBQWlCLEVBQUUsQ0FBQztJQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3hCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNwQjtJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMs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QUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ1IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO0tBQ1QsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNCLElBQ0UscUJBQXFCLENBQUMsS0FBSyxDQUFDO1lBQzVCLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDNUM7WUFDQSxrRUFBa0U7WUFDbEUsUUFBUSxJQUFJLEdBQUcsQ0FBQztTQUNqQjtLQUNGO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQVUsRUFBRTtJQUNqRSxNQUFNLE1BQU0sR0FBZSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDOUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNWLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2xCO0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNsQjtJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDckM7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDVixJQUFJLENBQUMsR0FBRyxDQUNOLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVztvQkFDN0IsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZO29CQUM5QixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlO3FCQUNyQyxHQUFHLENBQUMsQ0FBQzthQUNUO1NBQ0Y7S0FDRjtJQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxPQUFlLEVBQ2YsYUFBcUI7SUFFckIsT0FBTyxDQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUM1QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYyB9IGZyb20gXCJmc1wiO1xyXG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwib3NcIjtcclxuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCI7XHJcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwidXJsXCI7XHJcbmltcG9ydCB7IEZvdW5kZXIsIE11bmljaXBhbGl0eVR5cGUgfSBmcm9tIFwiLi4vZGIvdHlwZXNcIjtcclxuXHJcbmNvbnN0IGFwcE5hbWUgPSBcInRleHQtdG8tbWFwXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5EYXRhU3luY09wdGlvbnMge1xyXG4gIHRtcERpcjogc3RyaW5nO1xyXG4gIGRhdGFEaXI6IHN0cmluZztcclxuICBkYkZpbGVQYXRoOiBzdHJpbmc7XHJcbiAgZGJJbml0RmlsZVBhdGg6IHN0cmluZztcclxuICBhZGRyZXNzUG9pbnRzQXRvbVVybDogc3RyaW5nO1xyXG4gIGFkZHJlc3NQb2ludHNaaXBGaWxlTmFtZTogc3RyaW5nO1xyXG4gIGFkZHJlc3NQb2ludHNDc3ZGb2xkZXJOYW1lOiBzdHJpbmc7XHJcbiAgc3RyZWV0c0F0b21Vcmw6IHN0cmluZztcclxuICBzdHJlZXRaaXBGb2xkZXJOYW1lOiBzdHJpbmc7XHJcbiAgc3RyZWV0RGJmRmlsZU5hbWU6IHN0cmluZztcclxuICBwb2x5Z29uU2hwRmlsZU5hbWU6IHN0cmluZztcclxuICBkaXN0cmljdFBvbHlnb25TaHBGaWxlTmFtZTogc3RyaW5nO1xyXG4gIGRpc3RyaWN0UG9seWdvbkRiZkZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgc2Nob29sc1htbFVybDogc3RyaW5nO1xyXG4gIHNjaG9vbHNYbWxGaWxlTmFtZTogc3RyaW5nO1xyXG4gIHJlZ2lvbnNDc3ZVcmw6IHN0cmluZztcclxuICByZWdpb25zU2NoZW1hVXJsOiBzdHJpbmc7XHJcbiAgcmVnaW9uc0NzdkZpbGVOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE9wZW5EYXRhU3luY09wdGlvbnNQYXJ0aWFsID0gUGFydGlhbDxPcGVuRGF0YVN5bmNPcHRpb25zPjtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRBcHBEYXRhRGlyUGF0aCA9ICgpOiBzdHJpbmcgPT5cclxuICBqb2luKFxyXG4gICAgcHJvY2Vzcy5lbnYuQVBQREFUQSB8fFxyXG4gICAgICAocHJvY2Vzcy5wbGF0Zm9ybSA9PSBcImRhcndpblwiXHJcbiAgICAgICAgPyBwcm9jZXNzLmVudi5IT01FICsgXCIvTGlicmFyeS9QcmVmZXJlbmNlc1wiXHJcbiAgICAgICAgOiBwcm9jZXNzLmVudi5IT01FICsgXCIvLmxvY2FsL3NoYXJlXCIpLFxyXG4gICAgYXBwTmFtZVxyXG4gICk7XHJcblxyXG5leHBvcnQgY29uc3QgcHJlcGFyZU9wdGlvbnMgPSAoXHJcbiAgb3B0aW9uczogT3BlbkRhdGFTeW5jT3B0aW9uc1BhcnRpYWxcclxuKTogT3BlbkRhdGFTeW5jT3B0aW9ucyA9PiB7XHJcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpciA/PyBnZXRBcHBEYXRhRGlyUGF0aCgpO1xyXG4gIGlmICghZXhpc3RzU3luYyhkYXRhRGlyKSkge1xyXG4gICAgbWtkaXJTeW5jKGRhdGFEaXIpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdG1wQXBwRGlyID0gam9pbih0bXBkaXIoKSwgYXBwTmFtZSk7XHJcbiAgaWYgKCFleGlzdHNTeW5jKHRtcEFwcERpcikpIHtcclxuICAgIG1rZGlyU3luYyh0bXBBcHBEaXIpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcclxuICBjb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpO1xyXG5cclxuICBjb25zdCBkZWZhdWx0czogT3BlbkRhdGFTeW5jT3B0aW9ucyA9IHtcclxuICAgIHRtcERpcjogdG1wQXBwRGlyLFxyXG4gICAgZGF0YURpcjogZGF0YURpcixcclxuICAgIGRiRmlsZVBhdGg6IGpvaW4oZGF0YURpciwgXCJhZGRyZXNzX3BvaW50cy5kYlwiKSxcclxuICAgIGRiSW5pdEZpbGVQYXRoOiBqb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcImFkZHJlc3NfcG9pbnRzX2luaXQuZGJcIiksXHJcbiAgICBhZGRyZXNzUG9pbnRzQXRvbVVybDpcclxuICAgICAgXCJodHRwczovL2F0b20uY3V6ay5jei9SVUlBTi1DU1YtQURSLVNUL1JVSUFOLUNTVi1BRFItU1QueG1sXCIsXHJcbiAgICBhZGRyZXNzUG9pbnRzWmlwRmlsZU5hbWU6IFwicnVpYW5fY3N2LnppcFwiLFxyXG4gICAgYWRkcmVzc1BvaW50c0NzdkZvbGRlck5hbWU6IFwiQ1NWXCIsXHJcbiAgICBzdHJlZXRzQXRvbVVybDogXCJodHRwczovL2F0b20uY3V6ay5jei9SVUlBTi1PQkNFLVNIUC9SVUlBTi1PQkNFLVNIUC54bWxcIixcclxuICAgIHN0cmVldFppcEZvbGRlck5hbWU6IFwic3RyZWV0c1wiLFxyXG4gICAgc3RyZWV0RGJmRmlsZU5hbWU6IFwiVUxfTC5kYmZcIixcclxuICAgIHBvbHlnb25TaHBGaWxlTmFtZTogXCJPQkVDX1Auc2hwXCIsXHJcbiAgICBkaXN0cmljdFBvbHlnb25TaHBGaWxlTmFtZTogXCJNT01DX1Auc2hwXCIsXHJcbiAgICBkaXN0cmljdFBvbHlnb25EYmZGaWxlTmFtZTogXCJNT01DX1AuZGJmXCIsXHJcbiAgICBzY2hvb2xzWG1sVXJsOiBcImh0dHBzOi8vcmVqc3RyaWt5Lm1zbXQuY3ovb3BlbmRhdGEvdnJlamNlbGsueG1sXCIsXHJcbiAgICBzY2hvb2xzWG1sRmlsZU5hbWU6IFwic2Nob29sLXJlZ2lzdGVyLnhtbFwiLFxyXG4gICAgcmVnaW9uc0NzdlVybDpcclxuICAgICAgXCJodHRwczovL3d3dy5jenNvLmN6L2RvY3VtZW50cy8xMDE4MC8yMzIwODY3NC9zdHJ1a3R1cmFfdXplbWlfY3IuY3N2XCIsXHJcbiAgICByZWdpb25zU2NoZW1hVXJsOlxyXG4gICAgICBcImh0dHBzOi8vd3d3LmN6c28uY3ovZG9jdW1lbnRzLzEwMTgwLzIzMjA4Njc0L3N0cnVrdHVyYV91emVtaV9jci1tZXRhZGF0YS5qc29uXCIsXHJcbiAgICByZWdpb25zQ3N2RmlsZU5hbWU6IFwic3RydWt0dXJhX3V6ZW1pX2NyLmNzdlwiLFxyXG4gIH07XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAuLi5kZWZhdWx0cyxcclxuICAgIC4uLm9wdGlvbnMsXHJcbiAgfTtcclxufTtcclxuXHJcbmNvbnN0IGNpdHlQYXR0ZXJucyA9IFtcclxuICAvXltzU110YXR1dMOhcm7DrSBtxJtzdG8gKyguKikkLyxcclxuICAvXltvT11iZWMgKyguKikkLyxcclxuICAvXlttTV3Em3N0byArKC4qKSQvLFxyXG4gIC9eW21NXcSbc3R5cyArKC4qKSQvLFxyXG5dO1xyXG5cclxuY29uc3QgZGlzdHJpY3RQYXR0ZXJucyA9IFtcclxuICAvXlttTV3Em3N0c2vDoSDEjcOhc3QgKyguKikkLyxcclxuICAvXlttTV3Em3N0c2vDvSBvYnZvZCArKC4qKSQvLFxyXG4gIC9eW3NTXXRhdHV0w6FybsOtIG3Em3N0byArLiosIFttTV3Em3N0c2vDoSDEjcOhc3QgKyguKikkLyxcclxuICAvXltzU110YXR1dMOhcm7DrSBtxJtzdG8gKy4qLCBbbU1dxJtzdHNrw70gb2J2b2QgKyguKikkLyxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBleHRyYWN0TXVuaWNpcGFsaXR5TmFtZSA9IChmb3VuZGVyOiBGb3VuZGVyKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwYXR0ZXJucyA9XHJcbiAgICBmb3VuZGVyLm11bmljaXBhbGl0eVR5cGUgPT09IE11bmljaXBhbGl0eVR5cGUuQ2l0eVxyXG4gICAgICA/IGNpdHlQYXR0ZXJuc1xyXG4gICAgICA6IGRpc3RyaWN0UGF0dGVybnM7XHJcbiAgY29uc3QgY29ycmVjdFBhdHRlcm4gPSBwYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+XHJcbiAgICBwYXR0ZXJuLnRlc3QoZm91bmRlci5uYW1lKVxyXG4gICk7XHJcbiAgaWYgKGNvcnJlY3RQYXR0ZXJuLmxlbmd0aCA+IDApIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGNvcnJlY3RQYXR0ZXJuWzBdLmV4ZWMoZm91bmRlci5uYW1lKTtcclxuICAgIGlmICh0eXBlb2YgcmVzdWx0WzFdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgIHJldHVybiByZXN1bHRbMV1cclxuICAgICAgICAucmVwbGFjZShcIiAtIFwiLCBcIi1cIilcclxuICAgICAgICAucmVwbGFjZSgvXFxzezIsfS9nLCBcIiBcIilcclxuICAgICAgICAudHJpbSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGZvdW5kZXIubmFtZTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzYW5pdGl6ZU11bmljaXBhbGl0eU5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICByZXR1cm4gbmFtZVxyXG4gICAgLnJlcGxhY2UoXCIgLSBcIiwgXCItXCIpXHJcbiAgICAucmVwbGFjZSgvXFxzezIsfS9nLCBcIiBcIilcclxuICAgIC50cmltKCk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZmluZENsb3Nlc3RTdHJpbmcgPSAoXHJcbiAgc3RyOiBzdHJpbmcsXHJcbiAgYXJyOiBzdHJpbmdbXSxcclxuICBtYXhEaXN0YW5jZT86IG51bWJlclxyXG4pOiBzdHJpbmcgfCBudWxsID0+IHtcclxuICBsZXQgY2xvc2VzdFN0ciA9IFwiXCI7XHJcbiAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgY3VycmVudFN0ciA9IGFycltpXTtcclxuICAgIGNvbnN0IGRpc3RhbmNlID0gaW50ZXJwdW5jdGlvbkRpc3RhbmNlKHN0ciwgY3VycmVudFN0cik7XHJcblxyXG4gICAgaWYgKGRpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSB7XHJcbiAgICAgIGNsb3Nlc3RTdHIgPSBjdXJyZW50U3RyO1xyXG4gICAgICBjbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBleGFjdCBtYXRjaCBmb3VuZCwgZXhpdCBsb29wXHJcbiAgICBpZiAoY2xvc2VzdERpc3RhbmNlID09PSAwKSB7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKG1heERpc3RhbmNlICE9PSB1bmRlZmluZWQgJiYgY2xvc2VzdERpc3RhbmNlID4gbWF4RGlzdGFuY2UpIHtcclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNsb3Nlc3RTdHI7XHJcbn07XHJcblxyXG5jb25zdCBpbnRlcnB1bmN0aW9uRGlzdGFuY2UgPSAoc3RyMTogc3RyaW5nLCBzdHIyOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xyXG4gIGxldCBkaXN0YW5jZSA9IGxldmVuc2h0ZWluRGlzdGFuY2Uoc3RyMSwgc3RyMik7XHJcblxyXG4gIGNvbnN0IGludGVycHVuY3Rpb25NaXN0YWtlcyA9IHtcclxuICAgIGE6IFtcIsOhXCJdLFxyXG4gICAgw6E6IFtcImFcIl0sXHJcbiAgICBlOiBbXCLDqVwiLCBcIsSbXCJdLFxyXG4gICAgw6k6IFtcImVcIiwgXCLEm1wiXSxcclxuICAgIMSbOiBbXCJlXCIsIFwiw6lcIl0sXHJcbiAgICBpOiBbXCLDrVwiXSxcclxuICAgIMOtOiBbXCJpXCJdLFxyXG4gICAgeTogW1wiw71cIl0sXHJcbiAgICDDvTogW1wieVwiXSxcclxuICAgIG86IFtcIsOzXCJdLFxyXG4gICAgw7M6IFtcIm9cIl0sXHJcbiAgICB1OiBbXCLDulwiLCBcIsWvXCJdLFxyXG4gICAgxa86IFtcInVcIiwgXCLDulwiXSxcclxuICAgIMO6OiBbXCJ1XCIsIFwixa9cIl0sXHJcbiAgICBjOiBbXCLEjVwiXSxcclxuICAgIMSNOiBbXCJjXCJdLFxyXG4gICAgZDogW1wixI9cIl0sXHJcbiAgICDEjzogW1wiZFwiXSxcclxuICAgIG46IFtcIsWIXCJdLFxyXG4gICAgxYg6IFtcIm5cIl0sXHJcbiAgICByOiBbXCLFmVwiXSxcclxuICAgIMWZOiBbXCJyXCJdLFxyXG4gICAgczogW1wixaFcIl0sXHJcbiAgICDFoTogW1wic1wiXSxcclxuICAgIHQ6IFtcIsWlXCJdLFxyXG4gICAgxaU6IFtcInRcIl0sXHJcbiAgICB6OiBbXCLFvlwiXSxcclxuICAgIMW+OiBbXCJ6XCJdLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0IHN0cjFDaGFycyA9IHN0cjEuc3BsaXQoXCJcIik7XHJcbiAgY29uc3Qgc3RyMkNoYXJzID0gc3RyMi5zcGxpdChcIlwiKTtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIxQ2hhcnMubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGNoYXIxID0gc3RyMUNoYXJzW2ldO1xyXG4gICAgY29uc3QgY2hhcjIgPSBzdHIyQ2hhcnNbaV07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBpbnRlcnB1bmN0aW9uTWlzdGFrZXNbY2hhcjFdICYmXHJcbiAgICAgIGludGVycHVuY3Rpb25NaXN0YWtlc1tjaGFyMV0uaW5jbHVkZXMoY2hhcjIpXHJcbiAgICApIHtcclxuICAgICAgLy8gU3VidHJhY3QgYSBwZW5hbHR5IGZyb20gdGhlIGRpc3RhbmNlIGZvciBpbnRlcnB1bmN0aW9uIG1pc3Rha2VzXHJcbiAgICAgIGRpc3RhbmNlIC09IDAuNTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBkaXN0YW5jZTtcclxufTtcclxuXHJcbmNvbnN0IGxldmVuc2h0ZWluRGlzdGFuY2UgPSAoc3RyMTogc3RyaW5nLCBzdHIyOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xyXG4gIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXSA9IEFycmF5KHN0cjIubGVuZ3RoICsgMSlcclxuICAgIC5maWxsKG51bGwpXHJcbiAgICAubWFwKCgpID0+IEFycmF5KHN0cjEubGVuZ3RoICsgMSkuZmlsbChudWxsKSk7XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IHN0cjEubGVuZ3RoOyBpKyspIHtcclxuICAgIG1hdHJpeFswXVtpXSA9IGk7XHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBqID0gMDsgaiA8PSBzdHIyLmxlbmd0aDsgaisrKSB7XHJcbiAgICBtYXRyaXhbal1bMF0gPSBqO1xyXG4gIH1cclxuXHJcbiAgZm9yIChsZXQgaiA9IDE7IGogPD0gc3RyMi5sZW5ndGg7IGorKykge1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gc3RyMS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoc3RyMVtpIC0gMV0gPT09IHN0cjJbaiAtIDFdKSB7XHJcbiAgICAgICAgbWF0cml4W2pdW2ldID0gbWF0cml4W2ogLSAxXVtpIC0gMV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWF0cml4W2pdW2ldID1cclxuICAgICAgICAgIE1hdGgubWluKFxyXG4gICAgICAgICAgICBtYXRyaXhbal1baSAtIDFdLCAvLyBkZWxldGlvblxyXG4gICAgICAgICAgICBtYXRyaXhbaiAtIDFdW2ldLCAvLyBpbnNlcnRpb25cclxuICAgICAgICAgICAgbWF0cml4W2ogLSAxXVtpIC0gMV0gLy8gc3Vic3RpdHV0aW9uXHJcbiAgICAgICAgICApICsgMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG1hdHJpeFtzdHIyLmxlbmd0aF1bc3RyMS5sZW5ndGhdO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kVG9ORGVjaW1hbFBsYWNlcyhcclxuICB0b1JvdW5kOiBudW1iZXIsXHJcbiAgZGVjaW1hbFBsYWNlczogbnVtYmVyXHJcbik6IG51bWJlciB7XHJcbiAgcmV0dXJuIChcclxuICAgIE1hdGgucm91bmQodG9Sb3VuZCAqIE1hdGgucG93KDEwLCBkZWNpbWFsUGxhY2VzKSkgL1xyXG4gICAgTWF0aC5wb3coMTAsIGRlY2ltYWxQbGFjZXMpXHJcbiAgKTtcclxufVxyXG4iXX0=
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNwQyxPQUFPLEVBQVcsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO0FBeUI5QixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFXLEVBQUUsQ0FDNUMsSUFBSSxDQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTztJQUNqQixDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksUUFBUTtRQUMzQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsc0JBQXNCO1FBQzNDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsRUFDekMsT0FBTyxDQUNSLENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsT0FBbUMsRUFDZCxFQUFFO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksaUJBQWlCLEVBQUUsQ0FBQztJQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3hCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNwQjtJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMs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Q0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDUixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7S0FDVCxDQUFDO0lBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWpDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsSUFDRSxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7WUFDNUIscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUM1QztZQUNBLGtFQUFrRTtZQUNsRSxRQUFRLElBQUksR0FBRyxDQUFDO1NBQ2pCO0tBQ0Y7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFHLENBQUMsSUFBWSxFQUFFLElBQVksRUFBVSxFQUFFO0lBQ2pFLE1BQU0sTUFBTSxHQUFlLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ1YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRWhELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDbEI7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2xCO0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNWLElBQUksQ0FBQyxHQUFHLENBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXO29CQUM3QixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVk7b0JBQzlCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWU7cUJBQ3JDLEdBQUcsQ0FBQyxDQUFDO2FBQ1Q7U0FDRjtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUscUJBQXFCLENBQ25DLE9BQWUsRUFDZixhQUFxQjtJQUVyQixPQUFPLENBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQzVCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkaXJTeW5jIH0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJvc1wiO1xyXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIjtcclxuaW1wb3J0IHsgRm91bmRlciwgTXVuaWNpcGFsaXR5VHlwZSB9IGZyb20gXCIuLi9kYi90eXBlc1wiO1xyXG5cclxuY29uc3QgYXBwTmFtZSA9IFwidGV4dC10by1tYXBcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkRhdGFTeW5jT3B0aW9ucyB7XHJcbiAgdG1wRGlyOiBzdHJpbmc7XHJcbiAgZGF0YURpcjogc3RyaW5nO1xyXG4gIGRiRmlsZVBhdGg6IHN0cmluZztcclxuICBkYkluaXRGaWxlUGF0aDogc3RyaW5nO1xyXG4gIGFkZHJlc3NQb2ludHNBdG9tVXJsOiBzdHJpbmc7XHJcbiAgYWRkcmVzc1BvaW50c1ppcEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgYWRkcmVzc1BvaW50c0NzdkZvbGRlck5hbWU6IHN0cmluZztcclxuICBzdHJlZXRzQXRvbVVybDogc3RyaW5nO1xyXG4gIHN0cmVldFppcEZvbGRlck5hbWU6IHN0cmluZztcclxuICBzdHJlZXREYmZGaWxlTmFtZTogc3RyaW5nO1xyXG4gIHBvbHlnb25TaHBGaWxlTmFtZTogc3RyaW5nO1xyXG4gIGRpc3RyaWN0UG9seWdvblNocEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgZGlzdHJpY3RQb2x5Z29uRGJmRmlsZU5hbWU6IHN0cmluZztcclxuICBzY2hvb2xzSnNvbmxkVXJsOiBzdHJpbmc7XHJcbiAgc2Nob29sc0pzb25sZEZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgcmVnaW9uc0NzdlVybDogc3RyaW5nO1xyXG4gIHJlZ2lvbnNTY2hlbWFVcmw6IHN0cmluZztcclxuICByZWdpb25zQ3N2RmlsZU5hbWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgT3BlbkRhdGFTeW5jT3B0aW9uc1BhcnRpYWwgPSBQYXJ0aWFsPE9wZW5EYXRhU3luY09wdGlvbnM+O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEFwcERhdGFEaXJQYXRoID0gKCk6IHN0cmluZyA9PlxyXG4gIGpvaW4oXHJcbiAgICBwcm9jZXNzLmVudi5BUFBEQVRBIHx8XHJcbiAgICAgIChwcm9jZXNzLnBsYXRmb3JtID09IFwiZGFyd2luXCJcclxuICAgICAgICA/IHByb2Nlc3MuZW52LkhPTUUgKyBcIi9MaWJyYXJ5L1ByZWZlcmVuY2VzXCJcclxuICAgICAgICA6IHByb2Nlc3MuZW52LkhPTUUgKyBcIi8ubG9jYWwvc2hhcmVcIiksXHJcbiAgICBhcHBOYW1lXHJcbiAgKTtcclxuXHJcbmV4cG9ydCBjb25zdCBwcmVwYXJlT3B0aW9ucyA9IChcclxuICBvcHRpb25zOiBPcGVuRGF0YVN5bmNPcHRpb25zUGFydGlhbFxyXG4pOiBPcGVuRGF0YVN5bmNPcHRpb25zID0+IHtcclxuICBjb25zdCBkYXRhRGlyID0gb3B0aW9ucy5kYXRhRGlyID8/IGdldEFwcERhdGFEaXJQYXRoKCk7XHJcbiAgaWYgKCFleGlzdHNTeW5jKGRhdGFEaXIpKSB7XHJcbiAgICBta2RpclN5bmMoZGF0YURpcik7XHJcbiAgfVxyXG5cclxuICBjb25zdCB0bXBBcHBEaXIgPSBqb2luKHRtcGRpcigpLCBhcHBOYW1lKTtcclxuICBpZiAoIWV4aXN0c1N5bmModG1wQXBwRGlyKSkge1xyXG4gICAgbWtkaXJTeW5jKHRtcEFwcERpcik7XHJcbiAgfVxyXG5cclxuICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xyXG4gIGNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSk7XHJcblxyXG4gIGNvbnN0IGRlZmF1bHRzOiBPcGVuRGF0YVN5bmNPcHRpb25zID0ge1xyXG4gICAgdG1wRGlyOiB0bXBBcHBEaXIsXHJcbiAgICBkYXRhRGlyOiBkYXRhRGlyLFxyXG4gICAgZGJGaWxlUGF0aDogam9pbihkYXRhRGlyLCBcImFkZHJlc3NfcG9pbnRzLmRiXCIpLFxyXG4gICAgZGJJbml0RmlsZVBhdGg6IGpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiYWRkcmVzc19wb2ludHNfaW5pdC5kYlwiKSxcclxuICAgIGFkZHJlc3NQb2ludHNBdG9tVXJsOlxyXG4gICAgICBcImh0dHBzOi8vYXRvbS5jdXprLmN6L1JVSUFOLUNTVi1BRFItU1QvUlVJQU4tQ1NWLUFEUi1TVC54bWxcIixcclxuICAgIGFkZHJlc3NQb2ludHNaaXBGaWxlTmFtZTogXCJydWlhbl9jc3YuemlwXCIsXHJcbiAgICBhZGRyZXNzUG9pbnRzQ3N2Rm9sZGVyTmFtZTogXCJDU1ZcIixcclxuICAgIHN0cmVldHNBdG9tVXJsOiBcImh0dHBzOi8vYXRvbS5jdXprLmN6L1JVSUFOLU9CQ0UtU0hQL1JVSUFOLU9CQ0UtU0hQLnhtbFwiLFxyXG4gICAgc3RyZWV0WmlwRm9sZGVyTmFtZTogXCJzdHJlZXRzXCIsXHJcbiAgICBzdHJlZXREYmZGaWxlTmFtZTogXCJVTF9MLmRiZlwiLFxyXG4gICAgcG9seWdvblNocEZpbGVOYW1lOiBcIk9CRUNfUC5zaHBcIixcclxuICAgIGRpc3RyaWN0UG9seWdvblNocEZpbGVOYW1lOiBcIk1PTUNfUC5zaHBcIixcclxuICAgIGRpc3RyaWN0UG9seWdvbkRiZkZpbGVOYW1lOiBcIk1PTUNfUC5kYmZcIixcclxuICAgIHNjaG9vbHNKc29ubGRVcmw6IFwiaHR0cHM6Ly9sa29kLWZ0cC5tc210Lmdvdi5jei8wMDAyMjk4NS84OGE3YzEyYi02MDg0LTRlNDctOGI1MC00NjA5N2M2ZTY4M2YvUlNTWi1jZWxhLUNSLmpzb25sZFwiLFxyXG4gICAgc2Nob29sc0pzb25sZEZpbGVOYW1lOiBcInNjaG9vbC1yZWdpc3Rlci5qc29ubGRcIixcclxuICAgIHJlZ2lvbnNDc3ZVcmw6XHJcbiAgICAgIFwiaHR0cHM6Ly93d3cuY3pzby5jei9kb2N1bWVudHMvMTAxODAvMjMyMDg2NzQvc3RydWt0dXJhX3V6ZW1pX2NyLmNzdlwiLFxyXG4gICAgcmVnaW9uc1NjaGVtYVVybDpcclxuICAgICAgXCJodHRwczovL3d3dy5jenNvLmN6L2RvY3VtZW50cy8xMDE4MC8yMzIwODY3NC9zdHJ1a3R1cmFfdXplbWlfY3ItbWV0YWRhdGEuanNvblwiLFxyXG4gICAgcmVnaW9uc0NzdkZpbGVOYW1lOiBcInN0cnVrdHVyYV91emVtaV9jci5jc3ZcIixcclxuICB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgLi4uZGVmYXVsdHMsXHJcbiAgICAuLi5vcHRpb25zLFxyXG4gIH07XHJcbn07XHJcblxyXG5jb25zdCBjaXR5UGF0dGVybnMgPSBbXHJcbiAgL15bc1NddGF0dXTDoXJuw60gbcSbc3RvICsoLiopJC8sXHJcbiAgL15bb09dYmVjICsoLiopJC8sXHJcbiAgL15bbU1dxJtzdG8gKyguKikkLyxcclxuICAvXlttTV3Em3N0eXMgKyguKikkLyxcclxuXTtcclxuXHJcbmNvbnN0IGRpc3RyaWN0UGF0dGVybnMgPSBbXHJcbiAgL15bbU1dxJtzdHNrw6EgxI3DoXN0ICsoLiopJC8sXHJcbiAgL15bbU1dxJtzdHNrw70gb2J2b2QgKyguKikkLyxcclxuICAvXltzU110YXR1dMOhcm7DrSBtxJtzdG8gKy4qLCBbbU1dxJtzdHNrw6EgxI3DoXN0ICsoLiopJC8sXHJcbiAgL15bc1NddGF0dXTDoXJuw60gbcSbc3RvICsuKiwgW21NXcSbc3Rza8O9IG9idm9kICsoLiopJC8sXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgZXh0cmFjdE11bmljaXBhbGl0eU5hbWUgPSAoZm91bmRlcjogRm91bmRlcik6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGF0dGVybnMgPVxyXG4gICAgZm91bmRlci5tdW5pY2lwYWxpdHlUeXBlID09PSBNdW5pY2lwYWxpdHlUeXBlLkNpdHlcclxuICAgICAgPyBjaXR5UGF0dGVybnNcclxuICAgICAgOiBkaXN0cmljdFBhdHRlcm5zO1xyXG4gIGNvbnN0IGNvcnJlY3RQYXR0ZXJuID0gcGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PlxyXG4gICAgcGF0dGVybi50ZXN0KGZvdW5kZXIubmFtZSlcclxuICApO1xyXG4gIGlmIChjb3JyZWN0UGF0dGVybi5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBjb3JyZWN0UGF0dGVyblswXS5leGVjKGZvdW5kZXIubmFtZSk7XHJcbiAgICBpZiAodHlwZW9mIHJlc3VsdFsxXSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICByZXR1cm4gcmVzdWx0WzFdXHJcbiAgICAgICAgLnJlcGxhY2UoXCIgLSBcIiwgXCItXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcc3syLH0vZywgXCIgXCIpXHJcbiAgICAgICAgLnRyaW0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmb3VuZGVyLm5hbWU7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc2FuaXRpemVNdW5pY2lwYWxpdHlOYW1lID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgcmV0dXJuIG5hbWVcclxuICAgIC5yZXBsYWNlKFwiIC0gXCIsIFwiLVwiKVxyXG4gICAgLnJlcGxhY2UoL1xcc3syLH0vZywgXCIgXCIpXHJcbiAgICAudHJpbSgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGZpbmRDbG9zZXN0U3RyaW5nID0gKFxyXG4gIHN0cjogc3RyaW5nLFxyXG4gIGFycjogc3RyaW5nW10sXHJcbiAgbWF4RGlzdGFuY2U/OiBudW1iZXJcclxuKTogc3RyaW5nIHwgbnVsbCA9PiB7XHJcbiAgbGV0IGNsb3Nlc3RTdHIgPSBcIlwiO1xyXG4gIGxldCBjbG9zZXN0RGlzdGFuY2UgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGN1cnJlbnRTdHIgPSBhcnJbaV07XHJcbiAgICBjb25zdCBkaXN0YW5jZSA9IGludGVycHVuY3Rpb25EaXN0YW5jZShzdHIsIGN1cnJlbnRTdHIpO1xyXG5cclxuICAgIGlmIChkaXN0YW5jZSA8IGNsb3Nlc3REaXN0YW5jZSkge1xyXG4gICAgICBjbG9zZXN0U3RyID0gY3VycmVudFN0cjtcclxuICAgICAgY2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXhhY3QgbWF0Y2ggZm91bmQsIGV4aXQgbG9vcFxyXG4gICAgaWYgKGNsb3Nlc3REaXN0YW5jZSA9PT0gMCkge1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChtYXhEaXN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIGNsb3Nlc3REaXN0YW5jZSA+IG1heERpc3RhbmNlKSB7XHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbG9zZXN0U3RyO1xyXG59O1xyXG5cclxuY29uc3QgaW50ZXJwdW5jdGlvbkRpc3RhbmNlID0gKHN0cjE6IHN0cmluZywgc3RyMjogc3RyaW5nKTogbnVtYmVyID0+IHtcclxuICBsZXQgZGlzdGFuY2UgPSBsZXZlbnNodGVpbkRpc3RhbmNlKHN0cjEsIHN0cjIpO1xyXG5cclxuICBjb25zdCBpbnRlcnB1bmN0aW9uTWlzdGFrZXMgPSB7XHJcbiAgICBhOiBbXCLDoVwiXSxcclxuICAgIMOhOiBbXCJhXCJdLFxyXG4gICAgZTogW1wiw6lcIiwgXCLEm1wiXSxcclxuICAgIMOpOiBbXCJlXCIsIFwixJtcIl0sXHJcbiAgICDEmzogW1wiZVwiLCBcIsOpXCJdLFxyXG4gICAgaTogW1wiw61cIl0sXHJcbiAgICDDrTogW1wiaVwiXSxcclxuICAgIHk6IFtcIsO9XCJdLFxyXG4gICAgw706IFtcInlcIl0sXHJcbiAgICBvOiBbXCLDs1wiXSxcclxuICAgIMOzOiBbXCJvXCJdLFxyXG4gICAgdTogW1wiw7pcIiwgXCLFr1wiXSxcclxuICAgIMWvOiBbXCJ1XCIsIFwiw7pcIl0sXHJcbiAgICDDujogW1widVwiLCBcIsWvXCJdLFxyXG4gICAgYzogW1wixI1cIl0sXHJcbiAgICDEjTogW1wiY1wiXSxcclxuICAgIGQ6IFtcIsSPXCJdLFxyXG4gICAgxI86IFtcImRcIl0sXHJcbiAgICBuOiBbXCLFiFwiXSxcclxuICAgIMWIOiBbXCJuXCJdLFxyXG4gICAgcjogW1wixZlcIl0sXHJcbiAgICDFmTogW1wiclwiXSxcclxuICAgIHM6IFtcIsWhXCJdLFxyXG4gICAgxaE6IFtcInNcIl0sXHJcbiAgICB0OiBbXCLFpVwiXSxcclxuICAgIMWlOiBbXCJ0XCJdLFxyXG4gICAgejogW1wixb5cIl0sXHJcbiAgICDFvjogW1wielwiXSxcclxuICB9O1xyXG5cclxuICBjb25zdCBzdHIxQ2hhcnMgPSBzdHIxLnNwbGl0KFwiXCIpO1xyXG4gIGNvbnN0IHN0cjJDaGFycyA9IHN0cjIuc3BsaXQoXCJcIik7XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyMUNoYXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBjaGFyMSA9IHN0cjFDaGFyc1tpXTtcclxuICAgIGNvbnN0IGNoYXIyID0gc3RyMkNoYXJzW2ldO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgaW50ZXJwdW5jdGlvbk1pc3Rha2VzW2NoYXIxXSAmJlxyXG4gICAgICBpbnRlcnB1bmN0aW9uTWlzdGFrZXNbY2hhcjFdLmluY2x1ZGVzKGNoYXIyKVxyXG4gICAgKSB7XHJcbiAgICAgIC8vIFN1YnRyYWN0IGEgcGVuYWx0eSBmcm9tIHRoZSBkaXN0YW5jZSBmb3IgaW50ZXJwdW5jdGlvbiBtaXN0YWtlc1xyXG4gICAgICBkaXN0YW5jZSAtPSAwLjU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGlzdGFuY2U7XHJcbn07XHJcblxyXG5jb25zdCBsZXZlbnNodGVpbkRpc3RhbmNlID0gKHN0cjE6IHN0cmluZywgc3RyMjogc3RyaW5nKTogbnVtYmVyID0+IHtcclxuICBjb25zdCBtYXRyaXg6IG51bWJlcltdW10gPSBBcnJheShzdHIyLmxlbmd0aCArIDEpXHJcbiAgICAuZmlsbChudWxsKVxyXG4gICAgLm1hcCgoKSA9PiBBcnJheShzdHIxLmxlbmd0aCArIDEpLmZpbGwobnVsbCkpO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdHIxLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBtYXRyaXhbMF1baV0gPSBpO1xyXG4gIH1cclxuXHJcbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gc3RyMi5sZW5ndGg7IGorKykge1xyXG4gICAgbWF0cml4W2pdWzBdID0gajtcclxuICB9XHJcblxyXG4gIGZvciAobGV0IGogPSAxOyBqIDw9IHN0cjIubGVuZ3RoOyBqKyspIHtcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHN0cjEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHN0cjFbaSAtIDFdID09PSBzdHIyW2ogLSAxXSkge1xyXG4gICAgICAgIG1hdHJpeFtqXVtpXSA9IG1hdHJpeFtqIC0gMV1baSAtIDFdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hdHJpeFtqXVtpXSA9XHJcbiAgICAgICAgICBNYXRoLm1pbihcclxuICAgICAgICAgICAgbWF0cml4W2pdW2kgLSAxXSwgLy8gZGVsZXRpb25cclxuICAgICAgICAgICAgbWF0cml4W2ogLSAxXVtpXSwgLy8gaW5zZXJ0aW9uXHJcbiAgICAgICAgICAgIG1hdHJpeFtqIC0gMV1baSAtIDFdIC8vIHN1YnN0aXR1dGlvblxyXG4gICAgICAgICAgKSArIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBtYXRyaXhbc3RyMi5sZW5ndGhdW3N0cjEubGVuZ3RoXTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByb3VuZFRvTkRlY2ltYWxQbGFjZXMoXHJcbiAgdG9Sb3VuZDogbnVtYmVyLFxyXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlclxyXG4pOiBudW1iZXIge1xyXG4gIHJldHVybiAoXHJcbiAgICBNYXRoLnJvdW5kKHRvUm91bmQgKiBNYXRoLnBvdygxMCwgZGVjaW1hbFBsYWNlcykpIC9cclxuICAgIE1hdGgucG93KDEwLCBkZWNpbWFsUGxhY2VzKVxyXG4gICk7XHJcbn1cclxuIl19
package/package.json CHANGED
@@ -11,8 +11,8 @@
11
11
  "@turf/truncate": "^6.5.0",
12
12
  "@turf/union": "^7.0.0-alpha.113",
13
13
  "adm-zip": "^0.5.9",
14
- "better-sqlite3": "^8.0.1",
15
- "chevrotain": "^10.4.2",
14
+ "better-sqlite3": "^11.0.0",
15
+ "chevrotain": "^12.0.0",
16
16
  "csv-parse": "^5.3.3",
17
17
  "czech-address": "^1.0.1",
18
18
  "d3-delaunay": "^6.0.4",
@@ -29,19 +29,20 @@
29
29
  "node-fetch": "^3.3.0",
30
30
  "parsedbf": "^1.1.1",
31
31
  "pg": "^8.11.1",
32
- "sax": "^1.2.4",
33
32
  "shp-to-geojson": "^1.0.0",
33
+ "stream-json": "^1.8.0",
34
34
  "typescript": "^4.9.4"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@chevrotain/types": "^10.5.0",
38
38
  "@jest/globals": "^29.5.0",
39
39
  "@types/adm-zip": "^0.5.0",
40
- "@types/better-sqlite3": "^7.6.3",
40
+ "@types/better-sqlite3": "^7.6.8",
41
41
  "@types/d3-delaunay": "^6.0.4",
42
42
  "@types/feedparser": "^2.2.5",
43
43
  "@types/lodash": "^4.14.196",
44
44
  "@types/node": "^18.11.17",
45
+ "@types/stream-json": "^1.7.7",
45
46
  "copyfiles": "^2.4.1",
46
47
  "jest": "^29.5.0",
47
48
  "npm-run-all": "^1.7.0",
@@ -74,7 +75,7 @@
74
75
  },
75
76
  "name": "text-to-map",
76
77
  "description": "Text To Map usiluje o lepší, strojově zpracovatelné využití částí vyhlášek s výčtem ulic a dalších lokací. Jde o rozšiřitelnou sadu konceptů a nástrojů, které zajistí hladký převod výčtu ulic a jejich rozsahů v lidsky srozumitelném jazyce do strojově zpracovatelného, uchopitelného formátu.",
77
- "version": "1.1.43",
78
+ "version": "1.1.44",
78
79
  "main": "dist/index.js",
79
80
  "types": "dist/index.d.ts",
80
81
  "files": [