ftable
Version:
Angular 6/7 Tables
797 lines (788 loc) • 269 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs/operators'), require('@angular/common'), require('@angular/forms'), require('thenby'), require('rxjs'), require('@angular/core'), require('@angular/common/http')) :
typeof define === 'function' && define.amd ? define('ftable', ['exports', 'rxjs/operators', '@angular/common', '@angular/forms', 'thenby', 'rxjs', '@angular/core', '@angular/common/http'], factory) :
(factory((global.ftable = {}),global.rxjs.operators,global.ng.common,global.ng.forms,global.thenby,global.rxjs,global.ng.core,global.ng.common.http));
}(this, (function (exports,operators,common,forms,thenby,rxjs,core,http) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var FFilterBase = /** @class */ (function () {
function FFilterBase() {
this.filter = new core.EventEmitter();
}
/**
* @return {?}
*/
FFilterBase.prototype.reset = /**
* @return {?}
*/
function () { };
FFilterBase.propDecorators = {
source: [{ type: core.Input }],
otherData: [{ type: core.Input }],
columnName: [{ type: core.Input }],
filter: [{ type: core.Output }]
};
return FFilterBase;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
// import { initDomAdapter } from '@angular/platyform-browser/src/browser';
var CheckBoxFFilterComponent = /** @class */ (function () {
function CheckBoxFFilterComponent() {
this.filter = new core.EventEmitter();
this.values = [];
}
/**
* @return {?}
*/
CheckBoxFFilterComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.initData();
};
/**
* @private
* @return {?}
*/
CheckBoxFFilterComponent.prototype.initData = /**
* @private
* @return {?}
*/
function () {
this.values = this.otherData.map(function (x) {
/** @type {?} */
var result = {};
result['value'] = x;
result['checked'] = true;
return result;
});
};
/**
* @param {?} index
* @param {?} value
* @param {?} event
* @return {?}
*/
CheckBoxFFilterComponent.prototype.checkBoxClicked = /**
* @param {?} index
* @param {?} value
* @param {?} event
* @return {?}
*/
function (index, value, event) {
if (this.source === 'frontend') {
/** @type {?} */
var fn = function (name, values) {
return function (d) {
if (values.length > 0) {
return (( /** @type {?} */(d))).filter(function (x) {
/** @type {?} */
var i = values.map(function (e) { return e.value; }).indexOf(String(x[name]));
return i !== -1 && values[i].checked === true;
});
}
else {
return (( /** @type {?} */(d)));
}
};
};
this.filter.emit({ columnName: this.columnName, apply: fn(this.columnName, this.values) });
}
else {
this.values[index].checked = !this.values[index].checked;
/** @type {?} */
var filtered = this.values.filter(function (x) { return x.checked === true; }).map(function (a) { return a.value; });
/** @type {?} */
var result = { values: filtered };
this.filter.emit({ columnName: this.columnName, type: 'checkbox', apply: result });
}
};
/**
* @return {?}
*/
CheckBoxFFilterComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.initData();
this.filter.emit({ columnName: this.columnName, apply: null });
};
CheckBoxFFilterComponent.decorators = [
{ type: core.Component, args: [{
template: "\n\n <table class='ft-ffilter-table'>\n \n <tr class='ft-ffilter-column' *ngFor=\"let value of otherData;let index = index\">\n <td class='ft-ffilter-row'>\n <span><input class=\"ft-c\" type=\"checkbox\"[name]=\"columnName\" (click)='checkBoxClicked(index, value ,$event)' value=\"value\" [(ngModel)]='values[index].checked'> {{ value }}</span>\n </td>\n </tr>\n</table>\n <!--\n <div class='ft-ffilter ft-c-filter' *ngFor=\"let value of otherData;let index = index\">\n <input class='ft-c' type=\"checkbox\" [name]=\"columnName\" (click)='checkBoxClicked(index, value ,$event)' value=\"value\" [(ngModel)]='values[index].checked'> {{ value }}<br>\n </div> -->\n "
}] }
];
/** @nocollapse */
CheckBoxFFilterComponent.ctorParameters = function () { return []; };
CheckBoxFFilterComponent.propDecorators = {
source: [{ type: core.Input }],
otherData: [{ type: core.Input }],
columnName: [{ type: core.Input }],
filter: [{ type: core.Output }]
};
return CheckBoxFFilterComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var DateFFilterComponent = /** @class */ (function () {
function DateFFilterComponent() {
this.filter = new core.EventEmitter();
this.minDay = '';
this.minMonth = '';
this.minYear = '';
this.maxDay = '';
this.maxMonth = '';
this.maxYear = '';
}
/**
* @param {?} mode
* @param {?} max
* @param {?} event
* @return {?}
*/
DateFFilterComponent.prototype.onKeyUp = /**
* @param {?} mode
* @param {?} max
* @param {?} event
* @return {?}
*/
function (mode, max, event) {
// Ignore if Delete or Backspace
if (event.keyCode !== 8 && event.keyCode !== 46) {
// filter letters and Trim
this[mode] = this[mode].match(/[0-9]*/).join('').substring(0, max);
// Move focus for UX
if (mode === 'minDay' && (this[mode].length === 2 || event.keyCode === 39)) {
this._elMinMonthRef.nativeElement.focus();
}
else if (mode === 'minMonth' && (this[mode].length === 2 || event.keyCode === 39)) {
this._elMinYearRef.nativeElement.focus();
}
else if (mode === 'minYear' && (this[mode].length === 4 || event.keyCode === 39)) {
this._elMaxDayRef.nativeElement.focus();
}
else if (mode === 'maxDay' && (this[mode].length === 2 || event.keyCode === 39)) {
this._elMaxMonthRef.nativeElement.focus();
}
else if (mode === 'maxMonth' && (this[mode].length === 2 || event.keyCode === 39)) {
this._elMaxYearRef.nativeElement.focus();
}
else if (mode === 'maxYear' && (this[mode].length === 4 || event.keyCode === 39)) {
this._elMinDayRef.nativeElement.focus();
}
}
if (this.source === 'frontend') {
/** @type {?} */
var fn = function (name, minDay, minMonth, minYear, maxDay, maxMonth, maxYear) {
return function (d) {
return (( /** @type {?} */(d))).filter(function (x) {
console.log(name, minDay, minMonth, minYear, maxDay, maxMonth, maxYear);
/** @type {?} */
var date = new Date(x[name]);
return (minDay.length > 0 ? Number(minDay) <= date.getDate() : true) &&
(minMonth.length > 0 ? Number(minMonth) <= date.getMonth() + 1 : true) &&
(minYear.length > 0 ? Number(minYear) <= date.getFullYear() : true) &&
(maxDay.length > 0 ? Number(maxDay) >= date.getDate() : true) &&
(maxMonth.length > 0 ? Number(maxMonth) >= date.getMonth() + 1 : true) &&
(maxYear.length > 0 ? Number(maxYear) >= date.getFullYear() : true);
});
};
};
this.filter.emit({ columnName: this.columnName, type: 'date', apply: fn(this.columnName, this.minDay, this.minMonth, this.minYear, this.maxDay, this.maxMonth, this.maxYear) });
}
else {
/** @type {?} */
var result = { minDay: this.minDay, minMonth: this.minMonth, minYear: this.minYear, maxDay: this.maxDay, maxMonth: this.maxMonth, maxYear: this.maxYear };
this.filter.emit({ columnName: this.columnName, type: 'date', apply: result });
}
};
/**
* @return {?}
*/
DateFFilterComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.minDay = '';
this.minMonth = '';
this.minYear = '';
this.maxDay = '';
this.maxMonth = '';
this.maxYear = '';
this.filter.emit({ columnName: this.columnName, apply: null });
};
DateFFilterComponent.decorators = [
{ type: core.Component, args: [{
template: "\n\n <table class='ft-ffilter-table ft-ffilter-date-table'>\n <tr class='ft-ffilter-column'>\n <td class='ft-ffilter-row ft-ffilter-dd-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-ffilter-day\" type='text' placeholder='dd' [(ngModel)]='minDay' (keyup)='onKeyUp(\"minDay\", 2, $event)' #minDayRef />\n </td>\n <td class='ft-ffilter-row ft-ffilter-mm-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-ffilter-month\" type='text' placeholder='mm' [(ngModel)]='minMonth' (keyup)='onKeyUp(\"minMonth\", 2, $event)' #minMonthRef />\n </td>\n <td class='ft-ffilter-row ft-ffilter-yyyy-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-ffilter-year\" type='text' placeholder='yyyy' [(ngModel)]='minYear' (keyup)='onKeyUp(\"minYear\", 4, $event)' #minYearRef />\n </td>\n </tr>\n <tr class='ft-ffilter-column'>\n <td class='ft-ffilter-row ft-ffilter-dd-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-ffilter-day\" type='text' placeholder='dd' [(ngModel)]='maxDay' (keyup)='onKeyUp(\"maxDay\" , 2, $event)' #maxDayRef />\n </td>\n <td class='ft-ffilter-row ft-ffilter-mm-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-ffilter-month\" type='text' placeholder='mm' [(ngModel)]='maxMonth' (keyup)='onKeyUp(\"maxMonth\", 2, $event)' #maxMonthRef />\n </td>\n <td class='ft-ffilter-row ft-ffilter-yyyy-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-ffilter-year\" type='text' placeholder='yyyy' [(ngModel)]='maxYear' (keyup)='onKeyUp(\"maxYear\", 4, $event)' #maxYearRef />\n </td>\n </tr>\n</table>\n <!--\n <div class='ft-ffilter'>\n <div class=\"ft-filter-date ft-div1-ffilter\">\n <input class=\"ft-i ft-i-filter ft-i-filter-day\" type='text' placeholder='dd' [(ngModel)]='minDay' (keyup)='onKeyUp(\"minDay\", 2, $event)' #minDayRef />\n <input class=\"ft-i ft-i-filter ft-i-filter-month\" type='text' placeholder='mm' [(ngModel)]='minMonth' (keyup)='onKeyUp(\"minMonth\", 2, $event)' #minMonthRef />\n <input class=\"ft-i ft-i-filter ft-i-filter-year\" type='text' placeholder='yyyy' [(ngModel)]='minYear' (keyup)='onKeyUp(\"minYear\", 4, $event)' #minYearRef />\n </div>\n <div class=\"ft-filter-date ft-div2-ffilter\">\n <input class=\"ft-i ft-i-filter ft-i-filter-day\" type='text' placeholder='dd' [(ngModel)]='maxDay' (keyup)='onKeyUp(\"maxDay\" , 2, $event)' #maxDayRef />\n <input class=\"ft-i ft-i-filter ft-i-filter-month\" type='text' placeholder='mm' [(ngModel)]='maxMonth' (keyup)='onKeyUp(\"maxMonth\", 2, $event)' #maxMonthRef />\n <input class=\"ft-i ft-i-filter ft-i-filter-year\" type='text' placeholder='yyyy' [(ngModel)]='maxYear' (keyup)='onKeyUp(\"maxYear\", 4, $event)' #maxYearRef />\n </div>\n </div>\n\n -->\n ",
styles: ["\n :host { flex:1;\n }"]
}] }
];
DateFFilterComponent.propDecorators = {
_elMinDayRef: [{ type: core.ViewChild, args: ["minDayRef",] }],
_elMinMonthRef: [{ type: core.ViewChild, args: ["minMonthRef",] }],
_elMinYearRef: [{ type: core.ViewChild, args: ["minYearRef",] }],
_elMaxDayRef: [{ type: core.ViewChild, args: ["maxDayRef",] }],
_elMaxMonthRef: [{ type: core.ViewChild, args: ["maxMonthRef",] }],
_elMaxYearRef: [{ type: core.ViewChild, args: ["maxYearRef",] }],
source: [{ type: core.Input }],
otherData: [{ type: core.Input }],
columnName: [{ type: core.Input }],
filter: [{ type: core.Output }]
};
return DateFFilterComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var EmptyFFilterComponent = /** @class */ (function () {
function EmptyFFilterComponent() {
this.filter = new core.EventEmitter();
}
/**
* @return {?}
*/
EmptyFFilterComponent.prototype.reset = /**
* @return {?}
*/
function () { };
EmptyFFilterComponent.decorators = [
{ type: core.Component, args: [{
template: "\n\n "
}] }
];
EmptyFFilterComponent.propDecorators = {
source: [{ type: core.Input }],
otherData: [{ type: core.Input }],
columnName: [{ type: core.Input }],
filter: [{ type: core.Output }]
};
return EmptyFFilterComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NumberFFilterComponent = /** @class */ (function () {
function NumberFFilterComponent() {
this.filter = new core.EventEmitter();
// Hold Inputted Values
this.min = null;
this.max = null;
}
/**
* @param {?} mode
* @param {?} event
* @return {?}
*/
NumberFFilterComponent.prototype.numberKeyUp = /**
* @param {?} mode
* @param {?} event
* @return {?}
*/
function (mode, event) {
if (event.keyCode !== 8 && event.keyCode !== 46) {
this[mode] = event.target.value;
// Move focus for UX
if (mode === 'min' && event.keyCode === 39) {
this._elMaxRef.nativeElement.focus();
}
else if (mode === 'max' && event.keyCode === 39) {
this._elMinRef.nativeElement.focus();
}
}
if (this.source === 'frontend') {
/** @type {?} */
var fn = function (name, searchMin, searchMax) {
return function (d) {
return (( /** @type {?} */(d))).filter(function (x) {
return (searchMin ? searchMin <= Number(x[name]) : true) &&
(searchMax ? searchMax >= Number(x[name]) : true);
});
};
};
this.filter.emit({ columnName: this.columnName, apply: fn(this.columnName, this.min, this.max) });
}
else {
/** @type {?} */
var result = { min: this.min, max: this.max };
this.filter.emit({ columnName: this.columnName, type: 'number', apply: result });
}
};
/**
* @return {?}
*/
NumberFFilterComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.min = null;
this.max = null;
this.filter.emit({ columnName: this.columnName, apply: null });
};
NumberFFilterComponent.decorators = [
{ type: core.Component, args: [{
template: "\n <table class='ft-ffilter-table'>\n <tr class='ft-ffilter-column'>\n <td class='ft-ffilter-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-min\" type=\"number\" placeholder='>=' [(ngModel)]='min' (keyup)='numberKeyUp(\"min\",$event)' #minRef >\n </td>\n </tr>\n <tr class='ft-ffilter-column'>\n <td class='ft-ffilter-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-max\" type=\"number\" placeholder='<=' [(ngModel)]='max' (keyup)='numberKeyUp(\"max\",$event)' #maxRef >\n </td>\n </tr>\n</table>\n\n <!--\n <div class=\"ft-ffilter\">\n <div class=\"ft-div1-ffilter\">\n <div class=\"ft-ffilter-prepend\">\n <span class=\"ft-ffilter-text\">>=</span>\n </div>\n <input class=\"ft-i ft-i-ffilter ft-i-min\" type=\"number\" [(ngModel)]='min' (keyup)='numberKeyUp(\"min\",$event)' #minRef >\n <div class=\"ft-ffilter-append\">\n <span class=\"ft-ffilter-text\"><=</span>\n </div>\n </div>\n\n <div class=\"ft-div2-ffilter\">\n <div class=\"ft-ffilter-prepend\">\n <span class=\"ft-filter-text\"><=</span>\n </div>\n <input class=\"ft-i ft-i-filter ft-i-max\" type=\"number\" [(ngModel)]='max' (keyup)='numberKeyUp(\"max\",$event)' #maxRef >\n <div class=\"ft-ffilter-append\">\n <span class=\"ft-filter-text\">>=</span>\n </div>\n </div>\n </div>\n -->\n ",
styles: ["\n :host { flex:1;\n }"]
}] }
];
NumberFFilterComponent.propDecorators = {
_elMinRef: [{ type: core.ViewChild, args: ["minRef",] }],
_elMaxRef: [{ type: core.ViewChild, args: ["maxRef",] }],
source: [{ type: core.Input }],
otherData: [{ type: core.Input }],
columnName: [{ type: core.Input }],
filter: [{ type: core.Output }]
};
return NumberFFilterComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var TextFFilterComponent = /** @class */ (function () {
function TextFFilterComponent() {
this.filter = new core.EventEmitter();
this.value = '';
}
/**
* @param {?} event
* @return {?}
*/
TextFFilterComponent.prototype.onKeyUp = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.source === 'frontend') {
/** @type {?} */
var fn = function (name, searchValue) {
return function (d) {
return (( /** @type {?} */(d))).filter(function (x) { return String(x[name]).toLowerCase().indexOf(String(searchValue).toLowerCase()) !== -1; });
};
};
this.filter.emit({ columnName: this.columnName, apply: fn(this.columnName, event.target.value) });
}
else {
/** @type {?} */
var result = { value: event.target.value };
this.filter.emit({ columnName: this.columnName, type: 'string', apply: result });
}
};
/**
* @return {?}
*/
TextFFilterComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.value = '';
this.filter.emit({ columnName: this.columnName, apply: null });
};
TextFFilterComponent.decorators = [
{ type: core.Component, args: [{
template: "\n <table class='ft-ffilter-table'>\n <tr class='ft-ffilter-column'>\n <td class='ft-ffilter-row'>\n <input class=\"ft-i ft-i-ffilter ft-i-ffilter-text\" type='text' [(ngModel)]='value' (keyup)='onKeyUp($event)'/>\n </td>\n </tr>\n</table>\n <!--\n <div class=\"ft-ffilter\">\n <div class=\"ft-div1-ffilter\">\n <input class=\"ft-i ft-i-ffilter ft-i-ffilter-text\" type='text' [(ngModel)]='value' (keyup)='onKeyUp($event)'/>\n </div>\n </div>\n -->\n ",
styles: ["\n :host { flex:1;\n }"]
}] }
];
TextFFilterComponent.propDecorators = {
source: [{ type: core.Input }],
otherData: [{ type: core.Input }],
columnName: [{ type: core.Input }],
filter: [{ type: core.Output }]
};
return TextFFilterComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var FFilterDirective = /** @class */ (function () {
function FFilterDirective(viewContainerRef) {
this.viewContainerRef = viewContainerRef;
}
FFilterDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[ffilter-host]',
},] }
];
/** @nocollapse */
FFilterDirective.ctorParameters = function () {
return [
{ type: core.ViewContainerRef }
];
};
return FFilterDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var FFilterComponent = /** @class */ (function () {
function FFilterComponent(componentFactoryResolver) {
this.componentFactoryResolver = componentFactoryResolver;
this.debounce = 500;
// Other data needed to be passed to filter
this.filter = new core.EventEmitter();
}
/**
* @return {?}
*/
FFilterComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.loadComponent();
};
/**
* @return {?}
*/
FFilterComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
// clearInterval(this.interval);
};
/**
* @return {?}
*/
FFilterComponent.prototype.loadComponent = /**
* @return {?}
*/
function () {
var _this = this;
// filter counter
// Check if standard filters else load custom
/** @type {?} */
var fftilter;
if (this.filterType === 'string') {
fftilter = TextFFilterComponent;
}
else if (this.filterType === 'number') {
fftilter = NumberFFilterComponent;
}
else if (this.filterType === 'checkbox') {
fftilter = CheckBoxFFilterComponent;
}
else if (this.filterType === 'date') {
fftilter = DateFFilterComponent;
}
else if (typeof this.filterType !== 'string') {
fftilter = this.filterType;
}
else {
// No filter Filter
fftilter = EmptyFFilterComponent;
}
/** @type {?} */
var componentFactory = this.componentFactoryResolver.resolveComponentFactory(fftilter);
// get reference of insertion point through
/** @type {?} */
var viewContainerRef = this.ffilterHost.viewContainerRef;
viewContainerRef.clear();
// Create instance of component
/** @type {?} */
var componentRef = viewContainerRef.createComponent(componentFactory);
// Pass data to filters
(( /** @type {?} */(componentRef.instance))).columnName = this.columnName;
(( /** @type {?} */(componentRef.instance))).source = this.source;
(( /** @type {?} */(componentRef.instance))).otherData = this.otherData;
// Bubble filter event
(( /** @type {?} */(componentRef.instance))).filter.pipe(operators.debounceTime(this.debounce)).subscribe(function (event) {
_this.filter.emit(event);
});
this.filterr = (( /** @type {?} */(componentRef.instance)));
};
/**
* @return {?}
*/
FFilterComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.filterr.reset();
};
FFilterComponent.totalfilters = 0;
FFilterComponent.decorators = [
{ type: core.Component, args: [{
selector: 'ft-ffilter',
template: "\n\n <ng-template ffilter-host></ng-template>\n "
}] }
];
/** @nocollapse */
FFilterComponent.ctorParameters = function () {
return [
{ type: core.ComponentFactoryResolver }
];
};
FFilterComponent.propDecorators = {
ffilterHost: [{ type: core.ViewChild, args: [FFilterDirective,] }],
source: [{ type: core.Input }],
columnName: [{ type: core.Input }],
debounce: [{ type: core.Input }],
filterType: [{ type: core.Input }],
otherData: [{ type: core.Input }],
filter: [{ type: core.Output }]
};
return FFilterComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var FExporterComponent = /** @class */ (function () {
function FExporterComponent() {
}
/**
* @return {?}
*/
FExporterComponent.prototype.generateFileName = /**
* @return {?}
*/
function () {
/** @type {?} */
var d = new Date();
return d.getFullYear() + d.getMonth() + d.getDate() + '_' + (d.getHours() + 1) + d.getMinutes() + d.getSeconds();
};
/**
* @return {?}
*/
FExporterComponent.prototype.CSV = /**
* @return {?}
*/
function () {
/** @type {?} */
var filename = this.generateFileName() + ".csv";
/** @type {?} */
var properties = [];
// console.log(this.data);
/** @type {?} */
var text = "";
this.data.forEach(function (items) {
for (var property in items) {
if (items.hasOwnProperty(property)) {
if (properties.indexOf(property) <= -1)
properties.push(property);
//console.log(property + " " + items[property]);
text += items[property] + ",";
}
}
text = text.slice(0, -1) + '\r\n';
});
text = properties.map(function (x) { return x.substr(0, 1).toUpperCase() + x.substr(1); }).join() + '\r\n' + text;
/** @type {?} */
var blob = new Blob([text], { type: 'text/csv' });
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, filename);
}
else {
/** @type {?} */
var elem = window.document.createElement('a');
elem.href = window.URL.createObjectURL(blob);
elem.download = filename;
document.body.appendChild(elem);
elem.click();
document.body.removeChild(elem);
}
};
/**
* @return {?}
*/
FExporterComponent.prototype.COPY = /**
* @return {?}
*/
function () {
/** @type {?} */
var input = document.createElement("textarea");
/** @type {?} */
var properties = [];
/** @type {?} */
var str = "";
this.data.forEach(function (items) {
/** @type {?} */
var row = [];
for (var property in items) {
if (items.hasOwnProperty(property)) {
if (properties.indexOf(property) <= -1)
properties.push(property);
row.push(items[property]);
}
}
str += properties.map(function (x) { return x.substr(0, 1).toUpperCase() + x.substr(1); }).join() + '\r\n' + row.join(',') + '\r\n';
});
try {
input.value = str;
input.setAttribute('id', "t1");
document.body.appendChild(input);
/** @type {?} */
var input1 = (( /** @type {?} */(document.getElementById("t1"))));
input1.focus();
input1.select();
document.execCommand("copy", false, null);
}
catch (err) {
console.log('Oops, unable to copy');
}
document.body.removeChild(input);
};
/**
* @return {?}
*/
FExporterComponent.prototype.PRINT = /**
* @return {?}
*/
function () {
/** @type {?} */
var properties = [];
/** @type {?} */
var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null);
/** @type {?} */
var body = document.createElementNS('http://www.w3.org/1999/xhtml', 'body');
doc.documentElement.appendChild(body);
/** @type {?} */
var table = document.createElement("table");
body.appendChild(table);
/** @type {?} */
var tbody = document.createElement("tbody");
table.appendChild(tbody);
this.data.forEach(function (items) {
/** @type {?} */
var row = document.createElement("tr");
for (var property in items) {
if (items.hasOwnProperty(property)) {
// items.forEach(function (item) {
/** @type {?} */
var cell = document.createElement("td");
if (properties.indexOf(property) <= -1) {
properties.push(property);
cell.textContent = property.substr(0, 1).toUpperCase() + property.substr(1);
}
else {
cell.textContent = items[property];
}
row.appendChild(cell);
}
}
tbody.appendChild(row);
});
/** @type {?} */
var pw = window.open("about:blank", "_new");
pw.document.open();
pw.document.write(new XMLSerializer().serializeToString(doc));
pw.print();
pw.close();
};
/**
* @return {?}
*/
FExporterComponent.prototype.JSON = /**
* @return {?}
*/
function () {
/** @type {?} */
var filename = this.generateFileName() + ".json";
/** @type {?} */
var blob = new Blob([JSON.stringify(this.data)], { type: 'text/json' });
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, filename);
}
else {
/** @type {?} */
var elem = window.document.createElement('a');
elem.href = window.URL.createObjectURL(blob);
elem.download = filename;
document.body.appendChild(elem);
elem.click();
document.body.removeChild(elem);
}
};
// XLSX
/* Make the table for a fast CRC. */
// XLSX
/* Make the table for a fast CRC. */
/**
* @return {?}
*/
FExporterComponent.prototype.make_crc_table =
// XLSX
/* Make the table for a fast CRC. */
/**
* @return {?}
*/
function () {
/** @type {?} */
var crc_table = [];
/** @type {?} */
var c;
/** @type {?} */
var n;
/** @type {?} */
var k;
for (n = 0; n < 256; n++) {
c = n;
for (k = 0; k < 8; k++) {
if ((c & 1) > 0) {
c = (0xEDB88320 ^ (c >>> 1)) >>> 0;
}
else {
c = (c >>> 1) >>> 0;
}
}
crc_table[n] = c;
}
return crc_table;
};
/**
* @param {?} buf
* @return {?}
*/
FExporterComponent.prototype.crc32 = /**
* @param {?} buf
* @return {?}
*/
function (buf) {
/** @type {?} */
var crc_table = this.make_crc_table();
/** @type {?} */
var crc = 0x00;
/** @type {?} */
var c = (crc ^ 0xFFFFFFFF);
/** @type {?} */
var n;
for (n = 0; n < buf.length; n++) {
c = (crc_table[((c ^ (buf[n].charCodeAt(0))) & 0xFF)] ^ (c >>> 8));
}
return (c ^ 0xFFFFFFFF) >>> 0;
};
/**
* @param {?} n
* @return {?}
*/
FExporterComponent.prototype.numberToExcelLetters = /**
* @param {?} n
* @return {?}
*/
function (n) {
/** @type {?} */
var quotient = Math.floor(n / 26);
/** @type {?} */
var remainder = n % 26;
/** @type {?} */
var result = '';
if (quotient > 0)
result += this.numberToExcelLetters(quotient);
if (remainder > 0)
result += String.fromCharCode(64 + remainder);
return result;
};
//var content = '\x3C\x3F\x78\x6D\x6C\x20\x76\x65\x72\x73\x69\x6F\x6E\x3D\x22\x31\x2E\x30\x22\x20\x65\x6E\x63\x6F\x64\x69\x6E\x67\x3D\x22\x55\x54\x46\x2D\x38\x22\x20\x73\x74\x61\x6E\x64\x61\x6C\x6F\x6E\x65\x3D\x22\x79\x65\x73\x22\x3F\x3E\x0D\x0A\x3C\x73\x73\x74\x20\x78\x6D\x6C\x6E\x73\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x73\x63\x68\x65\x6D\x61\x73\x2E\x6F\x70\x65\x6E\x78\x6D\x6C\x66\x6F\x72\x6D\x61\x74\x73\x2E\x6F\x72\x67\x2F\x73\x70\x72\x65\x61\x64\x73\x68\x65\x65\x74\x6D\x6C\x2F\x32\x30\x30\x36\x2F\x6D\x61\x69\x6E\x22\x20\x63\x6F\x75\x6E\x74\x3D\x22\x31\x30\x30\x22\x20\x75\x6E\x69\x71\x75\x65\x43\x6F\x75\x6E\x74\x3D\x22\x31\x30\x30\x22\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x32\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x32\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x32\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x32\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x32\x30\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x2F\x73\x73\x74\x3E';
//var crc = 0x00;
//console.log(crc32(crc, content).toString(16));
//var content = '\x3C\x3F\x78\x6D\x6C\x20\x76\x65\x72\x73\x69\x6F\x6E\x3D\x22\x31\x2E\x30\x22\x20\x65\x6E\x63\x6F\x64\x69\x6E\x67\x3D\x22\x55\x54\x46\x2D\x38\x22\x20\x73\x74\x61\x6E\x64\x61\x6C\x6F\x6E\x65\x3D\x22\x79\x65\x73\x22\x3F\x3E\x0D\x0A\x3C\x73\x73\x74\x20\x78\x6D\x6C\x6E\x73\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x73\x63\x68\x65\x6D\x61\x73\x2E\x6F\x70\x65\x6E\x78\x6D\x6C\x66\x6F\x72\x6D\x61\x74\x73\x2E\x6F\x72\x67\x2F\x73\x70\x72\x65\x61\x64\x73\x68\x65\x65\x74\x6D\x6C\x2F\x32\x30\x30\x36\x2F\x6D\x61\x69\x6E\x22\x20\x63\x6F\x75\x6E\x74\x3D\x22\x31\x30\x30\x22\x20\x75\x6E\x69\x71\x75\x65\x43\x6F\x75\x6E\x74\x3D\x22\x31\x30\x30\x22\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x31\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x32\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x33\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x34\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x35\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x36\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x37\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x44\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x45\x38\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x41\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x42\x39\x3C\x2F\x74\x3E\x3C\x2F\x73\x69\x3E\x3C\x73\x69\x3E\x3C\x74\x3E\x43\x39\x3C\x2F\x74\x3E