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

393 lines 47.1 kB
import { EmbeddedActionsParser, EOF } from "chevrotain"; import { splitStreetViaRomanNumerals } from "./roman-numerals"; import { AllType, AndAbove, AndBelow, DescriptiveType, EvenType, From, Hyphen, MainSeparator, MunicipalityPartName, Number, OddType, Separator, Slash, StreetName, To, Without, } from "./token-definition"; import { SeriesType } from "./types"; export class SmdParser extends EmbeddedActionsParser { constructor(tokenVocabulary) { super(tokenVocabulary); this.street = this.RULE("street", () => { let result; this.OR([ { ALT: () => { result = this.SUBRULE(this.streetNameAndNumbersSpecs); }, }, { ALT: () => { result = { type: "street", street: this.CONSUME(StreetName).image, numberSpec: [], }; }, }, { ALT: () => { result = this.SUBRULE(this.municipalityPartNameAndNumbersSpecs); }, }, { ALT: () => { const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image); result = { type: "municipalityPart", municipalityPart, numberSpec: [], }; }, }, ]); if (result.type === "street") { return splitStreetViaRomanNumerals(result.street).map((street) => ({ type: "street", street, numberSpec: result.numberSpec, })); } else { return [result]; } }); this.streetNameAndNumbersSpecs = this.RULE("streetNameAndNumbersSpecs", () => { const street = this.CONSUME(StreetName).image; this.OPTION(() => { this.CONSUME(MainSeparator); }); const numberSpec = this.SUBRULE(this.numberSpecs); return { type: "street", street, numberSpec }; }); this.municipalityPartNameAndNumbersSpecs = this.RULE("municipalityPartNameAndNumbersSpecs", () => { const municipalityPart = parseMunicipalityPartName(this.CONSUME(MunicipalityPartName).image); this.OPTION(() => { this.CONSUME(MainSeparator); }); const numberSpec = this.SUBRULE(this.numberSpecs); return { type: "municipalityPart", municipalityPart, numberSpec, }; }); this.numberSpecs = this.RULE("numberSpecs", () => { const positiveResult = []; let negativeResult; this.OR([ { GATE: () => this.LA(2).tokenType === Without, ALT: () => { const type = this.SUBRULE(this.seriesType); this.CONSUME(Without); this.OPTION(() => { this.CONSUME(AllType); }); const ranges = this.SUBRULE(this.rangeList); return { negative: true, type, ranges }; }, }, { ALT: () => { this.CONSUME2(Without); this.OR1([ { GATE: this._gatePostfixTypeSeriesSpec, ALT: () => { const { type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec); negativeResult = { negative: true, type, ranges }; }, }, { ALT: () => { const type = this.SUBRULE2(this.seriesType); const ranges = this.SUBRULE2(this.rangeList); negativeResult = { negative: true, type, ranges }; }, }, ]); }, }, { ALT: () => { this.AT_LEAST_ONE_SEP({ SEP: Separator, DEF: () => { positiveResult.push(this.SUBRULE(this.seriesSpecs)); }, }); }, }, ]); if (negativeResult) { return negativeResult; } return positiveResult; }); this.seriesSpecs = this.RULE("seriesSpecs", () => { let ranges = []; let type; this.OR([ { GATE: this._gatePostfixTypeSeriesSpec, ALT: () => { ({ type, ranges } = this.SUBRULE(this.postfixTypeSeriesSpec)); }, }, { ALT: () => { type = this.SUBRULE(this.seriesType); this.OPTION(() => { ranges = this.SUBRULE(this.rangeList); }); }, }, { ALT: () => { ({ type, ranges } = this.SUBRULE2(this.fromAndAboveWithType)); }, }, { ALT: () => { ({ type, ranges } = this.SUBRULE(this.toOrBelowWithType)); }, }, ]); return { type, ranges }; }); this._gatePostfixTypeSeriesSpec = () => { let index = 2; while (![Separator, EOF].includes(this.LA(index).tokenType)) { if ([OddType, EvenType].includes(this.LA(index).tokenType)) { return true; } index++; } return false; }; this.postfixTypeSeriesSpec = this.RULE("postfixTypeSeriesSpec", () => { this.CONSUME(AllType); const ranges = [this.SUBRULE(this.rangeOrNumber)]; let type; this.OR1([ { ALT: () => { this.CONSUME(OddType); type = SeriesType.Odd; }, }, { ALT: () => { this.CONSUME1(EvenType); type = SeriesType.Even; }, }, ]); return { type, ranges }; }); this.rangeList = this.RULE("rangeList", () => { let ranges = []; ranges.push(this.SUBRULE(this.rangeOrNumber)); this.MANY({ GATE: () => [Number, To, From].includes(this.LA(2).tokenType), DEF: () => { this.CONSUME(Separator); ranges.push(this.SUBRULE2(this.rangeOrNumber)); }, }); return ranges; }); this.seriesType = this.RULE("seriesType", () => { let type; this.OR([ { ALT: () => { this.CONSUME(OddType); type = SeriesType.Odd; }, }, { ALT: () => { this.CONSUME1(EvenType); type = SeriesType.Even; }, }, { ALT: () => { this.CONSUME2(AllType); type = SeriesType.All; }, }, { ALT: () => { this.CONSUME3(DescriptiveType); type = SeriesType.Description; }, }, ]); return type; }); this.rangeOrNumber = this.RULE("rangeOrNumber", () => { let result; this.OR([ { ALT: () => { result = this.SUBRULE(this.range); }, }, { ALT: () => { result = this.SUBRULE(this.fromAndAbove); }, }, { ALT: () => { result = this.SUBRULE(this.toOrBelow); }, }, { ALT: () => { result = this.SUBRULE(this.fullStreetNumber); }, }, { ALT: () => { const n = parseRichNumber(this.CONSUME(Number).image); result = { from: n, to: n }; }, }, ]); return result; }); this.range = this.RULE("range", () => { const from = parseRichNumber(this.CONSUME(Number).image); this.OR([ { ALT: () => this.CONSUME1(Hyphen) }, { ALT: () => this.CONSUME2(MainSeparator) }, ]); this.OPTION(() => { this.CONSUME(AllType); }); const to = parseRichNumber(this.CONSUME3(Number).image); return { from, to }; }); this.fromAndAbove = this.RULE("fromAndAbove", () => { let from; this.OR([ { ALT: () => { from = parseRichNumber(this.CONSUME(Number).image); this.CONSUME(AndAbove); }, }, { ALT: () => { this.CONSUME(From); this.OPTION(() => { this.CONSUME(AllType); }); from = parseRichNumber(this.CONSUME2(Number).image); this.OPTION2(() => { this.CONSUME2(AndAbove); }); }, }, ]); return { from }; }); this.fromAndAboveWithType = this.RULE("fromAndAboveWithType", () => { let type = SeriesType.All; this.CONSUME(From); this.OPTION(() => { this.OR([ { ALT: () => { type = SeriesType.All; this.CONSUME(AllType); }, }, { ALT: () => { type = SeriesType.Description; this.CONSUME(DescriptiveType); }, }, ]); }); const from = parseRichNumber(this.CONSUME(Number).image); this.OPTION2(() => { this.CONSUME(AndAbove); }); return { type, ranges: [{ from }] }; }); this.toOrBelow = this.RULE("toOrBelow", () => { let to; this.OR([ { ALT: () => { to = parseRichNumber(this.CONSUME(Number).image); this.CONSUME(AndBelow); }, }, { ALT: () => { this.CONSUME2(To); to = parseRichNumber(this.CONSUME2(Number).image); }, }, ]); return { to }; }); this.toOrBelowWithType = this.RULE("toOrBelowWithType", () => { let type = SeriesType.All; this.CONSUME(To); this.OPTION(() => { this.OR([ { ALT: () => { type = SeriesType.All; this.CONSUME(AllType); }, }, { ALT: () => { type = SeriesType.Description; this.CONSUME(DescriptiveType); }, }, ]); }); const to = parseRichNumber(this.CONSUME(Number).image); return { type, ranges: [{ to }] }; }); this.fullStreetNumber = this.RULE("fullStreetNumber", () => { const descriptiveNumber = parseRichNumber(this.CONSUME(Number).image); this.CONSUME(Slash); const orientationNumber = parseRichNumber(this.CONSUME2(Number).image); return { descriptionNumber: descriptiveNumber, orientationalNumber: orientationNumber, }; }); this.performSelfAnalysis(); } } const numberWithCharacterPattern = /^(\d+)([a-z])$/; export const parseRichNumber = (number) => { if (numberWithCharacterPattern.test(number)) { const match = numberWithCharacterPattern.exec(number); return { number: parseInt(match[1]), letter: match[2], }; } else { return { number: parseInt(number), }; } }; const municipalityPartPattern = /^část (?<type>obce|města) (?<name>.+)$/; export const parseMunicipalityPartName = (name) => { const match = municipalityPartPattern.exec(name); return match?.groups.name?.trim() ?? ""; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21kLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlZXQtbWFya2Rvd24vc21kLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxFQUFtQixNQUFNLFlBQVksQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLEVBQ1IsZUFBZSxFQUNmLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNOLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixFQUFFLEVBQ0YsT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFvRCxVQUFVLEVBQVcsTUFBTSxTQUFTLENBQUM7QUFFaEcsTUFBTSxPQUFPLFNBQVUsU0FBUSxxQkFBcUI7SUFDbEQsWUFBWSxlQUFnQztRQUMxQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFJbEIsV0FBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQWMsRUFBRTtZQUNsRCxJQUFJLE1BQU0sQ0FBQztZQUNYLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ047b0JBQ0UsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDUixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUFFO3dCQUNSLE1BQU0sR0FBRzs0QkFDUCxJQUFJLEVBQUUsUUFBUTs0QkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLOzRCQUN0QyxVQUFVLEVB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Q0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO0lBQ2hFLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxPQUFPLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbWJlZGRlZEFjdGlvbnNQYXJzZXIsIEVPRiwgVG9rZW5Wb2NhYnVsYXJ5IH0gZnJvbSBcImNoZXZyb3RhaW5cIjtcclxuaW1wb3J0IHsgc3BsaXRTdHJlZXRWaWFSb21hbk51bWVyYWxzIH0gZnJvbSBcIi4vcm9tYW4tbnVtZXJhbHNcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgQWxsVHlwZSxcclxuICBBbmRBYm92ZSxcclxuICBBbmRCZWxvdyxcclxuICBEZXNjcmlwdGl2ZVR5cGUsXHJcbiAgRXZlblR5cGUsXHJcbiAgRnJvbSxcclxuICBIeXBoZW4sXHJcbiAgTWFpblNlcGFyYXRvcixcclxuICBNdW5pY2lwYWxpdHlQYXJ0TmFtZSxcclxuICBOdW1iZXIsXHJcbiAgT2RkVHlwZSxcclxuICBTZXBhcmF0b3IsXHJcbiAgU2xhc2gsXHJcbiAgU3RyZWV0TmFtZSxcclxuICBUbyxcclxuICBXaXRob3V0LFxyXG59IGZyb20gXCIuL3Rva2VuLWRlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgRnVsbFN0cmVldE51bWJlciwgTmVnYXRpdmVTZXJpZXNTcGVjLCBSaWNoTnVtYmVyLCBTZXJpZXNUeXBlLCBTbWRMaW5lIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTbWRQYXJzZXIgZXh0ZW5kcyBFbWJlZGRlZEFjdGlvbnNQYXJzZXIge1xyXG4gIGNvbnN0cnVjdG9yKHRva2VuVm9jYWJ1bGFyeTogVG9rZW5Wb2NhYnVsYXJ5KSB7XHJcbiAgICBzdXBlcih0b2tlblZvY2FidWxhcnkpO1xyXG4gICAgdGhpcy5wZXJmb3JtU2VsZkFuYWx5c2lzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RyZWV0ID0gdGhpcy5SVUxFKFwic3RyZWV0XCIsICgpOiBTbWRMaW5lW10gPT4ge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIHRoaXMuT1IoW1xyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5zdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwic3RyZWV0XCIsXHJcbiAgICAgICAgICAgIHN0cmVldDogdGhpcy5DT05TVU1FKFN0cmVldE5hbWUpLmltYWdlLFxyXG4gICAgICAgICAgICBudW1iZXJTcGVjOiBbXSxcclxuICAgICAgICAgIH0gYXMgU21kTGluZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5tdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbXVuaWNpcGFsaXR5UGFydCA9IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUoXHJcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShNdW5pY2lwYWxpdHlQYXJ0TmFtZSkuaW1hZ2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwibXVuaWNpcGFsaXR5UGFydFwiLFxyXG4gICAgICAgICAgICBtdW5pY2lwYWxpdHlQYXJ0LFxyXG4gICAgICAgICAgICBudW1iZXJTcGVjOiBbXSxcclxuICAgICAgICAgIH0gYXMgU21kTGluZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcblxyXG4gICAgaWYgKHJlc3VsdC50eXBlID09PSBcInN0cmVldFwiKSB7XHJcbiAgICAgIHJldHVybiBzcGxpdFN0cmVldFZpYVJvbWFuTnVtZXJhbHMocmVzdWx0LnN0cmVldCkubWFwKChzdHJlZXQpID0+ICh7XHJcbiAgICAgICAgdHlwZTogXCJzdHJlZXRcIixcclxuICAgICAgICBzdHJlZXQsXHJcbiAgICAgICAgbnVtYmVyU3BlYzogcmVzdWx0Lm51bWJlclNwZWMsXHJcbiAgICAgIH0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBbcmVzdWx0XTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcHJpdmF0ZSBzdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzID0gdGhpcy5SVUxFKFxyXG4gICAgXCJzdHJlZXROYW1lQW5kTnVtYmVyc1NwZWNzXCIsXHJcbiAgICAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN0cmVldCA9IHRoaXMuQ09OU1VNRShTdHJlZXROYW1lKS5pbWFnZTtcclxuICAgICAgdGhpcy5PUFRJT04oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuQ09OU1VNRShNYWluU2VwYXJhdG9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IG51bWJlclNwZWMgPSB0aGlzLlNVQlJVTEUodGhpcy5udW1iZXJTcGVjcyk7XHJcbiAgICAgIHJldHVybiB7IHR5cGU6IFwic3RyZWV0XCIsIHN0cmVldCwgbnVtYmVyU3BlYyB9IGFzIFNtZExpbmU7XHJcbiAgICB9XHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBtdW5pY2lwYWxpdHlQYXJ0TmFtZUFuZE51bWJlcnNTcGVjcyA9IHRoaXMuUlVMRShcclxuICAgIFwibXVuaWNpcGFsaXR5UGFydE5hbWVBbmROdW1iZXJzU3BlY3NcIixcclxuICAgICgpID0+IHtcclxuICAgICAgY29uc3QgbXVuaWNpcGFsaXR5UGFydCA9IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUoXHJcbiAgICAgICAgdGhpcy5DT05TVU1FKE11bmljaXBhbGl0eVBhcnROYW1lKS5pbWFnZVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5DT05TVU1FKE1haW5TZXBhcmF0b3IpO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgbnVtYmVyU3BlYyA9IHRoaXMuU1VCUlVMRSh0aGlzLm51bWJlclNwZWNzKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0eXBlOiBcIm11bmljaXBhbGl0eVBhcnRcIixcclxuICAgICAgICBtdW5pY2lwYWxpdHlQYXJ0LFxyXG4gICAgICAgIG51bWJlclNwZWMsXHJcbiAgICAgIH0gYXMgU21kTGluZTtcclxuICAgIH1cclxuICApO1xyXG5cclxuICBwcml2YXRlIG51bWJlclNwZWNzID0gdGhpcy5SVUxFKFwibnVtYmVyU3BlY3NcIiwgKCkgPT4ge1xyXG4gICAgY29uc3QgcG9zaXRpdmVSZXN1bHQgPSBbXTtcclxuICAgIGxldCBuZWdhdGl2ZVJlc3VsdDogTmVnYXRpdmVTZXJpZXNTcGVjO1xyXG4gICAgdGhpcy5PUihbXHJcbiAgICAgIHtcclxuICAgICAgICBHQVRFOiAoKSA9PiB0aGlzLkxBKDIpLnRva2VuVHlwZSA9PT0gV2l0aG91dCxcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLlNVQlJVTEUodGhpcy5zZXJpZXNUeXBlKTtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRShXaXRob3V0KTtcclxuICAgICAgICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLlNVQlJVTEUodGhpcy5yYW5nZUxpc3QpO1xyXG4gICAgICAgICAgcmV0dXJuIHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTIoV2l0aG91dCk7XHJcbiAgICAgICAgICB0aGlzLk9SMShbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBHQVRFOiB0aGlzLl9nYXRlUG9zdGZpeFR5cGVTZXJpZXNTcGVjLFxyXG4gICAgICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0eXBlLCByYW5nZXMgfSA9IHRoaXMuU1VCUlVMRShcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wb3N0Zml4VHlwZVNlcmllc1NwZWNcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBuZWdhdGl2ZVJlc3VsdCA9IHsgbmVnYXRpdmU6IHRydWUsIHR5cGUsIHJhbmdlcyB9O1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLlNVQlJVTEUyKHRoaXMuc2VyaWVzVHlwZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLlNVQlJVTEUyKHRoaXMucmFuZ2VMaXN0KTtcclxuICAgICAgICAgICAgICAgIG5lZ2F0aXZlUmVzdWx0ID0geyBuZWdhdGl2ZTogdHJ1ZSwgdHlwZSwgcmFuZ2VzIH07XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQVRfTEVBU1RfT05FX1NFUCh7XHJcbiAgICAgICAgICAgIFNFUDogU2VwYXJhdG9yLFxyXG4gICAgICAgICAgICBERUY6ICgpID0+IHtcclxuICAgICAgICAgICAgICBwb3NpdGl2ZVJlc3VsdC5wdXNoKHRoaXMuU1VCUlVMRSh0aGlzLnNlcmllc1NwZWNzKSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgICBpZiAobmVnYXRpdmVSZXN1bHQpIHtcclxuICAgICAgcmV0dXJuIG5lZ2F0aXZlUmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBvc2l0aXZlUmVzdWx0O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHNlcmllc1NwZWNzID0gdGhpcy5SVUxFKFwic2VyaWVzU3BlY3NcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHJhbmdlcyA9IFtdO1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEdBVEU6IHRoaXMuX2dhdGVQb3N0Zml4VHlwZVNlcmllc1NwZWMsXHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAoeyB0eXBlLCByYW5nZXMgfSA9IHRoaXMuU1VCUlVMRSh0aGlzLnBvc3RmaXhUeXBlU2VyaWVzU3BlYykpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHR5cGUgPSB0aGlzLlNVQlJVTEUodGhpcy5zZXJpZXNUeXBlKTtcclxuICAgICAgICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgICAgICAgcmFuZ2VzID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2VMaXN0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgICh7IHR5cGUsIHJhbmdlcyB9ID0gdGhpcy5TVUJSVUxFMih0aGlzLmZyb21BbmRBYm92ZVdpdGhUeXBlKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgKHsgdHlwZSwgcmFuZ2VzIH0gPSB0aGlzLlNVQlJVTEUodGhpcy50b09yQmVsb3dXaXRoVHlwZSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdKTtcclxuXHJcbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXMgfTtcclxuICB9KTtcclxuXHJcbiAgcHJpdmF0ZSBfZ2F0ZVBvc3RmaXhUeXBlU2VyaWVzU3BlYyA9ICgpOiBib29sZWFuID0+IHtcclxuICAgIGxldCBpbmRleCA9IDI7XHJcbiAgICB3aGlsZSAoIVtTZXBhcmF0b3IsIEVPRl0uaW5jbHVkZXModGhpcy5MQShpbmRleCkudG9rZW5UeXBlKSkge1xyXG4gICAgICBpZiAoW09kZFR5cGUsIEV2ZW5UeXBlXS5pbmNsdWRlcyh0aGlzLkxBKGluZGV4KS50b2tlblR5cGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaW5kZXgrKztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIHBvc3RmaXhUeXBlU2VyaWVzU3BlYyA9IHRoaXMuUlVMRShcInBvc3RmaXhUeXBlU2VyaWVzU3BlY1wiLCAoKSA9PiB7XHJcbiAgICB0aGlzLkNPTlNVTUUoQWxsVHlwZSk7XHJcbiAgICBjb25zdCByYW5nZXMgPSBbdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2VPck51bWJlcildO1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SMShbXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRShPZGRUeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLk9kZDtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUxKEV2ZW5UeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkV2ZW47XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0pO1xyXG4gICAgcmV0dXJuIHsgdHlwZSwgcmFuZ2VzIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgcmFuZ2VMaXN0ID0gdGhpcy5SVUxFKFwicmFuZ2VMaXN0XCIsICgpID0+IHtcclxuICAgIGxldCByYW5nZXMgPSBbXTtcclxuICAgIHJhbmdlcy5wdXNoKHRoaXMuU1VCUlVMRSh0aGlzLnJhbmdlT3JOdW1iZXIpKTtcclxuICAgIHRoaXMuTUFOWSh7XHJcbiAgICAgIEdBVEU6ICgpID0+IFtOdW1iZXIsIFRvLCBGcm9tXS5pbmNsdWRlcyh0aGlzLkxBKDIpLnRva2VuVHlwZSksXHJcbiAgICAgIERFRjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuQ09OU1VNRShTZXBhcmF0b3IpO1xyXG4gICAgICAgIHJhbmdlcy5wdXNoKHRoaXMuU1VCUlVMRTIodGhpcy5yYW5nZU9yTnVtYmVyKSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByYW5nZXM7XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgc2VyaWVzVHlwZSA9IHRoaXMuUlVMRShcInNlcmllc1R5cGVcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHR5cGU6IFNlcmllc1R5cGU7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKE9kZFR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuT2RkO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTEoRXZlblR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuRXZlbjtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUyKEFsbFR5cGUpO1xyXG4gICAgICAgICAgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuQ09OU1VNRTMoRGVzY3JpcHRpdmVUeXBlKTtcclxuICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkRlc2NyaXB0aW9uO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdKTtcclxuICAgIHJldHVybiB0eXBlO1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHJhbmdlT3JOdW1iZXIgPSB0aGlzLlJVTEUoXCJyYW5nZU9yTnVtYmVyXCIsICgpID0+IHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMucmFuZ2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuU1VCUlVMRSh0aGlzLmZyb21BbmRBYm92ZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5TVUJSVUxFKHRoaXMudG9PckJlbG93KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLlNVQlJVTEUodGhpcy5mdWxsU3RyZWV0TnVtYmVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcclxuICAgICAgICAgIHJlc3VsdCA9IHsgZnJvbTogbiwgdG86IG4gfTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHJhbmdlID0gdGhpcy5SVUxFKFwicmFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgY29uc3QgZnJvbSA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAgeyBBTFQ6ICgpID0+IHRoaXMuQ09OU1VNRTEoSHlwaGVuKSB9LFxyXG4gICAgICB7IEFMVDogKCkgPT4gdGhpcy5DT05TVU1FMihNYWluU2VwYXJhdG9yKSB9LFxyXG4gICAgXSk7XHJcbiAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgdG8gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FMyhOdW1iZXIpLmltYWdlKTtcclxuICAgIHJldHVybiB7IGZyb20sIHRvIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgZnJvbUFuZEFib3ZlID0gdGhpcy5SVUxFKFwiZnJvbUFuZEFib3ZlXCIsICgpID0+IHtcclxuICAgIGxldCBmcm9tOiBSaWNoTnVtYmVyO1xyXG4gICAgdGhpcy5PUihbXHJcbiAgICAgIHtcclxuICAgICAgICBBTFQ6ICgpID0+IHtcclxuICAgICAgICAgIGZyb20gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKEFuZEFib3ZlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUoRnJvbSk7XHJcbiAgICAgICAgICB0aGlzLk9QVElPTigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuQ09OU1VNRShBbGxUeXBlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZnJvbSA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUyKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5PUFRJT04yKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FMihBbmRBYm92ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSk7XHJcblxyXG4gICAgcmV0dXJuIHsgZnJvbSB9O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIGZyb21BbmRBYm92ZVdpdGhUeXBlID0gdGhpcy5SVUxFKFwiZnJvbUFuZEFib3ZlV2l0aFR5cGVcIiwgKCkgPT4ge1xyXG4gICAgbGV0IHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgIHRoaXMuQ09OU1VNRShGcm9tKTtcclxuICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgdGhpcy5PUihbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKERlc2NyaXB0aXZlVHlwZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmcm9tID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRShOdW1iZXIpLmltYWdlKTtcclxuICAgIHRoaXMuT1BUSU9OMigoKSA9PiB7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShBbmRBYm92ZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB7IHR5cGUsIHJhbmdlczogW3sgZnJvbSB9XSB9O1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIHRvT3JCZWxvdyA9IHRoaXMuUlVMRShcInRvT3JCZWxvd1wiLCAoKSA9PiB7XHJcbiAgICBsZXQgdG86IFJpY2hOdW1iZXI7XHJcbiAgICB0aGlzLk9SKFtcclxuICAgICAge1xyXG4gICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgdG8gPSBwYXJzZVJpY2hOdW1iZXIodGhpcy5DT05TVU1FKE51bWJlcikuaW1hZ2UpO1xyXG4gICAgICAgICAgdGhpcy5DT05TVU1FKEFuZEJlbG93KTtcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkNPTlNVTUUyKFRvKTtcclxuICAgICAgICAgIHRvID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0pO1xyXG5cclxuICAgIHJldHVybiB7IHRvIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgdG9PckJlbG93V2l0aFR5cGUgPSB0aGlzLlJVTEUoXCJ0b09yQmVsb3dXaXRoVHlwZVwiLCAoKSA9PiB7XHJcbiAgICBsZXQgdHlwZSA9IFNlcmllc1R5cGUuQWxsO1xyXG4gICAgdGhpcy5DT05TVU1FKFRvKTtcclxuICAgIHRoaXMuT1BUSU9OKCgpID0+IHtcclxuICAgICAgdGhpcy5PUihbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgQUxUOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHR5cGUgPSBTZXJpZXNUeXBlLkFsbDtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKEFsbFR5cGUpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIEFMVDogKCkgPT4ge1xyXG4gICAgICAgICAgICB0eXBlID0gU2VyaWVzVHlwZS5EZXNjcmlwdGlvbjtcclxuICAgICAgICAgICAgdGhpcy5DT05TVU1FKERlc2NyaXB0aXZlVHlwZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCB0byA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICByZXR1cm4geyB0eXBlLCByYW5nZXM6IFt7IHRvIH1dIH07XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgZnVsbFN0cmVldE51bWJlciA9IHRoaXMuUlVMRShcclxuICAgIFwiZnVsbFN0cmVldE51bWJlclwiLFxyXG4gICAgKCk6IEZ1bGxTdHJlZXROdW1iZXIgPT4ge1xyXG4gICAgICBjb25zdCBkZXNjcmlwdGl2ZU51bWJlciA9IHBhcnNlUmljaE51bWJlcih0aGlzLkNPTlNVTUUoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgIHRoaXMuQ09OU1VNRShTbGFzaCk7XHJcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uTnVtYmVyID0gcGFyc2VSaWNoTnVtYmVyKHRoaXMuQ09OU1VNRTIoTnVtYmVyKS5pbWFnZSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGVzY3JpcHRpb25OdW1iZXI6IGRlc2NyaXB0aXZlTnVtYmVyLFxyXG4gICAgICAgIG9yaWVudGF0aW9uYWxOdW1iZXI6IG9yaWVudGF0aW9uTnVtYmVyLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICk7XHJcbn1cclxuXHJcbmNvbnN0IG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuID0gL14oXFxkKykoW2Etel0pJC87XHJcblxyXG5leHBvcnQgY29uc3QgcGFyc2VSaWNoTnVtYmVyID0gKG51bWJlcjogc3RyaW5nKTogUmljaE51bWJlciA9PiB7XHJcbiAgaWYgKG51bWJlcldpdGhDaGFyYWN0ZXJQYXR0ZXJuLnRlc3QobnVtYmVyKSkge1xyXG4gICAgY29uc3QgbWF0Y2ggPSBudW1iZXJXaXRoQ2hhcmFjdGVyUGF0dGVybi5leGVjKG51bWJlcik7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBudW1iZXI6IHBhcnNlSW50KG1hdGNoWzFdKSxcclxuICAgICAgbGV0dGVyOiBtYXRjaFsyXSxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG51bWJlcjogcGFyc2VJbnQobnVtYmVyKSxcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgbXVuaWNpcGFsaXR5UGFydFBhdHRlcm4gPSAvXsSNw6FzdCAoPzx0eXBlPm9iY2V8bcSbc3RhKSAoPzxuYW1lPi4rKSQvO1xyXG5cclxuZXhwb3J0IGNvbnN0IHBhcnNlTXVuaWNpcGFsaXR5UGFydE5hbWUgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBtYXRjaCA9IG11bmljaXBhbGl0eVBhcnRQYXR0ZXJuLmV4ZWMobmFtZSk7XHJcbiAgcmV0dXJuIG1hdGNoPy5ncm91cHMubmFtZT8udHJpbSgpID8/IFwiXCI7XHJcbn07XHJcbiJdfQ==