ngx-colors-v
Version:
A beautiful color picker for angular that let you choose from a color palette, using sliders (Hue, Lightness, Alpha sliders) or through text input(hex, rgba, hsla)
338 lines • 66 kB
JavaScript
import { Component, ViewChild, HostListener, HostBinding, } from "@angular/core";
import { trigger, transition, query, style, stagger, animate, keyframes, } from "@angular/animations";
import { ColorFormats } from "../../enums/formats";
import { DefaultColors } from "../../helpers/default-colors";
import { formats } from "../../helpers/formats";
import { Hsva } from "../../clases/formats";
import { NgxColor } from "../../clases/color";
import { HEX_REGEX, RGBA_REGEX } from "../../constants/contants";
import * as i0 from "@angular/core";
import * as i1 from "../../services/converter.service";
import * as i2 from "../color-picker/color-picker.component";
import * as i3 from "@angular/common";
export class PanelComponent {
constructor(service, cdr) {
this.service = service;
this.cdr = cdr;
this.color = "#000000";
this.previewColor = "#000000";
this.hsva = new Hsva(0, 1, 1, 1);
this.colorsAnimationEffect = "slide-in";
this.palette = DefaultColors;
this.variants = [];
this.colorFormats = formats;
this.format = ColorFormats.HEX;
this.canChangeFormat = true;
this.menu = 1;
this.hideColorPicker = false;
this.hideTextInput = false;
this.colorPickerControls = "default";
}
click(event) {
if (this.isOutside(event)) {
// this.emitClose("cancel");
}
}
onScroll(event) {
this.onScreenMovement();
}
onResize() {
this.onScreenMovement();
}
ngOnInit() {
this.setPosition();
this.hsva = this.service.stringToHsva(this.color);
this.indexSeleccionado = this.findIndexSelectedColor(this.palette);
}
ngAfterViewInit() {
this.setPositionY();
}
onScreenMovement() {
this.setPosition();
this.setPositionY();
if (!this.panelRef.nativeElement.style.transition) {
this.panelRef.nativeElement.style.transition = "transform 0.5s ease-out";
}
}
findIndexSelectedColor(colors) {
let resultIndex = undefined;
if (this.color) {
for (let i = 0; i < colors.length; i++) {
const color = colors[i];
if (typeof color == "string") {
if (this.service.stringToFormat(this.color, ColorFormats.HEX) ==
this.service.stringToFormat(color, ColorFormats.HEX)) {
resultIndex = i;
}
}
else {
if (this.findIndexSelectedColor(color.variants) != undefined) {
resultIndex = i;
}
}
}
}
return resultIndex;
}
iniciate(triggerInstance, triggerElementRef, color, palette, animation, format, hideTextInput, hideColorPicker, acceptLabel, cancelLabel, colorPickerControls, position) {
this.colorPickerControls = colorPickerControls;
this.triggerInstance = triggerInstance;
this.TriggerBBox = triggerElementRef;
this.color = color;
this.hideColorPicker = hideColorPicker;
this.hideTextInput = hideTextInput;
this.acceptLabel = acceptLabel;
this.cancelLabel = cancelLabel;
if (format) {
if (formats.includes(format)) {
this.format = formats.indexOf(format.toLowerCase());
this.canChangeFormat = false;
if (this.service.getFormatByString(this.color) != format.toLowerCase()) {
this.setColorFromHsva(this.service.stringToHsva(this.color));
}
}
else {
console.error("Format provided is invalid, using HEX");
this.format = ColorFormats.HEX;
}
}
else {
this.format = formats.indexOf(this.service.getFormatByString(this.color));
}
this.previewColor = this.color;
this.palette = palette ?? DefaultColors;
this.colorsAnimationEffect = animation;
if (position == "top") {
let TriggerBBox = this.TriggerBBox.nativeElement.getBoundingClientRect();
this.positionString =
"transform: translateY(calc( -100% - " + TriggerBBox.height + "px ))";
}
}
setPosition() {
if (this.TriggerBBox) {
var viewportOffset = this.TriggerBBox.nativeElement.getBoundingClientRect();
this.top = viewportOffset.top + viewportOffset.height;
this.left =
viewportOffset.left + 420 > window.innerWidth
? viewportOffset.right - 420
: viewportOffset.left;
}
}
setPositionY() {
var triggerBBox = this.TriggerBBox.nativeElement.getBoundingClientRect();
var panelBBox = this.panelRef.nativeElement.getBoundingClientRect();
var panelHeight = panelBBox.height;
//Check for space above the trigger
if (0 > panelBBox.top - 5) {
this.positionString = "";
}
//Check for space below the trigger
if (panelHeight > window.innerHeight - (panelBBox.top - 5)) {
//there is no space, move panel over the trigger
this.positionString =
"transform: translateY(calc( -100% - " + triggerBBox.height + "px ));";
}
this.cdr.detectChanges();
}
hasVariant(color) {
if (!this.previewColor) {
return false;
}
return (typeof color != "string" &&
color.variants.some((v) => v.toUpperCase() == this.previewColor.toUpperCase()));
}
isSelected(color) {
if (!this.previewColor) {
return false;
}
return (typeof color == "string" &&
color.toUpperCase() == this.previewColor.toUpperCase());
}
getBackgroundColor(color) {
if (typeof color == "string") {
return { background: color };
}
else {
return { background: color?.preview };
}
}
onAlphaChange(event) {
this.palette = this.ChangeAlphaOnPalette(event, this.palette);
}
ChangeAlphaOnPalette(alpha, colors) {
const result = [];
for (let i = 0; i < colors.length; i++) {
const color = colors[i];
if (typeof color == "string") {
const newColor = this.service.stringToHsva(color);
newColor.onAlphaChange(alpha);
result.push(this.service.toFormat(newColor, this.format));
}
else {
const newColor = new NgxColor();
const newColorPreview = this.service.stringToHsva(color.preview);
newColorPreview.onAlphaChange(alpha);
newColor.preview = this.service.toFormat(newColorPreview, this.format);
newColor.variants = this.ChangeAlphaOnPalette(alpha, color.variants);
result.push(newColor);
}
}
return result;
}
/**
* Change color from default colors
* @param string color
*/
changeColor(color) {
this.setColorFromString(color);
this.menu = 1;
}
onChangeColorPicker(event) {
this.temporalColor = event;
this.color = this.service.toFormat(event, this.format);
this.triggerInstance.sliderChange(this.service.toFormat(event, this.format));
}
changeColorManual(color) {
this.setColorFromString(color);
}
setColorFromHsva(value) {
this.hsva = value;
this.color = this.service.toFormat(value, this.format);
this.previewColor = this.service.hsvaToRgba(value).toString();
}
setColorFromString(color) {
this.hsva = this.service.stringToHsva(color);
this.color = color;
this.previewColor = color;
}
onColorClick(color) {
if (typeof color === "string") {
this.changeColor(color);
}
else {
this.variants = color.variants;
this.menu = 2;
}
}
nextFormat() {
if (this.canChangeFormat) {
this.format = (this.format + 1) % this.colorFormats.length;
this.setColorFromHsva(this.hsva);
}
}
close() {
this.triggerInstance.close();
}
accept() {
if (!this.disabled) {
this.triggerInstance.setColor(this.service.stringToFormat(this.color, ColorFormats.HEX));
this.triggerInstance.close();
}
}
onClickBack() {
if (this.menu == 3) {
this.color = this.backupColor;
this.hsva = this.service.stringToHsva(this.color);
}
this.indexSeleccionado = this.findIndexSelectedColor(this.palette);
this.menu = 1;
}
isOutside(event) {
return event.target.classList.contains("ngx-colors-overlay");
}
onOpenedScroll($event) {
$event.stopPropagation();
}
get disabled() {
return (!RGBA_REGEX.test(this.color.toLowerCase()) && !HEX_REGEX.test(this.color));
}
}
PanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: PanelComponent, deps: [{ token: i1.ConverterService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
PanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: PanelComponent, selector: "ngx-colors-panel", host: { listeners: { "document:mousedown": "click($event)", "document:scroll": "onScroll($event)", "window:resize": "onResize()" }, properties: { "style.top.px": "this.top", "style.left.px": "this.left" } }, viewQueries: [{ propertyName: "panelRef", first: true, predicate: ["dialog"], descendants: true }], ngImport: i0, template: "<div\r\n class=\"opened\"\r\n [style]=\"positionString\"\r\n (scroll)=\"onOpenedScroll($event)\"\r\n #dialog\r\n>\r\n <section class=\"main-content-container\">\r\n <article class=\"left\">\r\n <!--Menu 1-->\r\n <ng-container *ngIf=\"menu == 1\">\r\n <!--Color list-->\r\n <div class=\"colors\" [@colorsAnimation]=\"colorsAnimationEffect\">\r\n <ng-container *ngFor=\"let color of palette; let i = index\">\r\n <div class=\"circle wrapper color\">\r\n <div\r\n (click)=\"onColorClick(color)\"\r\n class=\"circle color circle-border\"\r\n [ngStyle]=\"getBackgroundColor(color)\"\r\n >\r\n <div *ngIf=\"i == this.indexSeleccionado\" class=\"selected\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!--Menu 2: Variants of selected color-->\r\n <ng-container *ngIf=\"menu == 2\">\r\n <div class=\"colors\" [@colorsAnimation]=\"colorsAnimationEffect\">\r\n <div class=\"circle wrapper\">\r\n <div (click)=\"onClickBack()\" class=\"add\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let variant of variants\">\r\n <div class=\"circle wrapper color\">\r\n <div\r\n (click)=\"changeColor(variant)\"\r\n class=\"circle circle-border\"\r\n [ngStyle]=\"{ background: variant }\"\r\n >\r\n <div *ngIf=\"isSelected(variant)\" class=\"selected\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </article>\r\n\r\n <article class=\"right\">\r\n <div\r\n class=\"color-picker-wrapper\"\r\n *ngIf=\"!hideColorPicker && this.colorPickerControls != 'only-alpha'\"\r\n >\r\n <!-- <span [(colorPicker)]=\"color\"></span> -->\r\n <color-picker\r\n [controls]=\"colorPickerControls\"\r\n [color]=\"hsva\"\r\n (sliderChange)=\"onChangeColorPicker($event)\"\r\n ></color-picker>\r\n </div>\r\n <color-picker\r\n *ngIf=\"!hideColorPicker && this.colorPickerControls == 'only-alpha'\"\r\n [controls]=\"colorPickerControls\"\r\n [color]=\"hsva\"\r\n (colorChange)=\"onChangeColorPicker($event)\"\r\n (onAlphaChange)=\"onAlphaChange($event)\"\r\n ></color-picker>\r\n </article>\r\n </section>\r\n\r\n <!--Format & Manual input-->\r\n <div class=\"manual-input-wrapper\" *ngIf=\"!hideTextInput\">\r\n <p (click)=\"nextFormat()\">{{ colorFormats[format] }}</p>\r\n <div class=\"g-input\">\r\n <input\r\n placeholder=\"#FFFFFF\"\r\n type=\"text\"\r\n [value]=\"color\"\r\n [style.font-size.px]=\"color && color.length > 23 ? 9 : 10\"\r\n [style.letter-spacing.px]=\"color && color.length > 16 ? 0 : 1.5\"\r\n (keyup)=\"changeColorManual(paintInput.value)\"\r\n (keydown.enter)=\"accept()\"\r\n #paintInput\r\n />\r\n <span *ngIf=\"disabled\" class=\"error-message\">\r\n Color value should be hexa, rgb, or rgba format\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"nav-wrapper\">\r\n <button (click)=\"close()\" style=\"float: right\">\r\n {{ cancelLabel }}\r\n </button>\r\n <button (click)=\"accept()\" [disabled]=\"disabled\" style=\"float: right\">\r\n {{ acceptLabel }}\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host{position:fixed;z-index:2001}.hidden{display:none}.button{display:flex;align-items:center;justify-content:center}.top{transform:translateY(-100%)}.opened{box-sizing:border-box;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;background:#fff;width:420px;border-radius:5px;position:absolute}.opened button{border:none;font-family:inherit;font-size:12px;background-color:unset;-webkit-user-select:none;user-select:none;padding:10px;letter-spacing:1px;color:#222;border-radius:3px;line-height:20px;cursor:pointer}.opened button:hover,.opened .button:hover{background-color:#0000000d;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1);transition-property:opacity,background-color;transition-duration:.2s,.2s;transition-timing-function:cubic-bezier(.35,0,.25,1),cubic-bezier(.35,0,.25,1);transition-delay:0s,0s}.opened button:focus{outline:none}.opened button:disabled{color:#aaa;background:#ddd}.opened .colors{display:flex;flex-wrap:wrap;align-items:center;margin:15px}.opened .colors .circle{height:34px;width:34px;box-sizing:border-box;border-radius:100%;cursor:pointer}.opened .colors .circle .add{font-size:20px;line-height:45px;text-align:center}.opened .colors .circle .selected{border:2px solid white;border-radius:100%;height:28px;width:28px;box-sizing:border-box;margin:2px}.opened .colors .circle.wrapper{margin:0 5px 5px;flex:34px 0 0}.opened .colors .circle.button{margin:0 5px 5px}.opened .colors .circle.wrapper.color{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.opened .colors .circle-border{border:1px solid rgba(0,0,0,.03)}.opened .color-picker-wrapper{margin:16px 16px 0 0}.opened .nav-wrapper{overflow:hidden;padding:8px 16px}.opened .nav-wrapper .round-button{padding:5px 0;width:40px;height:40px;box-sizing:border-box;border-radius:100%;text-align:center;line-height:45px}.opened .manual-input-wrapper{display:flex;margin:15px;font-family:sans-serif}.opened .manual-input-wrapper p{margin:0;text-align:center;font-size:10px;letter-spacing:1.5px;text-transform:uppercase;line-height:48px;width:145px;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.opened .manual-input-wrapper .g-input{border:1px solid #e8ebed;height:45px;border-radius:5px;width:100%}.opened .manual-input-wrapper .g-input input{font-size:9px;border:none;width:100%;text-transform:uppercase;outline:none;text-align:center;letter-spacing:1px;color:#595b65;height:100%;border-radius:5px;margin:0;padding:0}.opened .manual-input-wrapper .g-input span.error-message{margin-top:3px;display:inline-block;font-size:11px;color:#f44336}.main-content-container{display:flex;max-height:250px;overflow:auto}\n"], components: [{ type: i2.ColorPickerComponent, selector: "color-picker", inputs: ["color", "controls"], outputs: ["sliderChange", "onAlphaChange"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], animations: [
trigger("colorsAnimation", [
transition("void => slide-in", [
// Initially all colors are hidden
query(":enter", style({ opacity: 0 }), { optional: true }),
//slide-in animation
query(":enter", stagger("10ms", [
animate(".3s ease-in", keyframes([
style({ opacity: 0, transform: "translatex(-50%)", offset: 0 }),
style({
opacity: 0.5,
transform: "translatex(-10px) scale(1.1)",
offset: 0.3,
}),
style({ opacity: 1, transform: "translatex(0)", offset: 1 }),
])),
]), { optional: true }),
]),
//popup animation
transition("void => popup", [
query(":enter", style({ opacity: 0, transform: "scale(0)" }), {
optional: true,
}),
query(":enter", stagger("10ms", [
animate("500ms ease-out", keyframes([
style({ opacity: 0.5, transform: "scale(.5)", offset: 0.3 }),
style({ opacity: 1, transform: "scale(1.1)", offset: 0.8 }),
style({ opacity: 1, transform: "scale(1)", offset: 1 }),
])),
]), { optional: true }),
]),
]),
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: PanelComponent, decorators: [{
type: Component,
args: [{ selector: "ngx-colors-panel", animations: [
trigger("colorsAnimation", [
transition("void => slide-in", [
// Initially all colors are hidden
query(":enter", style({ opacity: 0 }), { optional: true }),
//slide-in animation
query(":enter", stagger("10ms", [
animate(".3s ease-in", keyframes([
style({ opacity: 0, transform: "translatex(-50%)", offset: 0 }),
style({
opacity: 0.5,
transform: "translatex(-10px) scale(1.1)",
offset: 0.3,
}),
style({ opacity: 1, transform: "translatex(0)", offset: 1 }),
])),
]), { optional: true }),
]),
//popup animation
transition("void => popup", [
query(":enter", style({ opacity: 0, transform: "scale(0)" }), {
optional: true,
}),
query(":enter", stagger("10ms", [
animate("500ms ease-out", keyframes([
style({ opacity: 0.5, transform: "scale(.5)", offset: 0.3 }),
style({ opacity: 1, transform: "scale(1.1)", offset: 0.8 }),
style({ opacity: 1, transform: "scale(1)", offset: 1 }),
])),
]), { optional: true }),
]),
]),
], template: "<div\r\n class=\"opened\"\r\n [style]=\"positionString\"\r\n (scroll)=\"onOpenedScroll($event)\"\r\n #dialog\r\n>\r\n <section class=\"main-content-container\">\r\n <article class=\"left\">\r\n <!--Menu 1-->\r\n <ng-container *ngIf=\"menu == 1\">\r\n <!--Color list-->\r\n <div class=\"colors\" [@colorsAnimation]=\"colorsAnimationEffect\">\r\n <ng-container *ngFor=\"let color of palette; let i = index\">\r\n <div class=\"circle wrapper color\">\r\n <div\r\n (click)=\"onColorClick(color)\"\r\n class=\"circle color circle-border\"\r\n [ngStyle]=\"getBackgroundColor(color)\"\r\n >\r\n <div *ngIf=\"i == this.indexSeleccionado\" class=\"selected\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <!--Menu 2: Variants of selected color-->\r\n <ng-container *ngIf=\"menu == 2\">\r\n <div class=\"colors\" [@colorsAnimation]=\"colorsAnimationEffect\">\r\n <div class=\"circle wrapper\">\r\n <div (click)=\"onClickBack()\" class=\"add\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let variant of variants\">\r\n <div class=\"circle wrapper color\">\r\n <div\r\n (click)=\"changeColor(variant)\"\r\n class=\"circle circle-border\"\r\n [ngStyle]=\"{ background: variant }\"\r\n >\r\n <div *ngIf=\"isSelected(variant)\" class=\"selected\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </article>\r\n\r\n <article class=\"right\">\r\n <div\r\n class=\"color-picker-wrapper\"\r\n *ngIf=\"!hideColorPicker && this.colorPickerControls != 'only-alpha'\"\r\n >\r\n <!-- <span [(colorPicker)]=\"color\"></span> -->\r\n <color-picker\r\n [controls]=\"colorPickerControls\"\r\n [color]=\"hsva\"\r\n (sliderChange)=\"onChangeColorPicker($event)\"\r\n ></color-picker>\r\n </div>\r\n <color-picker\r\n *ngIf=\"!hideColorPicker && this.colorPickerControls == 'only-alpha'\"\r\n [controls]=\"colorPickerControls\"\r\n [color]=\"hsva\"\r\n (colorChange)=\"onChangeColorPicker($event)\"\r\n (onAlphaChange)=\"onAlphaChange($event)\"\r\n ></color-picker>\r\n </article>\r\n </section>\r\n\r\n <!--Format & Manual input-->\r\n <div class=\"manual-input-wrapper\" *ngIf=\"!hideTextInput\">\r\n <p (click)=\"nextFormat()\">{{ colorFormats[format] }}</p>\r\n <div class=\"g-input\">\r\n <input\r\n placeholder=\"#FFFFFF\"\r\n type=\"text\"\r\n [value]=\"color\"\r\n [style.font-size.px]=\"color && color.length > 23 ? 9 : 10\"\r\n [style.letter-spacing.px]=\"color && color.length > 16 ? 0 : 1.5\"\r\n (keyup)=\"changeColorManual(paintInput.value)\"\r\n (keydown.enter)=\"accept()\"\r\n #paintInput\r\n />\r\n <span *ngIf=\"disabled\" class=\"error-message\">\r\n Color value should be hexa, rgb, or rgba format\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"nav-wrapper\">\r\n <button (click)=\"close()\" style=\"float: right\">\r\n {{ cancelLabel }}\r\n </button>\r\n <button (click)=\"accept()\" [disabled]=\"disabled\" style=\"float: right\">\r\n {{ acceptLabel }}\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host{position:fixed;z-index:2001}.hidden{display:none}.button{display:flex;align-items:center;justify-content:center}.top{transform:translateY(-100%)}.opened{box-sizing:border-box;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;background:#fff;width:420px;border-radius:5px;position:absolute}.opened button{border:none;font-family:inherit;font-size:12px;background-color:unset;-webkit-user-select:none;user-select:none;padding:10px;letter-spacing:1px;color:#222;border-radius:3px;line-height:20px;cursor:pointer}.opened button:hover,.opened .button:hover{background-color:#0000000d;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1);transition-property:opacity,background-color;transition-duration:.2s,.2s;transition-timing-function:cubic-bezier(.35,0,.25,1),cubic-bezier(.35,0,.25,1);transition-delay:0s,0s}.opened button:focus{outline:none}.opened button:disabled{color:#aaa;background:#ddd}.opened .colors{display:flex;flex-wrap:wrap;align-items:center;margin:15px}.opened .colors .circle{height:34px;width:34px;box-sizing:border-box;border-radius:100%;cursor:pointer}.opened .colors .circle .add{font-size:20px;line-height:45px;text-align:center}.opened .colors .circle .selected{border:2px solid white;border-radius:100%;height:28px;width:28px;box-sizing:border-box;margin:2px}.opened .colors .circle.wrapper{margin:0 5px 5px;flex:34px 0 0}.opened .colors .circle.button{margin:0 5px 5px}.opened .colors .circle.wrapper.color{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.opened .colors .circle-border{border:1px solid rgba(0,0,0,.03)}.opened .color-picker-wrapper{margin:16px 16px 0 0}.opened .nav-wrapper{overflow:hidden;padding:8px 16px}.opened .nav-wrapper .round-button{padding:5px 0;width:40px;height:40px;box-sizing:border-box;border-radius:100%;text-align:center;line-height:45px}.opened .manual-input-wrapper{display:flex;margin:15px;font-family:sans-serif}.opened .manual-input-wrapper p{margin:0;text-align:center;font-size:10px;letter-spacing:1.5px;text-transform:uppercase;line-height:48px;width:145px;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.opened .manual-input-wrapper .g-input{border:1px solid #e8ebed;height:45px;border-radius:5px;width:100%}.opened .manual-input-wrapper .g-input input{font-size:9px;border:none;width:100%;text-transform:uppercase;outline:none;text-align:center;letter-spacing:1px;color:#595b65;height:100%;border-radius:5px;margin:0;padding:0}.opened .manual-input-wrapper .g-input span.error-message{margin-top:3px;display:inline-block;font-size:11px;color:#f44336}.main-content-container{display:flex;max-height:250px;overflow:auto}\n"] }]
}], ctorParameters: function () { return [{ type: i1.ConverterService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { click: [{
type: HostListener,
args: ["document:mousedown", ["$event"]]
}], onScroll: [{
type: HostListener,
args: ["document:scroll", ["$event"]]
}], onResize: [{
type: HostListener,
args: ["window:resize"]
}], top: [{
type: HostBinding,
args: ["style.top.px"]
}], left: [{
type: HostBinding,
args: ["style.left.px"]
}], panelRef: [{
type: ViewChild,
args: ["dialog"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbG9ycy9zcmMvbGliL2NvbXBvbmVudHMvcGFuZWwvcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbG9ycy9zcmMvbGliL2NvbXBvbmVudHMvcGFuZWwvcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxTQUFTLEVBRVQsWUFBWSxFQUNaLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixLQUFLLEVBQ0wsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsU0FBUyxHQUNWLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFaEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQXNEakUsTUFBTSxPQUFPLGNBQWM7SUFzQnpCLFlBQ1MsT0FBeUIsRUFDeEIsR0FBc0I7UUFEdkIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFHaEMsVUFBSyxHQUFHLFNBQVMsQ0FBQztRQUVYLGlCQUFZLEdBQVcsU0FBUyxDQUFDO1FBQ2pDLFNBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFD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LEVBQUUsQ0FBQzt3Q0FDNUQsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzt3Q0FDM0QsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztxQ0FDeEQsQ0FBQyxDQUNIO2lDQUNGLENBQUMsRUFDRixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FDbkI7NkJBQ0YsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIO3VJQUlELEtBQUs7c0JBREosWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFROUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU0zQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZTtnQkFLTyxHQUFHO3NCQUF0QyxXQUFXO3VCQUFDLGNBQWM7Z0JBQ1UsSUFBSTtzQkFBeEMsV0FBVzt1QkFBQyxlQUFlO2dCQUNQLFFBQVE7c0JBQTVCLFNBQVM7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICB0cmlnZ2VyLFxyXG4gIHRyYW5zaXRpb24sXHJcbiAgcXVlcnksXHJcbiAgc3R5bGUsXHJcbiAgc3RhZ2dlcixcclxuICBhbmltYXRlLFxyXG4gIGtleWZyYW1lcyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvYW5pbWF0aW9uc1wiO1xyXG5pbXBvcnQgeyBDb2xvckZvcm1hdHMgfSBmcm9tIFwiLi4vLi4vZW51bXMvZm9ybWF0c1wiO1xyXG5pbXBvcnQgeyBDb252ZXJ0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2NvbnZlcnRlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlZmF1bHRDb2xvcnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9kZWZhdWx0LWNvbG9yc1wiO1xyXG5pbXBvcnQgeyBmb3JtYXRzIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvZm9ybWF0c1wiO1xyXG5pbXBvcnQgeyBOZ3hDb2xvcnNUcmlnZ2VyRGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvbmd4LWNvbG9ycy10cmlnZ2VyLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBIc3ZhIH0gZnJvbSBcIi4uLy4uL2NsYXNlcy9mb3JtYXRzXCI7XHJcbmltcG9ydCB7IE5neENvbG9yIH0gZnJvbSBcIi4uLy4uL2NsYXNlcy9jb2xvclwiO1xyXG5pbXBvcnQgeyBIRVhfUkVHRVgsIFJHQkFfUkVHRVggfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2NvbnRhbnRzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJuZ3gtY29sb3JzLXBhbmVsXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9wYW5lbC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9wYW5lbC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKFwiY29sb3JzQW5pbWF0aW9uXCIsIFtcclxuICAgICAgdHJhbnNpdGlvbihcInZvaWQgPT4gc2xpZGUtaW5cIiwgW1xyXG4gICAgICAgIC8vIEluaXRpYWxseSBhbGwgY29sb3JzIGFyZSBoaWRkZW5cclxuICAgICAgICBxdWVyeShcIjplbnRlclwiLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSksIHsgb3B0aW9uYWw6IHRydWUgfSksXHJcbiAgICAgICAgLy9zbGlkZS1pbiBhbmltYXRpb25cclxuICAgICAgICBxdWVyeShcclxuICAgICAgICAgIFwiOmVudGVyXCIsXHJcbiAgICAgICAgICBzdGFnZ2VyKFwiMTBtc1wiLCBbXHJcbiAgICAgICAgICAgIGFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgXCIuM3MgZWFzZS1pblwiLFxyXG4gICAgICAgICAgICAgIGtleWZyYW1lcyhbXHJcbiAgICAgICAgICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGV4KC01MCUpXCIsIG9mZnNldDogMCB9KSxcclxuICAgICAgICAgICAgICAgIHN0eWxlKHtcclxuICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMC41LFxyXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRleCgtMTBweCkgc2NhbGUoMS4xKVwiLFxyXG4gICAgICAgICAgICAgICAgICBvZmZzZXQ6IDAuMyxcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06IFwidHJhbnNsYXRleCgwKVwiLCBvZmZzZXQ6IDEgfSksXHJcbiAgICAgICAgICAgICAgXSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgIF0pLFxyXG4gICAgICAgICAgeyBvcHRpb25hbDogdHJ1ZSB9XHJcbiAgICAgICAgKSxcclxuICAgICAgXSksXHJcbiAgICAgIC8vcG9wdXAgYW5pbWF0aW9uXHJcbiAgICAgIHRyYW5zaXRpb24oXCJ2b2lkID0+IHBvcHVwXCIsIFtcclxuICAgICAgICBxdWVyeShcIjplbnRlclwiLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogXCJzY2FsZSgwKVwiIH0pLCB7XHJcbiAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcclxuICAgICAgICB9KSxcclxuICAgICAgICBxdWVyeShcclxuICAgICAgICAgIFwiOmVudGVyXCIsXHJcbiAgICAgICAgICBzdGFnZ2VyKFwiMTBtc1wiLCBbXHJcbiAgICAgICAgICAgIGFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgXCI1MDBtcyBlYXNlLW91dFwiLFxyXG4gICAgICAgICAgICAgIGtleWZyYW1lcyhbXHJcbiAgICAgICAgICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAuNSwgdHJhbnNmb3JtOiBcInNjYWxlKC41KVwiLCBvZmZzZXQ6IDAuMyB9KSxcclxuICAgICAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiBcInNjYWxlKDEuMSlcIiwgb2Zmc2V0OiAwLjggfSksXHJcbiAgICAgICAgICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogXCJzY2FsZSgxKVwiLCBvZmZzZXQ6IDEgfSksXHJcbiAgICAgICAgICAgICAgXSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgIF0pLFxyXG4gICAgICAgICAgeyBvcHRpb25hbDogdHJ1ZSB9XHJcbiAgICAgICAgKSxcclxuICAgICAgXSksXHJcbiAgICBdKSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDptb3VzZWRvd25cIiwgW1wiJGV2ZW50XCJdKVxyXG4gIGNsaWNrKGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5pc091dHNpZGUoZXZlbnQpKSB7XHJcbiAgICAgIC8vIHRoaXMuZW1pdENsb3NlKFwiY2FuY2VsXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OnNjcm9sbFwiLCBbXCIkZXZlbnRcIl0pXHJcbiAgb25TY3JvbGwoZXZlbnQpIHtcclxuICAgIHRoaXMub25TY3JlZW5Nb3ZlbWVudCgpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcclxuICBvblJlc2l6ZSgpIHtcclxuICAgIHRoaXMub25TY3JlZW5Nb3ZlbWVudCgpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUudG9wLnB4XCIpIHB1YmxpYyB0b3A6IG51bWJlcjtcclxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS5sZWZ0LnB4XCIpIHB1YmxpYyBsZWZ0OiBudW1iZXI7XHJcbiAgQFZpZXdDaGlsZChcImRpYWxvZ1wiKSBwYW5lbFJlZjogRWxlbWVudFJlZjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgc2VydmljZTogQ29udmVydGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge31cclxuXHJcbiAgY29sb3IgPSBcIiMwMDAwMDBcIjtcclxuXHJcbiAgcHVibGljIHByZXZpZXdDb2xvcjogc3RyaW5nID0gXCIjMDAwMDAwXCI7XHJcbiAgcHVibGljIGhzdmEgPSBuZXcgSHN2YSgwLCAxLCAxLCAxKTtcclxuXHJcbiAgcHVibGljIGNvbG9yc0FuaW1hdGlvbkVmZmVjdCA9IFwic2xpZGUtaW5cIjtcclxuXHJcbiAgcHVibGljIHBhbGV0dGUgPSBEZWZhdWx0Q29sb3JzO1xyXG4gIHB1YmxpYyB2YXJpYW50cyA9IFtdO1xyXG5cclxuICBwdWJsaWMgY29sb3JGb3JtYXRzID0gZm9ybWF0cztcclxuICBwdWJsaWMgZm9ybWF0OiBDb2xvckZvcm1hdHMgPSBDb2xvckZvcm1hdHMuSEVYO1xyXG5cclxuICBwdWJsaWMgY2FuQ2hhbmdlRm9ybWF0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcHVibGljIG1lbnUgPSAxO1xyXG5cclxuICBwdWJsaWMgaGlkZUNvbG9yUGlja2VyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGhpZGVUZXh0SW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYWNjZXB0TGFiZWw6IHN0cmluZztcclxuICBwdWJsaWMgY2FuY2VsTGFiZWw6IHN0cmluZztcclxuICBwdWJsaWMgY29sb3JQaWNrZXJDb250cm9sczogXCJkZWZhdWx0XCIgfCBcIm9ubHktYWxwaGFcIiB8IFwibm8tYWxwaGFcIiA9IFwiZGVmYXVsdFwiO1xyXG4gIHByaXZhdGUgdHJpZ2dlckluc3RhbmNlOiBOZ3hDb2xvcnNUcmlnZ2VyRGlyZWN0aXZlO1xyXG4gIHByaXZhdGUgVHJpZ2dlckJCb3g7XHJcbiAgcHVibGljIGlzU2VsZWN0ZWRDb2xvckluUGFsZXR0ZTogYm9vbGVhbjtcclxuICBwdWJsaWMgaW5kZXhTZWxlY2Npb25hZG87XHJcbiAgcHVibGljIHBvc2l0aW9uU3RyaW5nO1xyXG4gIHB1YmxpYyB0ZW1wb3JhbENvbG9yO1xyXG4gIHB1YmxpYyBiYWNrdXBDb2xvcjtcclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRQb3NpdGlvbigpO1xyXG4gICAgdGhpcy5oc3ZhID0gdGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YSh0aGlzLmNvbG9yKTtcclxuICAgIHRoaXMuaW5kZXhTZWxlY2Npb25hZG8gPSB0aGlzLmZpbmRJbmRleFNlbGVjdGVkQ29sb3IodGhpcy5wYWxldHRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnNldFBvc2l0aW9uWSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblNjcmVlbk1vdmVtZW50KCkge1xyXG4gICAgdGhpcy5zZXRQb3NpdGlvbigpO1xyXG4gICAgdGhpcy5zZXRQb3NpdGlvblkoKTtcclxuICAgIGlmICghdGhpcy5wYW5lbFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zaXRpb24pIHtcclxuICAgICAgdGhpcy5wYW5lbFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSBcInRyYW5zZm9ybSAwLjVzIGVhc2Utb3V0XCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmRJbmRleFNlbGVjdGVkQ29sb3IoY29sb3JzKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHRJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgIGlmICh0aGlzLmNvbG9yKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY29sb3IgPSBjb2xvcnNbaV07XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb2xvciA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5zdHJpbmdUb0Zvcm1hdCh0aGlzLmNvbG9yLCBDb2xvckZvcm1hdHMuSEVYKSA9PVxyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2Uuc3RyaW5nVG9Gb3JtYXQoY29sb3IsIENvbG9yRm9ybWF0cy5IRVgpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgcmVzdWx0SW5kZXggPSBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5maW5kSW5kZXhTZWxlY3RlZENvbG9yKGNvbG9yLnZhcmlhbnRzKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmVzdWx0SW5kZXggPSBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdEluZGV4O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaWNpYXRlKFxyXG4gICAgdHJpZ2dlckluc3RhbmNlOiBOZ3hDb2xvcnNUcmlnZ2VyRGlyZWN0aXZlLFxyXG4gICAgdHJpZ2dlckVsZW1lbnRSZWYsXHJcbiAgICBjb2xvcixcclxuICAgIHBhbGV0dGUsXHJcbiAgICBhbmltYXRpb24sXHJcbiAgICBmb3JtYXQ6IHN0cmluZyxcclxuICAgIGhpZGVUZXh0SW5wdXQ6IGJvb2xlYW4sXHJcbiAgICBoaWRlQ29sb3JQaWNrZXI6IGJvb2xlYW4sXHJcbiAgICBhY2NlcHRMYWJlbDogc3RyaW5nLFxyXG4gICAgY2FuY2VsTGFiZWw6IHN0cmluZyxcclxuICAgIGNvbG9yUGlja2VyQ29udHJvbHM6IFwiZGVmYXVsdFwiIHwgXCJvbmx5LWFscGhhXCIgfCBcIm5vLWFscGhhXCIsXHJcbiAgICBwb3NpdGlvbjogXCJ0b3BcIiB8IFwiYm90dG9tXCJcclxuICApIHtcclxuICAgIHRoaXMuY29sb3JQaWNrZXJDb250cm9scyA9IGNvbG9yUGlja2VyQ29udHJvbHM7XHJcbiAgICB0aGlzLnRyaWdnZXJJbnN0YW5jZSA9IHRyaWdnZXJJbnN0YW5jZTtcclxuICAgIHRoaXMuVHJpZ2dlckJCb3ggPSB0cmlnZ2VyRWxlbWVudFJlZjtcclxuICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcclxuICAgIHRoaXMuaGlkZUNvbG9yUGlja2VyID0gaGlkZUNvbG9yUGlja2VyO1xyXG4gICAgdGhpcy5oaWRlVGV4dElucHV0ID0gaGlkZVRleHRJbnB1dDtcclxuICAgIHRoaXMuYWNjZXB0TGFiZWwgPSBhY2NlcHRMYWJlbDtcclxuICAgIHRoaXMuY2FuY2VsTGFiZWwgPSBjYW5jZWxMYWJlbDtcclxuICAgIGlmIChmb3JtYXQpIHtcclxuICAgICAgaWYgKGZvcm1hdHMuaW5jbHVkZXMoZm9ybWF0KSkge1xyXG4gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0cy5pbmRleE9mKGZvcm1hdC50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB0aGlzLmNhbkNoYW5nZUZvcm1hdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRGb3JtYXRCeVN0cmluZyh0aGlzLmNvbG9yKSAhPSBmb3JtYXQudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5zZXRDb2xvckZyb21Ic3ZhKHRoaXMuc2VydmljZS5zdHJpbmdUb0hzdmEodGhpcy5jb2xvcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRm9ybWF0IHByb3ZpZGVkIGlzIGludmFsaWQsIHVzaW5nIEhFWFwiKTtcclxuICAgICAgICB0aGlzLmZvcm1hdCA9IENvbG9yRm9ybWF0cy5IRVg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0cy5pbmRleE9mKHRoaXMuc2VydmljZS5nZXRGb3JtYXRCeVN0cmluZyh0aGlzLmNvbG9yKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcmV2aWV3Q29sb3IgPSB0aGlzLmNvbG9yO1xyXG4gICAgdGhpcy5wYWxldHRlID0gcGFsZXR0ZSA/PyBEZWZhdWx0Q29sb3JzO1xyXG4gICAgdGhpcy5jb2xvcnNBbmltYXRpb25FZmZlY3QgPSBhbmltYXRpb247XHJcbiAgICBpZiAocG9zaXRpb24gPT0gXCJ0b3BcIikge1xyXG4gICAgICBsZXQgVHJpZ2dlckJCb3ggPSB0aGlzLlRyaWdnZXJCQm94Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMucG9zaXRpb25TdHJpbmcgPVxyXG4gICAgICAgIFwidHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGMoIC0xMDAlIC0gXCIgKyBUcmlnZ2VyQkJveC5oZWlnaHQgKyBcInB4ICkpXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UG9zaXRpb24oKSB7XHJcbiAgICBpZiAodGhpcy5UcmlnZ2VyQkJveCkge1xyXG4gICAgICB2YXIgdmlld3BvcnRPZmZzZXQgPVxyXG4gICAgICAgIHRoaXMuVHJpZ2dlckJCb3gubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgdGhpcy50b3AgPSB2aWV3cG9ydE9mZnNldC50b3AgKyB2aWV3cG9ydE9mZnNldC5oZWlnaHQ7XHJcbiAgICAgIHRoaXMubGVmdCA9XHJcbiAgICAgICAgdmlld3BvcnRPZmZzZXQubGVmdCArIDQyMCA+IHdpbmRvdy5pbm5lcldpZHRoXHJcbiAgICAgICAgICA/IHZpZXdwb3J0T2Zmc2V0LnJpZ2h0IC0gNDIwXHJcbiAgICAgICAgICA6IHZpZXdwb3J0T2Zmc2V0LmxlZnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFBvc2l0aW9uWSgpIHtcclxuICAgIHZhciB0cmlnZ2VyQkJveCA9IHRoaXMuVHJpZ2dlckJCb3gubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHZhciBwYW5lbEJCb3ggPSB0aGlzLnBhbmVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB2YXIgcGFuZWxIZWlnaHQgPSBwYW5lbEJCb3guaGVpZ2h0O1xyXG5cclxuICAgIC8vQ2hlY2sgZm9yIHNwYWNlIGFib3ZlIHRoZSB0cmlnZ2VyXHJcbiAgICBpZiAoMCA+IHBhbmVsQkJveC50b3AgLSA1KSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb25TdHJpbmcgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgLy9DaGVjayBmb3Igc3BhY2UgYmVsb3cgdGhlIHRyaWdnZXJcclxuICAgIGlmIChwYW5lbEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIChwYW5lbEJCb3gudG9wIC0gNSkpIHtcclxuICAgICAgLy90aGVyZSBpcyBubyBzcGFjZSwgbW92ZSBwYW5lbCBvdmVyIHRoZSB0cmlnZ2VyXHJcbiAgICAgIHRoaXMucG9zaXRpb25TdHJpbmcgPVxyXG4gICAgICAgIFwidHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGMoIC0xMDAlIC0gXCIgKyB0cmlnZ2VyQkJveC5oZWlnaHQgKyBcInB4ICkpO1wiO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc1ZhcmlhbnQoY29sb3IpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5wcmV2aWV3Q29sb3IpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIChcclxuICAgICAgdHlwZW9mIGNvbG9yICE9IFwic3RyaW5nXCIgJiZcclxuICAgICAgY29sb3IudmFyaWFudHMuc29tZShcclxuICAgICAgICAodikgPT4gdi50b1VwcGVyQ2FzZSgpID09IHRoaXMucHJldmlld0NvbG9yLnRvVXBwZXJDYXNlKClcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NlbGVjdGVkKGNvbG9yKSB7XHJcbiAgICBpZiAoIXRoaXMucHJldmlld0NvbG9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAoXHJcbiAgICAgIHR5cGVvZiBjb2xvciA9PSBcInN0cmluZ1wiICYmXHJcbiAgICAgIGNvbG9yLnRvVXBwZXJDYXNlKCkgPT0gdGhpcy5wcmV2aWV3Q29sb3IudG9VcHBlckNhc2UoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpIHtcclxuICAgIGlmICh0eXBlb2YgY29sb3IgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICByZXR1cm4geyBiYWNrZ3JvdW5kOiBjb2xvciB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHsgYmFja2dyb3VuZDogY29sb3I/LnByZXZpZXcgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkFscGhhQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICB0aGlzLnBhbGV0dGUgPSB0aGlzLkNoYW5nZUFscGhhT25QYWxldHRlKGV2ZW50LCB0aGlzLnBhbGV0dGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBDaGFuZ2VBbHBoYU9uUGFsZXR0ZShcclxuICAgIGFscGhhLFxyXG4gICAgY29sb3JzOiBBcnJheTxzdHJpbmcgfCBOZ3hDb2xvcj5cclxuICApOiBBcnJheTxhbnk+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY29sb3IgPSBjb2xvcnNbaV07XHJcbiAgICAgIGlmICh0eXBlb2YgY29sb3IgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIGNvbnN0IG5ld0NvbG9yID0gdGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YShjb2xvcik7XHJcbiAgICAgICAgbmV3Q29sb3Iub25BbHBoYUNoYW5nZShhbHBoYSk7XHJcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZXJ2aWNlLnRvRm9ybWF0KG5ld0NvbG9yLCB0aGlzLmZvcm1hdCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG5ld0NvbG9yID0gbmV3IE5neENvbG9yKCk7XHJcbiAgICAgICAgY29uc3QgbmV3Q29sb3JQcmV2aWV3ID0gdGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YShjb2xvci5wcmV2aWV3KTtcclxuICAgICAgICBuZXdDb2xvclByZXZpZXcub25BbHBoYUNoYW5nZShhbHBoYSk7XHJcbiAgICAgICAgbmV3Q29sb3IucHJldmlldyA9IHRoaXMuc2VydmljZS50b0Zvcm1hdChuZXdDb2xvclByZXZpZXcsIHRoaXMuZm9ybWF0KTtcclxuICAgICAgICBuZXdDb2xvci52YXJpYW50cyA9IHRoaXMuQ2hhbmdlQWxwaGFPblBhbGV0dGUoYWxwaGEsIGNvbG9yLnZhcmlhbnRzKTtcclxuICAgICAgICByZXN1bHQucHVzaChuZXdDb2xvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGFuZ2UgY29sb3IgZnJvbSBkZWZhdWx0IGNvbG9yc1xyXG4gICAqIEBwYXJhbSBzdHJpbmcgY29sb3JcclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlQ29sb3IoY29sb3I6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRDb2xvckZyb21TdHJpbmcoY29sb3IpO1xyXG4gICAgdGhpcy5tZW51ID0gMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNoYW5nZUNvbG9yUGlja2VyKGV2ZW50OiBIc3ZhKSB7XHJcbiAgICB0aGlzLnRlbXBvcmFsQ29sb3IgPSBldmVudDtcclxuICAgIHRoaXMuY29sb3IgPSB0aGlzLnNlcnZpY2UudG9Gb3JtYXQoZXZlbnQsIHRoaXMuZm9ybWF0KTtcclxuICAgIHRoaXMudHJpZ2dlckluc3RhbmNlLnNsaWRlckNoYW5nZShcclxuICAgICAgdGhpcy5zZXJ2aWNlLnRvRm9ybWF0KGV2ZW50LCB0aGlzLmZvcm1hdClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hhbmdlQ29sb3JNYW51YWwoY29sb3I6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRDb2xvckZyb21TdHJpbmcoY29sb3IpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q29sb3JGcm9tSHN2YSh2YWx1ZTogSHN2YSkge1xyXG4gICAgdGhpcy5oc3ZhID0gdmFsdWU7XHJcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5zZXJ2aWNlLnRvRm9ybWF0KHZhbHVlLCB0aGlzLmZvcm1hdCk7XHJcbiAgICB0aGlzLnByZXZpZXdDb2xvciA9IHRoaXMuc2VydmljZS5oc3ZhVG9SZ2JhKHZhbHVlKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q29sb3JGcm9tU3RyaW5nKGNvbG9yOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuaHN2YSA9IHRoaXMuc2VydmljZS5zdHJpbmdUb0hzdmEoY29sb3IpO1xyXG4gICAgdGhpcy5jb2xvciA9IGNvbG9yO1xyXG4gICAgdGhpcy5wcmV2aWV3Q29sb3IgPSBjb2xvcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNvbG9yQ2xpY2soY29sb3IpIHtcclxuICAgIGlmICh0eXBlb2YgY29sb3IgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgdGhpcy5jaGFuZ2VDb2xvcihjb2xvcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZhcmlhbnRzID0gY29sb3IudmFyaWFudHM7XHJcbiAgICAgIHRoaXMubWVudSA9IDI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmV4dEZvcm1hdCgpIHtcclxuICAgIGlmICh0aGlzLmNhbkNoYW5nZUZvcm1hdCkge1xyXG4gICAgICB0aGlzLmZvcm1hdCA9ICh0aGlzLmZvcm1hdCArIDEpICUgdGhpcy5jb2xvckZvcm1hdHMubGVuZ3RoO1xyXG4gICAgICB0aGlzLnNldENvbG9yRnJvbUhzdmEodGhpcy5oc3ZhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy50cmlnZ2VySW5zdGFuY2UuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIGFjY2VwdCgpIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLnRyaWdnZXJJbnN0YW5jZS5zZXRDb2xvcihcclxuICAgICAgICB0aGlzLnNlcnZpY2Uuc3RyaW5nVG9Gb3JtYXQodGhpcy5jb2xvciwgQ29sb3JGb3JtYXRzLkhFWClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy50cmlnZ2VySW5zdGFuY2UuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsaWNrQmFjaygpIHtcclxuICAgIGlmICh0aGlzLm1lbnUgPT0gMykge1xyXG4gICAgICB0aGlzLmNvbG9yID0gdGhpcy5iYWNrdXBDb2xvcjtcclxuICAgICAgdGhpcy5oc3ZhID0gdGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YSh0aGlzLmNvbG9yKTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5kZXhTZWxlY2Npb25hZG8gPSB0aGlzLmZpbmRJbmRleFNlbGVjdGVkQ29sb3IodGhpcy5wYWxldHRlKTtcclxuICAgIHRoaXMubWVudSA9IDE7XHJcbiAgfVxyXG5cclxuICBpc091dHNpZGUoZXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwibmd4LWNvbG9ycy1vdmVybGF5XCIpO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuZWRTY3JvbGwoJGV2ZW50KSB7XHJcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAhUkdCQV9SRUdFWC50ZXN0KHRoaXMuY29sb3IudG9Mb3dlckNhc2UoKSkgJiYgIUhFWF9SRUdFWC50ZXN0KHRoaXMuY29sb3IpXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgY2xhc3M9XCJvcGVuZWRcIlxyXG4gIFtzdHlsZV09XCJwb3NpdGlvblN0cmluZ1wiXHJcbiAgKHNjcm9sbCk9XCJvbk9wZW5lZFNjcm9sbCgkZXZlbnQpXCJcclxuICAjZGlhbG9nXHJcbj5cclxuICA8c2VjdGlvbiBjbGFzcz1cIm1haW4tY29udGVudC1jb250YWluZXJcIj5cclxuICAgIDxhcnRpY2xlIGNsYXNzPVwibGVmdFwiPlxyXG4gICAgICA8IS0tTWVudSAxLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZW51ID09IDFcIj5cclxuICAgICAgICA8IS0tQ29sb3IgbGlzdC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvcnNcIiBbQGNvbG9yc0FuaW1hdGlvbl09XCJjb2xvcnNBbmltYXRpb25FZmZlY3RcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbG9yIG9mIHBhbGV0dGU7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZSB3cmFwcGVyIGNvbG9yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29sb3JDbGljayhjb2xvcilcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjaXJjbGUgY29sb3IgY2lyY2xlLWJvcmRlclwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA9PSB0aGlzLmluZGV4U2VsZWNjaW9uYWRvXCIgY2xhc3M9XCJzZWxlY3RlZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwhLS1NZW51IDI6IFZhcmlhbnRzIG9mIHNlbGVjdGVkIGNvbG9yLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZW51ID09IDJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sb3JzXCIgW0Bjb2xvcnNBbmltYXRpb25dPVwiY29sb3JzQW5pbWF0aW9uRWZmZWN0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlIHdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGlja0JhY2soKVwiIGNsYXNzPVwiYWRkXCI+XHJcbiAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0yMCAxMUg3LjgzbDUuNTktNS41OUwxMiA0bC04IDggOCA4IDEuNDEtMS40MUw3LjgzIDEzSDIwdi0yelwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmlhbnQgb2YgdmFyaWFudHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZSB3cmFwcGVyIGNvbG9yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZUNvbG9yKHZhcmlhbnQpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2lyY2xlIGNpcmNsZS1ib3JkZXJcIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiB2YXJpYW50IH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1NlbGVjdGVkKHZhcmlhbnQpXCIgY2xhc3M9XCJzZWxlY3RlZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvYXJ0aWNsZT5cclxuXHJcbiAgICA8YXJ0aWNsZSBjbGFzcz1cInJpZ2h0XCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImNvbG9yLXBpY2tlci13cmFwcGVyXCJcclxuICAgICAgICAqbmdJZj1cIiFoaWRlQ29sb3JQaWNrZXIgJiYgdGhpcy5jb2xvclBpY2tlckNvbnRyb2xzICE9ICdvbmx5LWFscGhhJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8IS0tIDxzcGFuIFsoY29sb3JQaWNrZXIpXT1cImNvbG9yXCI+PC9zcGFuPiAtLT5cclxuICAgICAgICA8Y29sb3ItcGlja2VyXHJcbiAgICAgICAgICBbY29udHJvbHNdPVwiY29sb3JQaWNrZXJDb250cm9sc1wiXHJcbiAgICAgICAgICBbY29sb3JdPVwiaHN2YVwiXHJcbiAgICAgICAgICAoc2xpZGVyQ2hhbmdlKT1cIm9uQ2hhbmdlQ29sb3JQaWNrZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvY29sb3ItcGlja2VyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGNvbG9yLXBpY2tlclxyXG4gICAgICAgICpuZ0lmPVwiIWhpZGVDb2xvclBpY2tlciAmJiB0aGlzLmNvbG9yUGlja2VyQ29udHJvbHMgPT0gJ29ubHktYWxwaGEnXCJcclxuICAgICAgICBbY29udHJvbHNdPVwiY29sb3JQaWNrZXJDb250cm9sc1wiXHJcbiAgICAgICAgW2NvbG9yXT1cImhzdmFcIlxyXG4gICAgICAgIChjb2xvckNoYW5nZSk9XCJvbkNoYW5nZUNvbG9yUGlja2VyKCRldmVudClcIlxyXG4gICAgICAgIChvbkFscGhhQ2hhbmdlKT1cIm9uQWxwaGFDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgID48L2NvbG9yLXBpY2tlcj5cclxuICAgIDwvYXJ0aWNsZT5cclxuICA8L3NlY3Rpb24+XHJcblxyXG4gIDwhLS1Gb3JtYXQgJiBNYW51YWwgaW5wdXQtLT5cclxuICA8ZGl2IGNsYXNzPVwibWFudWFsLWlucHV0LXdyYXBwZXJcIiAqbmdJZj1cIiFoaWRlVGV4dElucHV0XCI+XHJcbiAgICA8cCAoY2xpY2spPVwibmV4dEZvcm1hdCgpXCI+e3sgY29sb3JGb3JtYXRzW2Zvcm1hdF0gfX08L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZy1pbnB1dFwiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICBwbGFjZWhvbGRlcj1cIiNGRkZGRkZcIlxyXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICBbdmFsdWVdPVwiY29sb3JcIlxyXG4gICAgICAgIFtzdHlsZS5mb250LXNpemUucHhdPVwiY29sb3IgJiYgY29sb3IubGVuZ3RoID4gMjMgPyA5IDogMTBcIlxyXG4gICAgICAgIFtzdHlsZS5sZXR0ZXItc3BhY2luZy5weF09XCJjb2xvciAmJiBjb2xvci5sZW5ndGggPiAxNiA/IDAgOiAxLjVcIlxyXG4gICAgICAgIChrZXl1cCk9XCJjaGFuZ2VDb2xvck1hbnVhbChwYWludElucHV0LnZhbHVlKVwiXHJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWNjZXB0KClcIlxyXG4gICAgICAgICNwYWludElucHV0XHJcbiAgICAgIC8+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiZGlzYWJsZWRcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cclxuICAgICAgICBDb2xvciB2YWx1ZSBzaG91bGQgYmUgaGV4YSwgcmdiLCBvciByZ2JhIGZvcm1hdFxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm5hdi13cmFwcGVyXCI+XHJcbiAgICA8YnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCIgc3R5bGU9XCJmbG9hdDogcmlnaHRcIj5cclxuICAgICAge3sgY2FuY2VsTGFiZWwgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiYWNjZXB0KClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBzdHlsZT1cImZsb2F0OiByaWdodFwiPlxyXG4gICAgICB7eyBhY2NlcHRMYWJlbCB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=