UNPKG

angular2-csv

Version:

> Helper library for create CSV file in Angular 6

277 lines (270 loc) 26.1 kB
import { Injectable, NgModule, Component, Input, defineInjectable } from '@angular/core'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class Angular2CsvService { constructor() { } } Angular2CsvService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ Angular2CsvService.ctorParameters = () => []; /** @nocollapse */ Angular2CsvService.ngInjectableDef = defineInjectable({ factory: function Angular2CsvService_Factory() { return new Angular2CsvService(); }, token: Angular2CsvService, providedIn: "root" }); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class Angular2CsvComponent { constructor() { this.filename = this.filename || 'mycsv.csv'; this.options = this.objectAssign({}, ConfigDefaults, this.options); this.label_btn = "download"; this.csv = ''; } /** * Event Download * @return {?} */ onDownload() { this.generateCsv(); } /** * ngOnInit * @return {?} */ ngOnInit() { } /** * [generateCsv description] * @return {?} */ generateCsv() { if (this.options.useBom) { this.csv += CsvConfigConsts.BOM; } if (this.options.showTitle) { this.csv += this.options.title + '\r\n\n'; } this.getHeaders(); this.getBody(); if (this.csv === '') { console.log('Invalid data'); return; } let /** @type {?} */ blob = new Blob([this.csv], { type: 'text/csv;charset=utf8;' }); if (navigator.msSaveBlob) { let /** @type {?} */ filename = this.options.filename.replace(/ /g, '_') + '.csv'; navigator.msSaveBlob(blob, filename); } else { let /** @type {?} */ uri = 'data:attachment/csv;charset=utf-8,' + encodeURI(this.csv); let /** @type {?} */ link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.setAttribute('visibility', 'hidden'); link.download = this.filename.replace(/ /g, '_') + '.csv'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } this.csv = ''; } /** * Create Headers for Csv File * @return {?} */ getHeaders() { if (this.options.headers.length > 0) { let /** @type {?} */ row = ''; for (let /** @type {?} */ column of this.options.headers) { row += column + this.options.fieldSeparator; } row = row.slice(0, -1); this.csv += row + CsvConfigConsts.EOL; } } /** * Create Headers * @return {?} */ getBody() { for (let /** @type {?} */ dataRow of this.data) { let /** @type {?} */ row = ''; if (this.isEmptyObject(dataRow) && this.options.removeNewLines) { continue; } if (typeof this.options.keys !== 'undefined' && this.options.keys.length) { for (let /** @type {?} */ key of this.options.keys) { row += this.formartData(dataRow[key]) + this.options.fieldSeparator; } row = row.slice(0, -1); this.csv += row + CsvConfigConsts.EOL; } else { for (let /** @type {?} */ key in dataRow) { if (dataRow[key]) { row += this.formartData(dataRow[key]) + this.options.fieldSeparator; } } this.csv += row + CsvConfigConsts.EOL; } } } /** * Format Data * @param {?} data * @return {?} */ formartData(data) { if (this.options.decimalseparator === 'locale' && this.isFloat(data)) { return data.toLocaleString(); } if (this.options.decimalseparator !== '.' && this.isFloat(data)) { return data.toString().replace('.', this.options.decimalseparator); } if (typeof data === 'string') { data = data.replace(/"/g, '""'); if (this.options.quoteStrings || data.indexOf(',') > -1 || data.indexOf("\n") > -1 || data.indexOf("\r") > -1) { data = this.options.quoteStrings + data + this.options.quoteStrings; } return data; } if (typeof data === 'boolean') { return data ? 'TRUE' : 'FALSE'; } return data; } /** * Validate if object is not empty * @param {?} obj * @return {?} */ isEmptyObject(obj) { return (obj && (Object.keys(obj).length === 0)); } /** * Get Input is Float * @param {?} input * @return {?} */ isFloat(input) { return +input === input && (!isFinite(input) || Boolean(input % 1)); } /** * Add object Values * @param {?} val * @return {?} */ toObject(val) { if (val === null || val === undefined) { throw new TypeError('Object.assign cannot be called with null or undefined'); } return Object(val); } /** * Add Values to Object * @param {?} target * @param {...?} source * @return {?} */ objectAssign(target, ...source) { let /** @type {?} */ from; let /** @type {?} */ to = this.toObject(target); let /** @type {?} */ symbols; let /** @type {?} */ hasOwnProperty = Object.prototype.hasOwnProperty; let /** @type {?} */ propIsEnumerable = Object.prototype.propertyIsEnumerable; for (let /** @type {?} */ s = 1; s < arguments.length; s++) { from = Object(arguments[s]); for (let /** @type {?} */ key in from) { if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } if ((/** @type {?} */ (Object)).getOwnPropertySymbols) { symbols = (/** @type {?} */ (Object)).getOwnPropertySymbols(from); for (let /** @type {?} */ symbol of symbols) { if (propIsEnumerable.call(from, symbol)) { to[symbol] = from[symbol]; } } } } return to; } } Angular2CsvComponent.decorators = [ { type: Component, args: [{ selector: 'angular2csv', template: `<button (click)="onDownload()">{{ label_btn }}</button>`, styles: [] },] }, ]; /** @nocollapse */ Angular2CsvComponent.ctorParameters = () => []; Angular2CsvComponent.propDecorators = { data: [{ type: Input }], filename: [{ type: Input }], options: [{ type: Input }] }; /** * CsvConfigConsts */ class CsvConfigConsts { } CsvConfigConsts.EOL = '\r\n'; CsvConfigConsts.BOM = '\ufeff'; CsvConfigConsts.DEFAULT_FIELD_SEPARATOR = ','; CsvConfigConsts.DEFAULT_DECIMAL_SEPARATOR = '.'; CsvConfigConsts.DEFAULT_QUOTE = '"'; CsvConfigConsts.DEFAULT_SHOW_TITLE = false; CsvConfigConsts.DEFAULT_TITLE = 'My Report'; CsvConfigConsts.DEFAULT_FILENAME = 'mycsv.csv'; CsvConfigConsts.DEFAULT_SHOW_LABELS = false; CsvConfigConsts.DEFAULT_USE_BOM = true; CsvConfigConsts.DEFAULT_HEADER = []; CsvConfigConsts.DEFAULT_KEY = []; CsvConfigConsts.DEFAULT_REMOVE_NEW_LINES = false; /** * Default Configurations */ const /** @type {?} */ ConfigDefaults = { filename: CsvConfigConsts.DEFAULT_FILENAME, fieldSeparator: CsvConfigConsts.DEFAULT_FIELD_SEPARATOR, quoteStrings: CsvConfigConsts.DEFAULT_QUOTE, decimalseparator: CsvConfigConsts.DEFAULT_DECIMAL_SEPARATOR, showLabels: CsvConfigConsts.DEFAULT_SHOW_LABELS, showTitle: CsvConfigConsts.DEFAULT_SHOW_TITLE, title: CsvConfigConsts.DEFAULT_TITLE, useBom: CsvConfigConsts.DEFAULT_USE_BOM, headers: CsvConfigConsts.DEFAULT_HEADER, keys: CsvConfigConsts.DEFAULT_KEY, removeNewLines: CsvConfigConsts.DEFAULT_REMOVE_NEW_LINES }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class Angular2CsvModule { } Angular2CsvModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule ], declarations: [Angular2CsvComponent], exports: [Angular2CsvComponent] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { Angular2CsvService, Angular2CsvComponent, CsvConfigConsts, ConfigDefaults, Angular2CsvModule }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhcjItY3N2LmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9hbmd1bGFyMi1jc3YvbGliL2FuZ3VsYXIyLWNzdi5zZXJ2aWNlLnRzIiwibmc6Ly9hbmd1bGFyMi1jc3YvbGliL2FuZ3VsYXIyLWNzdi5jb21wb25lbnQudHMiLCJuZzovL2FuZ3VsYXIyLWNzdi9saWIvYW5ndWxhcjItY3N2Lm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXIyQ3N2U2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbmd1bGFyMmNzdicsXG4gIHRlbXBsYXRlOiBgPGJ1dHRvbiAoY2xpY2spPVwib25Eb3dubG9hZCgpXCI+e3sgbGFiZWxfYnRuIH19PC9idXR0b24+YCxcbiAgc3R5bGVzOiBbXVxufSlcblxuZXhwb3J0IGNsYXNzIEFuZ3VsYXIyQ3N2Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBkYXRhOiBhbnlbXTtcbiAgQElucHV0KCkgZmlsZW5hbWU6IHN0cmluZyAgPSB0aGlzLmZpbGVuYW1lIHx8ICdteWNzdi5jc3YnO1xuICBASW5wdXQoKSBvcHRpb25zOiBPcHRpb25zID0gdGhpcy5vYmplY3RBc3NpZ24oe30sIENvbmZpZ0RlZmF1bHRzLCB0aGlzLm9wdGlvbnMpO1xuXG4gIGxhYmVsX2J0bjogc3RyaW5nID0gXCJkb3dubG9hZFwiO1xuICBjc3Y6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbiAgLyoqXG4gICAqIEV2ZW50IERvd25sb2FkXG4gICAqL1xuICBvbkRvd25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGVDc3YoKTtcbiAgfVxuICAvKipcbiAgICogbmdPbkluaXRcbiAgICovXG4gIG5nT25Jbml0KCkge31cbiAgLyoqXG4gICAqIFtnZW5lcmF0ZUNzdiBkZXNjcmlwdGlvbl1cbiAgICovXG4gIGdlbmVyYXRlQ3N2KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VCb20pIHtcbiAgICAgIHRoaXMuY3N2ICs9IENzdkNvbmZpZ0NvbnN0cy5CT007XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VGl0bGUpIHtcbiAgICAgIHRoaXMuY3N2ICs9IHRoaXMub3B0aW9ucy50aXRsZSArICdcXHJcXG5cXG4nO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0SGVhZGVycygpO1xuICAgIHRoaXMuZ2V0Qm9keSgpO1xuXG4gICAgaWYgKHRoaXMuY3N2ID09PSAnJykge1xuICAgICAgY29uc29sZS5sb2coJ0ludmFsaWQgZGF0YScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBibG9iID0gbmV3IEJsb2IoW3RoaXMuY3N2XSwge3R5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zjg7J30pO1xuXG4gICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG5cbiAgICAgIGxldCBmaWxlbmFtZSA9IHRoaXMub3B0aW9ucy5maWxlbmFtZS5yZXBsYWNlKC8gL2csICdfJykgKyAnLmNzdic7XG4gICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBmaWxlbmFtZSk7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICBsZXQgdXJpID0gJ2RhdGE6YXR0YWNobWVudC9jc3Y7Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlVVJJKHRoaXMuY3N2KTtcbiAgICAgIGxldCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgndmlzaWJpbGl0eScsICdoaWRkZW4nKTtcbiAgICAgIGxpbmsuZG93bmxvYWQgPSB0aGlzLmZpbGVuYW1lLnJlcGxhY2UoLyAvZywgJ18nKSArICcuY3N2JztcblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcblxuICAgICAgbGluay5jbGljaygpO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgIH1cblxuICAgIHRoaXMuY3N2ID0gJyc7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBIZWFkZXJzIGZvciBDc3YgRmlsZVxuICAgKi9cbiAgZ2V0SGVhZGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmhlYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHJvdyA9ICcnO1xuICAgICAgZm9yIChsZXQgY29sdW1uIG9mIHRoaXMub3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgIHJvdyArPSBjb2x1bW4gKyB0aGlzLm9wdGlvbnMuZmllbGRTZXBhcmF0b3I7XG4gICAgICB9XG5cbiAgICAgIHJvdyA9IHJvdy5zbGljZSgwLCAtMSk7XG4gICAgICB0aGlzLmNzdiArPSByb3cgKyBDc3ZDb25maWdDb25zdHMuRU9MO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIEhlYWRlcnNcbiAgICovXG4gIGdldEJvZHkoKTogdm9pZCB7XG5cbiAgICBmb3IgKGxldCBkYXRhUm93IG9mIHRoaXMuZGF0YSkge1xuXG4gICAgICBsZXQgcm93ID0gJyc7XG5cbiAgICAgIGlmKHRoaXMuaXNFbXB0eU9iamVjdChkYXRhUm93KSAmJiB0aGlzLm9wdGlvbnMucmVtb3ZlTmV3TGluZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmtleXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMub3B0aW9ucy5rZXlzLmxlbmd0aCkge1xuXG4gICAgICAgIGZvciAobGV0IGtleSBvZiB0aGlzLm9wdGlvbnMua2V5cykge1xuICAgICAgICAgIHJvdyArPSB0aGlzLmZvcm1hcnREYXRhKGRhdGFSb3dba2V5XSkgKyB0aGlzLm9wdGlvbnMuZmllbGRTZXBhcmF0b3I7XG4gICAgICAgIH1cblxuICAgICAgICByb3cgPSByb3cuc2xpY2UoMCwgLTEpO1xuICAgICAgICB0aGlzLmNzdiArPSByb3cgKyBDc3ZDb25maWdDb25zdHMuRU9MO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhUm93KSB7XG4gICAgICAgICAgaWYoZGF0YVJvd1trZXldKSB7XG4gICAgICAgICAgICByb3cgKz0gdGhpcy5mb3JtYXJ0RGF0YShkYXRhUm93W2tleV0pICsgdGhpcy5vcHRpb25zLmZpZWxkU2VwYXJhdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNzdiArPSByb3cgKyBDc3ZDb25maWdDb25zdHMuRU9MO1xuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBGb3JtYXQgRGF0YVxuICAgKi9cbiAgZm9ybWFydERhdGEoZGF0YTogYW55KSB7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRlY2ltYWxzZXBhcmF0b3IgPT09ICdsb2NhbGUnICYmIHRoaXMuaXNGbG9hdChkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmRlY2ltYWxzZXBhcmF0b3IgIT09ICcuJyAmJiB0aGlzLmlzRmxvYXQoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsIHRoaXMub3B0aW9ucy5kZWNpbWFsc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnF1b3RlU3RyaW5ncyB8fCBkYXRhLmluZGV4T2YoJywnKSA+IC0xIHx8IGRhdGEuaW5kZXhPZihcIlxcblwiKSA+IC0xIHx8IGRhdGEuaW5kZXhPZihcIlxcclwiKSA+IC0xKSB7XG4gICAgICAgIGRhdGEgPSB0aGlzLm9wdGlvbnMucXVvdGVTdHJpbmdzICsgZGF0YSArIHRoaXMub3B0aW9ucy5xdW90ZVN0cmluZ3M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gZGF0YSA/ICdUUlVFJyA6ICdGQUxTRSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGlmIG9iamVjdCBpcyBub3QgZW1wdHlcbiAgICovXG4gIGlzRW1wdHlPYmplY3Qob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gKG9iaiAmJiAoT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDApKTtcbiAgfVxuICAvKipcbiAgICogR2V0IElucHV0IGlzIEZsb2F0XG4gICAqL1xuICBpc0Zsb2F0KGlucHV0OiBhbnkpIHtcbiAgICByZXR1cm4gK2lucHV0ID09PSBpbnB1dCAmJiAoIWlzRmluaXRlKGlucHV0KSB8fCBCb29sZWFuKGlucHV0ICUgMSkpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgb2JqZWN0IFZhbHVlc1xuICAgKi9cbiAgdG9PYmplY3QodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0KHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBWYWx1ZXMgdG8gT2JqZWN0XG4gICAqL1xuICBvYmplY3RBc3NpZ24odGFyZ2V0OiBhbnksIC4uLnNvdXJjZTogYW55W10pIHtcbiAgICBsZXQgZnJvbTogYW55O1xuICAgIGxldCB0byA9IHRoaXMudG9PYmplY3QodGFyZ2V0KTtcbiAgICBsZXQgc3ltYm9sczogYW55O1xuXG4gICAgbGV0IGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICBsZXQgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbiAgICBmb3IgKGxldCBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuICAgICAgZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG4gICAgICBmb3IgKGxldCBrZXkgaW4gZnJvbSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG4gICAgICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoKDxhbnk+IE9iamVjdCkuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHN5bWJvbHMgPSAoPGFueT4gT2JqZWN0KS5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG4gICAgICAgIGZvciAobGV0IHN5bWJvbCBvZiBzeW1ib2xzKSB7XG4gICAgICAgICAgaWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2wpKSB7XG4gICAgICAgICAgICB0b1tzeW1ib2xdID0gZnJvbVtzeW1ib2xdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0bztcbiAgfVxufVxuLyoqXG4gKiBPcHRpb24gSW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIGZpZWxkU2VwYXJhdG9yOiBzdHJpbmc7XG4gIHF1b3RlU3RyaW5nczogc3RyaW5nO1xuICBkZWNpbWFsc2VwYXJhdG9yOiBzdHJpbmc7XG4gIHNob3dMYWJlbHM6IGJvb2xlYW47XG4gIHNob3dUaXRsZTogYm9vbGVhbjtcbiAgdGl0bGU6IHN0cmluZztcbiAgdXNlQm9tOiBib29sZWFuO1xuICBoZWFkZXJzOiBzdHJpbmdbXTtcbiAga2V5czogc3RyaW5nW107XG4gIHJlbW92ZU5ld0xpbmVzOiBib29sZWFuO1xufVxuLyoqXG4gKiBDc3ZDb25maWdDb25zdHNcbiAqL1xuZXhwb3J0IGNsYXNzIENzdkNvbmZpZ0NvbnN0cyB7XG5cbiAgcHVibGljIHN0YXRpYyBFT0wgPSAnXFxyXFxuJztcbiAgcHVibGljIHN0YXRpYyBCT00gPSAnXFx1ZmVmZic7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0ZJRUxEX1NFUEFSQVRPUiA9ICcsJztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0RFQ0lNQUxfU0VQQVJBVE9SID0gJy4nO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfUVVPVEUgPSAnXCInO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfU0hPV19USVRMRSA9IGZhbHNlO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfVElUTEUgPSAnTXkgUmVwb3J0JztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0ZJTEVOQU1FID0gJ215Y3N2LmNzdic7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9TSE9XX0xBQkVMUyA9IGZhbHNlO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfVVNFX0JPTSA9IHRydWU7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9IRUFERVI6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9LRVk6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9SRU1PVkVfTkVXX0xJTkVTID0gZmFsc2U7XG59XG4vKipcbiAqIERlZmF1bHQgQ29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IENvbmZpZ0RlZmF1bHRzOiBPcHRpb25zID0ge1xuICBmaWxlbmFtZTogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfRklMRU5BTUUsXG4gIGZpZWxkU2VwYXJhdG9yOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9GSUVMRF9TRVBBUkFUT1IsXG4gIHF1b3RlU3RyaW5nczogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfUVVPVEUsXG4gIGRlY2ltYWxzZXBhcmF0b3I6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX0RFQ0lNQUxfU0VQQVJBVE9SLFxuICBzaG93TGFiZWxzOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9TSE9XX0xBQkVMUyxcbiAgc2hvd1RpdGxlOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9TSE9XX1RJVExFLFxuICB0aXRsZTogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfVElUTEUsXG4gIHVzZUJvbTogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfVVNFX0JPTSxcbiAgaGVhZGVyczogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfSEVBREVSLFxuICBrZXlzOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9LRVksXG4gIHJlbW92ZU5ld0xpbmVzOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9SRU1PVkVfTkVXX0xJTkVTXG59O1xuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IEFuZ3VsYXIyQ3N2Q29tcG9uZW50IH0gZnJvbSAnLi9hbmd1bGFyMi1jc3YuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtBbmd1bGFyMkNzdkNvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtBbmd1bGFyMkNzdkNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhcjJDc3ZNb2R1bGUgeyB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0lBT0UsaUJBQWlCOzs7WUFMbEIsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7Ozs7Ozs7O0FDSkQ7SUFpQkU7d0JBTjZCLElBQUksQ0FBQyxRQUFRLElBQUksV0FBVzt1QkFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7eUJBRTNELFVBQVU7bUJBQ2hCLEVBQUU7S0FFQTs7Ozs7SUFJaEIsVUFBVTtRQUNSLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNwQjs7Ozs7SUFJRCxRQUFRLE1BQUs7Ozs7O0lBSWIsV0FBVztRQUVULElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztTQUMzQztRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFZixJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUIsT0FBTztTQUNSO1FBRUQscUJBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFDLENBQUMsQ0FBQztRQUVsRSxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUU7WUFFeEIscUJBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ2pFLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBRXRDO2FBQU07WUFFTCxxQkFBSSxHQUFHLEdBQUcsb0NBQW9DLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyRSxxQkFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV2QyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBRTFELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWhDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUViLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7S0FDZjs7Ozs7SUFJRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLHFCQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixLQUFLLHFCQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFDdkMsR0FBRyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQzthQUM3QztZQUVELEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUM7U0FDdkM7S0FDRjs7Ozs7SUFJRCxPQUFPO1FBRUwsS0FBSyxxQkFBSSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUU3QixxQkFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBRWIsSUFBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFO2dCQUM3RCxTQUFTO2FBQ1Y7WUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFFeEUsS0FBSyxxQkFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ2pDLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO2lCQUNyRTtnQkFFRCxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQzthQUV2QztpQkFBTTtnQkFFTCxLQUFLLHFCQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUU7b0JBQ3ZCLElBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNmLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO3FCQUNyRTtpQkFDRjtnQkFDRCxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDO2FBRXZDO1NBQ0Y7S0FDRjs7Ozs7O0lBSUQsV0FBVyxDQUFDLElBQVM7UUFFbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9ELE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3BFO1FBRUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDNUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWhDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQzdHLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7YUFDckU7WUFFRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxPQUFPLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDN0IsT0FBTyxJQUFJLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztTQUNoQztRQUVELE9BQU8sSUFBSSxDQUFDO0tBQ2I7Ozs7OztJQUlELGFBQWEsQ0FBQyxHQUFRO1FBQ3BCLFFBQVEsR0FBRyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO0tBQ2pEOzs7Ozs7SUFJRCxPQUFPLENBQUMsS0FBVTtRQUNoQixPQUFPLENBQUMsS0FBSyxLQUFLLEtBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDckU7Ozs7OztJQUlELFFBQVEsQ0FBQyxHQUFRO1FBQ2YsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckMsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1NBQzlFO1FBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDcEI7Ozs7Ozs7SUFJRCxZQUFZLENBQUMsTUFBVyxFQUFFLEdBQUcsTUFBYTtRQUN4QyxxQkFBSSxJQUFTLENBQUM7UUFDZCxxQkFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixxQkFBSSxPQUFZLENBQUM7UUFFakIscUJBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO1FBQ3JELHFCQUFJLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUM7UUFFN0QsS0FBSyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUIsS0FBSyxxQkFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUNsQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNyQjthQUNGO1lBRUQsSUFBSSxtQkFBTyxNQUFNLEdBQUUscUJBQXFCLEVBQUU7Z0JBQ3hDLE9BQU8sR0FBRyxtQkFBTyxNQUFNLEdBQUUscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JELEtBQUsscUJBQUksTUFBTSxJQUFJLE9BQU8sRUFBRTtvQkFDMUIsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFO3dCQUN2QyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUMzQjtpQkFDRjthQUNGO1NBQ0Y7UUFFRCxPQUFPLEVBQUUsQ0FBQztLQUNYOzs7WUExTUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxhQUFhO2dCQUN2QixRQUFRLEVBQUUseURBQXlEO2dCQUNuRSxNQUFNLEVBQUUsRUFBRTthQUNYOzs7OzttQkFJRSxLQUFLO3VCQUNMLEtBQUs7c0JBQ0wsS0FBSzs7Ozs7QUFxTlI7O3NCQUVzQixNQUFNO3NCQUNOLFFBQVE7MENBRVksR0FBRzs0Q0FDRCxHQUFHO2dDQUNmLEdBQUc7cUNBQ0UsS0FBSztnQ0FDVixXQUFXO21DQUNSLFdBQVc7c0NBQ1IsS0FBSztrQ0FDVCxJQUFJO2lDQUNLLEVBQUU7OEJBQ0wsRUFBRTsyQ0FDQyxLQUFLOzs7O0FBS2hELHVCQUFhLGNBQWMsR0FBWTtJQUNyQyxRQUFRLEVBQUUsZUFBZSxDQUFDLGdCQUFnQjtJQUMxQyxjQUFjLEVBQUUsZUFBZSxDQUFDLHVCQUF1QjtJQUN2RCxZQUFZLEVBQUUsZUFBZSxDQUFDLGFBQWE7SUFDM0MsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLHlCQUF5QjtJQUMzRCxVQUFVLEVBQUUsZUFBZSxDQUFDLG1CQUFtQjtJQUMvQyxTQUFTLEVBQUUsZUFBZSxDQUFDLGtCQUFrQjtJQUM3QyxLQUFLLEVBQUUsZUFBZSxDQUFDLGFBQWE7SUFDcEMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxlQUFlO0lBQ3ZDLE9BQU8sRUFBRSxlQUFlLENBQUMsY0FBYztJQUN2QyxJQUFJLEVBQUUsZUFBZSxDQUFDLFdBQVc7SUFDakMsY0FBYyxFQUFFLGVBQWUsQ0FBQyx3QkFBd0I7Q0FDekQ7Ozs7OztBQ2pRRDs7O1lBS0MsUUFBUSxTQUFDO2dCQUNSLE9BQU8sRUFBRTtvQkFDUCxZQUFZO2lCQUNiO2dCQUNELFlBQVksRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dCQUNwQyxPQUFPLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQzthQUNoQzs7Ozs7Ozs7Ozs7Ozs7OyJ9