UNPKG

ng-snotify

Version:
270 lines 35 kB
import { __decorate, __param } from "tslib"; import { Inject, Injectable } from '@angular/core'; import { Subject, from } from 'rxjs'; import { TransformArgument } from '../decorators/transform-argument.decorator'; import { mergeDeep, uuid } from '../utils'; import { SetToastType } from '../decorators/set-toast-type.decorator'; import { SnotifyToast } from '../models/snotify-toast.model'; import { SnotifyStyle } from '../enums/snotify-style.enum'; /** * SnotifyService - create, remove, config toasts */ let SnotifyService = // tslint:disable:unified-signatures class SnotifyService { constructor(config) { this.config = config; this.emitter = new Subject(); this.toastChanged = new Subject(); this.toastDeleted = new Subject(); this.notifications = []; } /** * emit changes in notifications array */ emit() { this.emitter.next(this.notifications.slice()); } /** * returns SnotifyToast object * @param id Number * @return SnotifyToast|undefined */ get(id) { return this.notifications.find(toast => toast.id === id); } /** * add SnotifyToast to notifications array * @param toast SnotifyToast */ add(toast) { if (this.config.global.filterDuplicates && this.containsToast(toast)) { return; } if (this.config.global.newOnTop) { this.notifications.unshift(toast); } else { this.notifications.push(toast); } this.emit(); } /** * checks if the toast is in the collection. * @param inToast SnotifyToast * @returns boolean */ containsToast(inToast) { return this.notifications.some(toast => toast.equals(inToast)); } /** * If ID passed, emits toast animation remove, if ID & REMOVE passed, removes toast from notifications array * @param id number * @param remove boolean */ remove(id, remove) { if (!id) { return this.clear(); } else if (remove) { this.notifications = this.notifications.filter(toast => toast.id !== id); return this.emit(); } this.toastDeleted.next(id); } /** * Clear notifications array */ clear() { this.notifications = []; this.emit(); } /** * Creates toast and add it to array, returns toast id * @param snotify Snotify * @return number */ create(snotify) { const config = mergeDeep(this.config.toast, this.config.type[snotify.config.type], snotify.config); const toast = new SnotifyToast(uuid(), snotify.title, snotify.body, config); this.add(toast); return toast; } setDefaults(defaults) { return (this.config = mergeDeep(this.config, defaults)); } /** * Transform toast arguments into Snotify object */ simple(args) { return this.create(args); } /** * Transform toast arguments into Snotify object */ success(args) { return this.create(args); } /** * Transform toast arguments into Snotify object */ error(args) { return this.create(args); } /** * Transform toast arguments into Snotify object */ info(args) { return this.create(args); } /** * Transform toast arguments into Snotify object */ warning(args) { return this.create(args); } /** * Transform toast arguments into Snotify object */ confirm(args) { return this.create(args); } /** * Transform toast arguments into Snotify object */ prompt(args) { return this.create(args); } /** * Transform toast arguments into Snotify object */ async(args) { let async; if (args.action instanceof Promise) { async = from(args.action); } else { async = args.action; } const toast = this.create(args); toast.on('mounted', () => { const subscription = async.subscribe((next) => { this.mergeToast(toast, next); }, (error) => { this.mergeToast(toast, error, SnotifyStyle.error); subscription.unsubscribe(); }, () => { this.mergeToast(toast, {}, SnotifyStyle.success); subscription.unsubscribe(); }); }); return toast; } mergeToast(toast, next, type) { if (next.body) { toast.body = next.body; } if (next.title) { toast.title = next.title; } if (type) { toast.config = mergeDeep(toast.config, this.config.global, this.config.toast[type], { type }, next.config); } else { toast.config = mergeDeep(toast.config, next.config); } if (next.html) { toast.config.html = next.html; } this.emit(); this.toastChanged.next(toast); } /** * Creates empty toast with html string inside * @param html string | SafeHtml * @param config SnotifyToastConfig * @returns number */ html(html, config) { return this.create({ title: null, body: null, config: Object.assign(Object.assign({}, config), { html }) }); } }; SnotifyService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: ['SnotifyToastConfig',] }] } ]; __decorate([ TransformArgument /** * Determines current toast type and collects default configuration */ , SetToastType ], SnotifyService.prototype, "simple", null); __decorate([ TransformArgument /** * Determines current toast type and collects default configuration */ , SetToastType ], SnotifyService.prototype, "success", null); __decorate([ TransformArgument /** * Determines current toast type and collects default configuration */ , SetToastType ], SnotifyService.prototype, "error", null); __decorate([ TransformArgument /** * Determines current toast type and collects default configuration */ , SetToastType ], SnotifyService.prototype, "info", null); __decorate([ TransformArgument /** * Determines current toast type and collects default configuration */ , SetToastType ], SnotifyService.prototype, "warning", null); __decorate([ TransformArgument /** * Determines current toast type and collects default configuration */ , SetToastType ], SnotifyService.prototype, "confirm", null); __decorate([ TransformArgument /** * Determines current toast type and collects default configuration */ , SetToastType ], SnotifyService.prototype, "prompt", null); __decorate([ TransformArgument /** * Determines current toast type and collects default configuration */ , SetToastType ], SnotifyService.prototype, "async", null); SnotifyService = __decorate([ Injectable() // tslint:disable:unified-signatures , __param(0, Inject('SnotifyToastConfig')) ], SnotifyService); export { SnotifyService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25vdGlmeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctc25vdGlmeS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9zbm90aWZ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUsvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRDs7R0FFRztBQUdILElBQWEsY0FBYztBQUQzQixvQ0FBb0M7QUFDcEMsTUFBYSxjQUFjO0lBTXpCLFlBQWlELE1BQXVCO1FBQXZCLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBTC9ELFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQztRQUN4QyxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1FBQzNDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUN0QyxrQkFBYSxHQUFtQixFQUFFLENBQUM7SUFFZ0MsQ0FBQztJQUM1RTs7T0FFRztJQUNLLElBQUk7UUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsRUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENB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QU0sQ0FBQztZQUNqQixLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxrQ0FDRCxNQUFNLEdBQ04sRUFBRSxJQUFJLEVBQUUsQ0FDWjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFBOzs0Q0F0ZGMsTUFBTSxTQUFDLG9CQUFvQjs7QUFxSHhDO0lBTEMsaUJBQWlCO0lBQ2xCOztPQUVHOztJQUNGLFlBQVk7NENBR1o7QUFzQ0Q7SUFMQyxpQkFBaUI7SUFDbEI7O09BRUc7O0lBQ0YsWUFBWTs2Q0FHWjtBQXNDRDtJQUxDLGlCQUFpQjtJQUNsQjs7T0FFRzs7SUFDRixZQUFZOzJDQUdaO0FBc0NEO0lBTEMsaUJBQWlCO0lBQ2xCOztPQUVHOztJQUNGLFlBQVk7MENBR1o7QUFzQ0Q7SUFMQyxpQkFBaUI7SUFDbEI7O09BRUc7O0lBQ0YsWUFBWTs2Q0FHWjtBQXNDRDtJQUxDLGlCQUFpQjtJQUNsQjs7T0FFRzs7SUFDRixZQUFZOzZDQUdaO0FBc0NEO0lBTEMsaUJBQWlCO0lBQ2xCOztPQUVHOztJQUNGLFlBQVk7NENBR1o7QUErQ0Q7SUFMQyxpQkFBaUI7SUFDbEI7O09BRUc7O0lBQ0YsWUFBWTsyQ0E0Qlo7QUF2YlUsY0FBYztJQUYxQixVQUFVLEVBQUU7SUFDYixvQ0FBb0M7O0lBT3JCLFdBQUEsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUE7R0FOOUIsY0FBYyxDQTRkMUI7U0E1ZFksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU25vdGlmeVRvYXN0Q29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zbm90aWZ5LXRvYXN0LWNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBTbm90aWZ5IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zbm90aWZ5LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFNub3RpZnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvc25vdGlmeS50eXBlJztcclxuaW1wb3J0IHsgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgVHJhbnNmb3JtQXJndW1lbnQgfSBmcm9tICcuLi9kZWNvcmF0b3JzL3RyYW5zZm9ybS1hcmd1bWVudC5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBtZXJnZURlZXAsIHV1aWQgfSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCB7IFNldFRvYXN0VHlwZSB9IGZyb20gJy4uL2RlY29yYXRvcnMvc2V0LXRvYXN0LXR5cGUuZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgU25vdGlmeURlZmF1bHRzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zbm90aWZ5LWRlZmF1bHRzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFNub3RpZnlUb2FzdCB9IGZyb20gJy4uL21vZGVscy9zbm90aWZ5LXRvYXN0Lm1vZGVsJztcclxuaW1wb3J0IHsgU25vdGlmeVN0eWxlIH0gZnJvbSAnLi4vZW51bXMvc25vdGlmeS1zdHlsZS5lbnVtJztcclxuXHJcbi8qKlxyXG4gKiBTbm90aWZ5U2VydmljZSAtIGNyZWF0ZSwgcmVtb3ZlLCBjb25maWcgdG9hc3RzXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbi8vIHRzbGludDpkaXNhYmxlOnVuaWZpZWQtc2lnbmF0dXJlc1xyXG5leHBvcnQgY2xhc3MgU25vdGlmeVNlcnZpY2Uge1xyXG4gIHJlYWRvbmx5IGVtaXR0ZXIgPSBuZXcgU3ViamVjdDxTbm90aWZ5VG9hc3RbXT4oKTtcclxuICByZWFkb25seSB0b2FzdENoYW5nZWQgPSBuZXcgU3ViamVjdDxTbm90aWZ5VG9hc3Q+KCk7XHJcbiAgcmVhZG9ubHkgdG9hc3REZWxldGVkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xyXG4gIHByaXZhdGUgbm90aWZpY2F0aW9uczogU25vdGlmeVRvYXN0W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdCgnU25vdGlmeVRvYXN0Q29uZmlnJykgcHVibGljIGNvbmZpZzogU25vdGlmeURlZmF1bHRzKSB7fVxyXG4gIC8qKlxyXG4gICAqIGVtaXQgY2hhbmdlcyBpbiBub3RpZmljYXRpb25zIGFycmF5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBlbWl0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5lbWl0dGVyLm5leHQodGhpcy5ub3RpZmljYXRpb25zLnNsaWNlKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmV0dXJucyBTbm90aWZ5VG9hc3Qgb2JqZWN0XHJcbiAgICogQHBhcmFtIGlkIE51bWJlclxyXG4gICAqIEByZXR1cm4gU25vdGlmeVRvYXN0fHVuZGVmaW5lZFxyXG4gICAqL1xyXG4gIGdldChpZDogbnVtYmVyKTogU25vdGlmeVRvYXN0IHtcclxuICAgIHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZCh0b2FzdCA9PiB0b2FzdC5pZCA9PT0gaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogYWRkIFNub3RpZnlUb2FzdCB0byBub3RpZmljYXRpb25zIGFycmF5XHJcbiAgICogQHBhcmFtIHRvYXN0IFNub3RpZnlUb2FzdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWRkKHRvYXN0OiBTbm90aWZ5VG9hc3QpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5nbG9iYWwuZmlsdGVyRHVwbGljYXRlcyAmJiB0aGlzLmNvbnRhaW5zVG9hc3QodG9hc3QpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbmZpZy5nbG9iYWwubmV3T25Ub3ApIHtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnVuc2hpZnQodG9hc3QpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnB1c2godG9hc3QpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjaGVja3MgaWYgdGhlIHRvYXN0IGlzIGluIHRoZSBjb2xsZWN0aW9uLlxyXG4gICAqIEBwYXJhbSBpblRvYXN0IFNub3RpZnlUb2FzdFxyXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnRhaW5zVG9hc3QoaW5Ub2FzdDogU25vdGlmeVRvYXN0KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25zLnNvbWUodG9hc3QgPT4gdG9hc3QuZXF1YWxzKGluVG9hc3QpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIElEIHBhc3NlZCwgZW1pdHMgdG9hc3QgYW5pbWF0aW9uIHJlbW92ZSwgaWYgSUQgJiBSRU1PVkUgcGFzc2VkLCByZW1vdmVzIHRvYXN0IGZyb20gbm90aWZpY2F0aW9ucyBhcnJheVxyXG4gICAqIEBwYXJhbSBpZCBudW1iZXJcclxuICAgKiBAcGFyYW0gcmVtb3ZlIGJvb2xlYW5cclxuICAgKi9cclxuICByZW1vdmUoaWQ/OiBudW1iZXIsIHJlbW92ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2xlYXIoKTtcclxuICAgIH0gZWxzZSBpZiAocmVtb3ZlKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IHRoaXMubm90aWZpY2F0aW9ucy5maWx0ZXIodG9hc3QgPT4gdG9hc3QuaWQgIT09IGlkKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZW1pdCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50b2FzdERlbGV0ZWQubmV4dChpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBub3RpZmljYXRpb25zIGFycmF5XHJcbiAgICovXHJcbiAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyB0b2FzdCBhbmQgYWRkIGl0IHRvIGFycmF5LCByZXR1cm5zIHRvYXN0IGlkXHJcbiAgICogQHBhcmFtIHNub3RpZnkgU25vdGlmeVxyXG4gICAqIEByZXR1cm4gbnVtYmVyXHJcbiAgICovXHJcbiAgY3JlYXRlKHNub3RpZnk6IFNub3RpZnkpOiBTbm90aWZ5VG9hc3Qge1xyXG4gICAgY29uc3QgY29uZmlnID0gbWVyZ2VEZWVwKHRoaXMuY29uZmlnLnRvYXN0LCB0aGlzLmNvbmZpZy50eXBlW3Nub3RpZnkuY29uZmlnLnR5cGVdLCBzbm90aWZ5LmNvbmZpZyk7XHJcbiAgICBjb25zdCB0b2FzdCA9IG5ldyBTbm90aWZ5VG9hc3QodXVpZCgpLCBzbm90aWZ5LnRpdGxlLCBzbm90aWZ5LmJvZHksIGNvbmZpZyk7XHJcbiAgICB0aGlzLmFkZCh0b2FzdCk7XHJcbiAgICByZXR1cm4gdG9hc3Q7XHJcbiAgfVxyXG5cclxuICBzZXREZWZhdWx0cyhkZWZhdWx0czogU25vdGlmeURlZmF1bHRzKTogU25vdGlmeURlZmF1bHRzIHtcclxuICAgIHJldHVybiAodGhpcy5jb25maWcgPSBtZXJnZURlZXAodGhpcy5jb25maWcsIGRlZmF1bHRzKSBhcyBTbm90aWZ5RGVmYXVsdHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggc2ltcGxlIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XHJcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgc2ltcGxlKGJvZHk6IHN0cmluZyk6IFNub3RpZnlUb2FzdDtcclxuICAvKipcclxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBzaW1wbGUgc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgc2ltcGxlKGJvZHk6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IFNub3RpZnlUb2FzdDtcclxuICAvKipcclxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBzaW1wbGUgc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gY29uZmlnIFNub3RpZnlUb2FzdENvbmZpZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIHNpbXBsZShib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHNpbXBsZSBzdHlsZSAgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gW2JvZHldIHN0cmluZ1xyXG4gICAqIEBwYXJhbSBbdGl0bGVdIHN0cmluZ1xyXG4gICAqIEBwYXJhbSBbY29uZmlnXSBTbm90aWZ5VG9hc3RDb25maWdcclxuICAgKiBAcmV0dXJucyBudW1iZXJcclxuICAgKi9cclxuICBzaW1wbGUoYm9keTogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBjb25maWc6IFNub3RpZnlUb2FzdENvbmZpZyk6IFNub3RpZnlUb2FzdDtcclxuICAvKipcclxuICAgKiBUcmFuc2Zvcm0gdG9hc3QgYXJndW1lbnRzIGludG8gU25vdGlmeSBvYmplY3RcclxuICAgKi9cclxuICBAVHJhbnNmb3JtQXJndW1lbnRcclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIGN1cnJlbnQgdG9hc3QgdHlwZSBhbmQgY29sbGVjdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgQFNldFRvYXN0VHlwZVxyXG4gIHNpbXBsZShhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggc3VjY2VzcyBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIHN1Y2Nlc3MoYm9keTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHN1Y2Nlc3Mgc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgc3VjY2Vzcyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggc3VjY2VzcyBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEBwYXJhbSBjb25maWcgU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgc3VjY2Vzcyhib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHN1Y2Nlc3Mgc3R5bGUgIHJldHVybnMgdG9hc3QgaWQ7XHJcbiAgICogQHBhcmFtIFtib2R5XSBzdHJpbmdcclxuICAgKiBAcGFyYW0gW3RpdGxlXSBzdHJpbmdcclxuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgc3VjY2Vzcyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybSB0b2FzdCBhcmd1bWVudHMgaW50byBTbm90aWZ5IG9iamVjdFxyXG4gICAqL1xyXG4gIEBUcmFuc2Zvcm1Bcmd1bWVudFxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBAU2V0VG9hc3RUeXBlXHJcbiAgc3VjY2VzcyhhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggZXJyb3Igc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcmV0dXJucyBudW1iZXJcclxuICAgKi9cclxuICBlcnJvcihib2R5OiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggZXJyb3Igc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgZXJyb3IoYm9keTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGVycm9yIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XHJcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXHJcbiAgICogQHBhcmFtIGNvbmZpZyBTbm90aWZ5VG9hc3RDb25maWdcclxuICAgKiBAcmV0dXJucyBudW1iZXJcclxuICAgKi9cclxuICBlcnJvcihib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGVycm9yIHN0eWxlICByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBbYm9keV0gc3RyaW5nXHJcbiAgICogQHBhcmFtIFt0aXRsZV0gc3RyaW5nXHJcbiAgICogQHBhcmFtIFtjb25maWddIFNub3RpZnlUb2FzdENvbmZpZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIGVycm9yKGJvZHk6IHN0cmluZywgdGl0bGU6IHN0cmluZywgY29uZmlnOiBTbm90aWZ5VG9hc3RDb25maWcpOiBTbm90aWZ5VG9hc3Q7XHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtIHRvYXN0IGFyZ3VtZW50cyBpbnRvIFNub3RpZnkgb2JqZWN0XHJcbiAgICovXHJcbiAgQFRyYW5zZm9ybUFyZ3VtZW50XHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyBjdXJyZW50IHRvYXN0IHR5cGUgYW5kIGNvbGxlY3RzIGRlZmF1bHQgY29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIEBTZXRUb2FzdFR5cGVcclxuICBlcnJvcihhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggaW5mbyBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIGluZm8oYm9keTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGluZm8gc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgaW5mbyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggaW5mbyBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEBwYXJhbSBjb25maWcgU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgaW5mbyhib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGluZm8gc3R5bGUgIHJldHVybnMgdG9hc3QgaWQ7XHJcbiAgICogQHBhcmFtIFtib2R5XSBzdHJpbmdcclxuICAgKiBAcGFyYW0gW3RpdGxlXSBzdHJpbmdcclxuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgaW5mbyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybSB0b2FzdCBhcmd1bWVudHMgaW50byBTbm90aWZ5IG9iamVjdFxyXG4gICAqL1xyXG4gIEBUcmFuc2Zvcm1Bcmd1bWVudFxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBAU2V0VG9hc3RUeXBlXHJcbiAgaW5mbyhhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggd2FybmluZyBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIHdhcm5pbmcoYm9keTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHdhcm5pbmcgc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgd2FybmluZyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggd2FybmluZyBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEBwYXJhbSBjb25maWcgU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgd2FybmluZyhib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHdhcm5pbmcgc3R5bGUgIHJldHVybnMgdG9hc3QgaWQ7XHJcbiAgICogQHBhcmFtIFtib2R5XSBzdHJpbmdcclxuICAgKiBAcGFyYW0gW3RpdGxlXSBzdHJpbmdcclxuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgd2FybmluZyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybSB0b2FzdCBhcmd1bWVudHMgaW50byBTbm90aWZ5IG9iamVjdFxyXG4gICAqL1xyXG4gIEBUcmFuc2Zvcm1Bcmd1bWVudFxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBAU2V0VG9hc3RUeXBlXHJcbiAgd2FybmluZyhhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggY29uZmlybSBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIGNvbmZpcm0oYm9keTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGNvbmZpcm0gc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgY29uZmlybShib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggY29uZmlybSBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEBwYXJhbSBjb25maWcgU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgY29uZmlybShib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGNvbmZpcm0gc3R5bGUgIHJldHVybnMgdG9hc3QgaWQ7XHJcbiAgICogQHBhcmFtIFtib2R5XSBzdHJpbmdcclxuICAgKiBAcGFyYW0gW3RpdGxlXSBzdHJpbmdcclxuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgY29uZmlybShib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybSB0b2FzdCBhcmd1bWVudHMgaW50byBTbm90aWZ5IG9iamVjdFxyXG4gICAqL1xyXG4gIEBUcmFuc2Zvcm1Bcmd1bWVudFxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBAU2V0VG9hc3RUeXBlXHJcbiAgY29uZmlybShhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggUHJvbXB0IHN0eWxlIHdpdGggdHdvIGJ1dHRvbnMsIHJldHVybnMgdG9hc3QgaWQ7XHJcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgcHJvbXB0KGJvZHk6IHN0cmluZyk6IFNub3RpZnlUb2FzdDtcclxuICAvKipcclxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBQcm9tcHQgc3R5bGUgd2l0aCB0d28gYnV0dG9ucywgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgcHJvbXB0KGJvZHk6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IFNub3RpZnlUb2FzdDtcclxuICAvKipcclxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBQcm9tcHQgc3R5bGUgd2l0aCB0d28gYnV0dG9ucywgcmV0dXJucyB0b2FzdCBpZDtcclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gY29uZmlnIFNub3RpZnlUb2FzdENvbmZpZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIHByb21wdChib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIFByb21wdCBzdHlsZSB3aXRoIHR3byBidXR0b25zLCByZXR1cm5zIHRvYXN0IGlkO1xyXG4gICAqIEBwYXJhbSBbYm9keV0gc3RyaW5nXHJcbiAgICogQHBhcmFtIFt0aXRsZV0gc3RyaW5nXHJcbiAgICogQHBhcmFtIFtjb25maWddIFNub3RpZnlUb2FzdENvbmZpZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIHByb21wdChib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybSB0b2FzdCBhcmd1bWVudHMgaW50byBTbm90aWZ5IG9iamVjdFxyXG4gICAqL1xyXG4gIEBUcmFuc2Zvcm1Bcmd1bWVudFxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBAU2V0VG9hc3RUeXBlXHJcbiAgcHJvbXB0KGFyZ3M6IGFueSk6IFNub3RpZnlUb2FzdCB7XHJcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoYXJncyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGFzeW5jIHRvYXN0IHdpdGggSW5mbyBzdHlsZS4gUGFzcyBhY3Rpb24sIGFuZCByZXNvbHZlIG9yIHJlamVjdCBpdC5cclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gYWN0aW9uIFByb21pc2U8U25vdGlmeT4gfCBPYnNlcnZhYmxlPFNub3RpZnk+XHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMoYm9keTogc3RyaW5nLCBhY3Rpb246IFByb21pc2U8U25vdGlmeT4gfCBPYnNlcnZhYmxlPFNub3RpZnk+KTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYXN5bmMgdG9hc3Qgd2l0aCBJbmZvIHN0eWxlLiBQYXNzIGFjdGlvbiwgYW5kIHJlc29sdmUgb3IgcmVqZWN0IGl0LlxyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEBwYXJhbSB0aXRsZSBzdHJpbmdcclxuICAgKiBAcGFyYW0gYWN0aW9uIFByb21pc2U8U25vdGlmeT4gfCBPYnNlcnZhYmxlPFNub3RpZnk+XHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMoYm9keTogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBhY3Rpb246IFByb21pc2U8U25vdGlmeT4gfCBPYnNlcnZhYmxlPFNub3RpZnk+KTogU25vdGlmeVRvYXN0O1xyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYXN5bmMgdG9hc3Qgd2l0aCBJbmZvIHN0eWxlLiBQYXNzIGFjdGlvbiwgYW5kIHJlc29sdmUgb3IgcmVqZWN0IGl0LlxyXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xyXG4gICAqIEBwYXJhbSBhY3Rpb24gUHJvbWlzZTxTbm90aWZ5PiB8IE9ic2VydmFibGU8U25vdGlmeT5cclxuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXHJcbiAgICogQHJldHVybnMgbnVtYmVyXHJcbiAgICovXHJcbiAgYXN5bmMoYm9keTogc3RyaW5nLCBhY3Rpb246IFByb21pc2U8U25vdGlmeT4gfCBPYnNlcnZhYmxlPFNub3RpZnk+LCBjb25maWc6IFNub3RpZnlUb2FzdENvbmZpZyk6IFNub3RpZnlUb2FzdDtcclxuICAvKipcclxuICAgKiBDcmVhdGVzIGFzeW5jIHRvYXN0IHdpdGggSW5mbyBzdHlsZS4gUGFzcyBhY3Rpb24sIGFuZCByZXNvbHZlIG9yIHJlamVjdCBpdC5cclxuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcclxuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXHJcbiAgICogQHBhcmFtIGFjdGlvbiBQcm9taXNlPFNub3RpZnk+IHwgT2JzZXJ2YWJsZTxTbm90aWZ5PlxyXG4gICAqIEBwYXJhbSBbY29uZmlnXSBTbm90aWZ5VG9hc3RDb25maWdcclxuICAgKiBAcmV0dXJucyBudW1iZXJcclxuICAgKi9cclxuICBhc3luYyhcclxuICAgIGJvZHk6IHN0cmluZyxcclxuICAgIHRpdGxlOiBzdHJpbmcsXHJcbiAgICBhY3Rpb246IFByb21pc2U8U25vdGlmeT4gfCBPYnNlcnZhYmxlPFNub3RpZnk+LFxyXG4gICAgY29uZmlnOiBTbm90aWZ5VG9hc3RDb25maWdcclxuICApOiBTbm90aWZ5VG9hc3Q7XHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtIHRvYXN0IGFyZ3VtZW50cyBpbnRvIFNub3RpZnkgb2JqZWN0XHJcbiAgICovXHJcbiAgQFRyYW5zZm9ybUFyZ3VtZW50XHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyBjdXJyZW50IHRvYXN0IHR5cGUgYW5kIGNvbGxlY3RzIGRlZmF1bHQgY29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIEBTZXRUb2FzdFR5cGVcclxuICBhc3luYyhhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xyXG4gICAgbGV0IGFzeW5jOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgICBpZiAoYXJncy5hY3Rpb24gaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgIGFzeW5jID0gZnJvbShhcmdzLmFjdGlvbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhc3luYyA9IGFyZ3MuYWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRvYXN0ID0gdGhpcy5jcmVhdGUoYXJncyk7XHJcblxyXG4gICAgdG9hc3Qub24oJ21vdW50ZWQnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gYXN5bmMuc3Vic2NyaWJlKFxyXG4gICAgICAgIChuZXh0PzogU25vdGlmeSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5tZXJnZVRvYXN0KHRvYXN0LCBuZXh0KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcj86IFNub3RpZnkpID0+IHtcclxuICAgICAgICAgIHRoaXMubWVyZ2VUb2FzdCh0b2FzdCwgZXJyb3IsIFNub3RpZnlTdHlsZS5lcnJvcik7XHJcbiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubWVyZ2VUb2FzdCh0b2FzdCwge30sIFNub3RpZnlTdHlsZS5zdWNjZXNzKTtcclxuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0b2FzdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVyZ2VUb2FzdCh0b2FzdCwgbmV4dCwgdHlwZT86IFNub3RpZnlUeXBlKSB7XHJcbiAgICBpZiAobmV4dC5ib2R5KSB7XHJcbiAgICAgIHRvYXN0LmJvZHkgPSBuZXh0LmJvZHk7XHJcbiAgICB9XHJcbiAgICBpZiAobmV4dC50aXRsZSkge1xyXG4gICAgICB0b2FzdC50aXRsZSA9IG5leHQudGl0bGU7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSkge1xyXG4gICAgICB0b2FzdC5jb25maWcgPSBtZXJnZURlZXAodG9hc3QuY29uZmlnLCB0aGlzLmNvbmZpZy5nbG9iYWwsIHRoaXMuY29uZmlnLnRvYXN0W3R5cGVdLCB7IHR5cGUgfSwgbmV4dC5jb25maWcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdG9hc3QuY29uZmlnID0gbWVyZ2VEZWVwKHRvYXN0LmNvbmZpZywgbmV4dC5jb25maWcpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5leHQuaHRtbCkge1xyXG4gICAgICB0b2FzdC5jb25maWcuaHRtbCA9IG5leHQuaHRtbDtcclxuICAgIH1cclxuICAgIHRoaXMuZW1pdCgpO1xyXG4gICAgdGhpcy50b2FzdENoYW5nZWQubmV4dCh0b2FzdCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGVtcHR5IHRvYXN0IHdpdGggaHRtbCBzdHJpbmcgaW5zaWRlXHJcbiAgICogQHBhcmFtIGh0bWwgc3RyaW5nIHwgU2FmZUh0bWxcclxuICAgKiBAcGFyYW0gY29uZmlnIFNub3RpZnlUb2FzdENvbmZpZ1xyXG4gICAqIEByZXR1cm5zIG51bWJlclxyXG4gICAqL1xyXG4gIGh0bWwoaHRtbDogc3RyaW5nIHwgU2FmZUh0bWwsIGNvbmZpZz86IFNub3RpZnlUb2FzdENvbmZpZyk6IFNub3RpZnlUb2FzdCB7XHJcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoe1xyXG4gICAgICB0aXRsZTogbnVsbCxcclxuICAgICAgYm9keTogbnVsbCxcclxuICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgLi4uY29uZmlnLFxyXG4gICAgICAgIC4uLnsgaHRtbCB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=