ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
292 lines • 36.4 kB
JavaScript
import { Component, Input, Output, EventEmitter, ElementRef, HostBinding, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "ng-zorro-antd-mobile/slider";
export class RangeComponent {
get min() {
return this._min;
}
set min(value) {
this._min = value;
}
get max() {
return this._max;
}
set max(value) {
this._max = value;
}
get step() {
return this._step;
}
set step(value) {
this._step = value;
}
get value() {
return this._value;
}
set value(value) {
this.setValue(value);
}
set defaultValue(value) {
this._defaultValue = value;
this._value = this._defaultValue;
this.setValue(value);
}
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = value;
}
get marks() {
return this._marks;
}
set marks(value) {
this._marks = value;
}
get dots() {
return this._dots;
}
set dots(value) {
this._dots = value;
}
get included() {
return this._included;
}
set included(value) {
this._included = value;
}
set count(value) {
this._count = value;
}
set allowCross(value) {
this._allowCross = value;
this.setValueBound();
}
set pushable(value) {
this._pushable = value;
if (this.verifyPushable()) {
this.setValueBound();
}
}
get handleStyle() {
return this._handleStyle;
}
set handleStyle(value) {
this._handleStyle = value;
}
get trackStyle() {
return this._trackStyle;
}
set trackStyle(value) {
this._trackStyle = value;
}
get railStyle() {
return this._railStyle;
}
set railStyle(value) {
this._railStyle = value;
}
constructor(_elf) {
this._elf = _elf;
this.prefixCls = 'am-slider';
this.offset = [];
this.length = [];
this._min = 0;
this._max = 100;
this._step = 1;
this._defaultValue = [0, 0, 0];
this._disabled = false;
this._marks = {};
this._dots = false;
this._included = true;
this._count = 1;
this._allowCross = true;
this._handleStyle = [];
this._trackStyle = [];
this.onChange = new EventEmitter();
this.onAfterChange = new EventEmitter();
this.amWrapper = true;
this._ngModelOnChange = () => { };
this._ngModelOnTouched = () => { };
}
setCls() {
this.sliderCls = {
[`${this.prefixCls}-disabled`]: this._disabled
};
}
initialValue() {
const minTemp = this._min;
if (!this.verifyPushable()) {
this._pushable = 0;
console.warn('pushable设置无效,已大于有些value间隔,被强制设为0');
}
const initialValue = Array.apply(null, Array(this._count + 1)).map(function () {
return minTemp;
});
this._defaultValue = this._defaultValue !== undefined ? this._defaultValue : initialValue;
this._value = this._value !== undefined ? this._value : this._defaultValue;
// 验证count值
this._count = this._value.length - 1;
// 验证value区间
for (let i = 0; i < this._value.length; i++) {
if (this._value[i] < this._min) {
this._value[i] = this._min;
}
else if (this._value[i] > this._max) {
this._value[i] = this._max;
}
}
if (this._count > 0) {
this.upperBound = Math.max(...this._value);
this.lowerBound = Math.min(...this._value);
}
}
handleChange(e, i) {
let temp = [...this._value];
temp[i] = e;
this.upperBound = Math.max(...temp);
this.lowerBound = Math.min(...temp);
this.setTrackStyle(temp);
this.onChange.emit(temp);
}
handleAfterChange(e, i) {
setTimeout(() => {
this._value[i] = e;
this.upperBound = Math.max(...this._value);
this.lowerBound = Math.min(...this._value);
this.setTrackStyle(this._value);
this.onAfterChange.emit(this._value);
this._ngModelOnChange(this._value);
this.setValueBound();
}, 0);
}
setTrackStyle(value) {
if (value && value.length === this._count + 1) {
value.sort((a, b) => a - b);
for (let i = 0; i < this._count; i++) {
this.offset[i] = (value[i] * 100) / (this._max - this._min);
this.length[i] = ((value[i + 1] - value[i]) * 100) / (this._max - this._min);
}
}
}
setValueBound() {
this.maxBound = [];
this.minBound = [];
if ((this._allowCross && this._pushable === undefined) || this._handleCount <= 1) {
for (let i = 0; i < this._handleCount; i++) {
this.maxBound[i] = this._max;
this.minBound[i] = this._min;
}
}
else {
if (this._pushable === undefined) {
this._pushable = 0;
}
for (let i = 0; i < this._handleCount; i++) {
this.maxBound[i] = i === this._handleCount - 1 ? this._max : this._value[i + 1] - this._pushable;
this.minBound[i] = i === 0 ? this._min : this._value[i - 1] + this._pushable;
}
}
}
verifyPushable() {
for (let i = 1; i < this._handleCount; i++) {
const diff = this._value[i] - this._value[i - 1];
if (diff < this._pushable) {
return false;
}
}
return true;
}
writeValue(value) {
this.setValue(value, true);
}
setValue(value, isWriteValue = false) {
if (value) {
this._value = value;
this._handleCount = this._value.length + 1;
this.initialValue();
this.setValueBound();
this.setCls();
this.setTrackStyle(this._value);
if (isWriteValue) {
this._ngModelOnChange(this._value);
}
else {
this.onAfterChange.emit(this._value);
}
}
}
registerOnChange(fn) {
this._ngModelOnChange = fn;
}
registerOnTouched(fn) {
this._ngModelOnTouched = fn;
}
ngOnInit() {
this.initialValue();
this.setValueBound();
this._handleCount = this._count + 1;
this.setCls();
const sliderCoords = this._elf.nativeElement.getElementsByClassName('am-slider')[0].getBoundingClientRect();
this.sliderLength = sliderCoords.width;
this.sliderStart = sliderCoords.left;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: RangeComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: RangeComponent, selector: "Range , nzm-range", inputs: { min: "min", max: "max", step: "step", value: "value", defaultValue: "defaultValue", disabled: "disabled", marks: "marks", dots: "dots", included: "included", count: "count", allowCross: "allowCross", pushable: "pushable", handleStyle: "handleStyle", trackStyle: "trackStyle", railStyle: "railStyle" }, outputs: { onChange: "onChange", onAfterChange: "onAfterChange" }, host: { properties: { "class.am-slider-wrapper": "this.amWrapper" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RangeComponent),
multi: true
}
], ngImport: i0, template: "<div class=\"am-slider\" [ngClass]=\"sliderCls\">\n <div class=\"am-slider-rail\" [ngStyle]=\"railStyle\"></div>\n <SliderTrack\n *ngFor=\"let off of offset; let i = index\"\n [className]=\"'am-slider-track'\"\n [included]=\"included\"\n [style]=\"trackStyle[i]\"\n [offset]=\"off\"\n [length]=\"length[i]\"\n ></SliderTrack>\n <SliderSteps\n [max]=\"max\"\n [min]=\"min\"\n [dots]=\"dots\"\n [step]=\"step\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderSteps>\n <SliderHandle\n *ngFor=\"let val of value; let i = index\"\n [max]=\"max\"\n [min]=\"min\"\n [maxBound]=\"maxBound[i]\"\n [minBound]=\"minBound[i]\"\n [value]=\"val\"\n [step]=\"step\"\n [disabled]=\"disabled\"\n [sliderLength]=\"sliderLength\"\n [sliderStart]=\"sliderStart\"\n [handleStyle]=\"handleStyle[i]\"\n (onChange)=\"handleChange($event, i)\"\n (onAfterChange)=\"handleAfterChange($event, i)\"\n ></SliderHandle>\n <SliderMarks\n [max]=\"max\"\n [min]=\"min\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderMarks>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.SliderHandleComponent, selector: "SliderHandle, nzm-slider-handle", inputs: ["min", "max", "minBound", "maxBound", "step", "value", "disabled", "sliderLength", "sliderStart", "handleStyle"], outputs: ["onChange", "onAfterChange"] }, { kind: "component", type: i2.SliderMarksComponent, selector: "SliderMarks, nzm-slider-marks", inputs: ["min", "max", "marks", "included", "upperBound", "lowerBound"], outputs: ["onChange", "onAfterChange"] }, { kind: "component", type: i2.SliderStepsComponent, selector: "SliderSteps, nzm-slider-steps", inputs: ["min", "max", "marks", "step", "included", "dots", "upperBound", "lowerBound"] }, { kind: "component", type: i2.SliderTrackComponent, selector: "SliderTrack, nzm-slider-track", inputs: ["className", "included", "offset", "length", "style"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: RangeComponent, decorators: [{
type: Component,
args: [{ selector: 'Range , nzm-range', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RangeComponent),
multi: true
}
], template: "<div class=\"am-slider\" [ngClass]=\"sliderCls\">\n <div class=\"am-slider-rail\" [ngStyle]=\"railStyle\"></div>\n <SliderTrack\n *ngFor=\"let off of offset; let i = index\"\n [className]=\"'am-slider-track'\"\n [included]=\"included\"\n [style]=\"trackStyle[i]\"\n [offset]=\"off\"\n [length]=\"length[i]\"\n ></SliderTrack>\n <SliderSteps\n [max]=\"max\"\n [min]=\"min\"\n [dots]=\"dots\"\n [step]=\"step\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderSteps>\n <SliderHandle\n *ngFor=\"let val of value; let i = index\"\n [max]=\"max\"\n [min]=\"min\"\n [maxBound]=\"maxBound[i]\"\n [minBound]=\"minBound[i]\"\n [value]=\"val\"\n [step]=\"step\"\n [disabled]=\"disabled\"\n [sliderLength]=\"sliderLength\"\n [sliderStart]=\"sliderStart\"\n [handleStyle]=\"handleStyle[i]\"\n (onChange)=\"handleChange($event, i)\"\n (onAfterChange)=\"handleAfterChange($event, i)\"\n ></SliderHandle>\n <SliderMarks\n [max]=\"max\"\n [min]=\"min\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderMarks>\n</div>\n" }]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { min: [{
type: Input
}], max: [{
type: Input
}], step: [{
type: Input
}], value: [{
type: Input
}], defaultValue: [{
type: Input
}], disabled: [{
type: Input
}], marks: [{
type: Input
}], dots: [{
type: Input
}], included: [{
type: Input
}], count: [{
type: Input
}], allowCross: [{
type: Input
}], pushable: [{
type: Input
}], handleStyle: [{
type: Input
}], trackStyle: [{
type: Input
}], railStyle: [{
type: Input
}], onChange: [{
type: Output
}], onAfterChange: [{
type: Output
}], amWrapper: [{
type: HostBinding,
args: ['class.am-slider-wrapper']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9yYW5nZS9yYW5nZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL3JhbmdlL3JhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBYXpFLE1BQU0sT0FBTyxjQUFjO0lBNkJ6QixJQUNJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQ0ksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsS0FBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFDSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxLQUFhO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQWU7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFDSSxZQUFZLENBQUMsS0FB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QUFDO2dCQUM3QyxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMEJDWkgsc3FDQTBDQTs7MkZENUJhLGNBQWM7a0JBWDFCLFNBQVM7K0JBQ0UsbUJBQW1CLGFBRWxCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQzs0QkFDN0MsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7K0VBZ0NHLEdBQUc7c0JBRE4sS0FBSztnQkFRRixHQUFHO3NCQUROLEtBQUs7Z0JBUUYsSUFBSTtzQkFEUCxLQUFLO2dCQVFGLEtBQUs7c0JBRFIsS0FBSztnQkFRRixZQUFZO3NCQURmLEtBQUs7Z0JBT0YsUUFBUTtzQkFEWCxLQUFLO2dCQVFGLEtBQUs7c0JBRFIsS0FBSztnQkFRRixJQUFJO3NCQURQLEtBQUs7Z0JBUUYsUUFBUTtzQkFEWCxLQUFLO2dCQVFGLEtBQUs7c0JBRFIsS0FBSztnQkFLRixVQUFVO3NCQURiLEtBQUs7Z0JBTUYsUUFBUTtzQkFEWCxLQUFLO2dCQVFGLFdBQVc7c0JBRGQsS0FBSztnQkFRRixVQUFVO3NCQURiLEtBQUs7Z0JBUUYsU0FBUztzQkFEWixLQUFLO2dCQVFOLFFBQVE7c0JBRFAsTUFBTTtnQkFHUCxhQUFhO3NCQURaLE1BQU07Z0JBSVAsU0FBUztzQkFEUixXQUFXO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1JhbmdlICwgbnptLXJhbmdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhbmdlLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSYW5nZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBSYW5nZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1zbGlkZXInO1xuICBvZmZzZXQ6IGFueVtdID0gW107XG4gIGxlbmd0aDogYW55W10gPSBbXTtcbiAgdXBwZXJCb3VuZDogbnVtYmVyO1xuICBsb3dlckJvdW5kOiBudW1iZXI7XG4gIG1heEJvdW5kOiBudW1iZXJbXTtcbiAgbWluQm91bmQ6IG51bWJlcltdO1xuICBzbGlkZXJDbHM6IG9iamVjdDtcbiAgc2xpZGVyTGVuZ3RoOiBudW1iZXI7XG4gIHNsaWRlclN0YXJ0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfbWluID0gMDtcbiAgcHJpdmF0ZSBfbWF4ID0gMTAwO1xuICBwcml2YXRlIF9zdGVwID0gMTtcbiAgcHJpdmF0ZSBfdmFsdWU7XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZSA9IFswLCAwLCAwXTtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWFya3MgPSB7fTtcbiAgcHJpdmF0ZSBfZG90cyA9IGZhbHNlO1xuICBwcml2YXRlIF9pbmNsdWRlZCA9IHRydWU7XG4gIHByaXZhdGUgX2NvdW50ID0gMTtcbiAgcHJpdmF0ZSBfYWxsb3dDcm9zcyA9IHRydWU7XG4gIHByaXZhdGUgX3B1c2hhYmxlO1xuICBwcml2YXRlIF9oYW5kbGVTdHlsZSA9IFtdO1xuICBwcml2YXRlIF90cmFja1N0eWxlID0gW107XG4gIHByaXZhdGUgX3JhaWxTdHlsZTtcbiAgcHJpdmF0ZSBfaGFuZGxlQ291bnQ7XG5cbiAgQElucHV0KClcbiAgZ2V0IG1pbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cbiAgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG1heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cbiAgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuICBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBbbnVtYmVyXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogW251bWJlcl0pIHtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGVmYXVsdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtYXJrcygpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLl9tYXJrcztcbiAgfVxuICBzZXQgbWFya3ModmFsdWU6IG9iamVjdCkge1xuICAgIHRoaXMuX21hcmtzID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRvdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RvdHM7XG4gIH1cbiAgc2V0IGRvdHModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kb3RzID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGluY2x1ZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlZDtcbiAgfVxuICBzZXQgaW5jbHVkZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pbmNsdWRlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBjb3VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY291bnQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgYWxsb3dDcm9zcyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FsbG93Q3Jvc3MgPSB2YWx1ZTtcbiAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcHVzaGFibGUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3B1c2hhYmxlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMudmVyaWZ5UHVzaGFibGUoKSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZUJvdW5kKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBoYW5kbGVTdHlsZSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZVN0eWxlO1xuICB9XG4gIHNldCBoYW5kbGVTdHlsZSh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl9oYW5kbGVTdHlsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0cmFja1N0eWxlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhY2tTdHlsZTtcbiAgfVxuICBzZXQgdHJhY2tTdHlsZSh2YWx1ZTogYW55W10pIHtcbiAgICB0aGlzLl90cmFja1N0eWxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHJhaWxTdHlsZSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhaWxTdHlsZTtcbiAgfVxuICBzZXQgcmFpbFN0eWxlKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX3JhaWxTdHlsZSA9IHZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25BZnRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tc2xpZGVyLXdyYXBwZXInKVxuICBhbVdyYXBwZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgX25nTW9kZWxPbkNoYW5nZTogKHZhbHVlOiBudW1iZXJbXSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIF9uZ01vZGVsT25Ub3VjaGVkOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZjogRWxlbWVudFJlZikge31cblxuICBzZXRDbHMoKSB7XG4gICAgdGhpcy5zbGlkZXJDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWRpc2FibGVkYF06IHRoaXMuX2Rpc2FibGVkXG4gICAgfTtcbiAgfVxuXG4gIGluaXRpYWxWYWx1ZSgpIHtcbiAgICBjb25zdCBtaW5UZW1wID0gdGhpcy5fbWluO1xuICAgIGlmICghdGhpcy52ZXJpZnlQdXNoYWJsZSgpKSB7XG4gICAgICB0aGlzLl9wdXNoYWJsZSA9IDA7XG4gICAgICBjb25zb2xlLndhcm4oJ3B1c2hhYmxl6K6+572u5peg5pWI77yM5bey5aSn5LqO5pyJ5LqbdmFsdWXpl7TpmpTvvIzooqvlvLrliLborr7kuLowJyk7XG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IEFycmF5LmFwcGx5KG51bGwsIEFycmF5KHRoaXMuX2NvdW50ICsgMSkpLm1hcChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBtaW5UZW1wO1xuICAgIH0pO1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fZGVmYXVsdFZhbHVlIDogaW5pdGlhbFZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fdmFsdWUgIT09IHVuZGVmaW5lZCA/IHRoaXMuX3ZhbHVlIDogdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgIC8vIOmqjOivgWNvdW505YC8XG4gICAgdGhpcy5fY291bnQgPSB0aGlzLl92YWx1ZS5sZW5ndGggLSAxO1xuICAgIC8vIOmqjOivgXZhbHVl5Yy66Ze0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl92YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlW2ldIDwgdGhpcy5fbWluKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlW2ldID0gdGhpcy5fbWluO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl92YWx1ZVtpXSA+IHRoaXMuX21heCkge1xuICAgICAgICB0aGlzLl92YWx1ZVtpXSA9IHRoaXMuX21heDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvdW50ID4gMCkge1xuICAgICAgdGhpcy51cHBlckJvdW5kID0gTWF0aC5tYXgoLi4udGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5sb3dlckJvdW5kID0gTWF0aC5taW4oLi4udGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNoYW5nZShlLCBpKSB7XG4gICAgbGV0IHRlbXAgPSBbLi4udGhpcy5fdmFsdWVdO1xuICAgIHRlbXBbaV0gPSBlO1xuICAgIHRoaXMudXBwZXJCb3VuZCA9IE1hdGgubWF4KC4uLnRlbXApO1xuICAgIHRoaXMubG93ZXJCb3VuZCA9IE1hdGgubWluKC4uLnRlbXApO1xuICAgIHRoaXMuc2V0VHJhY2tTdHlsZSh0ZW1wKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGVtcCk7XG4gIH1cblxuICBoYW5kbGVBZnRlckNoYW5nZShlLCBpKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl92YWx1ZVtpXSA9IGU7XG4gICAgICB0aGlzLnVwcGVyQm91bmQgPSBNYXRoLm1heCguLi50aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLmxvd2VyQm91bmQgPSBNYXRoLm1pbiguLi50aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLnNldFRyYWNrU3R5bGUodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5vbkFmdGVyQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuc2V0VmFsdWVCb3VuZCgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgc2V0VHJhY2tTdHlsZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT09IHRoaXMuX2NvdW50ICsgMSkge1xuICAgICAgdmFsdWUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb3VudDsgaSsrKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0W2ldID0gKHZhbHVlW2ldICogMTAwKSAvICh0aGlzLl9tYXggLSB0aGlzLl9taW4pO1xuICAgICAgICB0aGlzLmxlbmd0aFtpXSA9ICgodmFsdWVbaSArIDFdIC0gdmFsdWVbaV0pICogMTAwKSAvICh0aGlzLl9tYXggLSB0aGlzLl9taW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFZhbHVlQm91bmQoKSB7XG4gICAgdGhpcy5tYXhCb3VuZCA9IFtdO1xuICAgIHRoaXMubWluQm91bmQgPSBbXTtcbiAgICBpZiAoKHRoaXMuX2FsbG93Q3Jvc3MgJiYgdGhpcy5fcHVzaGFibGUgPT09IHVuZGVmaW5lZCkgfHwgdGhpcy5faGFuZGxlQ291bnQgPD0gMSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9oYW5kbGVDb3VudDsgaSsrKSB7XG4gICAgICAgIHRoaXMubWF4Qm91bmRbaV0gPSB0aGlzLl9tYXg7XG4gICAgICAgIHRoaXMubWluQm91bmRbaV0gPSB0aGlzLl9taW47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9wdXNoYWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3B1c2hhYmxlID0gMDtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faGFuZGxlQ291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLm1heEJvdW5kW2ldID0gaSA9PT0gdGhpcy5faGFuZGxlQ291bnQgLSAxID8gdGhpcy5fbWF4IDogdGhpcy5fdmFsdWVbaSArIDFdIC0gdGhpcy5fcHVzaGFibGU7XG4gICAgICAgIHRoaXMubWluQm91bmRbaV0gPSBpID09PSAwID8gdGhpcy5fbWluIDogdGhpcy5fdmFsdWVbaSAtIDFdICsgdGhpcy5fcHVzaGFibGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5UHVzaGFibGUoKSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9oYW5kbGVDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5fdmFsdWVbaV0gLSB0aGlzLl92YWx1ZVtpIC0gMV07XG4gICAgICBpZiAoZGlmZiA8IHRoaXMuX3B1c2hhYmxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUsIHRydWUpO1xuICB9XG5cbiAgc2V0VmFsdWUodmFsdWU6IG51bWJlcltdLCBpc1dyaXRlVmFsdWUgPSBmYWxzZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2hhbmRsZUNvdW50ID0gdGhpcy5fdmFsdWUubGVuZ3RoICsgMTtcbiAgICAgIHRoaXMuaW5pdGlhbFZhbHVlKCk7XG4gICAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgICB0aGlzLnNldFRyYWNrU3R5bGUodGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKGlzV3JpdGVWYWx1ZSkge1xuICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5fdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFmdGVyQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogbnVtYmVyW10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX25nTW9kZWxPblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbFZhbHVlKCk7XG4gICAgdGhpcy5zZXRWYWx1ZUJvdW5kKCk7XG4gICAgdGhpcy5faGFuZGxlQ291bnQgPSB0aGlzLl9jb3VudCArIDE7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgICBjb25zdCBzbGlkZXJDb29yZHMgPSB0aGlzLl9lbGYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhbS1zbGlkZXInKVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLnNsaWRlckxlbmd0aCA9IHNsaWRlckNvb3Jkcy53aWR0aDtcbiAgICB0aGlzLnNsaWRlclN0YXJ0ID0gc2xpZGVyQ29vcmRzLmxlZnQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhbS1zbGlkZXJcIiBbbmdDbGFzc109XCJzbGlkZXJDbHNcIj5cbiAgPGRpdiBjbGFzcz1cImFtLXNsaWRlci1yYWlsXCIgW25nU3R5bGVdPVwicmFpbFN0eWxlXCI+PC9kaXY+XG4gIDxTbGlkZXJUcmFja1xuICAgICpuZ0Zvcj1cImxldCBvZmYgb2Ygb2Zmc2V0OyBsZXQgaSA9IGluZGV4XCJcbiAgICBbY2xhc3NOYW1lXT1cIidhbS1zbGlkZXItdHJhY2snXCJcbiAgICBbaW5jbHVkZWRdPVwiaW5jbHVkZWRcIlxuICAgIFtzdHlsZV09XCJ0cmFja1N0eWxlW2ldXCJcbiAgICBbb2Zmc2V0XT1cIm9mZlwiXG4gICAgW2xlbmd0aF09XCJsZW5ndGhbaV1cIlxuICA+PC9TbGlkZXJUcmFjaz5cbiAgPFNsaWRlclN0ZXBzXG4gICAgW21heF09XCJtYXhcIlxuICAgIFttaW5dPVwibWluXCJcbiAgICBbZG90c109XCJkb3RzXCJcbiAgICBbc3RlcF09XCJzdGVwXCJcbiAgICBbbWFya3NdPVwibWFya3NcIlxuICAgIFt1cHBlckJvdW5kXT1cInVwcGVyQm91bmRcIlxuICAgIFtsb3dlckJvdW5kXT1cImxvd2VyQm91bmRcIlxuICA+PC9TbGlkZXJTdGVwcz5cbiAgPFNsaWRlckhhbmRsZVxuICAgICpuZ0Zvcj1cImxldCB2YWwgb2YgdmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgIFttYXhdPVwibWF4XCJcbiAgICBbbWluXT1cIm1pblwiXG4gICAgW21heEJvdW5kXT1cIm1heEJvdW5kW2ldXCJcbiAgICBbbWluQm91bmRdPVwibWluQm91bmRbaV1cIlxuICAgIFt2YWx1ZV09XCJ2YWxcIlxuICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW3NsaWRlckxlbmd0aF09XCJzbGlkZXJMZW5ndGhcIlxuICAgIFtzbGlkZXJTdGFydF09XCJzbGlkZXJTdGFydFwiXG4gICAgW2hhbmRsZVN0eWxlXT1cImhhbmRsZVN0eWxlW2ldXCJcbiAgICAob25DaGFuZ2UpPVwiaGFuZGxlQ2hhbmdlKCRldmVudCwgaSlcIlxuICAgIChvbkFmdGVyQ2hhbmdlKT1cImhhbmRsZUFmdGVyQ2hhbmdlKCRldmVudCwgaSlcIlxuICA+PC9TbGlkZXJIYW5kbGU+XG4gIDxTbGlkZXJNYXJrc1xuICAgIFttYXhdPVwibWF4XCJcbiAgICBbbWluXT1cIm1pblwiXG4gICAgW21hcmtzXT1cIm1hcmtzXCJcbiAgICBbdXBwZXJCb3VuZF09XCJ1cHBlckJvdW5kXCJcbiAgICBbbG93ZXJCb3VuZF09XCJsb3dlckJvdW5kXCJcbiAgPjwvU2xpZGVyTWFya3M+XG48L2Rpdj5cbiJdfQ==