UNPKG

angular-magic-breadcrumb

Version:

AngularMagicBreadcrumb is a library for self-generated breadcrumb in angular 7

216 lines 21.2 kB
/** * @fileoverview added by tsickle * Generated from: lib/custom-breadcrumb.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input } from '@angular/core'; import { NavigationEnd, Router } from "@angular/router"; import { AngularMagicBreadcrumbService } from "./angular-magic-breadcrumb.service"; import { filter } from "rxjs/operators"; import { Location } from '@angular/common'; export class CustomBreadcrumbComponent { /** * @param {?} router * @param {?} breadcrumbService * @param {?} location */ constructor(router, breadcrumbService, location) { this.router = router; this.breadcrumbService = breadcrumbService; this.location = location; // this variable will handle the current url split into a list structure this.currentsplitUrl = []; // this variable will handle the full breadcrumb itself, this variable will be used in the HTML template this.breadcumValue = []; // this variable is a flag that indicates if the Breadcrumb must be shown in a specific view this.showBreadcrum = true; } /** * @return {?} */ ngOnInit() { this.setUrls(); this.getBreadcrum(); } /** * Checks if the part of the breadcrumb is active or not, and make the redirection to the specific url of the part * @param {?} breadcrum -> part of the full breadcrumb * @return {?} */ redirectToView(breadcrum) { if (breadcrum.active) { return; } this.router.navigate([breadcrum.url]); } /** * Make the subscriptions to the two observables, and saves the value of them into a specific variable * saves the breadcrumb and if should be shown or not * @return {?} */ getBreadcrum() { this.breadcrumbService.breadcrumbStructure_.subscribe((/** * @param {?} value * @return {?} */ value => { /** @type {?} */ let newBreadcrum = []; value.forEach((/** * @param {?} item * @return {?} */ item => { if (item.show == true) { newBreadcrum.push(item); } })); this.breadcumValue = newBreadcrum; })); this.breadcrumbService.showBreadcrumbStructure_.subscribe((/** * @param {?} value * @return {?} */ value => { this.showBreadcrum = value; })); } /** * @return {?} */ setUrls() { this._mainRoot = this.mainRoot; this.router.events.pipe( // Just executed when an navigation event ends filter((/** * @param {?} event * @return {?} */ event => event instanceof NavigationEnd))).subscribe((/** * @return {?} */ () => { // returns and save the breadcrumb into a new temporal variable /** @type {?} */ const currentBreadCrumStructure = this.getBreadcrumbStructure(); // resets the structure of the breadcrumb this.breadcrumbService.resetBreadcrumbStructure(); // this variable will hold the url to add to the breadcrumb structure /** @type {?} */ let setsUrl = ''; /** @type {?} */ const pathnameUrl = this.location.path().split('#')[0].split('?')[0]; // this condition is when the breadcrumb is in a platform that has got a route that we don't want to show in the breadcrumb if (pathnameUrl.includes('/' + this._mainRoot + '/')) { setsUrl = '/' + this._mainRoot; } if (pathnameUrl != this.lastPathname) { // the breadcrumb must be shown if the first item change this.showBreadcrum = true; } // splits the url by the route on the condition above and splits it by the '/' separator // Removes the /plataforma/ and params if the url have one of them /** @type {?} */ let splitUrl = pathnameUrl.split('/' + this._mainRoot + '/').join('').split('/'); // this line assure us that the url split has no blanks or null or empty elements splitUrl = splitUrl.filter(Boolean); splitUrl.forEach((/** * @param {?} item * @param {?} index * @return {?} */ (item, index) => { setsUrl = setsUrl + '/' + item; // a variable that holds the new part that will be added to the breadcrumb /** @type {?} */ let newBreadcrum = {}; // if one part of the breadcrumb did'nt change, the last known value will be added (remains the same) if (this.currentsplitUrl[index] === item) { newBreadcrum = currentBreadCrumStructure[index]; } else { // else... a new structure is created newBreadcrum = { value: item, url: setsUrl, active: splitUrl.length - 1 === index, show: true }; } // the new part of the breadcrumb is added to the structure that will be shown this.setItemBreadcrumbStructure(newBreadcrum, index); if (splitUrl.length - 1 === index) { // in the last item of the route, the current route split is setted into the variable, to use it later when another navigation // event happens this.currentsplitUrl = splitUrl; } })); this.lastPathname = pathnameUrl; })); } /** * @param {?} newBreadcrum * @param {?} index * @return {?} */ setItemBreadcrumbStructure(newBreadcrum, index) { this.breadcrumbService.setItemBreadcrumbStructure(newBreadcrum, index); } /** * @return {?} */ getBreadcrumbStructure() { return this.breadcrumbService.getBreadcrumbStructure(); } /** * @param {?} value * @return {?} */ changeVisibilityBreadcrumb(value) { this.breadcrumbService.changeVisibilityBreadcrumb(value); } } CustomBreadcrumbComponent.decorators = [ { type: Component, args: [{ selector: 'lng-self-generated-breadcrumb', template: "<div class=\"dynamic-breadcrumb\">\r\n <nav aria-label=\"breadcrumb\" class=\"navigation\" *ngIf=\"showBreadcrum\">\r\n <ol class=\"breadcrumb\">\r\n <li class=\"breadcrumb-item\" [class.active]=\"breadcrum.active\"\r\n (click)=\"redirectToView(breadcrum)\"\r\n style=\"text-transform: capitalize\"\r\n *ngFor=\"let breadcrum of breadcumValue\">{{breadcrum.value}}</li>\r\n </ol>\r\n </nav>\r\n</div>\r\n", providers: [AngularMagicBreadcrumbService], styles: [".dynamic-breadcrumb{background-color:#fff}.navigation{display:block}.breadcrumb{display:flex;flex-wrap:wrap;list-style:none;border-radius:.25rem;background-color:#fff;font-size:15px;padding:31px 30px 10px;color:#898989;font-weight:300;max-width:1216px;margin:0 auto}.breadcrumb .breadcrumb-item+.breadcrumb-item::before{display:inline-block;color:#6c757d;content:\"/\";padding-right:5px}.breadcrumb .breadcrumb-item{padding-left:5px}.breadcrumb .breadcrumb-item:not(.active){cursor:pointer}.breadcrumb .breadcrumb-item.active{color:#707070;font-weight:400}@media (min-width:768px){.breadcrumb{padding-left:30px;padding-bottom:22px}}@media (min-width:992px){.breadcrumb{padding-left:45px}}@media (min-width:1200px){.breadcrumb{font-size:17px;padding:40px 50px 10px}}"] }] } ]; /** @nocollapse */ CustomBreadcrumbComponent.ctorParameters = () => [ { type: Router }, { type: AngularMagicBreadcrumbService }, { type: Location } ]; CustomBreadcrumbComponent.propDecorators = { mainRoot: [{ type: Input }] }; if (false) { /** @type {?} */ CustomBreadcrumbComponent.prototype.mainRoot; /** @type {?} */ CustomBreadcrumbComponent.prototype._mainRoot; /** @type {?} */ CustomBreadcrumbComponent.prototype.lastPathname; /** @type {?} */ CustomBreadcrumbComponent.prototype.currentsplitUrl; /** @type {?} */ CustomBreadcrumbComponent.prototype.breadcumValue; /** @type {?} */ CustomBreadcrumbComponent.prototype.showBreadcrum; /** * @type {?} * @private */ CustomBreadcrumbComponent.prototype.router; /** @type {?} */ CustomBreadcrumbComponent.prototype.breadcrumbService; /** * @type {?} * @private */ CustomBreadcrumbComponent.prototype.location; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWJyZWFkY3J1bWIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1tYWdpYy1icmVhZGNydW1iLyIsInNvdXJjZXMiOlsibGliL2N1c3RvbS1icmVhZGNydW1iLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDakYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQVF6QyxNQUFNLE9BQU8seUJBQXlCOzs7Ozs7SUFlcEMsWUFDVSxNQUFjLEVBQ2YsaUJBQWdELEVBQy9DLFFBQWtCO1FBRmxCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZixzQkFBaUIsR0FBakIsaUJBQWlCLENBQStCO1FBQy9DLGFBQVEsR0FBUixRQUFRLENBQVU7O1FBYjVCLG9CQUFlLEdBQUcsRUFBRSxDQUFDOztRQUVyQixrQkFBYSxHQUlQLEVBQUUsQ0FBQzs7UUFFVCxrQkFBYSxHQUFHLElBQUksQ0FBQztJQU1qQixDQUFDOzs7O0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs7Ozs7SUFNRCxjQUFjLENBQUMsU0FBUztRQUN0QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDcEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDOzs7Ozs7SUFN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RSxLQUFLLENBQUMsQ0FBQztnQkFFckQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxLQUFLLEVBQUU7b0JBQ2pDLDhIQUE4SDtvQkFDOUgsZ0JBQWdCO29CQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztpQkFDakM7WUFFSCxDQUFDLEVBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQ2xDLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBRUQsMEJBQTBCLENBQUMsWUFBWSxFQUFFLEtBQUs7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDOzs7O0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUE7SUFDeEQsQ0FBQzs7Ozs7SUFFRCwwQkFBMEIsQ0FBQyxLQUFjO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRCxDQUFDOzs7WUFsSUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwrQkFBK0I7Z0JBQ3pDLHdjQUFpRDtnQkFFakQsU0FBUyxFQUFFLENBQUMsNkJBQTZCLENBQUM7O2FBQzNDOzs7O1lBVnNCLE1BQU07WUFDckIsNkJBQTZCO1lBRTdCLFFBQVE7Ozt1QkFTYixLQUFLOzs7O0lBQU4sNkNBQTBCOztJQUMxQiw4Q0FBa0I7O0lBQ2xCLGlEQUFxQjs7SUFFckIsb0RBQXFCOztJQUVyQixrREFJUzs7SUFFVCxrREFBcUI7Ozs7O0lBR25CLDJDQUFzQjs7SUFDdEIsc0RBQXVEOzs7OztJQUN2RCw2Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TmF2aWdhdGlvbkVuZCwgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7QW5ndWxhck1hZ2ljQnJlYWRjcnVtYlNlcnZpY2V9IGZyb20gXCIuL2FuZ3VsYXItbWFnaWMtYnJlYWRjcnVtYi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7ZmlsdGVyfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtMb2NhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbG5nLXNlbGYtZ2VuZXJhdGVkLWJyZWFkY3J1bWInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY3VzdG9tLWJyZWFkY3J1bWIuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtBbmd1bGFyTWFnaWNCcmVhZGNydW1iU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEN1c3RvbUJyZWFkY3J1bWJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIG1haW5Sb290OiBTdHJpbmc7XHJcbiAgX21haW5Sb290OiBTdHJpbmc7XHJcbiAgbGFzdFBhdGhuYW1lOiBzdHJpbmc7XHJcbiAgLy8gdGhpcyB2YXJpYWJsZSB3aWxsIGhhbmRsZSB0aGUgY3VycmVudCB1cmwgc3BsaXQgaW50byBhIGxpc3Qgc3RydWN0dXJlXHJcbiAgY3VycmVudHNwbGl0VXJsID0gW107XHJcbiAgLy8gdGhpcyB2YXJpYWJsZSB3aWxsIGhhbmRsZSB0aGUgZnVsbCBicmVhZGNydW1iIGl0c2VsZiwgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHVzZWQgaW4gdGhlIEhUTUwgdGVtcGxhdGVcclxuICBicmVhZGN1bVZhbHVlOiB7XHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIGFjdGl2ZTogYm9vbGVhbixcclxuICAgIHZhbHVlOiBzdHJpbmdcclxuICB9W10gPSBbXTtcclxuICAvLyB0aGlzIHZhcmlhYmxlIGlzIGEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0aGUgQnJlYWRjcnVtYiBtdXN0IGJlIHNob3duIGluIGEgc3BlY2lmaWMgdmlld1xyXG4gIHNob3dCcmVhZGNydW0gPSB0cnVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwdWJsaWMgYnJlYWRjcnVtYlNlcnZpY2U6IEFuZ3VsYXJNYWdpY0JyZWFkY3J1bWJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb25cclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuc2V0VXJscygpO1xyXG4gICAgdGhpcy5nZXRCcmVhZGNydW0oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiB0aGUgcGFydCBvZiB0aGUgYnJlYWRjcnVtYiBpcyBhY3RpdmUgb3Igbm90LCBhbmQgbWFrZSB0aGUgcmVkaXJlY3Rpb24gdG8gdGhlIHNwZWNpZmljIHVybCBvZiB0aGUgcGFydFxyXG4gICAqIEBwYXJhbSBicmVhZGNydW0gLT4gcGFydCBvZiB0aGUgZnVsbCBicmVhZGNydW1iXHJcbiAgICovXHJcbiAgcmVkaXJlY3RUb1ZpZXcoYnJlYWRjcnVtKSB7XHJcbiAgICBpZiAoYnJlYWRjcnVtLmFjdGl2ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYnJlYWRjcnVtLnVybF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFrZSB0aGUgc3Vic2NyaXB0aW9ucyB0byB0aGUgdHdvIG9ic2VydmFibGVzLCBhbmQgc2F2ZXMgdGhlIHZhbHVlIG9mIHRoZW0gaW50byBhIHNwZWNpZmljIHZhcmlhYmxlXHJcbiAgICogc2F2ZXMgdGhlIGJyZWFkY3J1bWIgYW5kIGlmIHNob3VsZCBiZSBzaG93biBvciBub3RcclxuICAgKi9cclxuICBnZXRCcmVhZGNydW0oKSB7XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmJyZWFkY3J1bWJTdHJ1Y3R1cmVfLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGxldCBuZXdCcmVhZGNydW0gPSBbXTtcclxuICAgICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpZiAoaXRlbS5zaG93ID09IHRydWUpIHtcclxuICAgICAgICAgIG5ld0JyZWFkY3J1bS5wdXNoKGl0ZW0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5icmVhZGN1bVZhbHVlID0gbmV3QnJlYWRjcnVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5zaG93QnJlYWRjcnVtYlN0cnVjdHVyZV8uc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgdGhpcy5zaG93QnJlYWRjcnVtID0gdmFsdWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFVybHMoKSB7XHJcbiAgICB0aGlzLl9tYWluUm9vdCA9IHRoaXMubWFpblJvb3Q7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgLy8gSnVzdCBleGVjdXRlZCB3aGVuIGFuIG5hdmlnYXRpb24gZXZlbnQgZW5kc1xyXG4gICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAvLyByZXR1cm5zIGFuZCBzYXZlIHRoZSBicmVhZGNydW1iIGludG8gYSBuZXcgdGVtcG9yYWwgdmFyaWFibGVcclxuICAgICAgY29uc3QgY3VycmVudEJyZWFkQ3J1bVN0cnVjdHVyZSA9IHRoaXMuZ2V0QnJlYWRjcnVtYlN0cnVjdHVyZSgpO1xyXG4gICAgICAvLyByZXNldHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgYnJlYWRjcnVtYlxyXG4gICAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLnJlc2V0QnJlYWRjcnVtYlN0cnVjdHVyZSgpO1xyXG4gICAgICAvLyB0aGlzIHZhcmlhYmxlIHdpbGwgaG9sZCB0aGUgdXJsIHRvIGFkZCB0byB0aGUgYnJlYWRjcnVtYiBzdHJ1Y3R1cmVcclxuICAgICAgbGV0IHNldHNVcmwgPSAnJztcclxuICAgICAgY29uc3QgcGF0aG5hbWVVcmwgPSB0aGlzLmxvY2F0aW9uLnBhdGgoKS5zcGxpdCgnIycpWzBdLnNwbGl0KCc/JylbMF07XHJcbiAgICAgIC8vIHRoaXMgY29uZGl0aW9uIGlzIHdoZW4gdGhlIGJyZWFkY3J1bWIgaXMgaW4gYSBwbGF0Zm9ybSB0aGF0IGhhcyBnb3QgYSByb3V0ZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gc2hvdyBpbiB0aGUgYnJlYWRjcnVtYlxyXG4gICAgICBpZiAocGF0aG5hbWVVcmwuaW5jbHVkZXMoJy8nKyB0aGlzLl9tYWluUm9vdCArJy8nKSkge1xyXG4gICAgICAgIHNldHNVcmwgPSAnLycrIHRoaXMuX21haW5Sb290O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwYXRobmFtZVVybCAhPSB0aGlzLmxhc3RQYXRobmFtZSkge1xyXG4gICAgICAgIC8vIHRoZSBicmVhZGNydW1iIG11c3QgYmUgc2hvd24gaWYgdGhlIGZpcnN0IGl0ZW0gY2hhbmdlXHJcbiAgICAgICAgdGhpcy5zaG93QnJlYWRjcnVtID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc3BsaXRzIHRoZSB1cmwgYnkgdGhlIHJvdXRlIG9uIHRoZSBjb25kaXRpb24gYWJvdmUgYW5kIHNwbGl0cyBpdCBieSB0aGUgJy8nIHNlcGFyYXRvclxyXG4gICAgICAvLyBSZW1vdmVzIHRoZSAvcGxhdGFmb3JtYS8gYW5kIHBhcmFtcyBpZiB0aGUgdXJsIGhhdmUgb25lIG9mIHRoZW1cclxuICAgICAgbGV0IHNwbGl0VXJsID0gcGF0aG5hbWVVcmwuc3BsaXQoJy8nKyB0aGlzLl9tYWluUm9vdCArJy8nKS5qb2luKCcnKS5zcGxpdCgnLycpO1xyXG4gICAgICAvLyB0aGlzIGxpbmUgYXNzdXJlIHVzIHRoYXQgdGhlIHVybCBzcGxpdCBoYXMgbm8gYmxhbmtzIG9yIG51bGwgb3IgZW1wdHkgZWxlbWVudHNcclxuICAgICAgc3BsaXRVcmwgPSBzcGxpdFVybC5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICAgIHNwbGl0VXJsLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgc2V0c1VybCA9IHNldHNVcmwgKyAnLycgKyBpdGVtO1xyXG4gICAgICAgIC8vIGEgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgbmV3IHBhcnQgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBicmVhZGNydW1iXHJcbiAgICAgICAgbGV0IG5ld0JyZWFkY3J1bSA9IHt9O1xyXG4gICAgICAgIC8vIGlmIG9uZSBwYXJ0IG9mIHRoZSBicmVhZGNydW1iIGRpZCdudCBjaGFuZ2UsIHRoZSBsYXN0IGtub3duIHZhbHVlIHdpbGwgYmUgYWRkZWQgKHJlbWFpbnMgdGhlIHNhbWUpXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudHNwbGl0VXJsW2luZGV4XSA9PT0gaXRlbSkge1xyXG4gICAgICAgICAgbmV3QnJlYWRjcnVtID0gY3VycmVudEJyZWFkQ3J1bVN0cnVjdHVyZVtpbmRleF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGVsc2UuLi4gYSBuZXcgc3RydWN0dXJlIGlzIGNyZWF0ZWRcclxuICAgICAgICAgIG5ld0JyZWFkY3J1bSA9IHtcclxuICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXHJcbiAgICAgICAgICAgIHVybDogc2V0c1VybCxcclxuICAgICAgICAgICAgYWN0aXZlOiBzcGxpdFVybC5sZW5ndGggLSAxID09PSBpbmRleCxcclxuICAgICAgICAgICAgc2hvdzogdHJ1ZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhlIG5ldyBwYXJ0IG9mIHRoZSBicmVhZGNydW1iIGlzIGFkZGVkIHRvIHRoZSBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGJlIHNob3duXHJcbiAgICAgICAgdGhpcy5zZXRJdGVtQnJlYWRjcnVtYlN0cnVjdHVyZShuZXdCcmVhZGNydW0sIGluZGV4KTtcclxuXHJcbiAgICAgICAgaWYgKHNwbGl0VXJsLmxlbmd0aCAtIDEgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICAvLyBpbiB0aGUgbGFzdCBpdGVtIG9mIHRoZSByb3V0ZSwgdGhlIGN1cnJlbnQgcm91dGUgc3BsaXQgaXMgc2V0dGVkIGludG8gdGhlIHZhcmlhYmxlLCB0byB1c2UgaXQgbGF0ZXIgd2hlbiBhbm90aGVyIG5hdmlnYXRpb25cclxuICAgICAgICAgIC8vIGV2ZW50IGhhcHBlbnNcclxuICAgICAgICAgIHRoaXMuY3VycmVudHNwbGl0VXJsID0gc3BsaXRVcmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMubGFzdFBhdGhuYW1lID0gcGF0aG5hbWVVcmw7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldEl0ZW1CcmVhZGNydW1iU3RydWN0dXJlKG5ld0JyZWFkY3J1bSwgaW5kZXgpIHtcclxuICAgIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2Uuc2V0SXRlbUJyZWFkY3J1bWJTdHJ1Y3R1cmUobmV3QnJlYWRjcnVtLCBpbmRleCk7XHJcbiAgfVxyXG5cclxuICBnZXRCcmVhZGNydW1iU3RydWN0dXJlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2UuZ2V0QnJlYWRjcnVtYlN0cnVjdHVyZSgpXHJcbiAgfVxyXG5cclxuICBjaGFuZ2VWaXNpYmlsaXR5QnJlYWRjcnVtYih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5jaGFuZ2VWaXNpYmlsaXR5QnJlYWRjcnVtYih2YWx1ZSlcclxuICB9XHJcblxyXG59XHJcbiJdfQ==