UNPKG

text-to-map

Version:

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ě zpra

116 lines 17.5 kB
import { findMunicipalityByNameAndType, findMunicipalityPartByName, getFounderCityCode, } from "../db/founders"; import { MunicipalityType } from "../db/types"; const municipalitySwitchStartPattern = /^navíc ulice /; const municipalitySwitchPattern = /^navíc ulice (z )?(?<type>městské části|městského obvodu|obce|města) (?<name>.+):$/; const wholeMunicipalityStartPattern = /^území /; const wholeMunicipalityPattern = /^území (?<type>městské části|městského obvodu|obce|města) (?<name>.+)$/; const restWithNoStreetNamePattern = /^všechny ostatní budovy bez názvu ulice\s*$/; const restOfMunicipalityPattern = /^zbytek (?<type>městské části|městského obvodu|obce|města)\s*$/; const restOfMunicipalityPartPattern = /^zbytek části (obce|města) (?<name>.+)\s*$/; export const isMunicipalitySwitch = (line) => { return municipalitySwitchStartPattern.test(line); }; export const getSwitchMunicipality = async (line, founder) => { const match = municipalitySwitchPattern.exec(line); if (match === null) { return { errors: [ { message: "Neplatný zápis pro dočasnou změnu obce v definici ulic. Správný zápis je: navíc ulice <typ> <název obce>. Např.: 'navíc ulice obce Mokrá Lhota:' (název obce musí být v 1. pádě).", startOffset: 0, endOffset: line.length + 1, }, ], municipality: null, }; } const { type, name } = match.groups; return await getMunicipalityResult(type, cleanName(name), line, founder); }; export const isWholeMunicipality = (line) => { return wholeMunicipalityStartPattern.test(line); }; export const isRestWithNoStreetNameLine = (line) => { return restWithNoStreetNamePattern.test(line); }; export const isRestOfMunicipalityLine = (line) => { return restOfMunicipalityPattern.test(line); }; export const isRestOfMunicipalityPartLine = (line) => { return restOfMunicipalityPartPattern.test(line); }; export const getRestOfMunicipalityPart = async (line, founder) => { const match = restOfMunicipalityPartPattern.exec(line); if (match === null) { return { errors: [ { message: "Neplatný zápis pro přidání zbytku části obce. Správný zápis je: zbytek části <typ> <název obce>. Např.: 'zbytek části obce Malšovice' (název části obce musí být v 1. pádě).", startOffset: 0, endOffset: line.length + 1, }, ], municipalityPartCode: null, }; } const { name } = match.groups; return await getMunicipalityPartResult(name, line, await getFounderCityCode(founder.municipalityType, founder.municipalityCode)); }; export const getWholeMunicipality = async (line, founder) => { const match = wholeMunicipalityPattern.exec(line); if (match === null) { return { errors: [ { message: "Neplatný zápis pro přidání celé obce. Správný zápis je: území <typ> <název obce>. Např.: 'území obce Kladno' (název obce musí být v 1. pádě).", startOffset: 0, endOffset: line.length + 1, }, ], municipality: null, }; } const { type, name } = match.groups; return await getMunicipalityResult(type, cleanName(name), line, founder); }; const getMunicipalityResult = async (type, name, line, founder) => { const typeValue = getMunicipalityType(type); const { municipality, errors } = await findMunicipalityByNameAndType(name, typeValue, founder); const startOffset = line.indexOf(name); const endOffset = startOffset + name.length + 1; return { municipality, errors: errors.map((error) => ({ ...error, startOffset, endOffset, })), }; }; export const getMunicipalityPartResult = async (name, line, cityCode) => { const { municipalityPartCode, errors } = await findMunicipalityPartByName(name, cityCode); const startOffset = line.indexOf(name); const endOffset = startOffset + name.length + 1; return { municipalityPartCode, errors: errors.map((error) => ({ ...error, startOffset, endOffset, })), }; }; const getMunicipalityType = (type) => { switch (type) { case "městské části": case "městského obvodu": return MunicipalityType.District; case "obce": case "města": return MunicipalityType.City; } }; const cleanName = (name) => { return name.trim(); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVuaWNpcGFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVldC1tYXJrZG93bi9tdW5pY2lwYWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLDZCQUE2QixFQUM3QiwwQkFBMEIsRUFDMUIsa0JBQWtCLEdBQ25CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFXLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3hELE1BQU0sOEJBQThCLEdBQUcsZUFBZSxDQUFDO0FBRXZELE1BQU0seUJBQXlCLEdBQzdCLG9GQUFvRixDQUFDO0FBRXZGLE1BQU0sNkJBQTZCLEdBQUcsU0FBUyxDQUFDO0FBRWhELE1BQU0sd0JBQXdCLEdBQzVCLHdFQUF3RSxDQUFDO0FBRTNFLE1BQU0sMkJBQTJCLEdBQy9CLDZDQUE2QyxDQUFDO0FBRWhELE1BQU0seUJBQXlCLEdBQzdCLGdFQUFnRSxDQUFDO0FBQ25FLE1BQU0sNkJBQTZCLEdBQ2pDLDRDQUE0QyxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsSUFBWSxFQUFXLEVBQUU7SUFDNUQsT0FBTyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxFQUN4QyxJQUFZLEVBQ1osT0FBZ0IsRUFDZSxFQUFFO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7UUFDbEIsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTjtvQkFDRSxPQUFPLEVBQ0wsbUxBQW1MO29CQUNyTCxXQUFXLEVBQUUsQ0FBQztvQkFDZCxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO2lCQUMzQjthQUNGO1lB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QUFLLGtCQUFrQjtZQUNyQixPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztRQUNuQyxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssT0FBTztZQUNWLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0tBQ2hDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRTtJQUN6QyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIGZpbmRNdW5pY2lwYWxpdHlCeU5hbWVBbmRUeXBlLFxyXG4gIGZpbmRNdW5pY2lwYWxpdHlQYXJ0QnlOYW1lLFxyXG4gIGdldEZvdW5kZXJDaXR5Q29kZSxcclxufSBmcm9tIFwiLi4vZGIvZm91bmRlcnNcIjtcclxuaW1wb3J0IHsgRm91bmRlciwgTXVuaWNpcGFsaXR5VHlwZSB9IGZyb20gXCIuLi9kYi90eXBlc1wiO1xyXG5pbXBvcnQgeyBEYk11bmljaXBhbGl0eVJlc3VsdCwgTXVuaWNpcGFsaXR5UGFydFJlc3VsdCB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5jb25zdCBtdW5pY2lwYWxpdHlTd2l0Y2hTdGFydFBhdHRlcm4gPSAvXm5hdsOtYyB1bGljZSAvO1xyXG5cclxuY29uc3QgbXVuaWNpcGFsaXR5U3dpdGNoUGF0dGVybiA9XHJcbiAgL15uYXbDrWMgdWxpY2UgKHogKT8oPzx0eXBlPm3Em3N0c2vDqSDEjcOhc3RpfG3Em3N0c2vDqWhvIG9idm9kdXxvYmNlfG3Em3N0YSkgKD88bmFtZT4uKyk6JC87XHJcblxyXG5jb25zdCB3aG9sZU11bmljaXBhbGl0eVN0YXJ0UGF0dGVybiA9IC9ew7p6ZW3DrSAvO1xyXG5cclxuY29uc3Qgd2hvbGVNdW5pY2lwYWxpdHlQYXR0ZXJuID1cclxuICAvXsO6emVtw60gKD88dHlwZT5txJtzdHNrw6kgxI3DoXN0aXxtxJtzdHNrw6lobyBvYnZvZHV8b2JjZXxtxJtzdGEpICg/PG5hbWU+LispJC87XHJcblxyXG5jb25zdCByZXN0V2l0aE5vU3RyZWV0TmFtZVBhdHRlcm4gPVxyXG4gIC9edsWhZWNobnkgb3N0YXRuw60gYnVkb3Z5IGJleiBuw6F6dnUgdWxpY2VcXHMqJC87XHJcblxyXG5jb25zdCByZXN0T2ZNdW5pY2lwYWxpdHlQYXR0ZXJuID1cclxuICAvXnpieXRlayAoPzx0eXBlPm3Em3N0c2vDqSDEjcOhc3RpfG3Em3N0c2vDqWhvIG9idm9kdXxvYmNlfG3Em3N0YSlcXHMqJC87XHJcbmNvbnN0IHJlc3RPZk11bmljaXBhbGl0eVBhcnRQYXR0ZXJuID1cclxuICAvXnpieXRlayDEjcOhc3RpIChvYmNlfG3Em3N0YSkgKD88bmFtZT4uKylcXHMqJC87XHJcblxyXG5leHBvcnQgY29uc3QgaXNNdW5pY2lwYWxpdHlTd2l0Y2ggPSAobGluZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIG11bmljaXBhbGl0eVN3aXRjaFN0YXJ0UGF0dGVybi50ZXN0KGxpbmUpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFN3aXRjaE11bmljaXBhbGl0eSA9IGFzeW5jIChcclxuICBsaW5lOiBzdHJpbmcsXHJcbiAgZm91bmRlcjogRm91bmRlclxyXG4pOiBQcm9taXNlPERiTXVuaWNpcGFsaXR5UmVzdWx0PiA9PiB7XHJcbiAgY29uc3QgbWF0Y2ggPSBtdW5pY2lwYWxpdHlTd2l0Y2hQYXR0ZXJuLmV4ZWMobGluZSk7XHJcbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBlcnJvcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtZXNzYWdlOlxyXG4gICAgICAgICAgICBcIk5lcGxhdG7DvSB6w6FwaXMgcHJvIGRvxI1hc25vdSB6bcSbbnUgb2JjZSB2IGRlZmluaWNpIHVsaWMuIFNwcsOhdm7DvSB6w6FwaXMgamU6IG5hdsOtYyB1bGljZSA8dHlwPiA8bsOhemV2IG9iY2U+LiBOYXDFmS46ICduYXbDrWMgdWxpY2Ugb2JjZSBNb2tyw6EgTGhvdGE6JyAobsOhemV2IG9iY2UgbXVzw60gYsO9dCB2IDEuIHDDoWTEmykuXCIsXHJcbiAgICAgICAgICBzdGFydE9mZnNldDogMCxcclxuICAgICAgICAgIGVuZE9mZnNldDogbGluZS5sZW5ndGggKyAxLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIG11bmljaXBhbGl0eTogbnVsbCxcclxuICAgIH07XHJcbiAgfVxyXG4gIGNvbnN0IHsgdHlwZSwgbmFtZSB9ID0gbWF0Y2guZ3JvdXBzO1xyXG4gIHJldHVybiBhd2FpdCBnZXRNdW5pY2lwYWxpdHlSZXN1bHQodHlwZSwgY2xlYW5OYW1lKG5hbWUpLCBsaW5lLCBmb3VuZGVyKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpc1dob2xlTXVuaWNpcGFsaXR5ID0gKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiB3aG9sZU11bmljaXBhbGl0eVN0YXJ0UGF0dGVybi50ZXN0KGxpbmUpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzUmVzdFdpdGhOb1N0cmVldE5hbWVMaW5lID0gKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiByZXN0V2l0aE5vU3RyZWV0TmFtZVBhdHRlcm4udGVzdChsaW5lKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpc1Jlc3RPZk11bmljaXBhbGl0eUxpbmUgPSAobGluZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIHJlc3RPZk11bmljaXBhbGl0eVBhdHRlcm4udGVzdChsaW5lKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpc1Jlc3RPZk11bmljaXBhbGl0eVBhcnRMaW5lID0gKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiByZXN0T2ZNdW5pY2lwYWxpdHlQYXJ0UGF0dGVybi50ZXN0KGxpbmUpO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFJlc3RPZk11bmljaXBhbGl0eVBhcnQgPSBhc3luYyAoXHJcbiAgbGluZTogc3RyaW5nLFxyXG4gIGZvdW5kZXI6IEZvdW5kZXJcclxuKTogUHJvbWlzZTxNdW5pY2lwYWxpdHlQYXJ0UmVzdWx0PiA9PiB7XHJcbiAgY29uc3QgbWF0Y2ggPSByZXN0T2ZNdW5pY2lwYWxpdHlQYXJ0UGF0dGVybi5leGVjKGxpbmUpO1xyXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXJyb3JzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbWVzc2FnZTpcclxuICAgICAgICAgICAgXCJOZXBsYXRuw70gesOhcGlzIHBybyBwxZlpZMOhbsOtIHpieXRrdSDEjcOhc3RpIG9iY2UuIFNwcsOhdm7DvSB6w6FwaXMgamU6IHpieXRlayDEjcOhc3RpIDx0eXA+IDxuw6F6ZXYgb2JjZT4uIE5hcMWZLjogJ3pieXRlayDEjcOhc3RpIG9iY2UgTWFsxaFvdmljZScgKG7DoXpldiDEjcOhc3RpIG9iY2UgbXVzw60gYsO9dCB2IDEuIHDDoWTEmykuXCIsXHJcbiAgICAgICAgICBzdGFydE9mZnNldDogMCxcclxuICAgICAgICAgIGVuZE9mZnNldDogbGluZS5sZW5ndGggKyAxLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIG11bmljaXBhbGl0eVBhcnRDb2RlOiBudWxsLFxyXG4gICAgfTtcclxuICB9XHJcbiAgY29uc3QgeyBuYW1lIH0gPSBtYXRjaC5ncm91cHM7XHJcbiAgcmV0dXJuIGF3YWl0IGdldE11bmljaXBhbGl0eVBhcnRSZXN1bHQoXHJcbiAgICBuYW1lLFxyXG4gICAgbGluZSxcclxuICAgIGF3YWl0IGdldEZvdW5kZXJDaXR5Q29kZShmb3VuZGVyLm11bmljaXBhbGl0eVR5cGUsIGZvdW5kZXIubXVuaWNpcGFsaXR5Q29kZSlcclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFdob2xlTXVuaWNpcGFsaXR5ID0gYXN5bmMgKFxyXG4gIGxpbmU6IHN0cmluZyxcclxuICBmb3VuZGVyOiBGb3VuZGVyXHJcbik6IFByb21pc2U8RGJNdW5pY2lwYWxpdHlSZXN1bHQ+ID0+IHtcclxuICBjb25zdCBtYXRjaCA9IHdob2xlTXVuaWNpcGFsaXR5UGF0dGVybi5leGVjKGxpbmUpO1xyXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXJyb3JzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbWVzc2FnZTpcclxuICAgICAgICAgICAgXCJOZXBsYXRuw70gesOhcGlzIHBybyBwxZlpZMOhbsOtIGNlbMOpIG9iY2UuIFNwcsOhdm7DvSB6w6FwaXMgamU6IMO6emVtw60gPHR5cD4gPG7DoXpldiBvYmNlPi4gTmFwxZkuOiAnw7p6ZW3DrSBvYmNlIEtsYWRubycgKG7DoXpldiBvYmNlIG11c8OtIGLDvXQgdiAxLiBww6FkxJspLlwiLFxyXG4gICAgICAgICAgc3RhcnRPZmZzZXQ6IDAsXHJcbiAgICAgICAgICBlbmRPZmZzZXQ6IGxpbmUubGVuZ3RoICsgMSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICBtdW5pY2lwYWxpdHk6IG51bGwsXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdCB7IHR5cGUsIG5hbWUgfSA9IG1hdGNoLmdyb3VwcztcclxuICByZXR1cm4gYXdhaXQgZ2V0TXVuaWNpcGFsaXR5UmVzdWx0KHR5cGUsIGNsZWFuTmFtZShuYW1lKSwgbGluZSwgZm91bmRlcik7XHJcbn07XHJcblxyXG5jb25zdCBnZXRNdW5pY2lwYWxpdHlSZXN1bHQgPSBhc3luYyAoXHJcbiAgdHlwZTogc3RyaW5nLFxyXG4gIG5hbWU6IHN0cmluZyxcclxuICBsaW5lOiBzdHJpbmcsXHJcbiAgZm91bmRlcjogRm91bmRlclxyXG4pOiBQcm9taXNlPERiTXVuaWNpcGFsaXR5UmVzdWx0PiA9PiB7XHJcbiAgY29uc3QgdHlwZVZhbHVlID0gZ2V0TXVuaWNpcGFsaXR5VHlwZSh0eXBlKTtcclxuICBjb25zdCB7IG11bmljaXBhbGl0eSwgZXJyb3JzIH0gPSBhd2FpdCBmaW5kTXVuaWNpcGFsaXR5QnlOYW1lQW5kVHlwZShcclxuICAgIG5hbWUsXHJcbiAgICB0eXBlVmFsdWUsXHJcbiAgICBmb3VuZGVyXHJcbiAgKTtcclxuXHJcbiAgY29uc3Qgc3RhcnRPZmZzZXQgPSBsaW5lLmluZGV4T2YobmFtZSk7XHJcbiAgY29uc3QgZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBuYW1lLmxlbmd0aCArIDE7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBtdW5pY2lwYWxpdHksXHJcbiAgICBlcnJvcnM6IGVycm9ycy5tYXAoKGVycm9yKSA9PiAoe1xyXG4gICAgICAuLi5lcnJvcixcclxuICAgICAgc3RhcnRPZmZzZXQsXHJcbiAgICAgIGVuZE9mZnNldCxcclxuICAgIH0pKSxcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldE11bmljaXBhbGl0eVBhcnRSZXN1bHQgPSBhc3luYyAoXHJcbiAgbmFtZTogc3RyaW5nLFxyXG4gIGxpbmU6IHN0cmluZyxcclxuICBjaXR5Q29kZTogbnVtYmVyXHJcbik6IFByb21pc2U8TXVuaWNpcGFsaXR5UGFydFJlc3VsdD4gPT4ge1xyXG4gIGNvbnN0IHsgbXVuaWNpcGFsaXR5UGFydENvZGUsIGVycm9ycyB9ID0gYXdhaXQgZmluZE11bmljaXBhbGl0eVBhcnRCeU5hbWUoXHJcbiAgICBuYW1lLFxyXG4gICAgY2l0eUNvZGVcclxuICApO1xyXG5cclxuICBjb25zdCBzdGFydE9mZnNldCA9IGxpbmUuaW5kZXhPZihuYW1lKTtcclxuICBjb25zdCBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIG5hbWUubGVuZ3RoICsgMTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIG11bmljaXBhbGl0eVBhcnRDb2RlLFxyXG4gICAgZXJyb3JzOiBlcnJvcnMubWFwKChlcnJvcikgPT4gKHtcclxuICAgICAgLi4uZXJyb3IsXHJcbiAgICAgIHN0YXJ0T2Zmc2V0LFxyXG4gICAgICBlbmRPZmZzZXQsXHJcbiAgICB9KSksXHJcbiAgfTtcclxufTtcclxuXHJcbmNvbnN0IGdldE11bmljaXBhbGl0eVR5cGUgPSAodHlwZTogc3RyaW5nKTogTXVuaWNpcGFsaXR5VHlwZSA9PiB7XHJcbiAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICBjYXNlIFwibcSbc3Rza8OpIMSNw6FzdGlcIjpcclxuICAgIGNhc2UgXCJtxJtzdHNrw6lobyBvYnZvZHVcIjpcclxuICAgICAgcmV0dXJuIE11bmljaXBhbGl0eVR5cGUuRGlzdHJpY3Q7XHJcbiAgICBjYXNlIFwib2JjZVwiOlxyXG4gICAgY2FzZSBcIm3Em3N0YVwiOlxyXG4gICAgICByZXR1cm4gTXVuaWNpcGFsaXR5VHlwZS5DaXR5O1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGNsZWFuTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIHJldHVybiBuYW1lLnRyaW0oKTtcclxufTtcclxuIl19