text-to-map 1.1.29 → 1.1.30
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.
- package/dist/bin/clear-all.js +8 -19
- package/dist/bin/init-db.js +5 -16
- package/dist/bin/knex.js +6 -17
- package/dist/bin/parse-ordinance.js +60 -71
- package/dist/bin/polygons.js +22 -33
- package/dist/db/address-points.js +43 -54
- package/dist/db/cities.js +25 -31
- package/dist/db/db.js +24 -33
- package/dist/db/founders.js +101 -89
- package/dist/db/meta.js +12 -21
- package/dist/db/migrations/20230704125715_initial.js +291 -304
- package/dist/db/migrations/20230731232915_city_positions.js +9 -22
- package/dist/db/migrations/20240106224603_city_polygon.js +7 -20
- package/dist/db/migrations/20240320200534_district_polygon.js +7 -20
- package/dist/db/migrations/20240729211323_ordinance_city.js +11 -0
- package/dist/db/regions.js +20 -29
- package/dist/db/schools.d.ts +1 -1
- package/dist/db/schools.js +18 -24
- package/dist/db/street-sync.js +13 -22
- package/dist/db/sync-log.js +25 -34
- package/dist/index.js +10 -21
- package/dist/open-data-sync/address-points.js +21 -30
- package/dist/open-data-sync/cities.js +10 -19
- package/dist/open-data-sync/common.js +8 -17
- package/dist/open-data-sync/regions.js +13 -22
- package/dist/open-data-sync/schools.js +20 -29
- package/dist/open-data-sync/streets.js +29 -35
- package/dist/smd-to-csv/ordinance-to-csv-rules.js +4 -13
- package/dist/smd-to-csv/txt-to-json.js +59 -70
- package/dist/street-markdown/municipality.js +26 -29
- package/dist/street-markdown/polygons.d.ts +4 -4
- package/dist/street-markdown/polygons.js +127 -70
- package/dist/street-markdown/smd-line-parser.js +6 -9
- package/dist/street-markdown/smd-parser.js +2 -3
- package/dist/street-markdown/smd.d.ts +7 -1
- package/dist/street-markdown/smd.js +180 -152
- package/dist/street-markdown/types.d.ts +19 -10
- package/dist/street-markdown/types.js +1 -1
- package/dist/utils/atom.js +9 -18
- package/dist/utils/helpers.d.ts +1 -1
- package/dist/utils/helpers.js +10 -5
- package/package.json +5 -1
package/dist/db/db.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { configDotenv } from "dotenv";
|
|
11
2
|
import knex from "knex";
|
|
12
3
|
import { dirname, join } from "path";
|
|
@@ -35,7 +26,7 @@ let _knexDb = undefined;
|
|
|
35
26
|
let _knexDbConfig = undefined;
|
|
36
27
|
export const getKnexDb = (config = {}) => {
|
|
37
28
|
if (_knexDb === undefined) {
|
|
38
|
-
_knexDbConfig =
|
|
29
|
+
_knexDbConfig = { ...defaults, ...getEnvConfig(), ...config };
|
|
39
30
|
if (_knexDbConfig.dbType === SupportedDbType.sqlite) {
|
|
40
31
|
_knexDb = knex({
|
|
41
32
|
client: DbClient[SupportedDbType.sqlite],
|
|
@@ -93,23 +84,23 @@ export const isMysql = (knex) => {
|
|
|
93
84
|
const getMigrationConfig = () => {
|
|
94
85
|
return { directory: join(__dirname, "migrations") };
|
|
95
86
|
};
|
|
96
|
-
export const initDb = (config = {}) =>
|
|
87
|
+
export const initDb = async (config = {}) => {
|
|
97
88
|
const knex = getKnexDb(config);
|
|
98
|
-
|
|
89
|
+
await knex.migrate.latest(getMigrationConfig());
|
|
99
90
|
return knex;
|
|
100
|
-
}
|
|
101
|
-
export const clearDb = (config = {}) =>
|
|
91
|
+
};
|
|
92
|
+
export const clearDb = async (config = {}) => {
|
|
102
93
|
const knex = getKnexDb(config);
|
|
103
|
-
|
|
104
|
-
|
|
94
|
+
await knex.migrate.rollback(getMigrationConfig(), true);
|
|
95
|
+
await knex.migrate.latest(getMigrationConfig());
|
|
105
96
|
return knex;
|
|
106
|
-
}
|
|
107
|
-
export const disconnectKnex = () =>
|
|
97
|
+
};
|
|
98
|
+
export const disconnectKnex = async () => {
|
|
108
99
|
if (_knexDb) {
|
|
109
|
-
|
|
100
|
+
await _knexDb.destroy();
|
|
110
101
|
_knexDb = undefined;
|
|
111
102
|
}
|
|
112
|
-
}
|
|
103
|
+
};
|
|
113
104
|
const getEnvConfig = () => {
|
|
114
105
|
configDotenv({ path: ".env.local" });
|
|
115
106
|
const envConfig = {};
|
|
@@ -143,42 +134,42 @@ const getEnvConfig = () => {
|
|
|
143
134
|
export const nonEmptyOrNull = (value) => {
|
|
144
135
|
return value ? value : null;
|
|
145
136
|
};
|
|
146
|
-
export const rawQuery = (query, ...bindings) =>
|
|
137
|
+
export const rawQuery = async (query, ...bindings) => {
|
|
147
138
|
const knex = getKnexDb();
|
|
148
|
-
const result =
|
|
139
|
+
const result = await knex.raw(query, ...bindings);
|
|
149
140
|
return isMysql(knex) ? result[0] : result;
|
|
150
|
-
}
|
|
141
|
+
};
|
|
151
142
|
/**
|
|
152
143
|
* Efficiently insert multiple rows. If preventDuplicatesByFirstColumn is true, the first
|
|
153
144
|
* column should be unique (PK or UNIQUE).
|
|
154
145
|
*/
|
|
155
|
-
export const insertMultipleRows = (rows, table, columnNames, preventDuplicates = true) =>
|
|
146
|
+
export const insertMultipleRows = async (rows, table, columnNames, preventDuplicates = true) => {
|
|
156
147
|
if (rows.length === 0) {
|
|
157
148
|
return 0;
|
|
158
149
|
}
|
|
159
150
|
const insertPlaceholders = generate2DPlaceholders(columnNames.length, rows.length);
|
|
160
151
|
const knex = getKnexDb();
|
|
161
152
|
const onConfict = preventDuplicates && !isMysql(knex) ? `ON CONFLICT DO NOTHING` : "";
|
|
162
|
-
|
|
153
|
+
await rawQuery(`INSERT ${isMysql(knex) ? "IGNORE" : ""} INTO ${table} (${columnNames.join(",")}) VALUES ${insertPlaceholders} ${onConfict}`, rows.flat());
|
|
163
154
|
return rows.length;
|
|
164
|
-
}
|
|
155
|
+
};
|
|
165
156
|
/**
|
|
166
157
|
* Insert a single row and return the autoincremented ID.
|
|
167
158
|
*/
|
|
168
|
-
export const insertAutoincrementRow = (row, table, columnNames) =>
|
|
159
|
+
export const insertAutoincrementRow = async (row, table, columnNames) => {
|
|
169
160
|
const data = columnNames.reduce((obj, columnName, index) => {
|
|
170
161
|
obj[columnName] = row[index];
|
|
171
162
|
return obj;
|
|
172
163
|
}, {});
|
|
173
|
-
const result =
|
|
164
|
+
const result = await getKnexDb().insert(data).into(table);
|
|
174
165
|
return result ? Number(result) : null;
|
|
175
|
-
}
|
|
176
|
-
export const deleteMultipleRowsKnex = (keys, table, keyColumnName) =>
|
|
166
|
+
};
|
|
167
|
+
export const deleteMultipleRowsKnex = async (keys, table, keyColumnName) => {
|
|
177
168
|
if (keys.length === 0) {
|
|
178
169
|
return;
|
|
179
170
|
}
|
|
180
|
-
|
|
181
|
-
}
|
|
171
|
+
await getKnexDb().from(table).whereIn(keyColumnName, keys).del();
|
|
172
|
+
};
|
|
182
173
|
const generateRepetitiveString = (value, glue, n) => {
|
|
183
174
|
return new Array(n).fill(value).join(glue);
|
|
184
175
|
};
|
|
@@ -197,4 +188,4 @@ export const extractKeyValuesPairs = (array, keyIndex, valuesIndices) => {
|
|
|
197
188
|
}, {});
|
|
198
189
|
return Object.keys(object).map((key) => [key, ...object[key]]);
|
|
199
190
|
};
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLElBQWMsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQVdwQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFFdEMsTUFBTSxDQUFOLElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN6QixvQ0FBaUIsQ0FBQTtJQUNqQix3Q0FBcUIsQ0FBQTtJQUNyQixrQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxlQUFlLEtBQWYsZUFBZSxRQUkxQjtBQUVELE1BQU0sNEJBQTRCLEdBQUcseUNBQXlDLENBQUM7QUFFL0UsTUFBTSxRQUFRLEdBQUc7SUFDZixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDMUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSTtJQUNoQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPO0NBQ2pDLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBYTtJQUN6QixNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU07SUFDOUIsUUFBUSxFQUFFLG1CQUFtQjtJQUM3QixZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLENBQUM7SUFDN0QsT0FBTyxFQUFFLEtBQUs7Q0FDZixDQUFDO0FBRUYsSUFBSSxPQUFPLEdBQVMsU0FBUyxDQUFDO0FB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RUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZ0RvdGVudiB9IGZyb20gXCJkb3RlbnZcIjtcclxuaW1wb3J0IGtuZXgsIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XHJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcInVybFwiO1xyXG5cclxuaW50ZXJmYWNlIERiQ29uZmlnIHtcclxuICBkYlR5cGU6IFN1cHBvcnRlZERiVHlwZTtcclxuICBwZ0Nvbm5lY3Rpb25TdHJpbmc/OiBzdHJpbmc7XHJcbiAgbXlzcWxDb25uZWN0aW9uU3RyaW5nPzogc3RyaW5nO1xyXG4gIGluaXRGaWxlUGF0aDogc3RyaW5nO1xyXG4gIGZpbGVQYXRoPzogc3RyaW5nO1xyXG4gIHZlcmJvc2U6IGJvb2xlYW47XHJcbn1cclxuXHJcbmNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XHJcbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSk7XHJcblxyXG5leHBvcnQgZW51bSBTdXBwb3J0ZWREYlR5cGUge1xyXG4gIHNxbGl0ZSA9IFwic3FsaXRlXCIsXHJcbiAgcG9zdGdyZXMgPSBcInBvc3RncmVzXCIsXHJcbiAgbXlzcWwgPSBcIm15c3FsXCIsXHJcbn1cclxuXHJcbmNvbnN0IG15c3FsQ29ubmVjdGlvblN0cmluZ1BhdHRlcm4gPSAvXihbXjpdKyk6KFxcZCspOihbXjpdKyk6KFteOl0rKTooW146XSspJC87XHJcblxyXG5jb25zdCBEYkNsaWVudCA9IHtcclxuICBbU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZV06IFwiYmV0dGVyLXNxbGl0ZTNcIixcclxuICBbU3VwcG9ydGVkRGJUeXBlLnBvc3RncmVzXTogXCJwZ1wiLFxyXG4gIFtTdXBwb3J0ZWREYlR5cGUubXlzcWxdOiBcIm15c3FsXCIsXHJcbn07XHJcblxyXG5jb25zdCBkZWZhdWx0czogRGJDb25maWcgPSB7XHJcbiAgZGJUeXBlOiBTdXBwb3J0ZWREYlR5cGUuc3FsaXRlLFxyXG4gIGZpbGVQYXRoOiBcImFkZHJlc3NfcG9pbnRzLmRiXCIsXHJcbiAgaW5pdEZpbGVQYXRoOiBqb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcImFkZHJlc3NfcG9pbnRzX2luaXQuZGJcIiksXHJcbiAgdmVyYm9zZTogZmFsc2UsXHJcbn07XHJcblxyXG5sZXQgX2tuZXhEYjogS25leCA9IHVuZGVmaW5lZDtcclxubGV0IF9rbmV4RGJDb25maWc6IERiQ29uZmlnID0gdW5kZWZpbmVkO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEtuZXhEYiA9IChjb25maWc6IFBhcnRpYWw8RGJDb25maWc+ID0ge30pOiBLbmV4ID0+IHtcclxuICBpZiAoX2tuZXhEYiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBfa25leERiQ29uZmlnID0geyAuLi5kZWZhdWx0cywgLi4uZ2V0RW52Q29uZmlnKCksIC4uLmNvbmZpZyB9O1xyXG5cclxuICAgIGlmIChfa25leERiQ29uZmlnLmRiVHlwZSA9PT0gU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZSkge1xyXG4gICAgICBfa25leERiID0ga25leCh7XHJcbiAgICAgICAgY2xpZW50OiBEYkNsaWVudFtTdXBwb3J0ZWREYlR5cGUuc3FsaXRlXSxcclxuICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICBmaWxlbmFtZTogX2tuZXhEYkNvbmZpZy5maWxlUGF0aCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBvb2w6IHtcclxuICAgICAgICAgIGFmdGVyQ3JlYXRlOiAoZGI6IGFueSwgZG9uZTogRnVuY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgZGIucHJhZ21hKFwiam91cm5hbF9tb2RlID0gV0FMO1wiKTtcclxuICAgICAgICAgICAgZG9uZShmYWxzZSwgZG9uZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXNlTnVsbEFzRGVmYXVsdDogdHJ1ZSxcclxuICAgICAgICBkZWJ1ZzogX2tuZXhEYkNvbmZpZy52ZXJib3NlLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoX2tuZXhEYkNvbmZpZy5kYlR5cGUgPT09IFN1cHBvcnRlZERiVHlwZS5wb3N0Z3Jlcykge1xyXG4gICAgICBfa25leERiID0ga25leCh7XHJcbiAgICAgICAgY2xpZW50OiBEYkNsaWVudFtTdXBwb3J0ZWREYlR5cGUucG9zdGdyZXNdLFxyXG4gICAgICAgIGNvbm5lY3Rpb246IF9rbmV4RGJDb25maWcucGdDb25uZWN0aW9uU3RyaW5nLFxyXG4gICAgICAgIHVzZU51bGxBc0RlZmF1bHQ6IHRydWUsXHJcbiAgICAgICAgZGVidWc6IF9rbmV4RGJDb25maWcudmVyYm9zZSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKF9rbmV4RGJDb25maWcuZGJUeXBlID09PSBTdXBwb3J0ZWREYlR5cGUubXlzcWwpIHtcclxuICAgICAgY29uc3QgW2hvc3QsIHBvcnQsIHVzZXIsIHBhc3N3b3JkLCBkYXRhYmFzZV0gPVxyXG4gICAgICAgIF9rbmV4RGJDb25maWcubXlzcWxDb25uZWN0aW9uU3RyaW5nLnNwbGl0KFwiOlwiKTtcclxuICAgICAgX2tuZXhEYiA9IGtuZXgoe1xyXG4gICAgICAgIGNsaWVudDogRGJDbGllbnRbU3VwcG9ydGVkRGJUeXBlLm15c3FsXSxcclxuICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICBob3N0LFxyXG4gICAgICAgICAgcG9ydDogTnVtYmVyKHBvcnQpLFxyXG4gICAgICAgICAgdXNlcixcclxuICAgICAgICAgIHBhc3N3b3JkLFxyXG4gICAgICAgICAgZGF0YWJhc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB1c2VOdWxsQXNEZWZhdWx0OiB0cnVlLFxyXG4gICAgICAgIGRlYnVnOiBfa25leERiQ29uZmlnLnZlcmJvc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBEQiB0eXBlOiAke19rbmV4RGJDb25maWcuZGJUeXBlfWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIF9rbmV4RGI7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNQb3N0Z3JlcyA9IChrbmV4OiBLbmV4KTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIGtuZXguY2xpZW50LmNvbmZpZy5jbGllbnQgPT09IERiQ2xpZW50W1N1cHBvcnRlZERiVHlwZS5wb3N0Z3Jlc107XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNTcWxpdGUgPSAoa25leDogS25leCk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBrbmV4LmNsaWVudC5jb25maWcuY2xpZW50ID09PSBEYkNsaWVudFtTdXBwb3J0ZWREYlR5cGUuc3FsaXRlXTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpc015c3FsID0gKGtuZXg6IEtuZXgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4ga25leC5jbGllbnQuY29uZmlnLmNsaWVudCA9PT0gRGJDbGllbnRbU3VwcG9ydGVkRGJUeXBlLm15c3FsXTtcclxufTtcclxuXHJcbmNvbnN0IGdldE1pZ3JhdGlvbkNvbmZpZyA9ICgpOiBLbmV4Lk1pZ3JhdG9yQ29uZmlnID0+IHtcclxuICByZXR1cm4geyBkaXJlY3Rvcnk6IGpvaW4oX19kaXJuYW1lLCBcIm1pZ3JhdGlvbnNcIikgfTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbml0RGIgPSBhc3luYyAoY29uZmlnOiBQYXJ0aWFsPERiQ29uZmlnPiA9IHt9KTogUHJvbWlzZTxLbmV4PiA9PiB7XHJcbiAgY29uc3Qga25leCA9IGdldEtuZXhEYihjb25maWcpO1xyXG4gIGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QoZ2V0TWlncmF0aW9uQ29uZmlnKCkpO1xyXG4gIHJldHVybiBrbmV4O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNsZWFyRGIgPSBhc3luYyAoXHJcbiAgY29uZmlnOiBQYXJ0aWFsPERiQ29uZmlnPiA9IHt9XHJcbik6IFByb21pc2U8S25leD4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoY29uZmlnKTtcclxuICBhd2FpdCBrbmV4Lm1pZ3JhdGUucm9sbGJhY2soZ2V0TWlncmF0aW9uQ29uZmlnKCksIHRydWUpO1xyXG4gIGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QoZ2V0TWlncmF0aW9uQ29uZmlnKCkpO1xyXG4gIHJldHVybiBrbmV4O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGRpc2Nvbm5lY3RLbmV4ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGlmIChfa25leERiKSB7XHJcbiAgICBhd2FpdCBfa25leERiLmRlc3Ryb3koKTtcclxuICAgIF9rbmV4RGIgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgZ2V0RW52Q29uZmlnID0gKCk6IFBhcnRpYWw8RGJDb25maWc+ID0+IHtcclxuICBjb25maWdEb3RlbnYoeyBwYXRoOiBcIi5lbnYubG9jYWxcIiB9KTtcclxuICBjb25zdCBlbnZDb25maWc6IFBhcnRpYWw8RGJDb25maWc+ID0ge307XHJcbiAgaWYgKFxyXG4gICAgcHJvY2Vzcy5lbnYuVEVYVFRPTUFQX0RCX1RZUEUgJiZcclxuICAgIE9iamVjdC52YWx1ZXMoU3VwcG9ydGVkRGJUeXBlKS5pbmNsdWRlcyhcclxuICAgICAgcHJvY2Vzcy5lbnYuVEVYVFRPTUFQX0RCX1RZUEUgYXMgU3VwcG9ydGVkRGJUeXBlXHJcbiAgICApXHJcbiAgKSB7XHJcbiAgICBlbnZDb25maWcuZGJUeXBlID0gcHJvY2Vzcy5lbnYuVEVYVFRPTUFQX0RCX1RZUEUgYXMgU3VwcG9ydGVkRGJUeXBlO1xyXG4gICAgaWYgKGVudkNvbmZpZy5kYlR5cGUgPT09IFN1cHBvcnRlZERiVHlwZS5wb3N0Z3Jlcykge1xyXG4gICAgICBpZiAoIXByb2Nlc3MuZW52LlRFWFRUT01BUF9QR19DT05ORUNUSU9OX1NUUklORykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIFwiRW52aXJvbm1lbnRhbCB2YXJpYWJsZSAnVEVYVFRPTUFQX1BHX0NPTk5FQ1RJT05fU1RSSU5HJyBtdXN0IGJlIHNldCBmb3IgUG9zdGdyZVNRTC5cIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgZW52Q29uZmlnLnBnQ29ubmVjdGlvblN0cmluZyA9IHByb2Nlc3MuZW52LlRFWFRUT01BUF9QR19DT05ORUNUSU9OX1NUUklORztcclxuICAgIH0gZWxzZSBpZiAoZW52Q29uZmlnLmRiVHlwZSA9PT0gU3VwcG9ydGVkRGJUeXBlLm15c3FsKSB7XHJcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuVEVYVFRPTUFQX01ZU1FMX0NPTk5FQ1RJT05fREFUQSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIFwiRW52aXJvbm1lbnRhbCB2YXJpYWJsZSAnVEVYVFRPTUFQX01ZU1FMX0NPTk5FQ1RJT05fREFUQScgbXVzdCBiZSBzZXQgZm9yIE15U1FMIG9yIE1hcmlhREIuXCJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIW15c3FsQ29ubmVjdGlvblN0cmluZ1BhdHRlcm4udGVzdChcclxuICAgICAgICAgIHByb2Nlc3MuZW52LlRFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEFcclxuICAgICAgICApXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIFwiRW52aXJvbm1lbnRhbCB2YXJpYWJsZSAnVEVYVFRPTUFQX01ZU1FMX0NPTk5FQ1RJT05fREFUQScgbXVzdCBiZSBpbiBmb3JtYXQgJ2hvc3Q6cG9ydDp1c2VyOnBhc3N3b3JkOmRhdGFiYXNlJy5cIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgZW52Q29uZmlnLm15c3FsQ29ubmVjdGlvblN0cmluZyA9XHJcbiAgICAgICAgcHJvY2Vzcy5lbnYuVEVYVFRPTUFQX01ZU1FMX0NPTk5FQ1RJT05fREFUQTtcclxuICAgIH0gZWxzZSBpZiAoZW52Q29uZmlnLmRiVHlwZSA9PT0gU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZSkge1xyXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuVEVYVFRPTUFQX1NRTElURV9QQVRIKSB7XHJcbiAgICAgICAgZW52Q29uZmlnLmZpbGVQYXRoID0gcHJvY2Vzcy5lbnYuVEVYVFRPTUFQX1NRTElURV9QQVRIO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBlbnZDb25maWc7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgbm9uRW1wdHlPck51bGwgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xyXG4gIHJldHVybiB2YWx1ZSA/IHZhbHVlIDogbnVsbDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCByYXdRdWVyeSA9IGFzeW5jIChcclxuICBxdWVyeTogc3RyaW5nLFxyXG4gIC4uLmJpbmRpbmdzOiByZWFkb25seSBLbmV4LlJhd0JpbmRpbmdbXVxyXG4pOiBQcm9taXNlPGFueVtdPiA9PiB7XHJcbiAgY29uc3Qga25leCA9IGdldEtuZXhEYigpO1xyXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtuZXgucmF3KHF1ZXJ5LCAuLi5iaW5kaW5ncyk7XHJcbiAgcmV0dXJuIGlzTXlzcWwoa25leCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XHJcbn07XHJcblxyXG4vKipcclxuICogRWZmaWNpZW50bHkgaW5zZXJ0IG11bHRpcGxlIHJvd3MuIElmIHByZXZlbnREdXBsaWNhdGVzQnlGaXJzdENvbHVtbiBpcyB0cnVlLCB0aGUgZmlyc3RcclxuICogY29sdW1uIHNob3VsZCBiZSB1bmlxdWUgKFBLIG9yIFVOSVFVRSkuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaW5zZXJ0TXVsdGlwbGVSb3dzID0gYXN5bmMgKFxyXG4gIHJvd3M6IHN0cmluZ1tdW10sXHJcbiAgdGFibGU6IHN0cmluZyxcclxuICBjb2x1bW5OYW1lczogc3RyaW5nW10sXHJcbiAgcHJldmVudER1cGxpY2F0ZXM6IGJvb2xlYW4gPSB0cnVlXHJcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGluc2VydFBsYWNlaG9sZGVycyA9IGdlbmVyYXRlMkRQbGFjZWhvbGRlcnMoXHJcbiAgICBjb2x1bW5OYW1lcy5sZW5ndGgsXHJcbiAgICByb3dzLmxlbmd0aFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuXHJcbiAgY29uc3Qgb25Db25maWN0ID1cclxuICAgIHByZXZlbnREdXBsaWNhdGVzICYmICFpc015c3FsKGtuZXgpID8gYE9OIENPTkZMSUNUIERPIE5PVEhJTkdgIDogXCJcIjtcclxuXHJcbiAgYXdhaXQgcmF3UXVlcnkoXHJcbiAgICBgSU5TRVJUICR7aXNNeXNxbChrbmV4KSA/IFwiSUdOT1JFXCIgOiBcIlwifSBJTlRPICR7dGFibGV9ICgke2NvbHVtbk5hbWVzLmpvaW4oXHJcbiAgICAgIFwiLFwiXHJcbiAgICApfSkgVkFMVUVTICR7aW5zZXJ0UGxhY2Vob2xkZXJzfSAke29uQ29uZmljdH1gLFxyXG4gICAgcm93cy5mbGF0KClcclxuICApO1xyXG5cclxuICByZXR1cm4gcm93cy5sZW5ndGg7XHJcbn07XHJcblxyXG4vKipcclxuICogSW5zZXJ0IGEgc2luZ2xlIHJvdyBhbmQgcmV0dXJuIHRoZSBhdXRvaW5jcmVtZW50ZWQgSUQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaW5zZXJ0QXV0b2luY3JlbWVudFJvdyA9IGFzeW5jIChcclxuICByb3c6IGFueVtdLFxyXG4gIHRhYmxlOiBzdHJpbmcsXHJcbiAgY29sdW1uTmFtZXM6IHN0cmluZ1tdXHJcbik6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4gPT4ge1xyXG4gIGNvbnN0IGRhdGEgPSBjb2x1bW5OYW1lcy5yZWR1Y2UoKG9iaiwgY29sdW1uTmFtZSwgaW5kZXgpID0+IHtcclxuICAgIG9ialtjb2x1bW5OYW1lXSA9IHJvd1tpbmRleF07XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH0sIHt9KTtcclxuXHJcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0S25leERiKCkuaW5zZXJ0KGRhdGEpLmludG8odGFibGUpO1xyXG5cclxuICByZXR1cm4gcmVzdWx0ID8gTnVtYmVyKHJlc3VsdCkgOiBudWxsO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGRlbGV0ZU11bHRpcGxlUm93c0tuZXggPSBhc3luYyAoXHJcbiAga2V5czogc3RyaW5nW10sXHJcbiAgdGFibGU6IHN0cmluZyxcclxuICBrZXlDb2x1bW5OYW1lOiBzdHJpbmdcclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGF3YWl0IGdldEtuZXhEYigpLmZyb20odGFibGUpLndoZXJlSW4oa2V5Q29sdW1uTmFtZSwga2V5cykuZGVsKCk7XHJcbn07XHJcblxyXG5jb25zdCBnZW5lcmF0ZVJlcGV0aXRpdmVTdHJpbmcgPSAoXHJcbiAgdmFsdWU6IHN0cmluZyxcclxuICBnbHVlOiBzdHJpbmcsXHJcbiAgbjogbnVtYmVyXHJcbik6IHN0cmluZyA9PiB7XHJcbiAgcmV0dXJuIG5ldyBBcnJheShuKS5maWxsKHZhbHVlKS5qb2luKGdsdWUpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUGxhY2Vob2xkZXJzID0gKG46IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgcmV0dXJuIGdlbmVyYXRlUmVwZXRpdGl2ZVN0cmluZyhcIj9cIiwgXCIsXCIsIG4pO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlMkRQbGFjZWhvbGRlcnMgPSAoXHJcbiAgaW5uZXI6IG51bWJlcixcclxuICBvdXRlcjogbnVtYmVyXHJcbik6IHN0cmluZyA9PiB7XHJcbiAgcmV0dXJuIGdlbmVyYXRlUmVwZXRpdGl2ZVN0cmluZyhcclxuICAgIGAoJHtnZW5lcmF0ZVBsYWNlaG9sZGVycyhpbm5lcil9KWAsXHJcbiAgICBcIixcIixcclxuICAgIG91dGVyXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBleHRyYWN0S2V5VmFsdWVzUGFpcnMgPSAoXHJcbiAgYXJyYXk6IHN0cmluZ1tdW10sXHJcbiAga2V5SW5kZXg6IG51bWJlcixcclxuICB2YWx1ZXNJbmRpY2VzOiBudW1iZXJbXVxyXG4pOiBzdHJpbmdbXVtdID0+IHtcclxuICBjb25zdCBvYmplY3QgPSBhcnJheS5yZWR1Y2UoKGFjYzogb2JqZWN0LCBkYXRhOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgaWYgKGRhdGFba2V5SW5kZXhdKSB7XHJcbiAgICAgIGFjY1tkYXRhW2tleUluZGV4XV0gPSB2YWx1ZXNJbmRpY2VzLm1hcCgoaW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgICBub25FbXB0eU9yTnVsbChkYXRhW2luZGV4XSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhY2M7XHJcbiAgfSwge30pO1xyXG5cclxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5tYXAoKGtleSkgPT4gW2tleSwgLi4ub2JqZWN0W2tleV1dKTtcclxufTtcclxuIl19
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLElBQWMsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQVdwQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFFdEMsTUFBTSxDQUFOLElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN6QixvQ0FBaUIsQ0FBQTtJQUNqQix3Q0FBcUIsQ0FBQTtJQUNyQixrQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxlQUFlLEtBQWYsZUFBZSxRQUkxQjtBQUVELE1BQU0sNEJBQTRCLEdBQUcseUNBQXlDLENBQUM7QUFFL0UsTUFBTSxRQUFRLEdBQUc7SUFDZixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDMUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSTtJQUNoQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPO0NBQ2pDLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBYTtJQUN6QixNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU07SUFDOUIsUUFBUSxFQUFFLG1CQUFtQjtJQUM3QixZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLENBQUM7SUFDN0QsT0FBTyxFQUFFLEtBQUs7Q0FDZixDQUFDO0FBRUYsSUFBSSxPQUFPLEdBQVMsU0FBUyxDQUFDO0FBQzlCLElBQUks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Q0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25maWdEb3RlbnYgfSBmcm9tIFwiZG90ZW52XCI7XHJcbmltcG9ydCBrbmV4LCB7IEtuZXggfSBmcm9tIFwia25leFwiO1xyXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIjtcclxuXHJcbmludGVyZmFjZSBEYkNvbmZpZyB7XHJcbiAgZGJUeXBlOiBTdXBwb3J0ZWREYlR5cGU7XHJcbiAgcGdDb25uZWN0aW9uU3RyaW5nPzogc3RyaW5nO1xyXG4gIG15c3FsQ29ubmVjdGlvblN0cmluZz86IHN0cmluZztcclxuICBpbml0RmlsZVBhdGg6IHN0cmluZztcclxuICBmaWxlUGF0aD86IHN0cmluZztcclxuICB2ZXJib3NlOiBib29sZWFuO1xyXG59XHJcblxyXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xyXG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpO1xyXG5cclxuZXhwb3J0IGVudW0gU3VwcG9ydGVkRGJUeXBlIHtcclxuICBzcWxpdGUgPSBcInNxbGl0ZVwiLFxyXG4gIHBvc3RncmVzID0gXCJwb3N0Z3Jlc1wiLFxyXG4gIG15c3FsID0gXCJteXNxbFwiLFxyXG59XHJcblxyXG5jb25zdCBteXNxbENvbm5lY3Rpb25TdHJpbmdQYXR0ZXJuID0gL14oW146XSspOihcXGQrKTooW146XSspOihbXjpdKyk6KFteOl0rKSQvO1xyXG5cclxuY29uc3QgRGJDbGllbnQgPSB7XHJcbiAgW1N1cHBvcnRlZERiVHlwZS5zcWxpdGVdOiBcImJldHRlci1zcWxpdGUzXCIsXHJcbiAgW1N1cHBvcnRlZERiVHlwZS5wb3N0Z3Jlc106IFwicGdcIixcclxuICBbU3VwcG9ydGVkRGJUeXBlLm15c3FsXTogXCJteXNxbFwiLFxyXG59O1xyXG5cclxuY29uc3QgZGVmYXVsdHM6IERiQ29uZmlnID0ge1xyXG4gIGRiVHlwZTogU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZSxcclxuICBmaWxlUGF0aDogXCJhZGRyZXNzX3BvaW50cy5kYlwiLFxyXG4gIGluaXRGaWxlUGF0aDogam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCJhZGRyZXNzX3BvaW50c19pbml0LmRiXCIpLFxyXG4gIHZlcmJvc2U6IGZhbHNlLFxyXG59O1xyXG5cclxubGV0IF9rbmV4RGI6IEtuZXggPSB1bmRlZmluZWQ7XHJcbmxldCBfa25leERiQ29uZmlnOiBEYkNvbmZpZyA9IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRLbmV4RGIgPSAoY29uZmlnOiBQYXJ0aWFsPERiQ29uZmlnPiA9IHt9KTogS25leCA9PiB7XHJcbiAgaWYgKF9rbmV4RGIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgX2tuZXhEYkNvbmZpZyA9IHsgLi4uZGVmYXVsdHMsIC4uLmdldEVudkNvbmZpZygpLCAuLi5jb25maWcgfTtcclxuXHJcbiAgICBpZiAoX2tuZXhEYkNvbmZpZy5kYlR5cGUgPT09IFN1cHBvcnRlZERiVHlwZS5zcWxpdGUpIHtcclxuICAgICAgX2tuZXhEYiA9IGtuZXgoe1xyXG4gICAgICAgIGNsaWVudDogRGJDbGllbnRbU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZV0sXHJcbiAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgZmlsZW5hbWU6IF9rbmV4RGJDb25maWcuZmlsZVBhdGgsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwb29sOiB7XHJcbiAgICAgICAgICBhZnRlckNyZWF0ZTogKGRiOiBhbnksIGRvbmU6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGRiLnByYWdtYShcImpvdXJuYWxfbW9kZSA9IFdBTDtcIik7XHJcbiAgICAgICAgICAgIGRvbmUoZmFsc2UsIGRvbmUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVzZU51bGxBc0RlZmF1bHQ6IHRydWUsXHJcbiAgICAgICAgZGVidWc6IF9rbmV4RGJDb25maWcudmVyYm9zZSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKF9rbmV4RGJDb25maWcuZGJUeXBlID09PSBTdXBwb3J0ZWREYlR5cGUucG9zdGdyZXMpIHtcclxuICAgICAgX2tuZXhEYiA9IGtuZXgoe1xyXG4gICAgICAgIGNsaWVudDogRGJDbGllbnRbU3VwcG9ydGVkRGJUeXBlLnBvc3RncmVzXSxcclxuICAgICAgICBjb25uZWN0aW9uOiBfa25leERiQ29uZmlnLnBnQ29ubmVjdGlvblN0cmluZyxcclxuICAgICAgICB1c2VOdWxsQXNEZWZhdWx0OiB0cnVlLFxyXG4gICAgICAgIGRlYnVnOiBfa25leERiQ29uZmlnLnZlcmJvc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChfa25leERiQ29uZmlnLmRiVHlwZSA9PT0gU3VwcG9ydGVkRGJUeXBlLm15c3FsKSB7XHJcbiAgICAgIGNvbnN0IFtob3N0LCBwb3J0LCB1c2VyLCBwYXNzd29yZCwgZGF0YWJhc2VdID1cclxuICAgICAgICBfa25leERiQ29uZmlnLm15c3FsQ29ubmVjdGlvblN0cmluZy5zcGxpdChcIjpcIik7XHJcbiAgICAgIF9rbmV4RGIgPSBrbmV4KHtcclxuICAgICAgICBjbGllbnQ6IERiQ2xpZW50W1N1cHBvcnRlZERiVHlwZS5teXNxbF0sXHJcbiAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgaG9zdCxcclxuICAgICAgICAgIHBvcnQ6IE51bWJlcihwb3J0KSxcclxuICAgICAgICAgIHVzZXIsXHJcbiAgICAgICAgICBwYXNzd29yZCxcclxuICAgICAgICAgIGRhdGFiYXNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXNlTnVsbEFzRGVmYXVsdDogdHJ1ZSxcclxuICAgICAgICBkZWJ1ZzogX2tuZXhEYkNvbmZpZy52ZXJib3NlLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgREIgdHlwZTogJHtfa25leERiQ29uZmlnLmRiVHlwZX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBfa25leERiO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzUG9zdGdyZXMgPSAoa25leDogS25leCk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiBrbmV4LmNsaWVudC5jb25maWcuY2xpZW50ID09PSBEYkNsaWVudFtTdXBwb3J0ZWREYlR5cGUucG9zdGdyZXNdO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzU3FsaXRlID0gKGtuZXg6IEtuZXgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4ga25leC5jbGllbnQuY29uZmlnLmNsaWVudCA9PT0gRGJDbGllbnRbU3VwcG9ydGVkRGJUeXBlLnNxbGl0ZV07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaXNNeXNxbCA9IChrbmV4OiBLbmV4KTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIGtuZXguY2xpZW50LmNvbmZpZy5jbGllbnQgPT09IERiQ2xpZW50W1N1cHBvcnRlZERiVHlwZS5teXNxbF07XHJcbn07XHJcblxyXG5jb25zdCBnZXRNaWdyYXRpb25Db25maWcgPSAoKTogS25leC5NaWdyYXRvckNvbmZpZyA9PiB7XHJcbiAgcmV0dXJuIHsgZGlyZWN0b3J5OiBqb2luKF9fZGlybmFtZSwgXCJtaWdyYXRpb25zXCIpIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5pdERiID0gYXN5bmMgKGNvbmZpZzogUGFydGlhbDxEYkNvbmZpZz4gPSB7fSk6IFByb21pc2U8S25leD4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoY29uZmlnKTtcclxuICBhd2FpdCBrbmV4Lm1pZ3JhdGUubGF0ZXN0KGdldE1pZ3JhdGlvbkNvbmZpZygpKTtcclxuICByZXR1cm4ga25leDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBjbGVhckRiID0gYXN5bmMgKFxyXG4gIGNvbmZpZzogUGFydGlhbDxEYkNvbmZpZz4gPSB7fVxyXG4pOiBQcm9taXNlPEtuZXg+ID0+IHtcclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKGNvbmZpZyk7XHJcbiAgYXdhaXQga25leC5taWdyYXRlLnJvbGxiYWNrKGdldE1pZ3JhdGlvbkNvbmZpZygpLCB0cnVlKTtcclxuICBhd2FpdCBrbmV4Lm1pZ3JhdGUubGF0ZXN0KGdldE1pZ3JhdGlvbkNvbmZpZygpKTtcclxuICByZXR1cm4ga25leDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkaXNjb25uZWN0S25leCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBpZiAoX2tuZXhEYikge1xyXG4gICAgYXdhaXQgX2tuZXhEYi5kZXN0cm95KCk7XHJcbiAgICBfa25leERiID0gdW5kZWZpbmVkO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldEVudkNvbmZpZyA9ICgpOiBQYXJ0aWFsPERiQ29uZmlnPiA9PiB7XHJcbiAgY29uZmlnRG90ZW52KHsgcGF0aDogXCIuZW52LmxvY2FsXCIgfSk7XHJcbiAgY29uc3QgZW52Q29uZmlnOiBQYXJ0aWFsPERiQ29uZmlnPiA9IHt9O1xyXG4gIGlmIChcclxuICAgIHByb2Nlc3MuZW52LlRFWFRUT01BUF9EQl9UWVBFICYmXHJcbiAgICBPYmplY3QudmFsdWVzKFN1cHBvcnRlZERiVHlwZSkuaW5jbHVkZXMoXHJcbiAgICAgIHByb2Nlc3MuZW52LlRFWFRUT01BUF9EQl9UWVBFIGFzIFN1cHBvcnRlZERiVHlwZVxyXG4gICAgKVxyXG4gICkge1xyXG4gICAgZW52Q29uZmlnLmRiVHlwZSA9IHByb2Nlc3MuZW52LlRFWFRUT01BUF9EQl9UWVBFIGFzIFN1cHBvcnRlZERiVHlwZTtcclxuICAgIGlmIChlbnZDb25maWcuZGJUeXBlID09PSBTdXBwb3J0ZWREYlR5cGUucG9zdGdyZXMpIHtcclxuICAgICAgaWYgKCFwcm9jZXNzLmVudi5URVhUVE9NQVBfUEdfQ09OTkVDVElPTl9TVFJJTkcpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBcIkVudmlyb25tZW50YWwgdmFyaWFibGUgJ1RFWFRUT01BUF9QR19DT05ORUNUSU9OX1NUUklORycgbXVzdCBiZSBzZXQgZm9yIFBvc3RncmVTUUwuXCJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGVudkNvbmZpZy5wZ0Nvbm5lY3Rpb25TdHJpbmcgPSBwcm9jZXNzLmVudi5URVhUVE9NQVBfUEdfQ09OTkVDVElPTl9TVFJJTkc7XHJcbiAgICB9IGVsc2UgaWYgKGVudkNvbmZpZy5kYlR5cGUgPT09IFN1cHBvcnRlZERiVHlwZS5teXNxbCkge1xyXG4gICAgICBpZiAoIXByb2Nlc3MuZW52LlRFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEEpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBcIkVudmlyb25tZW50YWwgdmFyaWFibGUgJ1RFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEEnIG11c3QgYmUgc2V0IGZvciBNeVNRTCBvciBNYXJpYURCLlwiXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgICFteXNxbENvbm5lY3Rpb25TdHJpbmdQYXR0ZXJuLnRlc3QoXHJcbiAgICAgICAgICBwcm9jZXNzLmVudi5URVhUVE9NQVBfTVlTUUxfQ09OTkVDVElPTl9EQVRBXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBcIkVudmlyb25tZW50YWwgdmFyaWFibGUgJ1RFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEEnIG11c3QgYmUgaW4gZm9ybWF0ICdob3N0OnBvcnQ6dXNlcjpwYXNzd29yZDpkYXRhYmFzZScuXCJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGVudkNvbmZpZy5teXNxbENvbm5lY3Rpb25TdHJpbmcgPVxyXG4gICAgICAgIHByb2Nlc3MuZW52LlRFWFRUT01BUF9NWVNRTF9DT05ORUNUSU9OX0RBVEE7XHJcbiAgICB9IGVsc2UgaWYgKGVudkNvbmZpZy5kYlR5cGUgPT09IFN1cHBvcnRlZERiVHlwZS5zcWxpdGUpIHtcclxuICAgICAgaWYgKHByb2Nlc3MuZW52LlRFWFRUT01BUF9TUUxJVEVfUEFUSCkge1xyXG4gICAgICAgIGVudkNvbmZpZy5maWxlUGF0aCA9IHByb2Nlc3MuZW52LlRFWFRUT01BUF9TUUxJVEVfUEFUSDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gZW52Q29uZmlnO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IG5vbkVtcHR5T3JOdWxsID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcclxuICByZXR1cm4gdmFsdWUgPyB2YWx1ZSA6IG51bGw7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgcmF3UXVlcnkgPSBhc3luYyAoXHJcbiAgcXVlcnk6IHN0cmluZyxcclxuICAuLi5iaW5kaW5nczogcmVhZG9ubHkgS25leC5SYXdCaW5kaW5nW11cclxuKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xyXG4gIGNvbnN0IGtuZXggPSBnZXRLbmV4RGIoKTtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBrbmV4LnJhdyhxdWVyeSwgLi4uYmluZGluZ3MpO1xyXG4gIHJldHVybiBpc015c3FsKGtuZXgpID8gcmVzdWx0WzBdIDogcmVzdWx0O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEVmZmljaWVudGx5IGluc2VydCBtdWx0aXBsZSByb3dzLiBJZiBwcmV2ZW50RHVwbGljYXRlc0J5Rmlyc3RDb2x1bW4gaXMgdHJ1ZSwgdGhlIGZpcnN0XHJcbiAqIGNvbHVtbiBzaG91bGQgYmUgdW5pcXVlIChQSyBvciBVTklRVUUpLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGluc2VydE11bHRpcGxlUm93cyA9IGFzeW5jIChcclxuICByb3dzOiBzdHJpbmdbXVtdLFxyXG4gIHRhYmxlOiBzdHJpbmcsXHJcbiAgY29sdW1uTmFtZXM6IHN0cmluZ1tdLFxyXG4gIHByZXZlbnREdXBsaWNhdGVzOiBib29sZWFuID0gdHJ1ZVxyXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xyXG4gIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCBpbnNlcnRQbGFjZWhvbGRlcnMgPSBnZW5lcmF0ZTJEUGxhY2Vob2xkZXJzKFxyXG4gICAgY29sdW1uTmFtZXMubGVuZ3RoLFxyXG4gICAgcm93cy5sZW5ndGhcclxuICApO1xyXG5cclxuICBjb25zdCBrbmV4ID0gZ2V0S25leERiKCk7XHJcblxyXG4gIGNvbnN0IG9uQ29uZmljdCA9XHJcbiAgICBwcmV2ZW50RHVwbGljYXRlcyAmJiAhaXNNeXNxbChrbmV4KSA/IGBPTiBDT05GTElDVCBETyBOT1RISU5HYCA6IFwiXCI7XHJcblxyXG4gIGF3YWl0IHJhd1F1ZXJ5KFxyXG4gICAgYElOU0VSVCAke2lzTXlzcWwoa25leCkgPyBcIklHTk9SRVwiIDogXCJcIn0gSU5UTyAke3RhYmxlfSAoJHtjb2x1bW5OYW1lcy5qb2luKFxyXG4gICAgICBcIixcIlxyXG4gICAgKX0pIFZBTFVFUyAke2luc2VydFBsYWNlaG9sZGVyc30gJHtvbkNvbmZpY3R9YCxcclxuICAgIHJvd3MuZmxhdCgpXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIHJvd3MubGVuZ3RoO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEluc2VydCBhIHNpbmdsZSByb3cgYW5kIHJldHVybiB0aGUgYXV0b2luY3JlbWVudGVkIElELlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGluc2VydEF1dG9pbmNyZW1lbnRSb3cgPSBhc3luYyAoXHJcbiAgcm93OiBhbnlbXSxcclxuICB0YWJsZTogc3RyaW5nLFxyXG4gIGNvbHVtbk5hbWVzOiBzdHJpbmdbXVxyXG4pOiBQcm9taXNlPG51bWJlciB8IG51bGw+ID0+IHtcclxuICBjb25zdCBkYXRhID0gY29sdW1uTmFtZXMucmVkdWNlKChvYmosIGNvbHVtbk5hbWUsIGluZGV4KSA9PiB7XHJcbiAgICBvYmpbY29sdW1uTmFtZV0gPSByb3dbaW5kZXhdO1xyXG4gICAgcmV0dXJuIG9iajtcclxuICB9LCB7fSk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEtuZXhEYigpLmluc2VydChkYXRhKS5pbnRvKHRhYmxlKTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdCA/IE51bWJlcihyZXN1bHQpIDogbnVsbDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWxldGVNdWx0aXBsZVJvd3NLbmV4ID0gYXN5bmMgKFxyXG4gIGtleXM6IHN0cmluZ1tdLFxyXG4gIHRhYmxlOiBzdHJpbmcsXHJcbiAga2V5Q29sdW1uTmFtZTogc3RyaW5nXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBhd2FpdCBnZXRLbmV4RGIoKS5mcm9tKHRhYmxlKS53aGVyZUluKGtleUNvbHVtbk5hbWUsIGtleXMpLmRlbCgpO1xyXG59O1xyXG5cclxuY29uc3QgZ2VuZXJhdGVSZXBldGl0aXZlU3RyaW5nID0gKFxyXG4gIHZhbHVlOiBzdHJpbmcsXHJcbiAgZ2x1ZTogc3RyaW5nLFxyXG4gIG46IG51bWJlclxyXG4pOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBuZXcgQXJyYXkobikuZmlsbCh2YWx1ZSkuam9pbihnbHVlKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVBsYWNlaG9sZGVycyA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBnZW5lcmF0ZVJlcGV0aXRpdmVTdHJpbmcoXCI/XCIsIFwiLFwiLCBuKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZW5lcmF0ZTJEUGxhY2Vob2xkZXJzID0gKFxyXG4gIGlubmVyOiBudW1iZXIsXHJcbiAgb3V0ZXI6IG51bWJlclxyXG4pOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBnZW5lcmF0ZVJlcGV0aXRpdmVTdHJpbmcoXHJcbiAgICBgKCR7Z2VuZXJhdGVQbGFjZWhvbGRlcnMoaW5uZXIpfSlgLFxyXG4gICAgXCIsXCIsXHJcbiAgICBvdXRlclxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZXh0cmFjdEtleVZhbHVlc1BhaXJzID0gKFxyXG4gIGFycmF5OiBzdHJpbmdbXVtdLFxyXG4gIGtleUluZGV4OiBudW1iZXIsXHJcbiAgdmFsdWVzSW5kaWNlczogbnVtYmVyW11cclxuKTogc3RyaW5nW11bXSA9PiB7XHJcbiAgY29uc3Qgb2JqZWN0ID0gYXJyYXkucmVkdWNlKChhY2M6IG9iamVjdCwgZGF0YTogc3RyaW5nW10pID0+IHtcclxuICAgIGlmIChkYXRhW2tleUluZGV4XSkge1xyXG4gICAgICBhY2NbZGF0YVtrZXlJbmRleF1dID0gdmFsdWVzSW5kaWNlcy5tYXAoKGluZGV4OiBudW1iZXIpID0+XHJcbiAgICAgICAgbm9uRW1wdHlPck51bGwoZGF0YVtpbmRleF0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWNjO1xyXG4gIH0sIHt9KTtcclxuXHJcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubWFwKChrZXkpID0+IFtrZXksIC4uLm9iamVjdFtrZXldXSk7XHJcbn07XHJcbiJdfQ==
|