@ohayojp.com/components
Version:
Common business components of ohayojp.
647 lines • 61 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: st-column-source.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Host, Inject, Injectable, Optional } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { ACLService } from '@ohayojp.com/acl';
import { OHAYO_I18N_TOKEN } from '@ohayojp.com/theme';
import { deepCopy, warn } from '@ohayojp.com/util';
import { STRowSource } from './st-row.directive';
import { STWidgetRegistry } from './st-widget';
/**
* @record
*/
export function STColumnSourceProcessOptions() { }
if (false) {
/** @type {?} */
STColumnSourceProcessOptions.prototype.widthMode;
/** @type {?} */
STColumnSourceProcessOptions.prototype.resizable;
}
export class STColumnSource {
/**
* @param {?} dom
* @param {?} rowSource
* @param {?} acl
* @param {?} i18nSrv
* @param {?} stWidgetRegistry
*/
constructor(dom, rowSource, acl, i18nSrv, stWidgetRegistry) {
this.dom = dom;
this.rowSource = rowSource;
this.acl = acl;
this.i18nSrv = i18nSrv;
this.stWidgetRegistry = stWidgetRegistry;
}
/**
* @param {?} val
* @return {?}
*/
setCog(val) {
this.cog = val;
}
/**
* @private
* @param {?} i
* @param {?} def
* @return {?}
*/
fixPop(i, def) {
if (i.pop == null || i.pop === false) {
i.pop = false;
return;
}
/** @type {?} */
let pop = Object.assign({}, def);
if (typeof i.pop === 'string') {
pop.title = i.pop;
}
else if (typeof i.pop === 'object') {
pop = Object.assign(Object.assign({}, pop), i.pop);
}
if (typeof pop.condition !== 'function') {
pop.condition = (/**
* @return {?}
*/
() => false);
}
i.pop = pop;
}
/**
* @private
* @param {?} list
* @return {?}
*/
btnCoerce(list) {
if (!list)
return [];
/** @type {?} */
const ret = [];
const { modal, drawer, pop, btnIcon } = this.cog;
for (const item of list) {
if (this.acl && item.acl && !this.acl.can(item.acl)) {
continue;
}
if (item.type === 'modal' || item.type === 'static') {
if (item.modal == null || item.modal.component == null) {
console.warn(`[st] Should specify modal parameter`);
item.type = 'none';
}
else {
item.modal = Object.assign(Object.assign({ paramsName: 'record', size: 'lg' }, modal), item.modal);
}
}
if (item.type === 'drawer') {
if (item.drawer == null || item.drawer.component == null) {
console.warn(`[st] Should specify drawer parameter`);
item.type = 'none';
}
else {
item.drawer = Object.assign(Object.assign({ paramsName: 'record', size: 'lg' }, drawer), item.drawer);
}
}
if (item.type === 'del' && typeof item.pop === 'undefined') {
item.pop = true;
}
// pop
this.fixPop(item, (/** @type {?} */ (pop)));
if (item.icon) {
item.icon = Object.assign(Object.assign({}, btnIcon), (typeof item.icon === 'string' ? { type: item.icon } : item.icon));
}
item.children = item.children && item.children.length > 0 ? this.btnCoerce(item.children) : [];
// i18n
if (item.i18n && this.i18nSrv) {
item.text = this.i18nSrv.fanyi(item.i18n);
}
ret.push(item);
}
this.btnCoerceIf(ret);
return ret;
}
/**
* @private
* @param {?} list
* @return {?}
*/
btnCoerceIf(list) {
for (const item of list) {
if (!item.iif)
item.iif = (/**
* @return {?}
*/
() => true);
item.iifBehavior = item.iifBehavior || this.cog.iifBehavior;
if (item.children && item.children.length > 0) {
this.btnCoerceIf(item.children);
}
else {
item.children = [];
}
}
}
/**
* @private
* @param {?} list
* @return {?}
*/
fixedCoerce(list) {
/** @type {?} */
const countReduce = (/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => a + +(/** @type {?} */ (b.width)).toString().replace('px', ''));
// left width
list
.filter((/**
* @param {?} w
* @return {?}
*/
w => w.fixed && w.fixed === 'left' && w.width))
.forEach((/**
* @param {?} item
* @param {?} idx
* @return {?}
*/
(item, idx) => (item._left = list.slice(0, idx).reduce(countReduce, 0) + 'px')));
// right width
list
.filter((/**
* @param {?} w
* @return {?}
*/
w => w.fixed && w.fixed === 'right' && w.width))
.reverse()
.forEach((/**
* @param {?} item
* @param {?} idx
* @return {?}
*/
(item, idx) => (item._right = (idx > 0 ? list.slice(-idx).reduce(countReduce, 0) : 0) + 'px')));
}
/**
* @private
* @param {?} item
* @return {?}
*/
sortCoerce(item) {
/** @type {?} */
const res = this.fixSortCoerce(item);
res.reName = Object.assign(Object.assign({}, this.cog.sortReName), res.reName);
return res;
}
/**
* @private
* @param {?} item
* @return {?}
*/
fixSortCoerce(item) {
if (typeof item.sort === 'undefined') {
return { enabled: false };
}
/** @type {?} */
let res = {};
if (typeof item.sort === 'string') {
res.key = item.sort;
}
else if (typeof item.sort !== 'boolean') {
res = item.sort;
}
else if (typeof item.sort === 'boolean') {
res.compare = (/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => a[(/** @type {?} */ (item.indexKey))] - b[(/** @type {?} */ (item.indexKey))]);
}
if (!res.key) {
res.key = item.indexKey;
}
res.enabled = true;
return res;
}
/**
* @private
* @param {?} item
* @return {?}
*/
filterCoerce(item) {
if (item.filter == null) {
return null;
}
/** @type {?} */
let res = item.filter;
res.type = res.type || 'default';
/** @type {?} */
let icon = 'filter';
/** @type {?} */
let iconTheme = 'fill';
if (res.type === 'keyword') {
if (res.menus == null || (/** @type {?} */ (res.menus)).length === 0) {
res.menus = [{ value: '' }];
}
icon = 'search';
iconTheme = 'outline';
}
if ((/** @type {?} */ (res.menus)).length === 0) {
return null;
}
if (typeof res.multiple === 'undefined') {
res.multiple = true;
}
res.confirmText = res.confirmText || this.cog.filterConfirmText;
res.clearText = res.clearText || this.cog.filterClearText;
res.key = res.key || item.indexKey;
res.icon = res.icon || icon;
/** @type {?} */
const baseIcon = (/** @type {?} */ ({ type: icon, theme: iconTheme }));
if (typeof res.icon === 'string') {
res.icon = (/** @type {?} */ (Object.assign(Object.assign({}, baseIcon), { type: res.icon })));
}
else {
res.icon = Object.assign(Object.assign({}, baseIcon), res.icon);
}
this.updateDefault(res);
if (this.acl) {
res.menus = (/** @type {?} */ (res.menus)).filter((/**
* @param {?} w
* @return {?}
*/
w => this.acl.can((/** @type {?} */ (w.acl)))));
}
if ((/** @type {?} */ (res.menus)).length <= 0) {
res = null;
}
return res;
}
/**
* @private
* @param {?} item
* @return {?}
*/
restoreRender(item) {
if (item.renderTitle) {
item.__renderTitle =
typeof item.renderTitle === 'string' ? this.rowSource.getTitle(item.renderTitle) : ((/** @type {?} */ (item.renderTitle)));
}
if (item.render) {
item.__render = typeof item.render === 'string' ? this.rowSource.getRow(item.render) : ((/** @type {?} */ (item.render)));
}
}
/**
* @private
* @param {?} item
* @return {?}
*/
widgetCoerce(item) {
var _a;
if (item.type !== 'widget')
return;
if (item.widget == null || !this.stWidgetRegistry.has(item.widget.type)) {
delete item.type;
warn(`st: No widget for type "${(_a = item.widget) === null || _a === void 0 ? void 0 : _a.type}"`);
}
}
/**
* @private
* @param {?} rootColumns
* @return {?}
*/
genHeaders(rootColumns) {
/** @type {?} */
const rows = [];
/** @type {?} */
const widths = [];
/** @type {?} */
const fillRowCells = (/**
* @param {?} columns
* @param {?} colIndex
* @param {?=} rowIndex
* @return {?}
*/
(columns, colIndex, rowIndex = 0) => {
// Init rows
rows[rowIndex] = rows[rowIndex] || [];
/** @type {?} */
let currentColIndex = colIndex;
/** @type {?} */
const colSpans = columns.map((/**
* @param {?} column
* @return {?}
*/
column => {
/** @type {?} */
const cell = {
column,
colStart: currentColIndex,
hasSubColumns: false,
};
/** @type {?} */
let colSpan = 1;
/** @type {?} */
const subColumns = column.children;
if (Array.isArray(subColumns) && subColumns.length > 0) {
colSpan = fillRowCells(subColumns, currentColIndex, rowIndex + 1).reduce((/**
* @param {?} total
* @param {?} count
* @return {?}
*/
(total, count) => total + count), 0);
cell.hasSubColumns = true;
}
else {
widths.push(((/** @type {?} */ (cell.column.width))) || '');
}
if ('colSpan' in column) {
colSpan = (/** @type {?} */ (column.colSpan));
}
if ('rowSpan' in column) {
cell.rowSpan = column.rowSpan;
}
cell.colSpan = colSpan;
cell.colEnd = cell.colStart + colSpan - 1;
rows[rowIndex].push((/** @type {?} */ (cell)));
currentColIndex += colSpan;
return colSpan;
}));
return colSpans;
});
fillRowCells(rootColumns, 0);
// Handle `rowSpan`
/** @type {?} */
const rowCount = rows.length;
for (let rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {
rows[rowIndex].forEach((/**
* @param {?} cell
* @return {?}
*/
cell => {
if (!('rowSpan' in cell) && !cell.hasSubColumns) {
cell.rowSpan = rowCount - rowIndex;
}
}));
}
return { headers: rows, headerWidths: rowCount > 1 ? widths : null };
}
/**
* @private
* @param {?} list
* @return {?}
*/
cleanCond(list) {
/** @type {?} */
const res = [];
/** @type {?} */
const copyList = deepCopy(list);
for (const item of copyList) {
if (item.iif && !item.iif(item)) {
continue;
}
if (this.acl && item.acl && !this.acl.can(item.acl)) {
continue;
}
res.push(item);
}
return res;
}
/**
* @param {?} list
* @param {?} options
* @return {?}
*/
process(list, options) {
if (!list || list.length === 0)
throw new Error(`[st]: the columns property muse be define!`);
const { noIndex } = this.cog;
/** @type {?} */
let checkboxCount = 0;
/** @type {?} */
let radioCount = 0;
/** @type {?} */
let point = 0;
/** @type {?} */
const columns = [];
/** @type {?} */
const processItem = (/**
* @param {?} item
* @return {?}
*/
(item) => {
// index
if (item.index) {
if (!Array.isArray(item.index)) {
item.index = item.index.split('.');
}
item.indexKey = item.index.join('.');
}
// #region title
/** @type {?} */
const tit = (typeof item.title === 'string' ? { text: item.title } : item.title) || {};
if (tit.i18n && this.i18nSrv) {
tit.text = this.i18nSrv.fanyi(tit.i18n);
}
if (tit.text) {
tit._text = this.dom.bypassSecurityTrustHtml(tit.text);
}
item.title = tit;
// #endregion
// no
if (item.type === 'no') {
item.noIndex = item.noIndex == null ? noIndex : item.noIndex;
}
// checkbox
if (item.selections == null) {
item.selections = [];
}
if (item.type === 'checkbox') {
++checkboxCount;
if (!item.width) {
item.width = `${item.selections.length > 0 ? 62 : 50}px`;
}
}
if (this.acl) {
item.selections = item.selections.filter((/**
* @param {?} w
* @return {?}
*/
w => this.acl.can((/** @type {?} */ (w.acl)))));
}
// radio
if (item.type === 'radio') {
++radioCount;
item.selections = [];
if (!item.width) {
item.width = '50px';
}
}
// types
if (item.type === 'yn') {
item.yn = Object.assign({ truth: true }, item.yn);
}
if ((item.type === 'link' && typeof item.click !== 'function') ||
(item.type === 'badge' && item.badge == null) ||
(item.type === 'tag' && item.tag == null) ||
(item.type === 'enum' && item.enum == null)) {
item.type = '';
}
item._isTruncate = !!item.width && options.widthMode.strictBehavior === 'truncate' && item.type !== 'img';
// className
if (!item.className) {
item.className = ((/** @type {?} */ ({
number: 'text-right',
currency: 'text-right',
date: 'text-center',
})))[(/** @type {?} */ (item.type))];
}
item._className = item.className || (item._isTruncate ? 'text-truncate' : null);
// width
if (typeof item.width === 'number') {
item.width = `${item.width}px`;
}
// sorter
item._sort = this.sortCoerce(item);
// filter
item.filter = (/** @type {?} */ (this.filterCoerce(item)));
// buttons
item.buttons = this.btnCoerce((/** @type {?} */ (item.buttons)));
// widget
this.widgetCoerce(item);
// restore custom row
this.restoreRender(item);
// resizable
item.resizable = Object.assign(Object.assign({ disabled: true, bounds: 'window', minWidth: 60, maxWidth: 360, preview: true }, options.resizable), (typeof item.resizable === 'boolean' ? ((/** @type {?} */ ({ disabled: !item.resizable }))) : item.resizable));
item.__point = point++;
return item;
});
/** @type {?} */
const processList = (/**
* @param {?} data
* @return {?}
*/
(data) => {
for (const item of data) {
columns.push(processItem(item));
if (Array.isArray(item.children)) {
processList(item.children);
}
}
});
/** @type {?} */
const copyList = this.cleanCond((/** @type {?} */ (list)));
processList(copyList);
if (checkboxCount > 1) {
throw new Error(`[st]: just only one column checkbox`);
}
if (radioCount > 1) {
throw new Error(`[st]: just only one column radio`);
}
this.fixedCoerce((/** @type {?} */ (columns)));
return Object.assign({
columns: columns.filter((/**
* @param {?} w
* @return {?}
*/
w => !Array.isArray(w.children) || w.children.length === 0))
}, this.genHeaders(copyList));
}
/**
* @param {?} columns
* @return {?}
*/
restoreAllRender(columns) {
columns.forEach((/**
* @param {?} i
* @return {?}
*/
i => this.restoreRender(i)));
}
/**
* @template THIS
* @this {THIS}
* @param {?} filter
* @return {THIS}
*/
updateDefault(filter) {
if (filter.type === 'default') {
filter.default = (/** @type {?} */ (filter.menus)).findIndex((/**
* @param {?} w
* @return {?}
*/
w => (/** @type {?} */ (w.checked)))) !== -1;
}
else {
filter.default = !!(/** @type {?} */ (filter.menus))[0].value;
}
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} col
* @return {THIS}
*/
cleanFilter(col) {
/** @type {?} */
const f = (/** @type {?} */ (col.filter));
f.default = false;
if (f.type === 'default') {
(/** @type {?} */ (f.menus)).forEach((/**
* @param {?} i
* @return {?}
*/
i => (i.checked = false)));
}
else {
(/** @type {?} */ (f.menus))[0].value = undefined;
}
return (/** @type {?} */ (this));
}
}
STColumnSource.decorators = [
{ type: Injectable }
];
/** @nocollapse */
STColumnSource.ctorParameters = () => [
{ type: DomSanitizer },
{ type: STRowSource, decorators: [{ type: Host }] },
{ type: ACLService, decorators: [{ type: Optional }] },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [OHAYO_I18N_TOKEN,] }] },
{ type: STWidgetRegistry }
];
if (false) {
/**
* @type {?}
* @private
*/
STColumnSource.prototype.cog;
/**
* @type {?}
* @private
*/
STColumnSource.prototype.dom;
/**
* @type {?}
* @private
*/
STColumnSource.prototype.rowSource;
/**
* @type {?}
* @private
*/
STColumnSource.prototype.acl;
/**
* @type {?}
* @private
*/
STColumnSource.prototype.i18nSrv;
/**
* @type {?}
* @private
*/
STColumnSource.prototype.stWidgetRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtY29sdW1uLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9hbmRyb2lkL0BvaGF5b2pwL3BhY2thZ2VzL2NvbXBvbmVudHMvc3QvIiwic291cmNlcyI6WyJzdC1jb2x1bW4tc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQW9CLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xFLE9BQU8sRUFBaUIsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7O0FBYy9DLGtEQUdDOzs7SUFGQyxpREFBdUI7O0lBQ3ZCLGlEQUF1Qjs7QUFJekIsTUFBTSxPQUFPLGNBQWM7Ozs7Ozs7O0lBR3pCLFlBQ1UsR0FBaUIsRUFDVCxTQUFzQixFQUNsQixHQUFlLEVBQ1csT0FBeUIsRUFDL0QsZ0JBQWtDO1FBSmxDLFFBQUcsR0FBSCxHQUFHLENBQWM7UUFDVCxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ2xCLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDVyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUMvRCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQ3hDLENBQUM7Ozs7O0lBRUwsTUFBTSxDQUFDLEdBQWtCO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pCLENBQUM7Ozs7Ozs7SUFFTyxNQUFNLENBQUMsQ0FBaUIsRUFBRSxHQUFzQjtRQUN0RCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxFQUFFO1lBQ3BDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO1lBQ2QsT0FBTztTQUNSOztZQUVHLEdBQUcscUJBQ0YsR0FBRyxDQUNQO1FBQ0QsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNuQjthQUFNLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUNwQyxHQUFHLG1DQUNFLEdBQUcsR0FDSCxDQUFDLENBQUMsR0FBRyxDQUNULENBQUM7U0FDSDtRQUVELElBQUksT0FBTyxHQUFHLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRTtZQUN2QyxHQUFHLENBQUMsU0FBUzs7O1lBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFBLENBQUM7U0FDN0I7UUFFRCxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNkLENBQUM7Ozs7OztJQUVPLFNBQVMsQ0FBQyxJQUFzQjtRQUN0QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDOztjQUNmLEdBQUcsR0FBcUIsRUFBRTtjQUMxQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHO1FBRWhELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNuRCxTQUFTO2FBQ1Y7WUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUNuRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtvQkFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztpQkFDcEI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLEtBQUssK0JBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBSyxLQUFLLEdBQUssSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFDO2lCQUNuRjthQUNGO1lBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7b0JBQ3hELE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztvQkFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7aUJBQ3BCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxNQUFNLCtCQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUssTUFBTSxHQUFLLElBQUksQ0FBQyxNQUFNLENBQUUsQ0FBQztpQkFDdEY7YUFDRjtZQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRTtnQkFDMUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDakI7WUFFRCxNQUFNO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsbUJBQUEsR0FBRyxFQUFDLENBQUMsQ0FBQztZQUV4QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksbUNBQ0osT0FBTyxHQUNQLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3JFLENBQUM7YUFDSDtZQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFL0YsT0FBTztZQUNQLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMzQztZQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEI7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7Ozs7O0lBRU8sV0FBVyxDQUFDLElBQXNCO1FBQ3hDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztnQkFBRSxJQUFJLENBQUMsR0FBRzs7O2dCQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUM1RCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNqQztpQkFBTTtnQkFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQzthQUNwQjtTQUNGO0lBQ0gsQ0FBQzs7Ozs7O0lBRU8sV0FBVyxDQUFDLElBQWlCOztjQUM3QixXQUFXOzs7OztRQUFHLENBQUMsQ0FBUyxFQUFFLENBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQUEsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDM0YsYUFBYTtRQUNiLElBQUk7YUFDRCxNQUFNOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUM7YUFDckQsT0FBTzs7Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFDLENBQUM7UUFDM0YsY0FBYztRQUNkLElBQUk7YUFDRCxNQUFNOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUM7YUFDdEQsT0FBTyxFQUFFO2FBQ1QsT0FBTzs7Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBQyxDQUFDO0lBQzVHLENBQUM7Ozs7OztJQUVPLFVBQVUsQ0FBQyxJQUFlOztjQUMxQixHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFDcEMsR0FBRyxDQUFDLE1BQU0sbUNBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQ25CLEdBQUcsQ0FBQyxNQUFNLENBQ2QsQ0FBQztRQUNGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7Ozs7O0lBRU8sYUFBYSxDQUFDLElBQWU7UUFDbkMsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDM0I7O1lBRUcsR0FBRyxHQUFjLEVBQUU7UUFFdkIsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ2pDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNyQjthQUFNLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN6QyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNqQjthQUFNLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN6QyxHQUFHLENBQUMsT0FBTzs7Ozs7WUFBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsbUJBQUEsSUFBSSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUEsQ0FBQztTQUMvRDtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1osR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3pCO1FBRUQsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFbkIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOzs7Ozs7SUFFTyxZQUFZLENBQUMsSUFBZTtRQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7O1lBRUcsR0FBRyxHQUEwQixJQUFJLENBQUMsTUFBTTtRQUM1QyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDOztZQUU3QixJQUFJLEdBQUcsUUFBUTs7WUFDZixTQUFTLEdBQUcsTUFBTTtRQUN0QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzFCLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksbUJBQUEsR0FBRyxDQUFDLEtBQUssRUFBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2hELEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzdCO1lBQ0QsSUFBSSxHQUFHLFFBQVEsQ0FBQztZQUNoQixTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxtQkFBQSxHQUFHLENBQUMsS0FBSyxFQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFO1lBQ3ZDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQ3JCO1FBRUQsR0FBRyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7UUFDaEUsR0FBRyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO1FBQzFELEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7O2NBRXRCLFFBQVEsR0FBRyxtQkFBQSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFVO1FBQzNELElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxHQUFHLENBQUMsSUFBSSxHQUFHLG1EQUFLLFFBQVEsS0FBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBWSxDQUFDO1NBQ3REO2FBQU07WUFDTCxHQUFHLENBQUMsSUFBSSxtQ0FBUSxRQUFRLEdBQUssR0FBRyxDQUFDLElBQUksQ0FBRSxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDWixHQUFHLENBQUMsS0FBSyxHQUFHLG1CQUFBLEdBQUcsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxNQUFNOzs7O1lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxtQkFBQSxDQUFDLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxtQkFBQSxHQUFHLENBQUMsS0FBSyxFQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUMxQixHQUFHLEdBQUcsSUFBSSxDQUFDO1NBQ1o7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Ozs7OztJQUVPLGFBQWEsQ0FBQyxJQUFlO1FBQ25DLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsYUFBYTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFBLElBQUksQ0FBQyxXQUFXLEVBQXFCLENBQUMsQ0FBQztTQUM5SDtRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFBLElBQUksQ0FBQyxNQUFNLEVBQXFCLENBQUMsQ0FBQztTQUMzSDtJQUNILENBQUM7Ozs7OztJQUVPLFlBQVksQ0FBQyxJQUFlOztRQUNsQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLDJCQUEyQixNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLElBQUksR0FBRyxDQUFDLENBQUM7U0FDdkQ7SUFDSCxDQUFDOzs7Ozs7SUFFTyxVQUFVLENBQUMsV0FBd0I7O2NBQ25DLElBQUksR0FBa0IsRUFBRTs7Y0FDeEIsTUFBTSxHQUFhLEVBQUU7O2NBQ3JCLFlBQVk7Ozs7OztRQUFHLENBQUMsT0FBb0IsRUFBRSxRQUFnQixFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQVksRUFBRTtZQUN0RixZQUFZO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7O2dCQUVsQyxlQUFlLEdBQUcsUUFBUTs7a0JBQ3hCLFFBQVEsR0FBYSxPQUFPLENBQUMsR0FBRzs7OztZQUFDLE1BQU0sQ0FBQyxFQUFFOztzQkFDeEMsSUFBSSxHQUFzQjtvQkFDOUIsTUFBTTtvQkFDTixRQUFRLEVBQUUsZUFBZTtvQkFDekIsYUFBYSxFQUFFLEtBQUs7aUJBQ3JCOztvQkFFRyxPQUFPLEdBQVcsQ0FBQzs7c0JBRWpCLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUTtnQkFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN0RCxPQUFPLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU07Ozs7O29CQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRSxDQUFDLENBQUMsQ0FBQztvQkFDN0csSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7aUJBQzNCO3FCQUFNO29CQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ2xEO2dCQUVELElBQUksU0FBUyxJQUFJLE1BQU0sRUFBRTtvQkFDdkIsT0FBTyxHQUFHLG1CQUFBLE1BQU0sQ0FBQyxPQUFPLEVBQUMsQ0FBQztpQkFDM0I7Z0JBRUQsSUFBSSxTQUFTLElBQUksTUFBTSxFQUFFO29CQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7aUJBQy9CO2dCQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBQSxJQUFJLEVBQWEsQ0FBQyxDQUFDO2dCQUV2QyxlQUFlLElBQUksT0FBTyxDQUFDO2dCQUUzQixPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDLEVBQUM7WUFFRixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUE7UUFFRCxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7Y0FHdkIsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQzVCLEtBQUssSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxRQUFRLEVBQUUsUUFBUSxJQUFJLENBQUMsRUFBRTtZQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTzs7OztZQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM1QixJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUM7aUJBQ3BDO1lBQ0gsQ0FBQyxFQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZFLENBQUM7Ozs7OztJQUVPLFNBQVMsQ0FBQyxJQUFpQjs7Y0FDM0IsR0FBRyxHQUFnQixFQUFFOztjQUNyQixRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMvQixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRTtZQUMzQixJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQixTQUFTO2FBQ1Y7WUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbkQsU0FBUzthQUNWO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7Ozs7O0lBRUQsT0FBTyxDQUNMLElBQWdCLEVBQ2hCLE9BQXFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2NBRXhGLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUc7O1lBQ3hCLGFBQWEsR0FBRyxDQUFDOztZQUNqQixVQUFVLEdBQUcsQ0FBQzs7WUFDZCxLQUFLLEdBQUcsQ0FBQzs7Y0FDUCxPQUFPLEdBQWdCLEVBQUU7O2NBRXpCLFdBQVc7Ozs7UUFBRyxDQUFDLElBQWUsRUFBYSxFQUFFO1lBQ2pELFFBQVE7WUFDUixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQztnQkFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3RDOzs7a0JBSUssR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtZQUN0RixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDNUIsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDekM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ1osR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4RDtZQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBRWpCLGFBQWE7WUFFYixLQUFLO1lBQ0wsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQzlEO1lBQ0QsV0FBVztZQUNYLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtnQkFDNUIsRUFBRSxhQUFhLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7aUJBQzFEO2FBQ0Y7WUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07Ozs7Z0JBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxtQkFBQSxDQUFDLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxDQUFDO2FBQ3JFO1lBQ0QsUUFBUTtZQUNSLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7Z0JBQ3pCLEVBQUUsVUFBVSxDQUFDO2dCQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDZixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztpQkFDckI7YUFDRjtZQUNELFFBQVE7WUFDUixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO2dCQUN0QixJQUFJLENBQUMsRUFBRSxtQkFBSyxLQUFLLEVBQUUsSUFBSSxJQUFLLElBQUksQ0FBQyxFQUFFLENBQUUsQ0FBQzthQUN2QztZQUNELElBQ0UsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDO2dCQUMxRCxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO2dCQUM3QyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDO2dCQUN6QyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQzNDO2dCQUNBLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUM7WUFDMUcsWUFBWTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsbUJBQUE7b0JBQ2hCLE1BQU0sRUFBRSxZQUFZO29CQUNwQixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsSUFBSSxFQUFFLGFBQWE7aUJBQ3BCLEVBQWEsQ0FBQyxDQUFDLG1CQUFBLElBQUksQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQzdCO1lBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRixRQUFRO1lBQ1IsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDO2FBQ2hDO1lBRUQsU0FBUztZQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxTQUFTO1lBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxtQkFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFrQixDQUFDO1lBQ3hELFVBQVU7WUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQUEsSUFBSSxDQUFDLE9BQU8sRUFBQyxDQUFDLENBQUM7WUFDN0MsU0FBUztZQUNULElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEIscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsWUFBWTtZQUNaLElBQUksQ0FBQyxTQUFTLGlDQUNaLFFBQVEsRUFBRSxJQUFJLEVBQ2QsTUFBTSxFQUFFLFFBQVEsRUFDaEIsUUFBUSxFQUFFLEVBQUUsRUFDWixRQUFRLEVBQUUsR0FBRyxFQUNiLE9BQU8sRUFBRSxJQUFJLElBQ1YsT0FBTyxDQUFDLFNBQVMsR0FDakIsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFBLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMzRyxDQUFDO1lBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUV2QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQTs7Y0FFSyxXQUFXOzs7O1FBQUcsQ0FBQyxJQUFpQixFQUFRLEVBQUU7WUFDOUMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ2hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzVCO2FBQ0Y7UUFDSCxDQUFDLENBQUE7O2NBRUssUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQUEsSUFBSSxFQUFlLENBQUM7UUFDcEQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRCLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBQSxPQUFPLEVBQWUsQ0FBQyxDQUFDO1FBQ3pDLHVCQUFTLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUMsSUFBSyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFHO0lBQy9ILENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsT0FBb0I7UUFDbkMsT0FBTyxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUM5QyxDQUFDOzs7Ozs7O0lBRUQsYUFBYSxDQUFDLE1BQXNCO1FBQ2xDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDN0IsTUFBTSxDQUFDLE9BQU8sR0FBRyxtQkFBQSxNQUFNLENBQUMsS0FBSyxFQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsbUJBQUEsQ0FBQyxDQUFDLE9BQU8sRUFBQyxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDbEU7YUFBTTtZQUNMLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLG1CQUFBLE1BQU0sQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDM0M7UUFDRCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7OztJQUVELFdBQVcsQ0FBQyxHQUFjOztjQUNsQixDQUFDLEdBQUcsbUJBQUEsR0FBRyxDQUFDLE1BQU0sRUFBQztRQUNyQixDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3hCLG1CQUFBLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxPQUFPOzs7O1lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLEVBQUMsQ0FBQztTQUM1QzthQUFNO1lBQ0wsbUJBQUEsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7U0FDL0I7UUFDRCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7O1lBdmNGLFVBQVU7Ozs7WUF6QkYsWUFBWTtZQUtaLFdBQVcsdUJBMEJmLElBQUk7WUE5QkEsVUFBVSx1QkErQmQsUUFBUTs0Q0FDUixRQUFRLFlBQUksTUFBTSxTQUFDLGdCQUFnQjtZQTNCL0IsZ0JBQWdCOzs7Ozs7O0lBcUJ2Qiw2QkFBMkI7Ozs7O0lBR3pCLDZCQUF5Qjs7Ozs7SUFDekIsbUNBQXNDOzs7OztJQUN0Qyw2QkFBbUM7Ozs7O0lBQ25DLGlDQUF1RTs7Ozs7SUFDdkUsMENBQTBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSG9zdCwgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQUNMU2VydmljZSB9IGZyb20gJ0BvaGF5by9hY2wnO1xuaW1wb3J0IHsgT2hheW9JMThOU2VydmljZSwgT0hBWU9fSTE4Tl9UT0tFTiB9IGZyb20gJ0BvaGF5by90aGVtZSc7XG5pbXBvcnQgeyBPaGF5b1NUQ29uZmlnLCBkZWVwQ29weSwgd2FybiB9IGZyb20gJ0BvaGF5by91dGlsJztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBTVFJvd1NvdXJjZSB9IGZyb20gJy4vc3Qtcm93LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTVFdpZGdldFJlZ2lzdHJ5IH0gZnJvbSAnLi9zdC13aWRnZXQnO1xuaW1wb3J0IHtcbiAgU1RDb2x1bW4sXG4gIFNUQ29sdW1uQnV0dG9uLFxuICBTVENvbHVtbkJ1dHRvblBvcCxcbiAgU1RDb2x1bW5GaWx0ZXIsXG4gIFNUQ29sdW1uR3JvdXBUeXBlLFxuICBTVEljb24sXG4gIFNUUmVzaXphYmxlLFxuICBTVFNvcnRNYXAsXG4gIFNUV2lkdGhNb2RlLFxufSBmcm9tICcuL3N0LmludGVyZmFjZXMnO1xuaW1wb3J0IHsgX1NUQ29sdW1uIH0gZnJvbSAnLi9zdC50eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU1RDb2x1bW5Tb3VyY2VQcm9jZXNzT3B0aW9ucyB7XG4gIHdpZHRoTW9kZTogU1RXaWR0aE1vZGU7XG4gIHJlc2l6YWJsZTogU1RSZXNpemFibGU7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTVENvbHVtblNvdXJjZSB7XG4gIHByaXZhdGUgY29nOiBPaGF5b1NUQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZG9tOiBEb21TYW5pdGl6ZXIsXG4gICAgQEhvc3QoKSBwcml2YXRlIHJvd1NvdXJjZTogU1RSb3dTb3VyY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBhY2w6IEFDTFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChPSEFZT19JMThOX1RPS0VOKSBwcml2YXRlIGkxOG5TcnY6IE9oYXlvSTE4TlNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdFdpZGdldFJlZ2lzdHJ5OiBTVFdpZGdldFJlZ2lzdHJ5LFxuICApIHsgfVxuXG4gIHNldENvZyh2YWw6IE9oYXlvU1RDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmNvZyA9IHZhbDtcbiAgfVxuXG4gIHByaXZhdGUgZml4UG9wKGk6IFNUQ29sdW1uQnV0dG9uLCBkZWY6IFNUQ29sdW1uQnV0dG9uUG9wKTogdm9pZCB7XG4gICAgaWYgKGkucG9wID09IG51bGwgfHwgaS5wb3AgPT09IGZhbHNlKSB7XG4gICAgICBpLnBvcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwb3AgPSB7XG4gICAgICAuLi5kZWYsXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIGkucG9wID09PSAnc3RyaW5nJykge1xuICAgICAgcG9wLnRpdGxlID0gaS5wb3A7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaS5wb3AgPT09ICdvYmplY3QnKSB7XG4gICAgICBwb3AgPSB7XG4gICAgICAgIC4uLnBvcCxcbiAgICAgICAgLi4uaS5wb3AsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcG9wLmNvbmRpdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcG9wLmNvbmRpdGlvbiA9ICgpID0+IGZhbHNlO1xuICAgIH1cblxuICAgIGkucG9wID0gcG9wO1xuICB9XG5cbiAgcHJpdmF0ZSBidG5Db2VyY2UobGlzdDogU1RDb2x1bW5CdXR0b25bXSk6IFNUQ29sdW1uQnV0dG9uW10ge1xuICAgIGlmICghbGlzdCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHJldDogU1RDb2x1bW5CdXR0b25bXSA9IFtdO1xuICAgIGNvbnN0IHsgbW9kYWwsIGRyYXdlciwgcG9wLCBidG5JY29uIH0gPSB0aGlzLmNvZztcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0KSB7XG4gICAgICBpZiAodGhpcy5hY2wgJiYgaXRlbS5hY2wgJiYgIXRoaXMuYWNsLmNhbihpdGVtLmFjbCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdtb2RhbCcgfHwgaXRlbS50eXBlID09PSAnc3RhdGljJykge1xuICAgICAgICBpZiAoaXRlbS5tb2RhbCA9PSBudWxsIHx8IGl0ZW0ubW9kYWwuY29tcG9uZW50ID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtzdF0gU2hvdWxkIHNwZWNpZnkgbW9kYWwgcGFyYW1ldGVyYCk7XG4gICAgICAgICAgaXRlbS50eXBlID0gJ25vbmUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0ubW9kYWwgPSB7IC4uLnsgcGFyYW1zTmFtZTogJ3JlY29yZCcsIHNpemU6ICdsZycgfSwgLi4ubW9kYWwsIC4uLml0ZW0ubW9kYWwgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS50eXBlID09PSAnZHJhd2VyJykge1xuICAgICAgICBpZiAoaXRlbS5kcmF3ZXIgPT0gbnVsbCB8fCBpdGVtLmRyYXdlci5jb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3N0XSBTaG91bGQgc3BlY2lmeSBkcmF3ZXIgcGFyYW1ldGVyYCk7XG4gICAgICAgICAgaXRlbS50eXBlID0gJ25vbmUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0uZHJhd2VyID0geyAuLi57IHBhcmFtc05hbWU6ICdyZWNvcmQnLCBzaXplOiAnbGcnIH0sIC4uLmRyYXdlciwgLi4uaXRlbS5kcmF3ZXIgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS50eXBlID09PSAnZGVsJyAmJiB0eXBlb2YgaXRlbS5wb3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGl0ZW0ucG9wID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gcG9wXG4gICAgICB0aGlzLmZpeFBvcChpdGVtLCBwb3AhKTtcblxuICAgICAgaWYgKGl0ZW0uaWNvbikge1xuICAgICAgICBpdGVtLmljb24gPSB7XG4gICAgICAgICAgLi4uYnRuSWNvbixcbiAgICAgICAgICAuLi4odHlwZW9mIGl0ZW0uaWNvbiA9PT0gJ3N0cmluZycgPyB7IHR5cGU6IGl0ZW0uaWNvbiB9IDogaXRlbS5pY29uKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaXRlbS5jaGlsZHJlbiA9IGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwID8gdGhpcy5idG5Db2VyY2UoaXRlbS5jaGlsZHJlbikgOiBbXTtcblxuICAgICAgLy8gaTE4blxuICAgICAgaWYgKGl0ZW0uaTE4biAmJiB0aGlzLmkxOG5TcnYpIHtcbiAgICAgICAgaXRlbS50ZXh0ID0gdGhpcy5pMThuU3J2LmZhbnlpKGl0ZW0uaTE4bik7XG4gICAgICB9XG5cbiAgICAgIHJldC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLmJ0bkNvZXJjZUlmKHJldCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgYnRuQ29lcmNlSWYobGlzdDogU1RDb2x1bW5CdXR0b25bXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0KSB7XG4gICAgICBpZiAoIWl0ZW0uaWlmKSBpdGVtLmlpZiA9ICgpID0+IHRydWU7XG4gICAgICBpdGVtLmlpZkJlaGF2aW9yID0gaXRlbS5paWZCZWhhdmlvciB8fCB0aGlzLmNvZy5paWZCZWhhdmlvcjtcbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmJ0bkNvZXJjZUlmKGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5jaGlsZHJlbiA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZml4ZWRDb2VyY2UobGlzdDogX1NUQ29sdW1uW10pOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudFJlZHVjZSA9IChhOiBudW1iZXIsIGI6IF9TVENvbHVtbikgPT4gYSArICtiLndpZHRoIS50b1N0cmluZygpLnJlcGxhY2UoJ3B4JywgJycpO1xuICAgIC8vIGxlZnQgd2lkdGhcbiAgICBsaXN0XG4gICAgICAuZmlsdGVyKHcgPT4gdy5maXhlZCAmJiB3LmZpeGVkID09PSAnbGVmdCcgJiYgdy53aWR0aClcbiAgICAgIC5mb3JFYWNoKChpdGVtLCBpZHgpID0+IChpdGVtLl9sZWZ0ID0gbGlzdC5zbGljZSgwLCBpZHgpLnJlZHVjZShjb3VudFJlZHVjZSwgMCkgKyAncHgnKSk7XG4gICAgLy8gcmlnaHQgd2lkdGhcbiAgICBsaXN0XG4gICAgICAuZmlsdGVyKHcgPT4gdy5maXhlZCAmJiB3LmZpeGVkID09PSAncmlnaHQnICYmIHcud2lkdGgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiAoaXRlbS5fcmlnaHQgPSAoaWR4ID4gMCA/IGxpc3Quc2xpY2UoLWlkeCkucmVkdWNlKGNvdW50UmVkdWNlLCAwKSA6IDApICsgJ3B4JykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3J0Q29lcmNlKGl0ZW06IF9TVENvbHVtbik6IFNUU29ydE1hcCB7XG4gICAgY29uc3QgcmVzID0gdGhpcy5maXhTb3J0Q29lcmNlKGl0ZW0pO1xuICAgIHJlcy5yZU5hbWUgPSB7XG4gICAgICAuLi50aGlzLmNvZy5zb3J0UmVOYW1lLFxuICAgICAgLi4ucmVzLnJlTmFtZSxcbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGZpeFNvcnRDb2VyY2UoaXRlbTogX1NUQ29sdW1uKTogU1RTb3J0TWFwIHtcbiAgICBpZiAodHlwZW9mIGl0ZW0uc29ydCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB7IGVuYWJsZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgbGV0IHJlczogU1RTb3J0TWFwID0ge307XG5cbiAgICBpZiAodHlwZW9mIGl0ZW0uc29ydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcy5rZXkgPSBpdGVtLnNvcnQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaXRlbS5zb3J0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHJlcyA9IGl0ZW0uc29ydDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtLnNvcnQgPT09ICdib29sZWFuJykge1xuICAgICAgcmVzLmNvbXBhcmUgPSAoYSwgYikgPT4gYVtpdGVtLmluZGV4S2V5IV0gLSBiW2l0ZW0uaW5kZXhLZXkhXTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcy5rZXkpIHtcbiAgICAgIHJlcy5rZXkgPSBpdGVtLmluZGV4S2V5O1xuICAgIH1cblxuICAgIHJlcy5lbmFibGVkID0gdHJ1ZTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckNvZXJjZShpdGVtOiBfU1RDb2x1bW4pOiBTVENvbHVtbkZpbHRlciB8IG51bGwge1xuICAgIGlmIChpdGVtLmZpbHRlciA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgcmVzOiBTVENvbHVtbkZpbHRlciB8IG51bGwgPSBpdGVtLmZpbHRlcjtcbiAgICByZXMudHlwZSA9IHJlcy50eXBlIHx8ICdkZWZhdWx0JztcblxuICAgIGxldCBpY29uID0gJ2ZpbHRlcic7XG4gICAgbGV0IGljb25UaGVtZSA9ICdmaWxsJztcbiAgICBpZiAocmVzLnR5cGUgPT09ICdrZXl3b3JkJykge1xuICAgICAgaWYgKHJlcy5tZW51cyA9PSBudWxsIHx8IHJlcy5tZW51cyEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcy5tZW51cyA9IFt7IHZhbHVlOiAnJyB9XTtcbiAgICAgIH1cbiAgICAgIGljb24gPSAnc2VhcmNoJztcbiAgICAgIGljb25UaGVtZSA9ICdvdXRsaW5lJztcbiAgICB9XG5cbiAgICBpZiAocmVzLm1lbnVzIS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVzLm11bHRpcGxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmVzLm11bHRpcGxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXMuY29uZmlybVRleHQgPSByZXMuY29uZmlybVRleHQgfHwgdGhpcy5jb2cuZmlsdGVyQ29uZmly