@datagrok-libraries/statistics 1.6.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -6
- package/src/fit/fit-curve.d.ts +11 -1
- package/src/fit/fit-curve.d.ts.map +1 -1
- package/src/fit/fit-curve.js +55 -18
- package/src/fit/fitting-algorithm/optimizer-nelder-mead.d.ts +1 -1
- package/src/fit/fitting-algorithm/optimizer-nelder-mead.js +2 -2
- package/src/fit/fitting-algorithm/optimizer.d.ts.map +1 -1
- package/src/fit/fitting-algorithm/optimizer.js +3 -2
- package/src/fit/new-fit-API.d.ts +167 -0
- package/src/fit/new-fit-API.d.ts.map +1 -0
- package/src/fit/new-fit-API.js +286 -0
- package/src/mpo/mpo-line-editor.d.ts +10 -0
- package/src/mpo/mpo-line-editor.d.ts.map +1 -0
- package/src/mpo/mpo-line-editor.js +258 -0
- package/src/mpo/mpo-profile-editor.d.ts +13 -0
- package/src/mpo/mpo-profile-editor.d.ts.map +1 -0
- package/src/mpo/mpo-profile-editor.js +79 -0
- package/src/mpo/mpo.d.ts +19 -0
- package/src/mpo/mpo.d.ts.map +1 -0
- package/src/mpo/mpo.js +52 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
import { FIT_FUNCTION_LINEAR, linear, FIT_FUNCTION_SIGMOID, sigmoid, FIT_FUNCTION_LOG_LINEAR, logLinear, FIT_FUNCTION_EXPONENTIAL, exponential, FIT_FUNCTION_4PL_REGRESSION, fourPLRegression, getAuc, getDetCoeff, } from './fit-curve';
|
|
3
|
+
import { fitSeries, getDataPoints } from './fit-data';
|
|
4
|
+
/** Class for the fit functions */
|
|
5
|
+
export class FitFunction {
|
|
6
|
+
}
|
|
7
|
+
export const FitFunctionTypes = {
|
|
8
|
+
SIGMOID: 'sigmoid',
|
|
9
|
+
LINEAR: 'linear',
|
|
10
|
+
LOG_LINEAR: 'log-linear',
|
|
11
|
+
EXPONENTIAL: 'exponential',
|
|
12
|
+
FOUR_PL_REGRESSION: '4pl-regression',
|
|
13
|
+
};
|
|
14
|
+
export class Fit {
|
|
15
|
+
constructor(values, data) {
|
|
16
|
+
this.auc = values.auc;
|
|
17
|
+
this.rSquared = values.rSquared;
|
|
18
|
+
this.series = data;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
class LinearFit extends Fit {
|
|
22
|
+
get name() {
|
|
23
|
+
return FIT_FUNCTION_LINEAR;
|
|
24
|
+
}
|
|
25
|
+
constructor(values, data) {
|
|
26
|
+
super(values, data);
|
|
27
|
+
this.slope = values.slope;
|
|
28
|
+
this.intercept = values.intercept;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
class LogLinearFit extends LinearFit {
|
|
32
|
+
get name() {
|
|
33
|
+
return FIT_FUNCTION_LOG_LINEAR;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class SigmoidFit extends Fit {
|
|
37
|
+
get name() {
|
|
38
|
+
return FIT_FUNCTION_SIGMOID;
|
|
39
|
+
}
|
|
40
|
+
constructor(values, data) {
|
|
41
|
+
super(values, data);
|
|
42
|
+
this.top = values.top;
|
|
43
|
+
this.slope = values.slope;
|
|
44
|
+
this.ic50 = values.ic50;
|
|
45
|
+
this.bottom = values.bottom;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
class ExponentialFit extends Fit {
|
|
49
|
+
get name() {
|
|
50
|
+
return FIT_FUNCTION_EXPONENTIAL;
|
|
51
|
+
}
|
|
52
|
+
constructor(values, data) {
|
|
53
|
+
super(values, data);
|
|
54
|
+
this.mantissa = values.mantissa;
|
|
55
|
+
this.power = values.power;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
class FourPLRegressionFit extends Fit {
|
|
59
|
+
get name() {
|
|
60
|
+
return FIT_FUNCTION_4PL_REGRESSION;
|
|
61
|
+
}
|
|
62
|
+
constructor(values, data) {
|
|
63
|
+
super(values, data);
|
|
64
|
+
this.top = values.top;
|
|
65
|
+
this.bottom = values.bottom;
|
|
66
|
+
this.slope = values.slope;
|
|
67
|
+
this.ec50 = values.ec50;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function getAucAndRsquared(fitCurve, data) {
|
|
71
|
+
return {
|
|
72
|
+
auc: getAuc(fitCurve, data),
|
|
73
|
+
rSquared: getDetCoeff(fitCurve, data),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Class that implements the linear function */
|
|
77
|
+
export class LinearFunction extends FitFunction {
|
|
78
|
+
get name() {
|
|
79
|
+
return FIT_FUNCTION_LINEAR;
|
|
80
|
+
}
|
|
81
|
+
get parameterNames() {
|
|
82
|
+
return ['Slope', 'Intercept'];
|
|
83
|
+
}
|
|
84
|
+
fillParams(fitCurve, data) {
|
|
85
|
+
return new LinearFit({
|
|
86
|
+
...getAucAndRsquared(fitCurve.fittedCurve, getDataPoints(data)),
|
|
87
|
+
slope: fitCurve.parameters[0],
|
|
88
|
+
intercept: fitCurve.parameters[1],
|
|
89
|
+
}, data);
|
|
90
|
+
}
|
|
91
|
+
y(params, x) {
|
|
92
|
+
return linear(params, x);
|
|
93
|
+
}
|
|
94
|
+
getInitialParameters(x, y) {
|
|
95
|
+
let minIndex = 0;
|
|
96
|
+
let maxIndex = 0;
|
|
97
|
+
for (let i = 1; i < x.length; i++) {
|
|
98
|
+
if (x[i] < x[minIndex])
|
|
99
|
+
minIndex = i;
|
|
100
|
+
if (x[i] > x[maxIndex])
|
|
101
|
+
maxIndex = i;
|
|
102
|
+
}
|
|
103
|
+
const deltaX = x[maxIndex] - x[minIndex];
|
|
104
|
+
const deltaY = y[maxIndex] - y[minIndex];
|
|
105
|
+
const A = deltaY / deltaX;
|
|
106
|
+
const B = y[maxIndex] - A * x[maxIndex];
|
|
107
|
+
const params = new Float32Array(2);
|
|
108
|
+
params.set([A, B]);
|
|
109
|
+
return params;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Class that implements the sigmoid function */
|
|
113
|
+
export class SigmoidFunction extends FitFunction {
|
|
114
|
+
get name() {
|
|
115
|
+
return FIT_FUNCTION_SIGMOID;
|
|
116
|
+
}
|
|
117
|
+
get parameterNames() {
|
|
118
|
+
return ['Top', 'Slope', 'IC50', 'Bottom'];
|
|
119
|
+
}
|
|
120
|
+
fillParams(fitCurve, data) {
|
|
121
|
+
return new SigmoidFit({
|
|
122
|
+
...getAucAndRsquared(fitCurve.fittedCurve, getDataPoints(data)),
|
|
123
|
+
top: fitCurve.parameters[0],
|
|
124
|
+
slope: fitCurve.parameters[1],
|
|
125
|
+
ic50: fitCurve.parameters[2],
|
|
126
|
+
bottom: fitCurve.parameters[3],
|
|
127
|
+
}, data);
|
|
128
|
+
}
|
|
129
|
+
y(params, x) {
|
|
130
|
+
return sigmoid(params, x);
|
|
131
|
+
}
|
|
132
|
+
getInitialParameters(x, y) {
|
|
133
|
+
const dataBounds = DG.Rect.fromXYArrays(x, y);
|
|
134
|
+
const medY = (dataBounds.maxY - dataBounds.minY) / 2 + dataBounds.minY;
|
|
135
|
+
let maxYInterval = dataBounds.maxY - dataBounds.minY;
|
|
136
|
+
let nearestXIndex = 0;
|
|
137
|
+
for (let i = 0; i < x.length; i++) {
|
|
138
|
+
const currentInterval = Math.abs(y[i] - medY);
|
|
139
|
+
if (currentInterval < maxYInterval) {
|
|
140
|
+
maxYInterval = currentInterval;
|
|
141
|
+
nearestXIndex = i;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const xAtMedY = x[nearestXIndex];
|
|
145
|
+
const slope = y[0] > y[y.length - 1] ? 1 : -1;
|
|
146
|
+
// params are: [max, tan, IC50, min]
|
|
147
|
+
const params = new Float32Array(4);
|
|
148
|
+
params.set([dataBounds.maxY, slope, xAtMedY, dataBounds.minY]);
|
|
149
|
+
return params;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** Class that implements the linear logarithmic function */
|
|
153
|
+
export class LogLinearFunction extends FitFunction {
|
|
154
|
+
get name() {
|
|
155
|
+
return FIT_FUNCTION_LOG_LINEAR;
|
|
156
|
+
}
|
|
157
|
+
get parameterNames() {
|
|
158
|
+
return ['Slope', 'Intercept'];
|
|
159
|
+
}
|
|
160
|
+
fillParams(fitCurve, data) {
|
|
161
|
+
return new LogLinearFit({
|
|
162
|
+
...getAucAndRsquared(fitCurve.fittedCurve, getDataPoints(data)),
|
|
163
|
+
slope: fitCurve.parameters[0],
|
|
164
|
+
intercept: fitCurve.parameters[1],
|
|
165
|
+
}, data);
|
|
166
|
+
}
|
|
167
|
+
y(params, x) {
|
|
168
|
+
return logLinear(params, x);
|
|
169
|
+
}
|
|
170
|
+
getInitialParameters(x, y) {
|
|
171
|
+
const params = new Float32Array(2);
|
|
172
|
+
params.set([-5, 100]);
|
|
173
|
+
return params;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Class that implements the exponential function */
|
|
177
|
+
export class ExponentialFunction extends FitFunction {
|
|
178
|
+
get name() {
|
|
179
|
+
return FIT_FUNCTION_EXPONENTIAL;
|
|
180
|
+
}
|
|
181
|
+
get parameterNames() {
|
|
182
|
+
return ['Mantissa', 'Power'];
|
|
183
|
+
}
|
|
184
|
+
fillParams(fitCurve, data) {
|
|
185
|
+
return new ExponentialFit({
|
|
186
|
+
...getAucAndRsquared(fitCurve.fittedCurve, getDataPoints(data)),
|
|
187
|
+
mantissa: fitCurve.parameters[0],
|
|
188
|
+
power: fitCurve.parameters[1],
|
|
189
|
+
}, data);
|
|
190
|
+
}
|
|
191
|
+
y(params, x) {
|
|
192
|
+
return exponential(params, x);
|
|
193
|
+
}
|
|
194
|
+
getInitialParameters(x, y) {
|
|
195
|
+
const params = new Float32Array(2);
|
|
196
|
+
params.set([100, -2]);
|
|
197
|
+
return params;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/** Class that implements the Four Parameter Logistic Regression function */
|
|
201
|
+
export class FourPLRegressionFunction extends FitFunction {
|
|
202
|
+
get name() {
|
|
203
|
+
return FIT_FUNCTION_4PL_REGRESSION;
|
|
204
|
+
}
|
|
205
|
+
get parameterNames() {
|
|
206
|
+
return ['Top', 'Slope', 'EC50', 'Bottom'];
|
|
207
|
+
}
|
|
208
|
+
fillParams(fitCurve, data) {
|
|
209
|
+
return new FourPLRegressionFit({
|
|
210
|
+
...getAucAndRsquared(fitCurve.fittedCurve, getDataPoints(data)),
|
|
211
|
+
top: fitCurve.parameters[0],
|
|
212
|
+
slope: fitCurve.parameters[1],
|
|
213
|
+
ec50: fitCurve.parameters[2],
|
|
214
|
+
bottom: fitCurve.parameters[3],
|
|
215
|
+
}, data);
|
|
216
|
+
}
|
|
217
|
+
y(params, x) {
|
|
218
|
+
return fourPLRegression(params, x);
|
|
219
|
+
}
|
|
220
|
+
getInitialParameters(x, y) {
|
|
221
|
+
const params = new Float32Array(4);
|
|
222
|
+
const bottom = Math.min(...y);
|
|
223
|
+
const top = Math.max(...y);
|
|
224
|
+
const medY = (top - bottom) / 2 + bottom;
|
|
225
|
+
let maxYInterval = top - bottom;
|
|
226
|
+
let nearestXIndex = 0;
|
|
227
|
+
for (let i = 0; i < x.length; i++) {
|
|
228
|
+
const currentInterval = Math.abs(y[i] - medY);
|
|
229
|
+
if (currentInterval < maxYInterval) {
|
|
230
|
+
maxYInterval = currentInterval;
|
|
231
|
+
nearestXIndex = i;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const ec50 = x[nearestXIndex];
|
|
235
|
+
const slope = y[0] > y[y.length - 1] ? -10 : 10;
|
|
236
|
+
params.set([top, slope, ec50, bottom]);
|
|
237
|
+
return params;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Object with fit functions
|
|
241
|
+
export const fitFunctions = {
|
|
242
|
+
'linear': new LinearFunction(),
|
|
243
|
+
'sigmoid': new SigmoidFunction(),
|
|
244
|
+
'log-linear': new LogLinearFunction(),
|
|
245
|
+
'exponential': new ExponentialFunction(),
|
|
246
|
+
'4pl-regression': new FourPLRegressionFunction(),
|
|
247
|
+
};
|
|
248
|
+
class FitFunctions {
|
|
249
|
+
constructor(series) {
|
|
250
|
+
this.series = series;
|
|
251
|
+
}
|
|
252
|
+
linear() {
|
|
253
|
+
return fitFunctions[FIT_FUNCTION_LINEAR]
|
|
254
|
+
.fillParams(fitSeries(this.series, fitFunctions[FIT_FUNCTION_LINEAR]), this.series);
|
|
255
|
+
}
|
|
256
|
+
logLinear() {
|
|
257
|
+
return fitFunctions[FIT_FUNCTION_LOG_LINEAR]
|
|
258
|
+
.fillParams(fitSeries(this.series, fitFunctions[FIT_FUNCTION_LOG_LINEAR]), this.series);
|
|
259
|
+
}
|
|
260
|
+
sigmoid() {
|
|
261
|
+
return fitFunctions[FIT_FUNCTION_SIGMOID]
|
|
262
|
+
.fillParams(fitSeries(this.series, fitFunctions[FIT_FUNCTION_SIGMOID]), this.series);
|
|
263
|
+
}
|
|
264
|
+
exponential() {
|
|
265
|
+
return fitFunctions[FIT_FUNCTION_EXPONENTIAL]
|
|
266
|
+
.fillParams(fitSeries(this.series, fitFunctions[FIT_FUNCTION_EXPONENTIAL]), this.series);
|
|
267
|
+
}
|
|
268
|
+
fourPL() {
|
|
269
|
+
return fitFunctions[FIT_FUNCTION_4PL_REGRESSION]
|
|
270
|
+
.fillParams(fitSeries(this.series, fitFunctions[FIT_FUNCTION_4PL_REGRESSION]), this.series);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
export class FitSeries {
|
|
274
|
+
constructor(points) {
|
|
275
|
+
this.points = points;
|
|
276
|
+
this.fit = new FitFunctions(this);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const series = new FitSeries([
|
|
280
|
+
{ 'x': 0, 'y': 0 },
|
|
281
|
+
{ 'x': 1, 'y': 0.5 },
|
|
282
|
+
{ 'x': 2, 'y': 1 },
|
|
283
|
+
{ 'x': 3, 'y': 10, 'outlier': true },
|
|
284
|
+
{ 'x': 4, 'y': 0 },
|
|
285
|
+
]);
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LWZpdC1BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJuZXctZml0LUFQSS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsTUFBTSxFQUdOLG9CQUFvQixFQUNwQixPQUFPLEVBQ1AsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCx3QkFBd0IsRUFDeEIsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixnQkFBZ0IsRUFNYSxNQUFNLEVBQUUsV0FBVyxHQUNqRCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUdwRCxrQ0FBa0M7QUFDbEMsTUFBTSxPQUFnQixXQUFXO0NBTWhDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsa0JBQWtCLEVBQUUsZ0JBQWdCO0NBQzVCLENBQUM7QUFtQ1gsTUFBTSxPQUFnQixHQUFHO0lBT3ZCLFlBQXNCLE1BQVksRUFBRSxJQUFlO1FBQ2pELElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBRUQsTUFBTSxTQUFVLFNBQVEsR0FBRztJQUl6QixJQUFJLElBQUk7UUFDTixPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFRCxZQUFZLE1BQWtCLEVBQUUsSUFBZTtRQUM3QyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BCLElBQUks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TUFBbUI7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBc0JGO0FBR0QsTUFBTSxNQUFNLEdBQWMsSUFBSSxTQUFTLENBQUM7SUFDdEMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7SUFDaEIsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUM7SUFDbEIsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUM7SUFDaEIsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQztJQUNsQyxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBQztDQUNqQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtcbiAgRklUX0ZVTkNUSU9OX0xJTkVBUixcbiAgbGluZWFyLFxuICBJRml0U2VyaWVzLFxuICBJRml0UG9pbnQsXG4gIEZJVF9GVU5DVElPTl9TSUdNT0lELFxuICBzaWdtb2lkLFxuICBGSVRfRlVOQ1RJT05fTE9HX0xJTkVBUixcbiAgbG9nTGluZWFyLFxuICBGSVRfRlVOQ1RJT05fRVhQT05FTlRJQUwsXG4gIGV4cG9uZW50aWFsLFxuICBGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT04sXG4gIGZvdXJQTFJlZ3Jlc3Npb24sXG4gIElGaXRGdW5jdGlvbkRlc2NyaXB0aW9uLFxuICBGaXRQYXJhbUJvdW5kcyxcbiAgRml0TWFya2VyVHlwZSxcbiAgRml0T3V0bGllck1hcmtlclR5cGUsXG4gIEZpdExpbmVTdHlsZSxcbiAgRml0RXJyb3JNb2RlbFR5cGUsIEZpdEN1cnZlLCBnZXRBdWMsIGdldERldENvZWZmLFxufSBmcm9tICcuL2ZpdC1jdXJ2ZSc7XG5pbXBvcnQge2ZpdFNlcmllcywgZ2V0RGF0YVBvaW50c30gZnJvbSAnLi9maXQtZGF0YSc7XG5cblxuLyoqIENsYXNzIGZvciB0aGUgZml0IGZ1bmN0aW9ucyAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpdEZ1bmN0aW9uPFQ+IHtcbiAgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBUO1xuICBhYnN0cmFjdCB5KHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpOiBudW1iZXI7XG4gIGFic3RyYWN0IGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheTtcbn1cblxuZXhwb3J0IGNvbnN0IEZpdEZ1bmN0aW9uVHlwZXMgPSB7XG4gIFNJR01PSUQ6ICdzaWdtb2lkJyxcbiAgTElORUFSOiAnbGluZWFyJyxcbiAgTE9HX0xJTkVBUjogJ2xvZy1saW5lYXInLFxuICBFWFBPTkVOVElBTDogJ2V4cG9uZW50aWFsJyxcbiAgRk9VUl9QTF9SRUdSRVNTSU9OOiAnNHBsLXJlZ3Jlc3Npb24nLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRml0RnVuY3Rpb25UeXBlID0gdHlwZW9mIEZpdEZ1bmN0aW9uVHlwZXNba2V5b2YgdHlwZW9mIEZpdEZ1bmN0aW9uVHlwZXNdO1xuXG5pbnRlcmZhY2UgSUZpdCB7XG4gIGF1YzogbnVtYmVyO1xuICByU3F1YXJlZDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUxpbmVhckZpdCBleHRlbmRzIElGaXQge1xuICBzbG9wZTogbnVtYmVyO1xuICBpbnRlcmNlcHQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElMb2dMaW5lYXJGaXQgZXh0ZW5kcyBJTGluZWFyRml0IHt9XG5cbmludGVyZmFjZSBJU2lnbW9pZEZpdCBleHRlbmRzIElGaXQge1xuICB0b3A6IG51bWJlcjtcbiAgc2xvcGU6IG51bWJlcjtcbiAgaWM1MDogbnVtYmVyO1xuICBib3R0b206IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElFeHBvbmVudGlhbEZpdCBleHRlbmRzIElGaXQge1xuICBtYW50aXNzYTogbnVtYmVyO1xuICBwb3dlcjogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUZvdXJQTFJlZ3Jlc3Npb25GaXQgZXh0ZW5kcyBJRml0IHtcbiAgdG9wOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xuICBzbG9wZTogbnVtYmVyO1xuICBlYzUwOiBudW1iZXI7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaXQgaW1wbGVtZW50cyBJRml0IHtcbiAgYXVjOiBudW1iZXI7XG4gIHJTcXVhcmVkOiBudW1iZXI7XG4gIHNlcmllczogRml0U2VyaWVzO1xuXG4gIGFic3RyYWN0IGdldCBuYW1lKCk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IodmFsdWVzOiBJRml0LCBkYXRhOiBGaXRTZXJpZXMpIHtcbiAgICB0aGlzLmF1YyA9IHZhbHVlcy5hdWM7XG4gICAgdGhpcy5yU3F1YXJlZCA9IHZhbHVlcy5yU3F1YXJlZDtcbiAgICB0aGlzLnNlcmllcyA9IGRhdGE7XG4gIH1cbn1cblxuY2xhc3MgTGluZWFyRml0IGV4dGVuZHMgRml0IGltcGxlbWVudHMgSUxpbmVhckZpdCB7XG4gIHNsb3BlOiBudW1iZXI7XG4gIGludGVyY2VwdDogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9MSU5FQVI7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZXM6IElMaW5lYXJGaXQsIGRhdGE6IEZpdFNlcmllcykge1xuICAgIHN1cGVyKHZhbHVlcywgZGF0YSk7XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmludGVyY2VwdCA9IHZhbHVlcy5pbnRlcmNlcHQ7XG4gIH1cbn1cblxuY2xhc3MgTG9nTGluZWFyRml0IGV4dGVuZHMgTGluZWFyRml0IGltcGxlbWVudHMgSUxvZ0xpbmVhckZpdCB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9MT0dfTElORUFSO1xuICB9XG59XG5cbmNsYXNzIFNpZ21vaWRGaXQgZXh0ZW5kcyBGaXQgaW1wbGVtZW50cyBJU2lnbW9pZEZpdCB7XG4gIHRvcDogbnVtYmVyO1xuICBzbG9wZTogbnVtYmVyO1xuICBpYzUwOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9TSUdNT0lEO1xuICB9XG5cbiAgY29uc3RydWN0b3IodmFsdWVzOiBJU2lnbW9pZEZpdCwgZGF0YTogRml0U2VyaWVzKSB7XG4gICAgc3VwZXIodmFsdWVzLCBkYXRhKTtcbiAgICB0aGlzLnRvcCA9IHZhbHVlcy50b3A7XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmljNTAgPSB2YWx1ZXMuaWM1MDtcbiAgICB0aGlzLmJvdHRvbSA9IHZhbHVlcy5ib3R0b207XG4gIH1cbn1cblxuY2xhc3MgRXhwb25lbnRpYWxGaXQgZXh0ZW5kcyBGaXQgaW1wbGVtZW50cyBJRXhwb25lbnRpYWxGaXQge1xuICBtYW50aXNzYTogbnVtYmVyO1xuICBwb3dlcjogbnVtYmVyO1xuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9FWFBPTkVOVElBTDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZhbHVlczogSUV4cG9uZW50aWFsRml0LCBkYXRhOiBGaXRTZXJpZXMpIHtcbiAgICBzdXBlcih2YWx1ZXMsIGRhdGEpO1xuICAgIHRoaXMubWFudGlzc2EgPSB2YWx1ZXMubWFudGlzc2E7XG4gICAgdGhpcy5wb3dlciA9IHZhbHVlcy5wb3dlcjtcbiAgfVxufVxuXG5jbGFzcyBGb3VyUExSZWdyZXNzaW9uRml0IGV4dGVuZHMgRml0IGltcGxlbWVudHMgSUZvdXJQTFJlZ3Jlc3Npb25GaXQge1xuICB0b3A6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG4gIHNsb3BlOiBudW1iZXI7XG4gIGVjNTA6IG51bWJlcjtcblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT047XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2YWx1ZXM6IElGb3VyUExSZWdyZXNzaW9uRml0LCBkYXRhOiBGaXRTZXJpZXMpIHtcbiAgICBzdXBlcih2YWx1ZXMsIGRhdGEpO1xuICAgIHRoaXMudG9wID0gdmFsdWVzLnRvcDtcbiAgICB0aGlzLmJvdHRvbSA9IHZhbHVlcy5ib3R0b207XG4gICAgdGhpcy5zbG9wZSA9IHZhbHVlcy5zbG9wZTtcbiAgICB0aGlzLmVjNTAgPSB2YWx1ZXMuZWM1MDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLCBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IElGaXQge1xuICByZXR1cm4ge1xuICAgIGF1YzogZ2V0QXVjKGZpdEN1cnZlLCBkYXRhKSxcbiAgICByU3F1YXJlZDogZ2V0RGV0Q29lZmYoZml0Q3VydmUsIGRhdGEpLFxuICB9O1xufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBsaW5lYXIgZnVuY3Rpb24gKi9cbmV4cG9ydCBjbGFzcyBMaW5lYXJGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPExpbmVhckZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fTElORUFSO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydTbG9wZScsICdJbnRlcmNlcHQnXTtcbiAgfVxuXG4gIGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBMaW5lYXJGaXQge1xuICAgIHJldHVybiBuZXcgTGluZWFyRml0KHtcbiAgICAgIC4uLmdldEF1Y0FuZFJzcXVhcmVkKGZpdEN1cnZlLmZpdHRlZEN1cnZlLCBnZXREYXRhUG9pbnRzKGRhdGEpKSxcbiAgICAgIHNsb3BlOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzBdLFxuICAgICAgaW50ZXJjZXB0OiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgIH0sIGRhdGEpO1xuICB9XG5cbiAgeShwYXJhbXM6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbGluZWFyKHBhcmFtcywgeCk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBGbG9hdDMyQXJyYXkge1xuICAgIGxldCBtaW5JbmRleCA9IDA7XG4gICAgbGV0IG1heEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh4W2ldIDwgeFttaW5JbmRleF0pXG4gICAgICAgIG1pbkluZGV4ID0gaTtcbiAgICAgIGlmICh4W2ldID4geFttYXhJbmRleF0pXG4gICAgICAgIG1heEluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YVggPSB4W21heEluZGV4XSAtIHhbbWluSW5kZXhdO1xuICAgIGNvbnN0IGRlbHRhWSA9IHlbbWF4SW5kZXhdIC0geVttaW5JbmRleF07XG4gICAgY29uc3QgQSA9IGRlbHRhWSAvIGRlbHRhWDtcbiAgICBjb25zdCBCID0geVttYXhJbmRleF0gLSBBICogeFttYXhJbmRleF07XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEZsb2F0MzJBcnJheSgyKTtcbiAgICBwYXJhbXMuc2V0KFtBLCBCXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBzaWdtb2lkIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgU2lnbW9pZEZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb248U2lnbW9pZEZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fU0lHTU9JRDtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnVG9wJywgJ1Nsb3BlJywgJ0lDNTAnLCAnQm90dG9tJ107XG4gIH1cblxuICBmaWxsUGFyYW1zKGZpdEN1cnZlOiBGaXRDdXJ2ZSwgZGF0YTogRml0U2VyaWVzKTogU2lnbW9pZEZpdCB7XG4gICAgcmV0dXJuIG5ldyBTaWdtb2lkRml0KHtcbiAgICAgIC4uLmdldEF1Y0FuZFJzcXVhcmVkKGZpdEN1cnZlLmZpdHRlZEN1cnZlLCBnZXREYXRhUG9pbnRzKGRhdGEpKSxcbiAgICAgIHRvcDogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIHNsb3BlOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgICAgaWM1MDogZml0Q3VydmUucGFyYW1ldGVyc1syXSxcbiAgICAgIGJvdHRvbTogZml0Q3VydmUucGFyYW1ldGVyc1szXSxcbiAgICB9LCBkYXRhKTtcbiAgfVxuXG4gIHkocGFyYW1zOiBGbG9hdDMyQXJyYXksIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHNpZ21vaWQocGFyYW1zLCB4KTtcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgZGF0YUJvdW5kcyA9IERHLlJlY3QuZnJvbVhZQXJyYXlzKHgsIHkpO1xuICAgIGNvbnN0IG1lZFkgPSAoZGF0YUJvdW5kcy5tYXhZIC0gZGF0YUJvdW5kcy5taW5ZKSAvIDIgKyBkYXRhQm91bmRzLm1pblk7XG4gICAgbGV0IG1heFlJbnRlcnZhbCA9IGRhdGFCb3VuZHMubWF4WSAtIGRhdGFCb3VuZHMubWluWTtcbiAgICBsZXQgbmVhcmVzdFhJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50SW50ZXJ2YWwgPSBNYXRoLmFicyh5W2ldIC0gbWVkWSk7XG4gICAgICBpZiAoY3VycmVudEludGVydmFsIDwgbWF4WUludGVydmFsKSB7XG4gICAgICAgIG1heFlJbnRlcnZhbCA9IGN1cnJlbnRJbnRlcnZhbDtcbiAgICAgICAgbmVhcmVzdFhJbmRleCA9IGk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHhBdE1lZFkgPSB4W25lYXJlc3RYSW5kZXhdO1xuICAgIGNvbnN0IHNsb3BlID0geVswXSA+IHlbeS5sZW5ndGggLSAxXSA/IDEgOiAtMTtcblxuICAgIC8vIHBhcmFtcyBhcmU6IFttYXgsIHRhbiwgSUM1MCwgbWluXVxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgcGFyYW1zLnNldChbZGF0YUJvdW5kcy5tYXhZLCBzbG9wZSwgeEF0TWVkWSwgZGF0YUJvdW5kcy5taW5ZXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBsaW5lYXIgbG9nYXJpdGhtaWMgZnVuY3Rpb24gKi9cbmV4cG9ydCBjbGFzcyBMb2dMaW5lYXJGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPExvZ0xpbmVhckZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fTE9HX0xJTkVBUjtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnU2xvcGUnLCAnSW50ZXJjZXB0J107XG4gIH1cblxuICBmaWxsUGFyYW1zKGZpdEN1cnZlOiBGaXRDdXJ2ZSwgZGF0YTogRml0U2VyaWVzKTogTG9nTGluZWFyRml0IHtcbiAgICByZXR1cm4gbmV3IExvZ0xpbmVhckZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICBzbG9wZTogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIGludGVyY2VwdDogZml0Q3VydmUucGFyYW1ldGVyc1sxXSxcbiAgICB9LCBkYXRhKTtcbiAgfVxuXG4gIHkocGFyYW1zOiBGbG9hdDMyQXJyYXksIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGxvZ0xpbmVhcihwYXJhbXMsIHgpO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgRmxvYXQzMkFycmF5KDIpO1xuICAgIHBhcmFtcy5zZXQoWy01LCAxMDBdKTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG5cbi8qKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGV4cG9uZW50aWFsIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgRXhwb25lbnRpYWxGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uPEV4cG9uZW50aWFsRml0PiB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9FWFBPTkVOVElBTDtcbiAgfVxuXG4gIGdldCBwYXJhbWV0ZXJOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnTWFudGlzc2EnLCAnUG93ZXInXTtcbiAgfVxuXG4gIGZpbGxQYXJhbXMoZml0Q3VydmU6IEZpdEN1cnZlLCBkYXRhOiBGaXRTZXJpZXMpOiBFeHBvbmVudGlhbEZpdCB7XG4gICAgcmV0dXJuIG5ldyBFeHBvbmVudGlhbEZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICBtYW50aXNzYTogZml0Q3VydmUucGFyYW1ldGVyc1swXSxcbiAgICAgIHBvd2VyOiBmaXRDdXJ2ZS5wYXJhbWV0ZXJzWzFdLFxuICAgIH0sIGRhdGEpO1xuICB9XG5cbiAgeShwYXJhbXM6IEZsb2F0MzJBcnJheSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZXhwb25lbnRpYWwocGFyYW1zLCB4KTtcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEZsb2F0MzJBcnJheSgyKTtcbiAgICBwYXJhbXMuc2V0KFsxMDAsIC0yXSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBGb3VyIFBhcmFtZXRlciBMb2dpc3RpYyBSZWdyZXNzaW9uIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgRm91clBMUmVncmVzc2lvbkZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb248Rm91clBMUmVncmVzc2lvbkZpdD4ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fNFBMX1JFR1JFU1NJT047XG4gIH1cblxuICBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ1RvcCcsICdTbG9wZScsICdFQzUwJywgJ0JvdHRvbSddO1xuICB9XG5cbiAgZmlsbFBhcmFtcyhmaXRDdXJ2ZTogRml0Q3VydmUsIGRhdGE6IEZpdFNlcmllcyk6IEZvdXJQTFJlZ3Jlc3Npb25GaXQge1xuICAgIHJldHVybiBuZXcgRm91clBMUmVncmVzc2lvbkZpdCh7XG4gICAgICAuLi5nZXRBdWNBbmRSc3F1YXJlZChmaXRDdXJ2ZS5maXR0ZWRDdXJ2ZSwgZ2V0RGF0YVBvaW50cyhkYXRhKSksXG4gICAgICB0b3A6IGZpdEN1cnZlLnBhcmFtZXRlcnNbMF0sXG4gICAgICBzbG9wZTogZml0Q3VydmUucGFyYW1ldGVyc1sxXSxcbiAgICAgIGVjNTA6IGZpdEN1cnZlLnBhcmFtZXRlcnNbMl0sXG4gICAgICBib3R0b206IGZpdEN1cnZlLnBhcmFtZXRlcnNbM10sXG4gICAgfSwgZGF0YSk7XG4gIH1cblxuICB5KHBhcmFtczogRmxvYXQzMkFycmF5LCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBmb3VyUExSZWdyZXNzaW9uKHBhcmFtcywgeCk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4oLi4ueSk7XG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoLi4ueSk7XG4gICAgY29uc3QgbWVkWSA9ICh0b3AgLSBib3R0b20pIC8gMiArIGJvdHRvbTtcbiAgICBsZXQgbWF4WUludGVydmFsID0gdG9wIC1ib3R0b207XG4gICAgbGV0IG5lYXJlc3RYSW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY3VycmVudEludGVydmFsID0gTWF0aC5hYnMoeVtpXSAtIG1lZFkpO1xuICAgICAgaWYgKGN1cnJlbnRJbnRlcnZhbCA8IG1heFlJbnRlcnZhbCkge1xuICAgICAgICBtYXhZSW50ZXJ2YWwgPSBjdXJyZW50SW50ZXJ2YWw7XG4gICAgICAgIG5lYXJlc3RYSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlYzUwID0geFtuZWFyZXN0WEluZGV4XTtcbiAgICBjb25zdCBzbG9wZSA9IHlbMF0gPiB5W3kubGVuZ3RoIC0gMV0/IC0xMCA6IDEwO1xuICAgIHBhcmFtcy5zZXQoW3RvcCwgc2xvcGUsIGVjNTAsIGJvdHRvbV0pO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbn1cblxuXG4vLyBPYmplY3Qgd2l0aCBmaXQgZnVuY3Rpb25zXG5leHBvcnQgY29uc3QgZml0RnVuY3Rpb25zID0ge1xuICAnbGluZWFyJzogbmV3IExpbmVhckZ1bmN0aW9uKCksXG4gICdzaWdtb2lkJzogbmV3IFNpZ21vaWRGdW5jdGlvbigpLFxuICAnbG9nLWxpbmVhcic6IG5ldyBMb2dMaW5lYXJGdW5jdGlvbigpLFxuICAnZXhwb25lbnRpYWwnOiBuZXcgRXhwb25lbnRpYWxGdW5jdGlvbigpLFxuICAnNHBsLXJlZ3Jlc3Npb24nOiBuZXcgRm91clBMUmVncmVzc2lvbkZ1bmN0aW9uKCksXG59O1xuXG5jbGFzcyBGaXRGdW5jdGlvbnMge1xuICBzZXJpZXM6IEZpdFNlcmllcztcblxuICBjb25zdHJ1Y3RvcihzZXJpZXM6IEZpdFNlcmllcykge1xuICAgIHRoaXMuc2VyaWVzID0gc2VyaWVzO1xuICB9XG5cbiAgbGluZWFyKCk6IExpbmVhckZpdCB7XG4gICAgcmV0dXJuIGZpdEZ1bmN0aW9uc1tGSVRfRlVOQ1RJT05fTElORUFSXVxuICAgICAgLmZpbGxQYXJhbXMoZml0U2VyaWVzKHRoaXMuc2VyaWVzLCBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0xJTkVBUl0pLCB0aGlzLnNlcmllcyk7XG4gIH1cblxuICBsb2dMaW5lYXIoKTogTG9nTGluZWFyRml0IHtcbiAgICByZXR1cm4gZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9MT0dfTElORUFSXVxuICAgICAgLmZpbGxQYXJhbXMoZml0U2VyaWVzKHRoaXMuc2VyaWVzLCBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0xPR19MSU5FQVJdKSwgdGhpcy5zZXJpZXMpO1xuICB9XG5cbiAgc2lnbW9pZCgpOiBTaWdtb2lkRml0IHtcbiAgICByZXR1cm4gZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl9TSUdNT0lEXVxuICAgICAgLmZpbGxQYXJhbXMoZml0U2VyaWVzKHRoaXMuc2VyaWVzLCBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX1NJR01PSURdKSwgdGhpcy5zZXJpZXMpO1xuICB9XG5cbiAgZXhwb25lbnRpYWwoKTogRXhwb25lbnRpYWxGaXQge1xuICAgIHJldHVybiBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0VYUE9ORU5USUFMXVxuICAgICAgLmZpbGxQYXJhbXMoZml0U2VyaWVzKHRoaXMuc2VyaWVzLCBmaXRGdW5jdGlvbnNbRklUX0ZVTkNUSU9OX0VYUE9ORU5USUFMXSksIHRoaXMuc2VyaWVzKTtcbiAgfVxuXG4gIGZvdXJQTCgpOiBGb3VyUExSZWdyZXNzaW9uRml0IHtcbiAgICByZXR1cm4gZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl80UExfUkVHUkVTU0lPTl1cbiAgICAgIC5maWxsUGFyYW1zKGZpdFNlcmllcyh0aGlzLnNlcmllcywgZml0RnVuY3Rpb25zW0ZJVF9GVU5DVElPTl80UExfUkVHUkVTU0lPTl0pLCB0aGlzLnNlcmllcyk7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgRml0U2VyaWVzIGltcGxlbWVudHMgSUZpdFNlcmllcyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcblxuICBmaXQ6IEZpdEZ1bmN0aW9ucztcbiAgcG9pbnRzOiBJRml0UG9pbnRbXTtcblxuICBjb25zdHJ1Y3Rvcihwb2ludHM6IElGaXRQb2ludFtdKSB7XG4gICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG4gICAgdGhpcy5maXQgPSBuZXcgRml0RnVuY3Rpb25zKHRoaXMpO1xuICB9XG5cbiAgbmFtZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250cm9scyB0aGUgc2VyaWVzIG5hbWVcbiAgZml0RnVuY3Rpb24/OiBzdHJpbmcgfCBJRml0RnVuY3Rpb25EZXNjcmlwdGlvbjsgLy8gY29udHJvbHMgdGhlIHNlcmllcyBmaXQgZnVuY3Rpb25cbiAgcGFyYW1ldGVycz86IG51bWJlcltdOyAgICAgICAgICAgICAgICAvLyBjb250cm9scyB0aGUgc2VyaWVzIHBhcmFtZXRlcnMsIGF1dG8tZml0dGluZyB3aGVuIG5vdCBkZWZpbmVkXG4gIHBhcmFtZXRlckJvdW5kcz86IEZpdFBhcmFtQm91bmRzW107ICAgLy8gZGVmaW5lcyB0aGUgYWNjZXB0YWJsZSByYW5nZSBvZiBlYWNoIHBhcmFtZXRlciwgd2hpY2ggaXMgdGFrZW4gaW50byBhY2NvdW50IGR1cmluZyB0aGUgZml0dGluZy4gU2VlIGFsc28gYHBhcmFtZXRlcnNgLlxuICBtYXJrZXJUeXBlPzogRml0TWFya2VyVHlwZTsgICAgICAgICAgIC8vIGRlZmluZXMgdGhlIHNlcmllcyBtYXJrZXIgdHlwZVxuICBvdXRsaWVyTWFya2VyVHlwZT86IEZpdE91dGxpZXJNYXJrZXJUeXBlOyAgLy8gZGVmaW5lcyB0aGUgc2VyaWVzIG91dGxpZXIgbWFya2VyIHR5cGVcbiAgbGluZVN0eWxlPzogRml0TGluZVN0eWxlOyAgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBzZXJpZXMgbGluZSBzdHlsZVxuICBwb2ludENvbG9yPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmRpemVkIHNlcmllcyBwb2ludCBjb2xvclxuICBmaXRMaW5lQ29sb3I/OiBzdHJpbmc7ICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmRpemVkIHNlcmllcyBmaXQgbGluZSBjb2xvclxuICBjb25maWRlbmNlSW50ZXJ2YWxDb2xvcj86IHN0cmluZzsgICAgIC8vIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmRpemVkIHNlcmllcyBjb25maWRlbmNlIGludGVydmFsIGNvbG9yXG4gIG91dGxpZXJDb2xvcj86IHN0cmluZzsgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZGl6ZWQgc2VyaWVzIG91dGxpZXIgY29sb3JcbiAgY29ubmVjdERvdHM/OiBib29sZWFuOyAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdG8gY29ubmVjdCB0aGUgcG9pbnRzIHdpdGggbGluZXMgb3Igbm90LiBJZiB0cnVlIGFuZCBzaG93Rml0TGluZSBpcyBmYWxzZSAtIGZpdHRpbmcgaXMgZGlzYWJsZWQgLSBvdGhlcndpc2UsIGl0IHdpbGwgYmUgcmVuZGVyZWQgYWNjb3JkaW5nbHkgdG8gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgc2hvd0ZpdExpbmU/OiBib29sZWFuOyAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgZml0IGxpbmUgb3Igbm90XG4gIHNob3dQb2ludHM/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgZGF0YSBkaXNwbGF5IG1vZGVcbiAgc2hvd0N1cnZlQ29uZmlkZW5jZUludGVydmFsPzogYm9vbGVhbjsgICAgLy8gZGVmaW5lcyB3aGV0aGVyIHRvIHNob3cgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9yIG5vdFxuICBlcnJvck1vZGVsPzogRml0RXJyb3JNb2RlbFR5cGU7ICAgICAgIC8vIGRlZmluZXMgdGhlIHNlcmllcyBlcnJvciBtb2RlbFxuICBjbGlja1RvVG9nZ2xlPzogYm9vbGVhbjsgICAgLy8gaWYgdHJ1ZSwgY2xpY2tpbmcgb24gdGhlIHBvaW50IHRvZ2dsZXMgaXRzIG91dGxpZXIgc3RhdHVzIGFuZCBjYXVzZXMgY3VydmUgcmVmaXR0aW5nXG4gIGxhYmVscz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFufTsgLy8gY29udHJvbGxlZCBieSBJRml0Q2hhcnREYXRhIGxhYmVsT3B0aW9ucywgc2hvd3MgbGFiZWxzXG4gIGRyb3BsaW5lcz86IHN0cmluZ1tdOyAgICAgICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgZHJvcGxpbmVzIHRoYXQgd291bGQgYmUgc2hvd24gb24gdGhlIHBsb3QgKElDNTApXG4gIGNvbHVtbk5hbWU/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgY29sdW1uIG5hbWUgd2hlcmUgdGhlIHNlcmllcyBpcyBzdG9yZWRcbn1cblxuXG5jb25zdCBzZXJpZXM6IEZpdFNlcmllcyA9IG5ldyBGaXRTZXJpZXMoW1xuICB7J3gnOiAwLCAneSc6IDB9LFxuICB7J3gnOiAxLCAneSc6IDAuNX0sXG4gIHsneCc6IDIsICd5JzogMX0sXG4gIHsneCc6IDMsICd5JzogMTAsICdvdXRsaWVyJzogdHJ1ZX0sXG4gIHsneCc6IDQsICd5JzogMH0sXG5dKTtcbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DesirabilityLine, PropertyDesirability } from './mpo';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
export declare class MpoDesirabilityLineEditor {
|
|
4
|
+
root: HTMLDivElement;
|
|
5
|
+
onChanged: Subject<unknown>;
|
|
6
|
+
private _prop;
|
|
7
|
+
constructor(prop: PropertyDesirability, width: number, height: number);
|
|
8
|
+
get line(): DesirabilityLine;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mpo-line-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mpo-line-editor.d.ts","sourceRoot":"","sources":["mpo-line-editor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,gBAAgB,EAAE,oBAAoB,EAAC,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAO7B,qBAAa,yBAAyB;IACpC,IAAI,iBAAY;IAChB,SAAS,mBAAiB;IAC1B,OAAO,CAAC,KAAK,CAAuB;gBAExB,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IA6PrE,IAAI,IAAI,IAAI,gBAAgB,CAE3B;CACF"}
|