UNPKG

ngx-masonry-layout

Version:
310 lines (302 loc) 33.7 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) : typeof define === 'function' && define.amd ? define('ngx-masonry-layout', ['exports', '@angular/core', '@angular/common'], factory) : (factory((global['ngx-masonry-layout'] = {}),global.ng.core,global.ng.common)); }(this, (function (exports,core,common) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var MasonryLayoutComponent = (function () { function MasonryLayoutComponent(elementRef) { this.elementRef = elementRef; this.GUTTER = 0; this.savedNodeDimensions = []; this.gridState = 'not started'; this.ENABLE_MASONRY = true; this.MAX_HEIGHT = 400; this.events = new core.EventEmitter(); this.elem = this.elementRef.nativeElement; } Object.defineProperty(MasonryLayoutComponent.prototype, "gutter", { set: /** * @param {?} value * @return {?} */ function (value) { this.GUTTER = value / 2; }, enumerable: true, configurable: true }); Object.defineProperty(MasonryLayoutComponent.prototype, "isMobile", { get: /** * @return {?} */ function () { /** @type {?} */ var check = false; (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor); return check; }, enumerable: true, configurable: true }); /** * @param {?} event * @return {?} */ MasonryLayoutComponent.prototype.onWindowResize = /** * @param {?} event * @return {?} */ function (event) { var _this = this; clearTimeout(this.resizeTimer); this.resizeTimer = setTimeout(function () { _this.gridState = 'not started'; _this.buildGrid(); }, 250); }; /** * @return {?} */ MasonryLayoutComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.buildGrid(); }; /** * @return {?} */ MasonryLayoutComponent.prototype.ngOnChanges = /** * @return {?} */ function () { var _this = this; clearTimeout(this.changesTimer); this.changesTimer = setTimeout(function () { _this.gridState = 'not started'; _this.buildGrid(); }, 250); }; /** * @return {?} */ MasonryLayoutComponent.prototype.buildGrid = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var parentWidth = Math.floor(this.elem.parentNode.offsetWidth); /** @type {?} */ var row = { startIndex: 0, endIndex: 0, length: 0, totalWidth: 0 }; if (!this.images || !this.images.length) { return; } this.elem.style.width = parentWidth + 'px'; this.elem.style.display = 'table'; this.images.forEach(function (node, index) { if (row.totalWidth === 0) { row.startIndex = index; row.length = 0; } row.length++; row.totalWidth += _this.getComputedWidth(index); if (row.totalWidth >= parentWidth || _this.isLastChild(index)) { row.endIndex = index; /** @type {?} */ var scaling = row.totalWidth / parentWidth; _this.setColDimensions(scaling, row); row.totalWidth = 0; } }); }; /** * @param {?} scaling * @param {?} row * @return {?} */ MasonryLayoutComponent.prototype.setColDimensions = /** * @param {?} scaling * @param {?} row * @return {?} */ function (scaling, row) { var _this = this; /** @type {?} */ var totalRowWidth = 0; /** @type {?} */ var parentWidth = this.elem.parentNode.offsetWidth; scaling = (scaling < 1) ? 1 : scaling; this.images.forEach(function (node, index) { if (!_this.ENABLE_MASONRY) { node.computedHeight = _this.MAX_HEIGHT + 'px'; node.computedWidth = _this.getComputedWidth(index) + 'px'; node.margin = _this.getNodeMargin(parentWidth); return; } if (index >= row.startIndex && index <= row.endIndex) { /** @type {?} */ var nodeWidth = void 0; // last image if (index === row.endIndex && scaling > 1) { nodeWidth = (100 - totalRowWidth) - ((_this.GUTTER * 2) / parentWidth * 100); node.computedWidth = 'calc(' + nodeWidth + '%)'; if (_this.gridState === 'not started') { _this.gridState = 'pre-building'; setTimeout(function () { _this.buildGrid(); }, 100); } } else { nodeWidth = ((_this.getComputedWidth(index) / scaling) / parentWidth * 100) - ((row.length * (_this.GUTTER * 2)) * (_this.getComputedWidth(index) / scaling) / parentWidth) / parentWidth * 100; node.computedWidth = 'calc(' + nodeWidth + '%)'; totalRowWidth += nodeWidth; totalRowWidth += (_this.GUTTER / parentWidth * 100) * 2; } // last row and last image if (index === row.endIndex && row.length === 1 && _this.isMobile) { nodeWidth = 100 - ((_this.GUTTER * 2) / parentWidth * 100); /** @type {?} */ var height = node.height * (parentWidth * (nodeWidth / 100) / node.width); if (height / 2 < _this.MAX_HEIGHT) { node.computedWidth = 'calc(' + nodeWidth + '%)'; } } node.margin = _this.getNodeMargin(parentWidth); node.computedHeight = node.height * (parentWidth * (nodeWidth / 100) / node.width) + 'px'; } }); }; /** * @param {?} index * @return {?} */ MasonryLayoutComponent.prototype.getComputedWidth = /** * @param {?} index * @return {?} */ function (index) { return this.images[index].width / (this.images[index].height / this.MAX_HEIGHT); }; /** * @param {?} index * @return {?} */ MasonryLayoutComponent.prototype.isLastChild = /** * @param {?} index * @return {?} */ function (index) { return index + 1 === this.images.length; }; /** * @param {?} parentWidth * @return {?} */ MasonryLayoutComponent.prototype.getNodeMargin = /** * @param {?} parentWidth * @return {?} */ function (parentWidth) { return 'calc(' + this.GUTTER / parentWidth * 100 + '%)'; }; /** * @param {?} image * @param {?} i * @return {?} */ MasonryLayoutComponent.prototype.clickOnImage = /** * @param {?} image * @param {?} i * @return {?} */ function (image, i) { this.events.emit({ type: 'click-on-image', image: image, index: i }); }; /** * @param {?} elem * @return {?} */ MasonryLayoutComponent.prototype.onImageLoaded = /** * @param {?} elem * @return {?} */ function (elem) { elem.style.opacity = 1; }; MasonryLayoutComponent.decorators = [ { type: core.Component, args: [{ selector: 'masonry-layout', template: "<div \n\t[ngClass]=\"CLASS_NAME\"\n\t*ngFor=\"let image of images; let i = index;\"\n [style.width]=\"image.computedWidth\"\n [style.height]=\"image.computedHeight\"\n [style.float]=\"'left'\"\n [style.margin]=\"image.margin\"\n [style.background]=\"'#eeeeee'\"\n [style.lineHeight]=\"0\">\n\t<img \n #imageElem\n [src]=\"image.path\" \n [style.width.%]=\"100\" \n [style.height]=\"'auto'\"\n [style.opacity]=\"0\"\n (click)=\"clickOnImage(image, i)\"\n (load)=\"onImageLoaded(imageElem)\" />\n</div>", },] }, ]; /** @nocollapse */ MasonryLayoutComponent.ctorParameters = function () { return [ { type: core.ElementRef } ]; }; MasonryLayoutComponent.propDecorators = { images: [{ type: core.Input, args: ['images',] }], ENABLE_MASONRY: [{ type: core.Input, args: ['masonry',] }], MAX_HEIGHT: [{ type: core.Input, args: ['max-height',] }], CLASS_NAME: [{ type: core.Input, args: ['class-name',] }], gutter: [{ type: core.Input, args: ['gutter',] }], events: [{ type: core.Output }], onWindowResize: [{ type: core.HostListener, args: ['window:resize', ['$event'],] }] }; return MasonryLayoutComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var MasonryLayoutModule = (function () { function MasonryLayoutModule() { } MasonryLayoutModule.decorators = [ { type: core.NgModule, args: [{ declarations: [ MasonryLayoutComponent ], imports: [ common.CommonModule ], exports: [ MasonryLayoutComponent ], entryComponents: [ MasonryLayoutComponent ] },] }, ]; return MasonryLayoutModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ exports.MasonryLayoutComponent = MasonryLayoutComponent; exports.MasonryLayoutModule = MasonryLayoutModule; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc29ucnktbGF5b3V0LnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LW1hc29ucnktbGF5b3V0L2xpYi9tYXNvbnJ5LWxheW91dC5jb21wb25lbnQudHMiLCJuZzovL25neC1tYXNvbnJ5LWxheW91dC9saWIvbWFzb25yeS1sYXlvdXQubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgIHBhdGg6IHN0cmluZzsgXG4gICAgd2lkdGg6IG51bWJlcjsgXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgY29tcHV0ZWRIZWlnaHQ/OiBzdHJpbmc7XG4gICAgY29tcHV0ZWRXaWR0aD86IHN0cmluZztcbiAgICBtYXJnaW4/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlcyBleHRlbmRzIEFycmF5PEltYWdlPnt9XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbWFzb25yeS1sYXlvdXQnLCBcbiAgICB0ZW1wbGF0ZTogYDxkaXYgXG5cdFtuZ0NsYXNzXT1cIkNMQVNTX05BTUVcIlxuXHQqbmdGb3I9XCJsZXQgaW1hZ2Ugb2YgaW1hZ2VzOyBsZXQgaSA9IGluZGV4O1wiXG4gICAgW3N0eWxlLndpZHRoXT1cImltYWdlLmNvbXB1dGVkV2lkdGhcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiaW1hZ2UuY29tcHV0ZWRIZWlnaHRcIlxuICAgIFtzdHlsZS5mbG9hdF09XCInbGVmdCdcIlxuICAgIFtzdHlsZS5tYXJnaW5dPVwiaW1hZ2UubWFyZ2luXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCInI2VlZWVlZSdcIlxuICAgIFtzdHlsZS5saW5lSGVpZ2h0XT1cIjBcIj5cblx0PGltZyBcbiAgICAgICAgI2ltYWdlRWxlbVxuICAgICAgICBbc3JjXT1cImltYWdlLnBhdGhcIiBcbiAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiMTAwXCIgXG4gICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJ2F1dG8nXCJcbiAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwiMFwiXG4gICAgICAgIChjbGljayk9XCJjbGlja09uSW1hZ2UoaW1hZ2UsIGkpXCJcbiAgICAgICAgKGxvYWQpPVwib25JbWFnZUxvYWRlZChpbWFnZUVsZW0pXCIgLz5cbjwvZGl2PmAsXG59KVxuXG5leHBvcnQgY2xhc3MgTWFzb25yeUxheW91dENvbXBvbmVudCB7XG4gICAgR1VUVEVSOiBudW1iZXIgPSAwO1xuICAgIG5vZGVzOiBhbnk7XG4gICAgZWxlbTogYW55O1xuICAgIHNhdmVkTm9kZURpbWVuc2lvbnM6IGFueSA9IFtdO1xuICAgIG9ic2VydmVyOiBhbnk7XG4gICAgZ3JpZFN0YXRlOiBzdHJpbmcgPSAnbm90IHN0YXJ0ZWQnO1xuICAgIHJlc2l6ZVRpbWVyOiBhbnk7XG4gICAgY2hhbmdlc1RpbWVyOiBhbnk7XG5cbiAgICBASW5wdXQoJ2ltYWdlcycpIGltYWdlczogSW1hZ2VzOyBcbiAgICBASW5wdXQoJ21hc29ucnknKSBFTkFCTEVfTUFTT05SWTogYm9vbGVhbiA9IHRydWU7IFxuICAgIEBJbnB1dCgnbWF4LWhlaWdodCcpIE1BWF9IRUlHSFQ6IG51bWJlciA9IDQwMDsgXG4gICAgQElucHV0KCdjbGFzcy1uYW1lJykgQ0xBU1NfTkFNRTogc3RyaW5nIHwgeyBba2V5OiBzdHJpbmddOiBhbnk7IH07XG5cbiAgICBASW5wdXQoJ2d1dHRlcicpXG4gICAgc2V0IGd1dHRlcih2YWx1ZTogbnVtYmVyKXtcbiAgICAgICAgdGhpcy5HVVRURVIgPSB2YWx1ZSAvIDI7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIGV2ZW50czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICAgXG4gICAgZ2V0IGlzTW9iaWxlKCk6Ym9vbGVhbiB7XG4gICAgICAgIHZhciBjaGVjayA9IGZhbHNlO1xuICAgICAgICAoZnVuY3Rpb24oYSl7aWYoLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLnRlc3QoYSl8fC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLnRlc3QoYS5zdWJzdHIoMCw0KSkpIGNoZWNrID0gdHJ1ZTt9KShuYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH07XG4gICAgIFxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZil7XG4gICAgICAgIHRoaXMuZWxlbSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICAgIG9uV2luZG93UmVzaXplKGV2ZW50KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVyKTtcblxuICAgICAgICB0aGlzLnJlc2l6ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZSA9ICdub3Qgc3RhcnRlZCc7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkR3JpZCgpOyBcbiAgICAgICAgfSwgMjUwKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5idWlsZEdyaWQoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpe1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jaGFuZ2VzVGltZXIpO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlc1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZSA9ICdub3Qgc3RhcnRlZCc7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkR3JpZCgpOyBcbiAgICAgICAgfSwgMjUwKTtcbiAgICB9XG5cbiAgICBidWlsZEdyaWQoKXtcbiAgICAgICAgbGV0IHBhcmVudFdpZHRoID0gTWF0aC5mbG9vcih0aGlzLmVsZW0ucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCk7XG4gICAgICAgIGxldCB0b3RhbFJvd1dpZHRoOiBhbnkgPSAwOyBcbiAgICAgICAgbGV0IHJvdzogYW55ID0ge1xuICAgICAgICAgICAgc3RhcnRJbmRleDogMCxcbiAgICAgICAgICAgIGVuZEluZGV4OiAwLFxuICAgICAgICAgICAgbGVuZ3RoOiAwLFxuICAgICAgICAgICAgdG90YWxXaWR0aDogMFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5pbWFnZXMgfHwgIXRoaXMuaW1hZ2VzLmxlbmd0aCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW0uc3R5bGUud2lkdGggPSBwYXJlbnRXaWR0aCArJ3B4JztcbiAgICAgICAgdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSAndGFibGUnO1xuXG4gICAgICAgIHRoaXMuaW1hZ2VzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAocm93LnRvdGFsV2lkdGggPT09IDApe1xuICAgICAgICAgICAgICAgIHJvdy5zdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgcm93Lmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJvdy5sZW5ndGgrKztcbiAgICAgICAgICAgIHJvdy50b3RhbFdpZHRoICs9IHRoaXMuZ2V0Q29tcHV0ZWRXaWR0aChpbmRleCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChyb3cudG90YWxXaWR0aCA+PSBwYXJlbnRXaWR0aCB8fCB0aGlzLmlzTGFzdENoaWxkKGluZGV4KSl7XG4gICAgICAgICAgICAgICAgcm93LmVuZEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgbGV0IHNjYWxpbmcgPSByb3cudG90YWxXaWR0aC9wYXJlbnRXaWR0aDtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29sRGltZW5zaW9ucyhzY2FsaW5nLCByb3cpO1xuICAgICAgICAgICAgICAgIHJvdy50b3RhbFdpZHRoID0gMDsgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldENvbERpbWVuc2lvbnMoc2NhbGluZzogbnVtYmVyLCByb3c6IGFueSl7XG4gICAgICAgIGxldCB0b3RhbFJvd1dpZHRoOiBhbnkgPSAwO1xuICAgICAgICBsZXQgcGFyZW50V2lkdGggPSB0aGlzLmVsZW0ucGFyZW50Tm9kZS5vZmZzZXRXaWR0aDtcbiAgICAgICAgc2NhbGluZyA9IChzY2FsaW5nIDwgMSkgPyAxIDogc2NhbGluZztcblxuICAgICAgICB0aGlzLmltYWdlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLkVOQUJMRV9NQVNPTlJZKXtcbiAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkSGVpZ2h0ID0gdGhpcy5NQVhfSEVJR0hUICsgJ3B4JztcbiAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkV2lkdGggPSB0aGlzLmdldENvbXB1dGVkV2lkdGgoaW5kZXgpICsgJ3B4JztcbiAgICAgICAgICAgICAgICBub2RlLm1hcmdpbiA9IHRoaXMuZ2V0Tm9kZU1hcmdpbihwYXJlbnRXaWR0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gcm93LnN0YXJ0SW5kZXggJiYgaW5kZXggPD0gcm93LmVuZEluZGV4KXtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZVdpZHRoO1xuXG4gICAgICAgICAgICAgICAgLy8gbGFzdCBpbWFnZVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gcm93LmVuZEluZGV4ICYmIHNjYWxpbmcgPiAxKXsgXG4gICAgICAgICAgICAgICAgICAgIG5vZGVXaWR0aCA9ICgxMDAgLSB0b3RhbFJvd1dpZHRoKSAtICgodGhpcy5HVVRURVIgKiAyKSAvIHBhcmVudFdpZHRoICogMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb21wdXRlZFdpZHRoID0gJ2NhbGMoJytub2RlV2lkdGgrJyUpJztcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ncmlkU3RhdGUgPT09ICdub3Qgc3RhcnRlZCcpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkU3RhdGUgPSAncHJlLWJ1aWxkaW5nJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZEdyaWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlV2lkdGggPSAoKHRoaXMuZ2V0Q29tcHV0ZWRXaWR0aChpbmRleCkgLyBzY2FsaW5nKSAvIHBhcmVudFdpZHRoICogMTAwKSAtICgocm93Lmxlbmd0aCAqICh0aGlzLkdVVFRFUiAqIDIpKSAqICh0aGlzLmdldENvbXB1dGVkV2lkdGgoaW5kZXgpIC8gc2NhbGluZykgLyBwYXJlbnRXaWR0aCkgLyBwYXJlbnRXaWR0aCAqIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb21wdXRlZFdpZHRoID0gJ2NhbGMoJytub2RlV2lkdGgrJyUpJztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUm93V2lkdGggKz0gbm9kZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFJvd1dpZHRoICs9ICh0aGlzLkdVVFRFUiAvIHBhcmVudFdpZHRoICogMTAwKSAqIDI7ICBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBsYXN0IHJvdyBhbmQgbGFzdCBpbWFnZVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gcm93LmVuZEluZGV4ICYmIHJvdy5sZW5ndGggPT09IDEgJiYgdGhpcy5pc01vYmlsZSl7XG4gICAgICAgICAgICAgICAgXHRub2RlV2lkdGggPSAxMDAgLSAoKHRoaXMuR1VUVEVSICogMikgLyBwYXJlbnRXaWR0aCAqIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBub2RlLmhlaWdodCAqICggcGFyZW50V2lkdGggKiAobm9kZVdpZHRoIC8gMTAwKSAvIG5vZGUud2lkdGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQvMiA8IHRoaXMuTUFYX0hFSUdIVCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvbXB1dGVkV2lkdGggPSAnY2FsYygnK25vZGVXaWR0aCsnJSknO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9kZS5tYXJnaW4gPSB0aGlzLmdldE5vZGVNYXJnaW4ocGFyZW50V2lkdGgpO1xuICAgICAgICAgICAgICAgIG5vZGUuY29tcHV0ZWRIZWlnaHQgPSBub2RlLmhlaWdodCAqICggcGFyZW50V2lkdGggKiAobm9kZVdpZHRoIC8gMTAwKSAvIG5vZGUud2lkdGgpICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0Q29tcHV0ZWRXaWR0aChpbmRleDogbnVtYmVyKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW2luZGV4XS53aWR0aCAvICh0aGlzLmltYWdlc1tpbmRleF0uaGVpZ2h0IC8gdGhpcy5NQVhfSEVJR0hUKTtcbiAgICB9XG5cbiAgICBpc0xhc3RDaGlsZChpbmRleDogbnVtYmVyKXtcbiAgICAgICAgcmV0dXJuIGluZGV4ICsgMSA9PT0gdGhpcy5pbWFnZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGdldE5vZGVNYXJnaW4ocGFyZW50V2lkdGg6IG51bWJlcil7XG4gICAgICAgIHJldHVybiAnY2FsYygnK3RoaXMuR1VUVEVSIC8gcGFyZW50V2lkdGggKiAxMDArJyUpJztcbiAgICB9XG5cbiAgICBjbGlja09uSW1hZ2UoaW1hZ2U6IGFueSwgaTogbnVtYmVyKXtcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiAnY2xpY2stb24taW1hZ2UnLFxuICAgICAgICAgICAgaW1hZ2U6IGltYWdlLFxuICAgICAgICAgICAgaW5kZXg6IGlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25JbWFnZUxvYWRlZChlbGVtKXtcbiAgICAgICAgZWxlbS5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICB9XG59IiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXNvbnJ5TGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9tYXNvbnJ5LWxheW91dC5jb21wb25lbnQnOyBcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgTWFzb25yeUxheW91dENvbXBvbmVudFxuICAgIF0sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGVcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgTWFzb25yeUxheW91dENvbXBvbmVudFxuICAgIF0sXG4gICAgZW50cnlDb21wb25lbnRzOiBbXG4gICAgICAgIE1hc29ucnlMYXlvdXRDb21wb25lbnRcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE1hc29ucnlMYXlvdXRNb2R1bGUgeyB9XG4iXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwiQ29tcG9uZW50IiwiRWxlbWVudFJlZiIsIklucHV0IiwiT3V0cHV0IiwiSG9zdExpc3RlbmVyIiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtRQStESSxnQ0FBb0IsVUFBc0I7WUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTswQkEzQnpCLENBQUM7dUNBR1MsRUFBRTs2QkFFVCxhQUFhO2tDQUtXLElBQUk7OEJBQ04sR0FBRzswQkFRUCxJQUFJQSxpQkFBWSxFQUFPO1lBU3pELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDN0M7UUFmRCxzQkFDSSwwQ0FBTTs7OztnQkFEVixVQUNXLEtBQWE7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUMzQjs7O1dBQUE7UUFJRCxzQkFBSSw0Q0FBUTs7O2dCQUFaOztnQkFDSSxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2xCLENBQUMsVUFBUyxDQUFDO29CQUFFLElBQUcsMFRBQTBULENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFFLHlrREFBeWtELENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUFFLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQUMsRUFBRSxTQUFTLENBQUMsU0FBUyxJQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMStELE9BQU8sS0FBSyxDQUFDO2FBQ2hCOzs7V0FBQTs7Ozs7UUFPRCwrQ0FBYzs7OztZQURkLFVBQ2UsS0FBSztnQkFEcEIsaUJBUUM7Z0JBTkcsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFL0Is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