UNPKG

gy-foo

Version:

A library that contains all models for the gy-web-project.

208 lines 23.4 kB
import { Occurrence } from './occurrence.model'; import { ModeFlags } from '../enums/modeFlags.enum'; export class Entity { constructor(entity, keepModes = true) { if (entity) { if (entity instanceof Entity) { this.structure = entity.getStructure(); this.occs = this.convertOccurences(entity.getOccs(), keepModes) || []; } else { this.structure = entity.structure; this.occs = this.convertOccurences(entity.occs, keepModes) || []; } } else { this.structure = {}; this.occs = []; } } /** * Checks if entity has the structure of an entity * @param entity entity to check */ static isEntity(entity) { return entity && entity.occs ? true : false; } /** * Gets the number of the Occurrences of this Entity */ getOccsLength() { return this.occs.length; } /** * Get all Occurences of this entity. */ getOccs() { return this.occs; } /** * Sets all Occurrences of the Entity to the given array. * @param occs array of the new Occurrences */ setOccs(occs) { this.occs = occs; } /** * Checks if the given occurence is in this Entity * @param pk the pk of the occurrence */ hasOcc(pk) { return this.occs.find((occ) => occ.getPk() === pk) != null; } /** * Sets the given Occurence on the given value. If pk is missing, the first Occurrence is set. * @param occ the new Occurrence * @param pk the pk of the Occurrence */ setOcc(occ, pk) { if (pk) { this.occs = this.occs.map((oldOcc) => { if (oldOcc.getPk() === pk) { return occ; } else { return oldOcc; } }); } else { this.occs[0] = occ; } } /** * Gets the Occurrence with the given pk, if no pk is given it gets the first Occurence * @param pk PK of the Occurrence */ getOcc(pk) { if (pk) { return this.occs.find((occ) => occ.getPk() === pk); } else { let occ; if (this.occs && this.occs.length > 0) { occ = this.occs[0]; } else { occ = new Occurrence(); this.addOcc(occ); } return occ; } } /** * Gets the structure of the Entity */ getStructure() { return this.structure; } /** * Adds an Occurrence to the Entity * @param occ the new Occurrence * @param modeFlag decides, if the add mode should be set for occ * @param isUserChange is that a User Change * @returns the pk of the new Occ */ addOcc(occ, add, isUserChange) { const addFlag = add !== undefined && add !== null ? add : true; if (!occ) { occ = new Occurrence(); } occ.setMode({ add: addFlag }); if (isUserChange) { occ.setModified(true, false); } if (!occ.getPk()) { let pk = 'new_'; let index = 1; this.occs.forEach((occ) => { if (occ.getPk().substr(0, 4) === 'new_' && Number(occ.getPk().substr(4)) >= index) { index = Number(occ.getPk().substr(4)) + 1; } }); pk += index; occ.addPk(pk); } if (!occ.getStructure() || !Object.keys(occ.getStructure()).length) { occ.setStructure(this.structure); } const occIndex = this.occs.findIndex((o) => o.getPk() === occ.getPk()); if (occIndex >= 0) { this.occs[occIndex] = occ; } else { this.occs.push(occ); } return occ.getPk(); } /** * Copys an Occurrence to the Entity * @param pk pk of the occurrence that should be copied * @param modeFlag decides, if the copy mode should be set for the new occ * @param isUserChange is this a User Change? * @returns the pk of the new Occ */ copyOcc(pk, cpy, isUserChange) { let cpyFlag = cpy !== undefined && cpy !== null ? cpy : true; const occ = this.getOcc(pk); const addFlag = occ.getMode() === 'add'; if (addFlag) { cpyFlag = false; } const copyCount = this.occs.filter((o) => o.getPk().search(new RegExp('^(?:copy_)?' + occ.getPk())) >= 0).length; const copyOcc = new Occurrence({ pk: 'copy_' + occ.getPk() + '#' + copyCount, data: Object.assign({}, occ.getData()), structure: occ.getStructure(), meta: occ.getMeta(), }, { add: addFlag, cpy: cpyFlag }); if (isUserChange) { occ.setModified(true, false); } this.occs.push(copyOcc); return copyOcc.getPk(); } /** * Adds the Occurrences of an Entity to this Occurrences * @param entity the Entity that should be added */ addEntity(entity) { this.occs.push(...this.convertOccurences(entity.occs).filter((occ) => !this.hasOcc(occ.getPk()))); } convertOccurences(occs, keepModes = true) { return occs.map((occ) => { return occ instanceof Occurrence ? occ : new Occurrence(occ.pk ? occ : { pk: occ._pk, data: occ, structure: this.structure || {} }, keepModes ? { add: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.ADD, cpy: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.CPY, del: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.DEL, } : null); }); } /** * Sets the modified flag for all occs in the entity * @param modified occ is modified? * @param setSubEntites should the modified flag be set also in the subentites? (default: false) */ setModified(modified, setSubEntites = false) { for (const occ of this.getOccs()) { occ.setModified(modified, setSubEntites); } } /** * Has the Entity been modified? * @param checkSubEnt check Subentities (default: true) */ isModified(checkSubEnt = true) { for (const occ of this.getOccs()) { if (occ.isModified(checkSubEnt)) { return true; } } return false; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ3ktZm9vLyIsInNvdXJjZXMiOlsibGliL21vZGVscy9lbnRpdHkubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sTUFBTTtJQUlqQixZQUFZLE1BQXFFLEVBQUUsU0FBUyxHQUFHLElBQUk7UUFDakcsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFJLE1BQU0sWUFBWSxNQUFNLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3ZFO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDbEU7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFjO1FBQzVCLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLElBQUks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UyxDQUFDLEdBQUc7cUJBQ3ZFO29CQUNILENBQUMsQ0FBQyxJQUFJLENBQ1QsQ0FBQztRQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsUUFBaUIsRUFBRSxnQkFBeUIsS0FBSztRQUMzRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNoQyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsY0FBdUIsSUFBSTtRQUNwQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNoQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2NjdXJyZW5jZSB9IGZyb20gJy4vb2NjdXJyZW5jZS5tb2RlbCc7XG5pbXBvcnQgeyBFbnRpdHlTdHJ1Y3R1cmUgfSBmcm9tICcuL2VudGl0eVN0cnVjdHVyZS5tb2RlbCc7XG5pbXBvcnQgeyBNb2RlRmxhZ3MgfSBmcm9tICcuLi9lbnVtcy9tb2RlRmxhZ3MuZW51bSc7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBwcml2YXRlIG9jY3M6IE9jY3VycmVuY2VbXTtcbiAgcHJpdmF0ZSBzdHJ1Y3R1cmU6IEVudGl0eVN0cnVjdHVyZTtcblxuICBjb25zdHJ1Y3RvcihlbnRpdHk/OiB7IHN0cnVjdHVyZTogRW50aXR5U3RydWN0dXJlOyBvY2NzPzogT2NjdXJyZW5jZVtdIH0gfCBFbnRpdHksIGtlZXBNb2RlcyA9IHRydWUpIHtcbiAgICBpZiAoZW50aXR5KSB7XG4gICAgICBpZiAoZW50aXR5IGluc3RhbmNlb2YgRW50aXR5KSB7XG4gICAgICAgIHRoaXMuc3RydWN0dXJlID0gZW50aXR5LmdldFN0cnVjdHVyZSgpO1xuICAgICAgICB0aGlzLm9jY3MgPSB0aGlzLmNvbnZlcnRPY2N1cmVuY2VzKGVudGl0eS5nZXRPY2NzKCksIGtlZXBNb2RlcykgfHwgW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0cnVjdHVyZSA9IGVudGl0eS5zdHJ1Y3R1cmU7XG4gICAgICAgIHRoaXMub2NjcyA9IHRoaXMuY29udmVydE9jY3VyZW5jZXMoZW50aXR5Lm9jY3MsIGtlZXBNb2RlcykgfHwgW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RydWN0dXJlID0ge307XG4gICAgICB0aGlzLm9jY3MgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGVudGl0eSBoYXMgdGhlIHN0cnVjdHVyZSBvZiBhbiBlbnRpdHlcbiAgICogQHBhcmFtIGVudGl0eSBlbnRpdHkgdG8gY2hlY2tcbiAgICovXG4gIHN0YXRpYyBpc0VudGl0eShlbnRpdHk6IEVudGl0eSkge1xuICAgIHJldHVybiBlbnRpdHkgJiYgZW50aXR5Lm9jY3MgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRoZSBPY2N1cnJlbmNlcyBvZiB0aGlzIEVudGl0eVxuICAgKi9cbiAgZ2V0T2Njc0xlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5vY2NzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIE9jY3VyZW5jZXMgb2YgdGhpcyBlbnRpdHkuXG4gICAqL1xuICBnZXRPY2NzKCkge1xuICAgIHJldHVybiB0aGlzLm9jY3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhbGwgT2NjdXJyZW5jZXMgb2YgdGhlIEVudGl0eSB0byB0aGUgZ2l2ZW4gYXJyYXkuXG4gICAqIEBwYXJhbSBvY2NzIGFycmF5IG9mIHRoZSBuZXcgT2NjdXJyZW5jZXNcbiAgICovXG4gIHNldE9jY3Mob2NjczogT2NjdXJyZW5jZVtdKSB7XG4gICAgdGhpcy5vY2NzID0gb2NjcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9jY3VyZW5jZSBpcyBpbiB0aGlzIEVudGl0eVxuICAgKiBAcGFyYW0gcGsgdGhlIHBrIG9mIHRoZSBvY2N1cnJlbmNlXG4gICAqL1xuICBoYXNPY2MocGs6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9jY3MuZmluZCgob2NjKSA9PiBvY2MuZ2V0UGsoKSA9PT0gcGspICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ2l2ZW4gT2NjdXJlbmNlIG9uIHRoZSBnaXZlbiB2YWx1ZS4gSWYgcGsgaXMgbWlzc2luZywgdGhlIGZpcnN0IE9jY3VycmVuY2UgaXMgc2V0LlxuICAgKiBAcGFyYW0gb2NjIHRoZSBuZXcgT2NjdXJyZW5jZVxuICAgKiBAcGFyYW0gcGsgdGhlIHBrIG9mIHRoZSBPY2N1cnJlbmNlXG4gICAqL1xuICBzZXRPY2Mob2NjOiBPY2N1cnJlbmNlLCBwaz86IHN0cmluZykge1xuICAgIGlmIChwaykge1xuICAgICAgdGhpcy5vY2NzID0gdGhpcy5vY2NzLm1hcCgob2xkT2NjKSA9PiB7XG4gICAgICAgIGlmIChvbGRPY2MuZ2V0UGsoKSA9PT0gcGspIHtcbiAgICAgICAgICByZXR1cm4gb2NjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBvbGRPY2M7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9jY3NbMF0gPSBvY2M7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIE9jY3VycmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGssIGlmIG5vIHBrIGlzIGdpdmVuIGl0IGdldHMgdGhlIGZpcnN0IE9jY3VyZW5jZVxuICAgKiBAcGFyYW0gcGsgUEsgb2YgdGhlIE9jY3VycmVuY2VcbiAgICovXG4gIGdldE9jYyhwaz86IHN0cmluZyk6IE9jY3VycmVuY2Uge1xuICAgIGlmIChwaykge1xuICAgICAgcmV0dXJuIHRoaXMub2Njcy5maW5kKChvY2MpID0+IG9jYy5nZXRQaygpID09PSBwayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBvY2M7XG4gICAgICBpZiAodGhpcy5vY2NzICYmIHRoaXMub2Njcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9jYyA9IHRoaXMub2Njc1swXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9jYyA9IG5ldyBPY2N1cnJlbmNlKCk7XG4gICAgICAgIHRoaXMuYWRkT2NjKG9jYyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2NjO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEVudGl0eVxuICAgKi9cbiAgZ2V0U3RydWN0dXJlKCkge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9jY3VycmVuY2UgdG8gdGhlIEVudGl0eVxuICAgKiBAcGFyYW0gb2NjIHRoZSBuZXcgT2NjdXJyZW5jZVxuICAgKiBAcGFyYW0gbW9kZUZsYWcgZGVjaWRlcywgaWYgdGhlIGFkZCBtb2RlIHNob3VsZCBiZSBzZXQgZm9yIG9jY1xuICAgKiBAcGFyYW0gaXNVc2VyQ2hhbmdlIGlzIHRoYXQgYSBVc2VyIENoYW5nZVxuICAgKiBAcmV0dXJucyB0aGUgcGsgb2YgdGhlIG5ldyBPY2NcbiAgICovXG4gIGFkZE9jYyhvY2M/OiBPY2N1cnJlbmNlLCBhZGQ/OiBib29sZWFuLCBpc1VzZXJDaGFuZ2U/OiBib29sZWFuKSB7XG4gICAgY29uc3QgYWRkRmxhZyA9IGFkZCAhPT0gdW5kZWZpbmVkICYmIGFkZCAhPT0gbnVsbCA/IGFkZCA6IHRydWU7XG4gICAgaWYgKCFvY2MpIHtcbiAgICAgIG9jYyA9IG5ldyBPY2N1cnJlbmNlKCk7XG4gICAgfVxuICAgIG9jYy5zZXRNb2RlKHsgYWRkOiBhZGRGbGFnIH0pO1xuICAgIGlmIChpc1VzZXJDaGFuZ2UpIHtcbiAgICAgIG9jYy5zZXRNb2RpZmllZCh0cnVlLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmICghb2NjLmdldFBrKCkpIHtcbiAgICAgIGxldCBwayA9ICduZXdfJztcbiAgICAgIGxldCBpbmRleCA9IDE7XG4gICAgICB0aGlzLm9jY3MuZm9yRWFjaCgob2NjKSA9PiB7XG4gICAgICAgIGlmIChvY2MuZ2V0UGsoKS5zdWJzdHIoMCwgNCkgPT09ICduZXdfJyAmJiBOdW1iZXIob2NjLmdldFBrKCkuc3Vic3RyKDQpKSA+PSBpbmRleCkge1xuICAgICAgICAgIGluZGV4ID0gTnVtYmVyKG9jYy5nZXRQaygpLnN1YnN0cig0KSkgKyAxO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHBrICs9IGluZGV4O1xuICAgICAgb2NjLmFkZFBrKHBrKTtcbiAgICB9XG5cbiAgICBpZiAoIW9jYy5nZXRTdHJ1Y3R1cmUoKSB8fCAhT2JqZWN0LmtleXMob2NjLmdldFN0cnVjdHVyZSgpKS5sZW5ndGgpIHtcbiAgICAgIG9jYy5zZXRTdHJ1Y3R1cmUodGhpcy5zdHJ1Y3R1cmUpO1xuICAgIH1cblxuICAgIGNvbnN0IG9jY0luZGV4ID0gdGhpcy5vY2NzLmZpbmRJbmRleCgobykgPT4gby5nZXRQaygpID09PSBvY2MuZ2V0UGsoKSk7XG4gICAgaWYgKG9jY0luZGV4ID49IDApIHtcbiAgICAgIHRoaXMub2Njc1tvY2NJbmRleF0gPSBvY2M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub2Njcy5wdXNoKG9jYyk7XG4gICAgfVxuICAgIHJldHVybiBvY2MuZ2V0UGsoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5cyBhbiBPY2N1cnJlbmNlIHRvIHRoZSBFbnRpdHlcbiAgICogQHBhcmFtIHBrIHBrIG9mIHRoZSBvY2N1cnJlbmNlIHRoYXQgc2hvdWxkIGJlIGNvcGllZFxuICAgKiBAcGFyYW0gbW9kZUZsYWcgZGVjaWRlcywgaWYgdGhlIGNvcHkgbW9kZSBzaG91bGQgYmUgc2V0IGZvciB0aGUgbmV3IG9jY1xuICAgKiBAcGFyYW0gaXNVc2VyQ2hhbmdlIGlzIHRoaXMgYSBVc2VyIENoYW5nZT9cbiAgICogQHJldHVybnMgdGhlIHBrIG9mIHRoZSBuZXcgT2NjXG4gICAqL1xuICBjb3B5T2NjKHBrOiBzdHJpbmcsIGNweT86IGJvb2xlYW4sIGlzVXNlckNoYW5nZT86IGJvb2xlYW4pIHtcbiAgICBsZXQgY3B5RmxhZyA9IGNweSAhPT0gdW5kZWZpbmVkICYmIGNweSAhPT0gbnVsbCA/IGNweSA6IHRydWU7XG4gICAgY29uc3Qgb2NjID0gdGhpcy5nZXRPY2MocGspO1xuICAgIGNvbnN0IGFkZEZsYWcgPSBvY2MuZ2V0TW9kZSgpID09PSAnYWRkJztcbiAgICBpZiAoYWRkRmxhZykge1xuICAgICAgY3B5RmxhZyA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjb3B5Q291bnQgPSB0aGlzLm9jY3MuZmlsdGVyKChvKSA9PiBvLmdldFBrKCkuc2VhcmNoKG5ldyBSZWdFeHAoJ14oPzpjb3B5Xyk/JyArIG9jYy5nZXRQaygpKSkgPj0gMCkubGVuZ3RoO1xuXG4gICAgY29uc3QgY29weU9jYyA9IG5ldyBPY2N1cnJlbmNlKFxuICAgICAge1xuICAgICAgICBwazogJ2NvcHlfJyArIG9jYy5nZXRQaygpICsgJyMnICsgY29weUNvdW50LFxuICAgICAgICBkYXRhOiB7IC4uLm9jYy5nZXREYXRhKCkgfSxcbiAgICAgICAgc3RydWN0dXJlOiBvY2MuZ2V0U3RydWN0dXJlKCksXG4gICAgICAgIG1ldGE6IG9jYy5nZXRNZXRhKCksXG4gICAgICB9LFxuICAgICAgeyBhZGQ6IGFkZEZsYWcsIGNweTogY3B5RmxhZyB9XG4gICAgKTtcbiAgICBpZiAoaXNVc2VyQ2hhbmdlKSB7XG4gICAgICBvY2Muc2V0TW9kaWZpZWQodHJ1ZSwgZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLm9jY3MucHVzaChjb3B5T2NjKTtcbiAgICByZXR1cm4gY29weU9jYy5nZXRQaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIE9jY3VycmVuY2VzIG9mIGFuIEVudGl0eSB0byB0aGlzIE9jY3VycmVuY2VzXG4gICAqIEBwYXJhbSBlbnRpdHkgdGhlIEVudGl0eSB0aGF0IHNob3VsZCBiZSBhZGRlZFxuICAgKi9cbiAgYWRkRW50aXR5KGVudGl0eTogRW50aXR5KSB7XG4gICAgdGhpcy5vY2NzLnB1c2goLi4udGhpcy5jb252ZXJ0T2NjdXJlbmNlcyhlbnRpdHkub2NjcykuZmlsdGVyKChvY2MpID0+ICF0aGlzLmhhc09jYyhvY2MuZ2V0UGsoKSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydE9jY3VyZW5jZXMoXG4gICAgb2NjczogKE9jY3VycmVuY2UgfCB7IHBrOiBzdHJpbmc7IHN0cnVjdHVyZTogRW50aXR5U3RydWN0dXJlOyBkYXRhPzogb2JqZWN0IH0gfCBhbnkpW10sXG4gICAga2VlcE1vZGVzID0gdHJ1ZVxuICApOiBPY2N1cnJlbmNlW10ge1xuICAgIHJldHVybiBvY2NzLm1hcCgob2NjKSA9PiB7XG4gICAgICByZXR1cm4gb2NjIGluc3RhbmNlb2YgT2NjdXJyZW5jZVxuICAgICAgICA/IG9jY1xuICAgICAgICA6IG5ldyBPY2N1cnJlbmNlKFxuICAgICAgICAgICAgb2NjLnBrID8gb2NjIDogeyBwazogb2NjLl9waywgZGF0YTogb2NjLCBzdHJ1Y3R1cmU6IHRoaXMuc3RydWN0dXJlIHx8IHt9IH0sXG4gICAgICAgICAgICBrZWVwTW9kZXNcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBhZGQ6IChvY2MuZGF0YSAhPSBudWxsID8gb2NjLmRhdGEuX21vZGUgOiBvY2MuX21vZGUpID09PSBNb2RlRmxhZ3MuQURELFxuICAgICAgICAgICAgICAgICAgY3B5OiAob2NjLmRhdGEgIT0gbnVsbCA/IG9jYy5kYXRhLl9tb2RlIDogb2NjLl9tb2RlKSA9PT0gTW9kZUZsYWdzLkNQWSxcbiAgICAgICAgICAgICAgICAgIGRlbDogKG9jYy5kYXRhICE9IG51bGwgPyBvY2MuZGF0YS5fbW9kZSA6IG9jYy5fbW9kZSkgPT09IE1vZGVGbGFncy5ERUwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG1vZGlmaWVkIGZsYWcgZm9yIGFsbCBvY2NzIGluIHRoZSBlbnRpdHlcbiAgICogQHBhcmFtIG1vZGlmaWVkIG9jYyBpcyBtb2RpZmllZD9cbiAgICogQHBhcmFtIHNldFN1YkVudGl0ZXMgc2hvdWxkIHRoZSBtb2RpZmllZCBmbGFnIGJlIHNldCBhbHNvIGluIHRoZSBzdWJlbnRpdGVzPyAoZGVmYXVsdDogZmFsc2UpXG4gICAqL1xuICBzZXRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbiwgc2V0U3ViRW50aXRlczogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvY2Mgb2YgdGhpcy5nZXRPY2NzKCkpIHtcbiAgICAgIG9jYy5zZXRNb2RpZmllZChtb2RpZmllZCwgc2V0U3ViRW50aXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhcyB0aGUgRW50aXR5IGJlZW4gbW9kaWZpZWQ/XG4gICAqIEBwYXJhbSBjaGVja1N1YkVudCBjaGVjayBTdWJlbnRpdGllcyAoZGVmYXVsdDogdHJ1ZSlcbiAgICovXG4gIGlzTW9kaWZpZWQoY2hlY2tTdWJFbnQ6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBvY2Mgb2YgdGhpcy5nZXRPY2NzKCkpIHtcbiAgICAgIGlmIChvY2MuaXNNb2RpZmllZChjaGVja1N1YkVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19