UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

475 lines 33 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef } from '@angular/core'; /** * @record */ export function ElementType() { } if (false) { /** @type {?} */ ElementType.prototype.type; /** @type {?} */ ElementType.prototype.backgroundImage; /** @type {?} */ ElementType.prototype.transform; } var ImagePickerComponent = /** @class */ (function () { function ImagePickerComponent() { this.prefixCls = 'am-image-picker'; this.flexEl = []; this._accept = 'image/*'; this._count = 4; this._selectable = true; this._files = []; this._multiple = false; this.capture = false; this.disableDelete = false; this.onFail = new EventEmitter(); this.onChange = new EventEmitter(); this.onImageClick = new EventEmitter(); this.onAddImageClick = new EventEmitter(); } Object.defineProperty(ImagePickerComponent.prototype, "files", { get: /** * @return {?} */ function () { return this._files; }, set: /** * @param {?} value * @return {?} */ function (value) { this._files = value; this.sortItem(); }, enumerable: true, configurable: true }); Object.defineProperty(ImagePickerComponent.prototype, "accept", { get: /** * @return {?} */ function () { return this._accept; }, set: /** * @param {?} value * @return {?} */ function (value) { this._accept = value; this.sortItem(); }, enumerable: true, configurable: true }); Object.defineProperty(ImagePickerComponent.prototype, "length", { get: /** * @return {?} */ function () { return this._count; }, set: /** * @param {?} value * @return {?} */ function (value) { if (value > 0) { this._count = value; } else { this._count = 4; } this.sortItem(); }, enumerable: true, configurable: true }); Object.defineProperty(ImagePickerComponent.prototype, "multiple", { get: /** * @return {?} */ function () { return this._multiple; }, set: /** * @param {?} value * @return {?} */ function (value) { this._multiple = value; this.sortItem(); }, enumerable: true, configurable: true }); Object.defineProperty(ImagePickerComponent.prototype, "selectable", { get: /** * @return {?} */ function () { return this._selectable; }, set: /** * @param {?} value * @return {?} */ function (value) { this._selectable = value; this.sortItem(); }, enumerable: true, configurable: true }); /** * @return {?} */ ImagePickerComponent.prototype.sortItem = /** * @return {?} */ function () { var _this = this; if (!this._files) { return; } /** @type {?} */ var count = parseInt('' + this._count, 10); if (count <= 0) { count = 4; } /** @type {?} */ var allEl = this._files.map((/** * @param {?} item * @return {?} */ function (item) { return { type: 'img', backgroundImage: 'url(' + item.url + ')', transform: 'rotate(' + _this.getRotation(item.orientation) + ')deg' }; })); if (this._selectable) { allEl.push({ type: 'select', backgroundImage: '', transform: '' }); } /** @type {?} */ var length = allEl.length; if (length !== 0 && length % count !== 0) { /** @type {?} */ var blankCount = count - (length % count); /** @type {?} */ var fillBlankEl = []; for (var i = 0; i < blankCount; i++) { fillBlankEl.push({ type: 'white', backgroundImage: '', transform: '' }); } allEl = allEl.concat(fillBlankEl); } this.flexEl = []; for (var i = 0; i < allEl.length / count; i++) { /** @type {?} */ var rowEl = allEl.slice(i * count, i * count + count); this.flexEl.push(rowEl); } }; /** * @param {?} imgItem * @return {?} */ ImagePickerComponent.prototype.addImage = /** * @param {?} imgItem * @return {?} */ function (imgItem) { this._files.push({ type: 'img', url: imgItem.url, orientation: imgItem.orientation }); this.sortItem(); this.onChange.emit({ files: this._files, operationType: 'add', index: this._files.length - 1 }); }; /** * @param {?} index * @return {?} */ ImagePickerComponent.prototype.removeImage = /** * @param {?} index * @return {?} */ function (index) { this._files.splice(index, 1); this.sortItem(); this.onChange.emit({ files: this._files, operationType: 'remove', index: index }); }; /** * @param {?} index * @return {?} */ ImagePickerComponent.prototype.imageClick = /** * @param {?} index * @return {?} */ function (index) { this.onImageClick.emit({ index: index, files: this._files }); }; /** * @param {?} e * @return {?} */ ImagePickerComponent.prototype.addImageClick = /** * @param {?} e * @return {?} */ function (e) { this.onAddImageClick.emit(e); }; /** * @param {?} file * @param {?} index * @return {?} */ ImagePickerComponent.prototype.parseFile = /** * @param {?} file * @param {?} index * @return {?} */ function (file, index) { var _this = this; /** @type {?} */ var reader = new FileReader(); reader.onload = (/** * @param {?} e * @return {?} */ function (e) { /** @type {?} */ var dataURL = ((/** @type {?} */ (e.target))).result; if (!dataURL) { _this.onFail.emit("Fail to get the " + index + " image"); return; } /** @type {?} */ var orientation = 1; _this.getOrientation(file, (/** * @param {?} res * @return {?} */ function (res) { // -2: not jpeg , -1: not defined if (res > 0) { orientation = res; } _this.addImage({ url: dataURL, orientation: orientation, file: file }); })); }); reader.readAsDataURL(file); }; /** * @param {?} event * @return {?} */ ImagePickerComponent.prototype.fileChange = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var fileList = event.target.files; if (fileList && fileList.length) { for (var i = 0; i < fileList.length; i++) { this.parseFile(fileList[i], i); } } }; /** * @param {?=} orientation * @return {?} */ ImagePickerComponent.prototype.getRotation = /** * @param {?=} orientation * @return {?} */ function (orientation) { if (orientation === void 0) { orientation = 1; } /** @type {?} */ var imgRotation = 0; switch (orientation) { case 3: imgRotation = 180; break; case 6: imgRotation = 90; break; case 8: imgRotation = 270; break; default: } return imgRotation; }; // https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side // https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side /** * @param {?} file * @param {?} callback * @return {?} */ ImagePickerComponent.prototype.getOrientation = // https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side /** * @param {?} file * @param {?} callback * @return {?} */ function (file, callback) { /** @type {?} */ var reader = new FileReader(); reader.onload = (/** * @param {?} e * @return {?} */ function (e) { /** @type {?} */ var view = new DataView(((/** @type {?} */ (e.target))).result); if (view.getUint16(0, false) !== 0xffd8) { return callback(-2); } /** @type {?} */ var length = view.byteLength; /** @type {?} */ var offset = 2; while (offset < length) { /** @type {?} */ var marker = view.getUint16(offset, false); offset += 2; if (marker === 0xffe1) { /** @type {?} */ var tmp = view.getUint32((offset += 2), false); if (tmp !== 0x45786966) { return callback(-1); } /** @type {?} */ var little = view.getUint16((offset += 6), false) === 0x4949; offset += view.getUint32(offset + 4, little); /** @type {?} */ var tags = view.getUint16(offset, little); offset += 2; for (var i = 0; i < tags; i++) { if (view.getUint16(offset + i * 12, little) === 0x0112) { return callback(view.getUint16(offset + i * 12 + 8, little)); } } } else if ((marker & 0xff00) !== 0xff00) { break; } else { offset += view.getUint16(offset, false); } } return callback(-1); }); reader.readAsArrayBuffer(file.slice(0, 64 * 1024)); }; ImagePickerComponent.decorators = [ { type: Component, args: [{ selector: 'ImagePicker, nzm-image-picker', template: "<div class=\"{{ prefixCls }}-list\" role=\"group\">\n <Flex *ngFor=\"let rowItem of flexEl; let i = index\">\n <FlexItem *ngFor=\"let item of rowItem; let j = index\">\n <div *ngIf=\"item && 'img' === item.type && item.backgroundImage\" class=\"{{ prefixCls }}-item\">\n <div\n role=\"button\"\n *ngIf=\"!disableDelete\"\n aria-label=\"Click and Remove this image\"\n class=\"{{ prefixCls }}-item-remove\"\n (click)=\"removeImage(i * length + j)\"\n ></div>\n <div\n role=\"button\"\n aria-label=\"Image can be clicked\"\n class=\"{{ prefixCls }}-item-content\"\n [ngStyle]=\"{ 'background-image': item.backgroundImage, transform: item.transform }\"\n (click)=\"imageClick(i * length + j)\"\n ></div>\n </div>\n <div\n role=\"button\"\n aria-label=\"Choose and add image\"\n *ngIf=\"item && 'select' === item.type\"\n class=\"{{ prefixCls }}-item {{ prefixCls }}-upload-btn\"\n (click)=\"addImageClick($event)\"\n >\n <input\n #fileSelectorInput\n type=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n [attr.capture]=\"capture ? capture : null\"\n (change)=\"fileChange($event)\"\n />\n </div>\n <div *ngIf=\"item && 'white' === item.type\" class=\"{{ prefixCls }}-item-white\"></div>\n </FlexItem>\n </Flex>\n</div>\n" }] } ]; /** @nocollapse */ ImagePickerComponent.ctorParameters = function () { return []; }; ImagePickerComponent.propDecorators = { _fileSelectorInput: [{ type: ViewChild, args: ['fileSelectorInput', { read: ViewContainerRef, static: false },] }], capture: [{ type: Input }], disableDelete: [{ type: Input }], files: [{ type: Input }], accept: [{ type: Input }], length: [{ type: Input }], multiple: [{ type: Input }], selectable: [{ type: Input }], onFail: [{ type: Output }], onChange: [{ type: Output }], onImageClick: [{ type: Output }], onAddImageClick: [{ type: Output }] }; return ImagePickerComponent; }()); export { ImagePickerComponent }; if (false) { /** @type {?} */ ImagePickerComponent.prototype.prefixCls; /** @type {?} */ ImagePickerComponent.prototype.flexEl; /** * @type {?} * @private */ ImagePickerComponent.prototype._accept; /** * @type {?} * @private */ ImagePickerComponent.prototype._count; /** * @type {?} * @private */ ImagePickerComponent.prototype._selectable; /** * @type {?} * @private */ ImagePickerComponent.prototype._files; /** * @type {?} * @private */ ImagePickerComponent.prototype._multiple; /** * @type {?} * @private */ ImagePickerComponent.prototype._fileSelectorInput; /** @type {?} */ ImagePickerComponent.prototype.capture; /** @type {?} */ ImagePickerComponent.prototype.disableDelete; /** @type {?} */ ImagePickerComponent.prototype.onFail; /** @type {?} */ ImagePickerComponent.prototype.onChange; /** @type {?} */ ImagePickerComponent.prototype.onImageClick; /** @type {?} */ ImagePickerComponent.prototype.onAddImageClick; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW1hZ2UtcGlja2VyL2ltYWdlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBRXBHLGlDQUlDOzs7SUFIQywyQkFBYTs7SUFDYixzQ0FBd0I7O0lBQ3hCLGdDQUFrQjs7QUFHcEI7SUF3RUU7UUFuRUEsY0FBUyxHQUFXLGlCQUFpQixDQUFDO1FBQ3RDLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBRXJCLFlBQU8sR0FBVyxTQUFTLENBQUM7UUFDNUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUM1QixXQUFNLEdBQWUsRUFBRSxDQUFDO1FBQ3hCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFLMUIsWUFBTyxHQUFxQixLQUFLLENBQUM7UUFDbEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUE4Q3hDLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUvQyxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakQsaUJBQVksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVyRCxvQkFBZSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRXpDLENBQUM7SUFyRGhCLHNCQUNJLHVDQUFLOzs7O1FBRFQ7WUFFRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsQ0FBQzs7Ozs7UUFDRCxVQUFVLEtBQWlCO1lBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDOzs7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b0JBQ3ZDLE1BQU07aUJBQ1A7cUJBQU07b0JBQ0wsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN6QzthQUNGO1lBQ0QsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUEsQ0FBQztRQUNGLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDOztnQkE5T0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSwrQkFBK0I7b0JBQ3pDLDI5Q0FBNEM7aUJBQzdDOzs7OztxQ0FXRSxTQUFTLFNBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTswQkFHeEUsS0FBSztnQ0FDTCxLQUFLO3dCQUNMLEtBQUs7eUJBUUwsS0FBSzt5QkFRTCxLQUFLOzJCQVlMLEtBQUs7NkJBUUwsS0FBSzt5QkFRTCxNQUFNOzJCQUVOLE1BQU07K0JBRU4sTUFBTTtrQ0FFTixNQUFNOztJQTBLVCwyQkFBQztDQUFBLEFBL09ELElBK09DO1NBM09ZLG9CQUFvQjs7O0lBQy9CLHlDQUFzQzs7SUFDdEMsc0NBQTZCOzs7OztJQUU3Qix1Q0FBb0M7Ozs7O0lBQ3BDLHNDQUEyQjs7Ozs7SUFDM0IsMkNBQW9DOzs7OztJQUNwQyxzQ0FBZ0M7Ozs7O0lBQ2hDLHlDQUFtQzs7Ozs7SUFFbkMsa0RBQzZDOztJQUU3Qyx1Q0FBMkM7O0lBQzNDLDZDQUF3Qzs7SUE2Q3hDLHNDQUMrQzs7SUFDL0Msd0NBQ2lEOztJQUNqRCw0Q0FDcUQ7O0lBQ3JELCtDQUN3RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50VHlwZSB7XG4gIHR5cGU6IHN0cmluZzsgLy8gJ2ltZycgfCAnc2VsZWN0JyB8ICd3aGl0ZSdcbiAgYmFja2dyb3VuZEltYWdlOiBzdHJpbmc7XG4gIHRyYW5zZm9ybTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdJbWFnZVBpY2tlciwgbnptLWltYWdlLXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlUGlja2VyQ29tcG9uZW50IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0taW1hZ2UtcGlja2VyJztcbiAgZmxleEVsOiBFbGVtZW50VHlwZVtdW10gPSBbXTtcblxuICBwcml2YXRlIF9hY2NlcHQ6IHN0cmluZyA9ICdpbWFnZS8qJztcbiAgcHJpdmF0ZSBfY291bnQ6IG51bWJlciA9IDQ7XG4gIHByaXZhdGUgX3NlbGVjdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9maWxlczogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9tdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVTZWxlY3RvcklucHV0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgX2ZpbGVTZWxlY3RvcklucHV0OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBJbnB1dCgpIGNhcHR1cmU6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZURlbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgZmlsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVzO1xuICB9XG4gIHNldCBmaWxlcyh2YWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuX2ZpbGVzID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBhY2NlcHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWNjZXB0O1xuICB9XG4gIHNldCBhY2NlcHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2FjY2VwdCA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2NvdW50O1xuICB9XG4gIHNldCBsZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgIHRoaXMuX2NvdW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvdW50ID0gNDtcbiAgICB9XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7XG4gIH1cbiAgc2V0IG11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHNlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGU7XG4gIH1cbiAgc2V0IHNlbGVjdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zZWxlY3RhYmxlID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkZhaWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgb25JbWFnZUNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uQWRkSW1hZ2VDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHNvcnRJdGVtKCkge1xuICAgIGlmICghdGhpcy5fZmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGNvdW50ID0gcGFyc2VJbnQoJycgKyB0aGlzLl9jb3VudCwgMTApO1xuICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICBjb3VudCA9IDQ7XG4gICAgfVxuICAgIGxldCBhbGxFbDogRWxlbWVudFR5cGVbXSA9IHRoaXMuX2ZpbGVzLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdpbWcnLFxuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICd1cmwoJyArIGl0ZW0udXJsICsgJyknLFxuICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoJyArIHRoaXMuZ2V0Um90YXRpb24oaXRlbS5vcmllbnRhdGlvbikgKyAnKWRlZydcbiAgICAgIH07XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGFibGUpIHtcbiAgICAgIGFsbEVsLnB1c2goe1xuICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAnJyxcbiAgICAgICAgdHJhbnNmb3JtOiAnJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IGFsbEVsLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoICE9PSAwICYmIGxlbmd0aCAlIGNvdW50ICE9PSAwKSB7XG4gICAgICBjb25zdCBibGFua0NvdW50ID0gY291bnQgLSAobGVuZ3RoICUgY291bnQpO1xuICAgICAgY29uc3QgZmlsbEJsYW5rRWw6IGFueVtdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsYW5rQ291bnQ7IGkrKykge1xuICAgICAgICBmaWxsQmxhbmtFbC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnd2hpdGUnLFxuICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogJycsXG4gICAgICAgICAgdHJhbnNmb3JtOiAnJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGFsbEVsID0gYWxsRWwuY29uY2F0KGZpbGxCbGFua0VsKTtcbiAgICB9XG4gICAgdGhpcy5mbGV4RWwgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsLmxlbmd0aCAvIGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHJvd0VsID0gYWxsRWwuc2xpY2UoaSAqIGNvdW50LCBpICogY291bnQgKyBjb3VudCk7XG4gICAgICB0aGlzLmZsZXhFbC5wdXNoKHJvd0VsKTtcbiAgICB9XG4gIH1cblxuICBhZGRJbWFnZShpbWdJdGVtOiBhbnkpIHtcbiAgICB0aGlzLl9maWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6ICdpbWcnLFxuICAgICAgdXJsOiBpbWdJdGVtLnVybCxcbiAgICAgIG9yaWVudGF0aW9uOiBpbWdJdGVtLm9yaWVudGF0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XG4gICAgICBmaWxlczogdGhpcy5fZmlsZXMsXG4gICAgICBvcGVyYXRpb25UeXBlOiAnYWRkJyxcbiAgICAgIGluZGV4OiB0aGlzLl9maWxlcy5sZW5ndGggLSAxXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVJbWFnZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5fZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHtcbiAgICAgIGZpbGVzOiB0aGlzLl9maWxlcyxcbiAgICAgIG9wZXJhdGlvblR5cGU6ICdyZW1vdmUnLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfSk7XG4gIH1cblxuICBpbWFnZUNsaWNrKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm9uSW1hZ2VDbGljay5lbWl0KHtcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIGZpbGVzOiB0aGlzLl9maWxlc1xuICAgIH0pO1xuICB9XG5cbiAgYWRkSW1hZ2VDbGljayhlKSB7XG4gICAgdGhpcy5vbkFkZEltYWdlQ2xpY2suZW1pdChlKTtcbiAgfVxuXG4gIHBhcnNlRmlsZShmaWxlOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgIGNvbnN0IGRhdGFVUkwgPSAoZS50YXJnZXQgYXMgYW55KS5yZXN1bHQ7XG4gICAgICBpZiAoIWRhdGFVUkwpIHtcbiAgICAgICAgdGhpcy5vbkZhaWwuZW1pdChgRmFpbCB0byBnZXQgdGhlICR7aW5kZXh9IGltYWdlYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IG9yaWVudGF0aW9uID0gMTtcbiAgICAgIHRoaXMuZ2V0T3JpZW50YXRpb24oZmlsZSwgcmVzID0+IHtcbiAgICAgICAgLy8gLTI6IG5vdCBqcGVnICwgLTE6IG5vdCBkZWZpbmVkXG4gICAgICAgIGlmIChyZXMgPiAwKSB7XG4gICAgICAgICAgb3JpZW50YXRpb24gPSByZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRJbWFnZSh7XG4gICAgICAgICAgdXJsOiBkYXRhVVJMLFxuICAgICAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgICAgIGZpbGVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgZmlsZUNoYW5nZShldmVudCkge1xuICAgIGNvbnN0IGZpbGVMaXN0OiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICBpZiAoZmlsZUxpc3QgJiYgZmlsZUxpc3QubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucGFyc2VGaWxlKGZpbGVMaXN0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRSb3RhdGlvbihvcmllbnRhdGlvbiA9IDEpIHtcbiAgICBsZXQgaW1nUm90YXRpb24gPSAwO1xuICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaW1nUm90YXRpb24gPSAxODA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OlxuICAgICAgICBpbWdSb3RhdGlvbiA9IDkwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgODpcbiAgICAgICAgaW1nUm90YXRpb24gPSAyNzA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gICAgcmV0dXJuIGltZ1JvdGF0aW9uO1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzU4NDc5NC9hY2Nlc3NpbmctanBlZy1leGlmLXJvdGF0aW9uLWRhdGEtaW4tamF2YXNjcmlwdC1vbi10aGUtY2xpZW50LXNpZGVcbiAgZ2V0T3JpZW50YXRpb24oZmlsZTogYW55LCBjYWxsYmFjazogKF86IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldygoZS50YXJnZXQgYXMgYW55KS5yZXN1bHQpO1xuICAgICAgaWYgKHZpZXcuZ2V0VWludDE2KDAsIGZhbHNlKSAhPT0gMHhmZmQ4KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygtMik7XG4gICAgICB9XG4gICAgICBjb25zdCBsZW5ndGggPSB2aWV3LmJ5dGVMZW5ndGg7XG4gICAgICBsZXQgb2Zmc2V0ID0gMjtcbiAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWFya2VyID0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICBpZiAobWFya2VyID09PSAweGZmZTEpIHtcbiAgICAgICAgICBjb25zdCB0bXAgPSB2aWV3LmdldFVpbnQzMigob2Zmc2V0ICs9IDIpLCBmYWxzZSk7XG4gICAgICAgICAgaWYgKHRtcCAhPT0gMHg0NTc4Njk2Nikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbGl0dGxlID0gdmlldy5nZXRVaW50MTYoKG9mZnNldCArPSA2KSwgZmFsc2UpID09PSAweDQ5NDk7XG4gICAgICAgICAgb2Zmc2V0ICs9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIGxpdHRsZSk7XG4gICAgICAgICAgY29uc3QgdGFncyA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgbGl0dGxlKTtcbiAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZpZXcuZ2V0VWludDE2KG9mZnNldCArIGkgKiAxMiwgbGl0dGxlKSA9PT0gMHgwMTEyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh2aWV3LmdldFVpbnQxNihvZmZzZXQgKyBpICogMTIgKyA4LCBsaXR0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hcmtlciAmIDB4ZmYwMCkgIT09IDB4ZmYwMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9mZnNldCArPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNhbGxiYWNrKC0xKTtcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlLnNsaWNlKDAsIDY0ICogMTAyNCkpO1xuICB9XG59XG4iXX0=