@datagrok-libraries/statistics 1.2.11 → 1.2.13

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/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # statistics changelog
2
2
 
3
+ ## 1.2.13 (2024-04-18)
4
+
5
+ ### Features
6
+
7
+ * [#2754](https://github.com/datagrok-ai/public/issues/2754): Implemented capability just to connect the points (without fitting)
8
+ * ODEs: prepare for fitting attachment
9
+ * [#2101](https://github.com/datagrok-ai/public/issues/2101): Improve curve properties and rendering:
10
+ * Added mergeSeries property
11
+ * Added column labels
12
+
13
+ ### Bug Fixes
14
+
15
+ * Fixed property panel names.
16
+ * [#2103](https://github.com/datagrok-ai/public/issues/2103): Renamed Show Statistics to Statistics
17
+
18
+ ## 1.2.12 (2024-03-14)
19
+
20
+ ### Features
21
+
22
+ * [#2105](https://github.com/datagrok-ai/public/issues/2105): Added outlier color property.
23
+
3
24
  ## 1.2.11 (2023-11-17)
4
25
 
5
26
  ### Features
package/package.json CHANGED
@@ -4,13 +4,13 @@
4
4
  "access": "public"
5
5
  },
6
6
  "friendlyName": "statistics",
7
- "version": "1.2.11",
8
- "description": "",
7
+ "version": "1.2.13",
8
+ "description": "Statistics utilities",
9
9
  "dependencies": {
10
- "datagrok-api": "^1.17.0",
11
- "@datagrok-libraries/utils": "^4.1.0",
12
- "cash-dom": "latest",
13
- "jstat": "latest",
10
+ "datagrok-api": "^1.18.0",
11
+ "@datagrok-libraries/utils": "^4.1.45",
12
+ "cash-dom": "^8.0.0",
13
+ "jstat": "^1.9.6",
14
14
  "dayjs": "^1.11.7"
15
15
  },
16
16
  "devDependencies": {
@@ -77,6 +77,7 @@ export interface IFitPoint {
77
77
  y: number;
78
78
  outlier?: boolean;
79
79
  color?: string;
80
+ outlierColor?: string;
80
81
  marker?: FitMarkerType;
81
82
  size?: number;
82
83
  stdev?: number;
@@ -104,6 +105,8 @@ export interface IFitChartOptions {
104
105
  logX?: boolean;
105
106
  logY?: boolean;
106
107
  allowXZeroes?: boolean;
108
+ mergeSeries?: boolean;
109
+ showColumnLabel?: boolean;
107
110
  showStatistics?: string[];
108
111
  labelOptions?: IFitChartLabelOptions[];
109
112
  }
@@ -130,6 +133,8 @@ export interface IFitSeriesOptions {
130
133
  pointColor?: string;
131
134
  fitLineColor?: string;
132
135
  confidenceIntervalColor?: string;
136
+ outlierColor?: string;
137
+ connectDots?: boolean;
133
138
  showFitLine?: boolean;
134
139
  showPoints?: string;
135
140
  showCurveConfidenceInterval?: boolean;
@@ -139,6 +144,7 @@ export interface IFitSeriesOptions {
139
144
  [key: string]: string | number | boolean;
140
145
  };
141
146
  droplines?: string[];
147
+ columnName?: string;
142
148
  }
143
149
  /** Properties that describe {@link FitStatistics}. Useful for editing, initialization, transformations, etc. */
144
150
  export declare const statisticsProperties: DG.Property[];
@@ -1 +1 @@
1
- {"version":3,"file":"fit-curve.d.ts","sourceRoot":"","sources":["fit-curve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fit-curve.d.ts","sourceRoot":"","sources":["fit-curve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAqBtC,eAAO,MAAM,aAAa;;;CAGzB,CAAC;AAEF,oBAAY,cAAc,GAAG;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;+EAC+E;AAC/E,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,oBAAY,QAAQ,GAAG;IACrB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,oBAAY,sBAAsB,GAAG;IACnC,aAAa,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC,CAAC;AAEF,oBAAY,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IACjC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;EAoBE;AAEF,eAAO,MAAM,YAAY,QAAQ,CAAC;AAClC,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,OAAO,SAAS,CAAC;AAE9B,eAAO,MAAM,gCAAgC,yBAAyB,CAAC;AACvE,eAAO,MAAM,8BAA8B,0BAA0B,CAAC;AAEtE,eAAO,MAAM,gCAAgC;;;CAG5C,CAAC;AAEF,eAAO,MAAM,SAAS,UAAW,CAAC;AAElC,oBAAY,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,iBAAiB,GACpH,eAAe,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAEtD,oBAAY,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;AAExE,oBAAY,iBAAiB,GAAG,UAAU,GAAG,cAAc,CAAC;AAE5D,mHAAmH;AACnH,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAGhB;AAED;mFACmF;AACnF,MAAM,WAAW,UAAW,SAAQ,iBAAiB;IACnD,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mHAAmH;AACnH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACxC;AAED,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,4DAA4D;AAC5D,qBAAa,YAAa,YAAW,aAAa;IAChD,YAAY,EAAE,gBAAgB,CAAM;IACpC,aAAa,EAAE,iBAAiB,CAAM;IACtC,MAAM,EAAE,UAAU,EAAE,CAAM;CAC3B;AAED,oHAAoH;AACpH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;KAAC,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,gHAAgH;AAChH,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,QAAQ,EAQ7C,CAAC;AAEF,mHAAmH;AACnH,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC,QAAQ,EAoB/C,CAAC;AAEF,oHAAoH;AACpH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,QAAQ,EA8B5C,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,aAAa,QAAQ,CAAC;AAInC,kCAAkC;AAClC,8BAAsB,WAAW;IAC/B,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;IAC5B,QAAQ,KAAK,cAAc,IAAI,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAC/C,QAAQ,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAClE;AAED,gDAAgD;AAChD,qBAAa,cAAe,SAAQ,WAAW;IAC7C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAED,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAItC,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAgBzD;AAED,iDAAiD;AACjD,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAED,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAItC,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAkBzD;AAED,8CAA8C;AAC9C,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAW;gBAEtB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EACtE,iBAAiB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE;IAUrF,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAED,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAItC,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAGzD;AAGD,eAAO,MAAM,YAAY,EAAE;IAAC,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAA;CAGvD,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAoCD,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,uBAAuB,GAAG,WAAW,CAkBnG;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAC/G,eAAe,CAAC,EAAE,cAAc,EAAE,GAAG,QAAQ,CAuC9C;AAED,wBAAgB,cAAc,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAC3G,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAIrB;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EACjG,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,eAAe,oBAAe,EAAE,UAAU,EAAE,iBAAiB,GACrH,sBAAsB,CA0BvB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EACnF,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,UAAU,GAAE,OAAc,GAAG,aAAa,CAYnG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAC1F,eAAe,GAAE,MAAa,EAAE,UAAU,GAAE,OAAc,GAAG,oBAAoB,GAAG,IAAI,CAuCzF;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,UAIjD;AAED,wBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,GAAG,MAAM,CAWnG;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE;IAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,GAAG,MAAM,CAYxG"}
@@ -71,23 +71,30 @@ export const fitChartDataProperties = [
71
71
  DG.Property.js('logX', DG.TYPE.BOOL, { description: 'Whether the X axis should be logarithmic', defaultValue: false }),
72
72
  DG.Property.js('logY', DG.TYPE.BOOL, { description: 'Whether the Y axis should be logarithmic', defaultValue: false }),
73
73
  DG.Property.js('allowXZeroes', DG.TYPE.BOOL, { description: 'Whether x zeroes allowed for logarithmic data or not', defaultValue: true }),
74
+ DG.Property.js('mergeSeries', DG.TYPE.BOOL, { description: 'Whether to merge series or not', defaultValue: false }),
75
+ DG.Property.js('showColumnLabel', DG.TYPE.BOOL, { description: 'Whether to show the column label in the legend or not', defaultValue: false }),
74
76
  DG.Property.js('showStatistics', DG.TYPE.STRING_LIST, { description: 'Whether specific statistics should be rendered',
75
- choices: statisticsProperties.map((frp) => frp.name), inputType: 'MultiChoice' }),
77
+ choices: statisticsProperties.map((frp) => frp.name), inputType: 'MultiChoice',
78
+ //@ts-ignore
79
+ friendlyName: 'Statistics' }),
76
80
  ];
77
81
  /** Properties that describe {@link IFitSeriesOptions}. Useful for editing, initialization, transformations, etc. */
78
82
  export const fitSeriesProperties = [
79
83
  DG.Property.js('fitFunction', DG.TYPE.STRING, { category: 'Fitting', choices: ['sigmoid', 'linear'], defaultValue: 'sigmoid' }),
80
84
  DG.Property.js('pointColor', DG.TYPE.STRING, { category: 'Rendering', nullable: true, inputType: 'Color' }),
81
85
  DG.Property.js('fitLineColor', DG.TYPE.STRING, { category: 'Rendering', nullable: true, inputType: 'Color' }),
86
+ DG.Property.js('outlierColor', DG.TYPE.STRING, { category: 'Rendering', nullable: true, inputType: 'Color' }),
82
87
  DG.Property.js('errorModel', DG.TYPE.STRING, { category: 'Fitting', defaultValue: 'constant',
83
88
  choices: ['constant', 'proportional'], nullable: false }),
89
+ DG.Property.js('connectDots', DG.TYPE.BOOL, { category: 'Fitting', defaultValue: false }),
84
90
  DG.Property.js('clickToToggle', DG.TYPE.BOOL, { category: 'Fitting', description: 'Click on a point to mark it as outlier and refit', nullable: true, defaultValue: false }),
85
91
  DG.Property.js('showFitLine', DG.TYPE.BOOL, { category: 'Fitting', defaultValue: true }),
86
92
  DG.Property.js('showPoints', DG.TYPE.STRING, // rewrite description
87
93
  { category: 'Fitting', description: 'Whether points/candlesticks/none should be rendered',
88
94
  defaultValue: 'points', choices: ['points', 'candlesticks', 'both'] }),
89
95
  DG.Property.js('showCurveConfidenceInterval', DG.TYPE.BOOL, { category: 'Fitting', description: 'Whether confidence intervals should be rendered', defaultValue: false,
90
- caption: 'Confidence interval' }),
96
+ //@ts-ignore
97
+ friendlyName: 'Confidence Interval' }),
91
98
  DG.Property.js('markerType', DG.TYPE.STRING, { category: 'Rendering', defaultValue: 'circle',
92
99
  choices: ['asterisk', 'circle', 'cross border', 'diamond', 'square', 'star',
93
100
  'triangle bottom', 'triangle left', 'triangle right', 'triangle top'], nullable: false }),
@@ -95,6 +102,7 @@ export const fitSeriesProperties = [
95
102
  choices: ['solid', 'dotted', 'dashed', 'dashdotted'], nullable: false }),
96
103
  DG.Property.js('droplines', DG.TYPE.STRING_LIST, { description: 'Whether specific droplines should be rendered',
97
104
  choices: DROPLINES, inputType: 'MultiChoice' }),
105
+ DG.Property.js('columnName', DG.TYPE.STRING, { description: 'Column name where the series is stored', defaultValue: '' }),
98
106
  ];
99
107
  export const FIT_FUNCTION_SIGMOID = 'sigmoid';
100
108
  export const FIT_FUNCTION_LINEAR = 'linear';
@@ -440,4 +448,4 @@ function objectiveNormalProportional(targetFunc, data, params) {
440
448
  likelihood += residuesSquares[i] / sigmaSq + Math.log(2 * pi * sigmaSq);
441
449
  return { value: -likelihood, const: 0, mult: sigma };
442
450
  }
443
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWN1cnZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZml0LWN1cnZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixvQ0FBb0M7QUFDcEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxzQkFBc0I7QUFDdEIsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFpQi9CLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixRQUFRLEVBQUUsVUFBVTtJQUNwQixZQUFZLEVBQUUsY0FBYztDQUM3QixDQUFDO0FBMENGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW9CRTtBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDO0FBRTlCLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLHNCQUFzQixDQUFDO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLHVCQUF1QixDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHO0lBQzlDLEdBQUcsRUFBRSxLQUFLO0lBQ1YsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBOERsQyw0REFBNEQ7QUFDNUQsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFDRSxpQkFBWSxHQUFxQixFQUFFLENBQUM7UUFDcEMsa0JBQWEsR0FBc0IsRUFBRSxDQUFDLENBQUUsNkRBQTZEO1FBQ3JHLFdBQU0sR0FBaUIsRUFBRSxDQUFDO0lBQzVCLENBQUM7Q0FBQTtBQXFCRCwrRUFBK0U7QUFHL0UsZ0hBQWdIO0FB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QUFDLENBQUM7SUFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUM3QyxPQUFPLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhDLE9BQU8sSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQ2xDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUM3QyxVQUFVLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFFMUUsT0FBTyxFQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbXVsdGktc3BhY2VzICovXG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge2xpbWl0ZWRNZW1vcnlCRkdTfSBmcm9tICcuLi8uLi9sYmZncy9sYmZncyc7XG4vL0B0cy1pZ25vcmU6IG5vIHR5cGVzXG5pbXBvcnQgKiBhcyBqU3RhdCBmcm9tICdqc3RhdCc7XG5cblxudHlwZSBPcHRpbWl6YWJsZSA9IHtcbiAgZ2V0VmFsdWU6IChwYXJhbWV0ZXJzOiBudW1iZXJbXSkgPT4gbnVtYmVyLFxuICBnZXRHcmFkaWVudDogKHBhcmFtZXRlcnM6IG51bWJlcltdLCBncmFkaWVudDogbnVtYmVyW10pID0+IG51bWJlcltdLFxufVxuXG50eXBlIExpa2VsaWhvb2QgPSB7XG4gIHZhbHVlOiBudW1iZXIsXG4gIGNvbnN0OiBudW1iZXIsXG4gIG11bHQ6IG51bWJlclxufTtcblxudHlwZSBPYmplY3RpdmVGdW5jdGlvbiA9ICh0YXJnZXRGdW5jOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LCBwYXJhbXM6IG51bWJlcltdKSA9PiBMaWtlbGlob29kO1xuXG5leHBvcnQgY29uc3QgRml0RXJyb3JNb2RlbCA9IHtcbiAgQ09OU1RBTlQ6ICdjb25zdGFudCcsXG4gIFBST1BPUlRJT05BTDogJ3Byb3BvcnRpb25hbCcsXG59O1xuXG5leHBvcnQgdHlwZSBGaXRQYXJhbUJvdW5kcyA9IHtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG59O1xuXG4vKiogRml0IGZ1bmN0aW9uIGRlc2NyaXB0aW9uLiBBcHBsaWVzIHRvIGN1c3RvbSB1c2VyIGZpdCBmdW5jdGlvbnMuXG4gKiBSZXF1aXJlcyBKUyBhcnJvdyBmdW5jdGlvbnMgZm9yIHRoZSBmaXQgZnVuY3Rpb25zIGFuZCBpbml0aWFsIHBhcmFtZXRlcnMuICovXG5leHBvcnQgaW50ZXJmYWNlIElGaXRGdW5jdGlvbkRlc2NyaXB0aW9uIHtcbiAgbmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbjogc3RyaW5nO1xuICBnZXRJbml0aWFsUGFyYW1ldGVyczogc3RyaW5nO1xuICBwYXJhbWV0ZXJOYW1lczogc3RyaW5nW107XG59XG5cbmV4cG9ydCB0eXBlIEZpdEN1cnZlID0ge1xuICBmaXR0ZWRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyO1xuICBwYXJhbWV0ZXJzOiBudW1iZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpdENvbmZpZGVuY2VJbnRlcnZhbHMgPSB7XG4gIGNvbmZpZGVuY2VUb3A6ICh4OiBudW1iZXIpID0+IG51bWJlcjtcbiAgY29uZmlkZW5jZUJvdHRvbTogKHg6IG51bWJlcikgPT4gbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRml0U3RhdGlzdGljcyA9IHtcbiAgclNxdWFyZWQ/OiBudW1iZXIsXG4gIGF1Yz86IG51bWJlcixcbiAgaW50ZXJjZXB0WDogbnVtYmVyLCAvLyBwYXJhbWV0ZXJzWzJdXG4gIGludGVyY2VwdFk6IG51bWJlciwgLy8gZml0dGVkQ3VydmVbcGFyYW1ldGVyc1syXV1cbiAgc2xvcGU6IG51bWJlciwgLy8gcGFyYW1ldGVyc1sxXVxuICB0b3A6IG51bWJlciwgLy8gcGFyYW1ldGVyc1swXVxuICBib3R0b206IG51bWJlciwgLy8gcGFyYW1ldGVyc1szXVxufTtcblxuZXhwb3J0IHR5cGUgRml0SW52ZXJ0ZWRGdW5jdGlvbnMgPSB7XG4gIGludmVydGVkOiAoeTogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGludmVydGVkVG9wOiAoeTogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGludmVydGVkQm90dG9tOiAoeTogbnVtYmVyKSA9PiBudW1iZXIsXG59O1xuXG4vKipcbiAqICBEYXRhZ3JvayBjdXJ2ZSBmaXR0aW5nXG4gKlxuICogLSBGaXR0aW5nOiBjb21wdXRpbmcgcGFyYW1ldGVycyBvZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHRvIGJlc3QgZml0IHRoZSBkYXRhXG4gKiAgIC0gVXNlcyBCRkdTIG9wdGltaXphdGlvbiBhbGdvcml0aG0gKG11bHRpLXRocmVhZGluZyBmb3IgcGVyZm9ybWFuY2UpLlxuICogICAgIEZvciBkb3NlLXJlc3BvbnNlIGN1cnZlcywgd2UgYXJlIHR5cGljYWxseSBmaXR0aW5nIHRoZSBzaWdtb2lkIGZ1bmN0aW9uXG4gKiAgIC0gQWJpbGl0eSB0byBkeW5hbWljYWxseSByZWdpc3RlciBjdXN0b20gZml0dGluZyBmdW5jdGlvbnNcbiAqICAgICAtIEF1dG9tYXRpYyBmaXQgZnVuY3Rpb24gZGV0ZXJtaW5hdGlvblxuICogICAgIC0gQ2FjaGluZyBvZiBjdXN0b20gZml0dGluZyBmdW5jdGlvbnNcbiAqICAgLSBBYmlsaXR5IHRvIGdldCBmaXR0aW5nIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyAoci1zcXVhcmVkLCBjbGFzc2lmaWNhdGlvbiwgZXRjKVxuICogLSBEZWVwIGludGVncmF0aW9uIHdpdGggdGhlIERhdGFncm9rIGdyaWRcbiAqICAgLSBFaXRoZXIgZml0dGluZyBvbiB0aGUgZmx5LCBvciB1c2luZyB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gKyBwYXJhbWV0ZXJzXG4gKiAgIC0gTXVsdGlwbGUgc2VyaWVzIGluIG9uZSBjZWxsXG4gKiAgIC0gQ2FuZGxlc3RpY2tzLCBjb25maWRlbmNlIGludGVydmFscywgYW5kIGRyb3BsaW5lcyBkcmF3aW5nXG4gKiAgIC0gQWJpbGl0eSB0byBkZWZpbmUgY2hhcnQsIG1hcmtlciwgb3IgZml0dGluZyBvcHRpb25zIChzdWNoIGFzIGZpdCBmdW5jdGlvbiBvciBtYXJrZXIgY29sb3IpXG4gKiAgICAgb24gdGhlIGNvbHVtbiBsZXZlbCwgd2l0aCB0aGUgYWJpbGl0eSB0byBvdmVycmlkZSBpdCBvbiBhIGdyaWQgY2VsbCBvciBwb2ludCBsZXZlbFxuICogICAtIENsaWNraW5nIGEgcG9pbnQgaW4gYSBjaGFydCB3aXRoaW4gYSBncmlkIG1ha2VzIGl0IGFuIG91dGxpZXIgLT4gY3VydmUgaXMgcmUtZml0dGVkIG9uIHRoZSBmbHlcbiAqICAgLSBBYmlsaXR5IHRvIHNwZWNpZnkgYSBjaGFydCBhcyBcInJlZmVyZW5jZVwiIHNvIHRoYXQgaXQgaXMgc2hvd24gb24gZXZlcnkgb3RoZXIgY2hhcnQgZm9yIGNvbXBhcmlzb25cbiAqIC0gQWJpbGl0eSB0byBvdmVybGF5IGN1cnZlcyBmcm9tIG11bHRpcGxlIGdyaWQgY2VsbHMgKHNwZWNpYWwgdmlld2VyKVxuICogLSBXb3JrIHdpdGggc2VyaWVzIHN0b3JlZCBpbiBtdWx0aXBsZSBmb3JtYXRzIChiaW5hcnkgZm9yIHBlcmZvcm1hbmNlLCBqc29uIGZvciBmbGV4aWJpbGl0eSwgZXRjKVxuKi9cblxuZXhwb3J0IGNvbnN0IEZJVF9TRU1fVFlQRSA9ICdmaXQnO1xuZXhwb3J0IGNvbnN0IEZJVF9DRUxMX1RZUEUgPSAnZml0JztcbmV4cG9ydCBjb25zdCBUQUdfRklUID0gJy5maXQnO1xuXG5leHBvcnQgY29uc3QgQ09ORklERU5DRV9JTlRFUlZBTF9TVFJPS0VfQ09MT1IgPSAncmdiYSgyNTUsMTkxLDYzLDAuNCknO1xuZXhwb3J0IGNvbnN0IENPTkZJREVOQ0VfSU5URVJWQUxfRklMTF9DT0xPUiA9ICdyZ2JhKDI1NSwyMzgsMjA0LDAuMyknO1xuXG5leHBvcnQgY29uc3QgQ1VSVkVfQ09ORklERU5DRV9JTlRFUlZBTF9CT1VORFMgPSB7XG4gIFRPUDogJ3RvcCcsXG4gIEJPVFRPTTogJ2JvdHRvbScsXG59O1xuXG5leHBvcnQgY29uc3QgRFJPUExJTkVTID0gWydJQzUwJ107XG5cbmV4cG9ydCB0eXBlIEZpdE1hcmtlclR5cGUgPSAnYXN0ZXJpc2snIHwgJ2NpcmNsZScgfCAnY3Jvc3MgYm9yZGVyJyB8ICdkaWFtb25kJyB8ICdzcXVhcmUnIHwgJ3N0YXInIHwgJ3RyaWFuZ2xlIGJvdHRvbScgfFxuICAndHJpYW5nbGUgbGVmdCcgfCAndHJpYW5nbGUgcmlnaHQnIHwgJ3RyaWFuZ2xlIHRvcCc7XG5cbmV4cG9ydCB0eXBlIEZpdExpbmVTdHlsZSA9ICdzb2xpZCcgfCAnZG90dGVkJyB8ICdkYXNoZWQnIHwgJ2Rhc2hkb3R0ZWQnO1xuXG5leHBvcnQgdHlwZSBGaXRFcnJvck1vZGVsVHlwZSA9ICdjb25zdGFudCcgfCAncHJvcG9ydGlvbmFsJztcblxuLyoqIEEgcG9pbnQgaW4gdGhlIGZpdCBzZXJpZXMuIE9ubHkgeCBhbmQgeSBhcmUgcmVxdWlyZWQuIENhbiBvdmVycmlkZSBzb21lIGZpZWxkcyBkZWZpbmVkIGluIElGaXRTZXJpZXNPcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRml0UG9pbnQge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgb3V0bGllcj86IGJvb2xlYW47ICAgICAgIC8vIGlmIHRydWUsIHJlbmRlcnMgYXMgJ3gnIGFuZCBnZXRzIGlnbm9yZWQgZm9yIGN1cnZlIGZpdHRpbmdcbiAgY29sb3I/OiBzdHJpbmc7ICAgICAgICAgIC8vIG92ZXJyaWRlcyB0aGUgbWFya2VyIGNvbG9yIGRlZmluZWQgaW4gSUZpdFNlcmllc09wdGlvbnNcbiAgbWFya2VyPzogRml0TWFya2VyVHlwZTsgIC8vIG92ZXJyaWRlcyB0aGUgbWFya2VyIHR5cGUgZGVmaW5lZCBpbiBJRml0U2VyaWVzT3B0aW9uc1xuICBzaXplPzogbnVtYmVyOyAgICAgICAgICAgLy8gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IG1hcmtlciBzaXplXG4gIHN0ZGV2PzogbnVtYmVyOyAgICAgICAgICAvLyB3aGVuIGRlZmluZWQsIHJlbmRlcnMgYW4gZXJyb3IgYmFyIGNhbmRsZXN0aWNrXG4gIC8vIG1pblk/OiBudW1iZXI7ICAgICAgICAgICAvLyB3aGVuIGRlZmluZWQsIHRoZSBtYXJrZXIgcmVuZGVycyBhcyBhIGNhbmRsZXN0aWNrIHdpdGggd2hpc2tlcnMgW21pblksIG1heFldXG4gIC8vIG1heFk/OiBudW1iZXI7ICAgICAgICAgICAvLyB3aGVuIGRlZmluZWQsIHRoZSBtYXJrZXIgcmVuZGVycyBhcyBhIGNhbmRsZXN0aWNrIHdpdGggd2hpc2tlcnMgW21pblksIG1heFldXG59XG5cbi8qKiBBIHNlcmllcyBjb25zaXN0cyBvZiBwb2ludHMsIGhhcyBhIG5hbWUsIGFuZCBvcHRpb25zLlxuICogSWYgZGVmaW5lZCwgc2VyaWVzT3B0aW9ucyBhcmUgbWVyZ2VkIHdpdGgge0BsaW5rIElGaXRDaGFydERhdGEuc2VyaWVzT3B0aW9uc30gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUZpdFNlcmllcyBleHRlbmRzIElGaXRTZXJpZXNPcHRpb25zIHtcbiAgcG9pbnRzOiBJRml0UG9pbnRbXTtcbn1cblxuLyoqIENoYXJ0IGxhYmVscyBvcHRpb25zLiBDb250cm9scyB0aGUgY2hhcnQgbGFiZWxzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRml0Q2hhcnRMYWJlbE9wdGlvbnMge1xuICB2aXNpYmxlOiBib29sZWFuOyAgICAgICAgIC8vIGlmIHRydWUsIHJlbmRlcnMgdGhlIGxhYmVsIG9uIHRoZSBwbG90XG4gIGNvbG9yOiBzdHJpbmc7ICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgbGFiZWwgY29sb3JcbiAgbmFtZTogc3RyaW5nOyAgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBsYWJlbCBuYW1lXG59XG5cbi8qKiBDaGFydCBvcHRpb25zLiBGb3IgZml0dGVkIGN1cnZlcywgdGhpcyBvYmplY3QgaXMgc3RvcmVkIGluIHRoZSBncmlkIGNvbHVtbiB0YWdzIGFuZCBpcyB1c2VkIGJ5IHRoZSByZW5kZXJlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUZpdENoYXJ0T3B0aW9ucyB7XG4gIG1pblg/OiBudW1iZXI7XG4gIG1pblk/OiBudW1iZXI7XG4gIG1heFg/OiBudW1iZXI7XG4gIG1heFk/OiBudW1iZXI7XG5cbiAgdGl0bGU/OiBzdHJpbmc7ICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgcGxvdCB0aXRsZS4gSWYgdGhlIHBsb3Qgc2l6ZSBpcyBlbm91Z2gsIHdpbGwgcmVuZGVyIGl0LlxuICB4QXhpc05hbWU/OiBzdHJpbmc7ICAgICAgICAvLyBkZWZpbmVzIHRoZSB4IGF4aXMgbmFtZS4gSWYgdGhlIHBsb3Qgc2l6ZSBpcyBlbm91Z2gsIHdpbGwgcmVuZGVyIGl0LlxuICB5QXhpc05hbWU/OiBzdHJpbmc7ICAgICAgICAvLyBkZWZpbmVzIHRoZSBZIGF4aXMgbmFtZS4gSWYgdGhlIHBsb3Qgc2l6ZSBpcyBlbm91Z2gsIHdpbGwgcmVuZGVyIGl0LlxuXG4gIGxvZ1g/OiBib29sZWFuOyAgICAgICAgICAgIC8vIGRlZmluZXMgd2hldGhlciB0aGUgeCBkYXRhIHNob3VsZCBiZSBsb2dhcml0aG1pYyBvciBub3RcbiAgbG9nWT86IGJvb2xlYW47ICAgICAgICAgICAgLy8gZGVmaW5lcyB3aGV0aGVyIHRoZSB5IGRhdGEgc2hvdWxkIGJlIGxvZ2FyaXRobWljIG9yIG5vdFxuXG4gIGFsbG93WFplcm9lcz86IGJvb2xlYW47ICAgIC8vIGRlZmluZXMgd2hldGhlciB4IHplcm9lcyBhbGxvd2VkIGZvciBsb2dhcml0aG1pYyBkYXRhIG9yIG5vdFxuXG4gIHNob3dTdGF0aXN0aWNzPzogc3RyaW5nW107IC8vIGRlZmluZXMgdGhlIHN0YXRpc3RpY3MgdGhhdCB3b3VsZCBiZSBzaG93biBvbiB0aGUgcGxvdFxuICBsYWJlbE9wdGlvbnM/OiBJRml0Q2hhcnRMYWJlbE9wdGlvbnNbXTsgLy8gY29udHJvbHMgdGhlIHBsb3QgbGFiZWxzXG59XG5cbi8qKiBEYXRhIGZvciB0aGUgZml0IGNoYXJ0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRml0Q2hhcnREYXRhIHtcbiAgY2hhcnRPcHRpb25zPzogSUZpdENoYXJ0T3B0aW9ucztcbiAgc2VyaWVzT3B0aW9ucz86IElGaXRTZXJpZXNPcHRpb25zOyAgLy8gRGVmYXVsdCBzZXJpZXMgb3B0aW9ucy4gSW5kaXZpZHVhbCBzZXJpZXMgY2FuIG92ZXJyaWRlIGl0LlxuICBzZXJpZXM/OiBJRml0U2VyaWVzW107XG59XG5cbi8qKiBDbGFzcyB0aGF0IGltcGxlbWVudHMge0BsaW5rIElGaXRDaGFydERhdGF9IGludGVyZmFjZSAqL1xuZXhwb3J0IGNsYXNzIEZpdENoYXJ0RGF0YSBpbXBsZW1lbnRzIElGaXRDaGFydERhdGEge1xuICBjaGFydE9wdGlvbnM6IElGaXRDaGFydE9wdGlvbnMgPSB7fTtcbiAgc2VyaWVzT3B0aW9uczogSUZpdFNlcmllc09wdGlvbnMgPSB7fTsgIC8vIERlZmF1bHQgc2VyaWVzIG9wdGlvbnMuIEluZGl2aWR1YWwgc2VyaWVzIGNhbiBvdmVycmlkZSBpdC5cbiAgc2VyaWVzOiBJRml0U2VyaWVzW10gPSBbXTtcbn1cblxuLyoqIFNlcmllcyBvcHRpb25zIGNhbiBiZSBlaXRoZXIgYXBwbGllZCBnbG9iYWxseSBvbiBhIGNvbHVtbiBsZXZlbCwgb3IgcGFydGlhbGx5IG92ZXJyaWRkZW4gaW4gcGFydGljdWxhciBzZXJpZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUZpdFNlcmllc09wdGlvbnMge1xuICBuYW1lPzogc3RyaW5nOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRyb2xzIHRoZSBzZXJpZXMgbmFtZVxuICBmaXRGdW5jdGlvbj86IHN0cmluZyB8IElGaXRGdW5jdGlvbkRlc2NyaXB0aW9uOyAvLyBjb250cm9scyB0aGUgc2VyaWVzIGZpdCBmdW5jdGlvblxuICBwYXJhbWV0ZXJzPzogbnVtYmVyW107ICAgICAgICAgICAgICAgIC8vIGNvbnRyb2xzIHRoZSBzZXJpZXMgcGFyYW1ldGVycywgYXV0by1maXR0aW5nIHdoZW4gbm90IGRlZmluZWRcbiAgcGFyYW1ldGVyQm91bmRzPzogRml0UGFyYW1Cb3VuZHNbXTsgICAvLyBkZWZpbmVzIHRoZSBhY2NlcHRhYmxlIHJhbmdlIG9mIGVhY2ggcGFyYW1ldGVyLCB3aGljaCBpcyB0YWtlbiBpbnRvIGFjY291bnQgZHVyaW5nIHRoZSBmaXR0aW5nLiBTZWUgYWxzbyBgcGFyYW1ldGVyc2AuXG4gIG1hcmtlclR5cGU/OiBGaXRNYXJrZXJUeXBlOyAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgc2VyaWVzIG1hcmtlciB0eXBlXG4gIGxpbmVTdHlsZT86IEZpdExpbmVTdHlsZTsgICAgICAgICAgICAgLy8gZGVmaW5lcyB0aGUgc2VyaWVzIGxpbmUgc3R5bGVcbiAgcG9pbnRDb2xvcj86IHN0cmluZzsgICAgICAgICAgICAgICAgICAvLyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkaXplZCBzZXJpZXMgcG9pbnQgY29sb3JcbiAgZml0TGluZUNvbG9yPzogc3RyaW5nOyAgICAgICAgICAgICAgICAvLyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkaXplZCBzZXJpZXMgZml0IGxpbmUgY29sb3JcbiAgY29uZmlkZW5jZUludGVydmFsQ29sb3I/OiBzdHJpbmc7ICAgICAvLyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkaXplZCBzZXJpZXMgY29uZmlkZW5jZSBpbnRlcnZhbCBjb2xvclxuICBzaG93Rml0TGluZT86IGJvb2xlYW47ICAgICAgICAgICAgICAgIC8vIGRlZmluZXMgd2hldGhlciB0byBzaG93IHRoZSBmaXQgbGluZSBvciBub3RcbiAgc2hvd1BvaW50cz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBkYXRhIGRpc3BsYXkgbW9kZVxuICBzaG93Q3VydmVDb25maWRlbmNlSW50ZXJ2YWw/OiBib29sZWFuOyAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb3Igbm90XG4gIGVycm9yTW9kZWw/OiBGaXRFcnJvck1vZGVsVHlwZTsgICAgICAgLy8gZGVmaW5lcyB0aGUgc2VyaWVzIGVycm9yIG1vZGVsXG4gIGNsaWNrVG9Ub2dnbGU/OiBib29sZWFuOyAgICAvLyBpZiB0cnVlLCBjbGlja2luZyBvbiB0aGUgcG9pbnQgdG9nZ2xlcyBpdHMgb3V0bGllciBzdGF0dXMgYW5kIGNhdXNlcyBjdXJ2ZSByZWZpdHRpbmdcbiAgbGFiZWxzPzoge1trZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW59OyAvLyBjb250cm9sbGVkIGJ5IElGaXRDaGFydERhdGEgbGFiZWxPcHRpb25zLCBzaG93cyBsYWJlbHNcbiAgZHJvcGxpbmVzPzogc3RyaW5nW107ICAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBkcm9wbGluZXMgdGhhdCB3b3VsZCBiZSBzaG93biBvbiB0aGUgcGxvdCAoSUM1MClcbn1cbi8vIFRPRE86IHNob3cgbGFiZWxzIGluIHByb3BlcnR5IHBhbmVsIGlmIHByZXNlbnQsIGNvbG9yIGJ5IGRlZmF1bHQgZnJvbSBzZXJpZXNcblxuXG4vKiogUHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIHtAbGluayBGaXRTdGF0aXN0aWNzfS4gVXNlZnVsIGZvciBlZGl0aW5nLCBpbml0aWFsaXphdGlvbiwgdHJhbnNmb3JtYXRpb25zLCBldGMuICovXG5leHBvcnQgY29uc3Qgc3RhdGlzdGljc1Byb3BlcnRpZXM6IERHLlByb3BlcnR5W10gPSBbXG4gIERHLlByb3BlcnR5LmpzKCdyU3F1YXJlZCcsIERHLlRZUEUuRkxPQVQsIHt1c2VyRWRpdGFibGU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdhdWMnLCBERy5UWVBFLkZMT0FULCB7dXNlckVkaXRhYmxlOiBmYWxzZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnaW50ZXJjZXB0WScsIERHLlRZUEUuRkxPQVQsIHt1c2VyRWRpdGFibGU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdpbnRlcmNlcHRYJywgREcuVFlQRS5GTE9BVCwge3VzZXJFZGl0YWJsZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ3Nsb3BlJywgREcuVFlQRS5GTE9BVCwge3VzZXJFZGl0YWJsZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ3RvcCcsIERHLlRZUEUuRkxPQVQsIHt1c2VyRWRpdGFibGU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdib3R0b20nLCBERy5UWVBFLkZMT0FULCB7dXNlckVkaXRhYmxlOiBmYWxzZX0pLFxuXTtcblxuLyoqIFByb3BlcnRpZXMgdGhhdCBkZXNjcmliZSB7QGxpbmsgSUZpdENoYXJ0T3B0aW9uc30uIFVzZWZ1bCBmb3IgZWRpdGluZywgaW5pdGlhbGl6YXRpb24sIHRyYW5zZm9ybWF0aW9ucywgZXRjLiAqL1xuZXhwb3J0IGNvbnN0IGZpdENoYXJ0RGF0YVByb3BlcnRpZXM6IERHLlByb3BlcnR5W10gPSBbXG4gIC8vIFN0eWxlIGFuZCB6b29tXG4gIERHLlByb3BlcnR5LmpzKCdtaW5YJywgREcuVFlQRS5GTE9BVCwge2Rlc2NyaXB0aW9uOiAnTWluaW11bSB2YWx1ZSBvZiB0aGUgWCBheGlzJywgbnVsbGFibGU6IHRydWV9KSxcbiAgREcuUHJvcGVydHkuanMoJ21pblknLCBERy5UWVBFLkZMT0FULCB7ZGVzY3JpcHRpb246ICdNaW5pbXVtIHZhbHVlIG9mIHRoZSBZIGF4aXMnLCBudWxsYWJsZTogdHJ1ZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnbWF4WCcsIERHLlRZUEUuRkxPQVQsIHtkZXNjcmlwdGlvbjogJ01heGltdW0gdmFsdWUgb2YgdGhlIFggYXhpcycsIG51bGxhYmxlOiB0cnVlfSksXG4gIERHLlByb3BlcnR5LmpzKCdtYXhZJywgREcuVFlQRS5GTE9BVCwge2Rlc2NyaXB0aW9uOiAnTWF4aW11bSB2YWx1ZSBvZiB0aGUgWSBheGlzJywgbnVsbGFibGU6IHRydWV9KSxcbiAgREcuUHJvcGVydHkuanMoJ3RpdGxlJywgREcuVFlQRS5TVFJJTkcsIHtudWxsYWJsZTogdHJ1ZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygneEF4aXNOYW1lJywgREcuVFlQRS5TVFJJTkcsIHtkZXNjcmlwdGlvbjpcbiAgICAnTGFiZWwgdG8gc2hvdyBvbiB0aGUgWCBheGlzLiBJZiBub3Qgc3BlY2lmaWVkLCBjb3JyZXNwb25kaW5nIGRhdGEgY29sdW1uIG5hbWUgaXMgdXNlZCcsIG51bGxhYmxlOiB0cnVlfSksXG4gIERHLlByb3BlcnR5LmpzKCd5QXhpc05hbWUnLCBERy5UWVBFLlNUUklORywge2Rlc2NyaXB0aW9uOlxuICAgICdMYWJlbCB0byBzaG93IG9uIHRoZSBZIGF4aXMuIElmIG5vdCBzcGVjaWZpZWQsIGNvcnJlc3BvbmRpbmcgZGF0YSBjb2x1bW4gbmFtZSBpcyB1c2VkJywgbnVsbGFibGU6IHRydWV9KSxcbiAgREcuUHJvcGVydHkuanMoJ2xvZ1gnLCBERy5UWVBFLkJPT0wsIHtkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIFggYXhpcyBzaG91bGQgYmUgbG9nYXJpdGhtaWMnLCBkZWZhdWx0VmFsdWU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdsb2dZJywgREcuVFlQRS5CT09MLCB7ZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBZIGF4aXMgc2hvdWxkIGJlIGxvZ2FyaXRobWljJywgZGVmYXVsdFZhbHVlOiBmYWxzZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnYWxsb3dYWmVyb2VzJywgREcuVFlQRS5CT09MLCB7ZGVzY3JpcHRpb246ICdXaGV0aGVyIHggemVyb2VzIGFsbG93ZWQgZm9yIGxvZ2FyaXRobWljIGRhdGEgb3Igbm90JywgZGVmYXVsdFZhbHVlOiB0cnVlfSksXG4gIERHLlByb3BlcnR5LmpzKCdzaG93U3RhdGlzdGljcycsIERHLlRZUEUuU1RSSU5HX0xJU1QsIHtkZXNjcmlwdGlvbjogJ1doZXRoZXIgc3BlY2lmaWMgc3RhdGlzdGljcyBzaG91bGQgYmUgcmVuZGVyZWQnLFxuICAgIGNob2ljZXM6IHN0YXRpc3RpY3NQcm9wZXJ0aWVzLm1hcCgoZnJwKSA9PiBmcnAubmFtZSksIGlucHV0VHlwZTogJ011bHRpQ2hvaWNlJ30pLFxuXTtcblxuLyoqIFByb3BlcnRpZXMgdGhhdCBkZXNjcmliZSB7QGxpbmsgSUZpdFNlcmllc09wdGlvbnN9LiBVc2VmdWwgZm9yIGVkaXRpbmcsIGluaXRpYWxpemF0aW9uLCB0cmFuc2Zvcm1hdGlvbnMsIGV0Yy4gKi9cbmV4cG9ydCBjb25zdCBmaXRTZXJpZXNQcm9wZXJ0aWVzOiBERy5Qcm9wZXJ0eVtdID0gW1xuICBERy5Qcm9wZXJ0eS5qcygnZml0RnVuY3Rpb24nLCBERy5UWVBFLlNUUklORyxcbiAgICB7Y2F0ZWdvcnk6ICdGaXR0aW5nJywgY2hvaWNlczogWydzaWdtb2lkJywgJ2xpbmVhciddLCBkZWZhdWx0VmFsdWU6ICdzaWdtb2lkJ30pLFxuICBERy5Qcm9wZXJ0eS5qcygncG9pbnRDb2xvcicsIERHLlRZUEUuU1RSSU5HLFxuICAgIHtjYXRlZ29yeTogJ1JlbmRlcmluZycsIG51bGxhYmxlOiB0cnVlLCBpbnB1dFR5cGU6ICdDb2xvcid9KSxcbiAgREcuUHJvcGVydHkuanMoJ2ZpdExpbmVDb2xvcicsIERHLlRZUEUuU1RSSU5HLFxuICAgIHtjYXRlZ29yeTogJ1JlbmRlcmluZycsIG51bGxhYmxlOiB0cnVlLCBpbnB1dFR5cGU6ICdDb2xvcid9KSxcbiAgREcuUHJvcGVydHkuanMoJ2Vycm9yTW9kZWwnLCBERy5UWVBFLlNUUklORywge2NhdGVnb3J5OiAnRml0dGluZycsIGRlZmF1bHRWYWx1ZTogJ2NvbnN0YW50JyxcbiAgICBjaG9pY2VzOiBbJ2NvbnN0YW50JywgJ3Byb3BvcnRpb25hbCddLCBudWxsYWJsZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2NsaWNrVG9Ub2dnbGUnLCBERy5UWVBFLkJPT0wsIHtjYXRlZ29yeTogJ0ZpdHRpbmcnLCBkZXNjcmlwdGlvbjpcbiAgICAnQ2xpY2sgb24gYSBwb2ludCB0byBtYXJrIGl0IGFzIG91dGxpZXIgYW5kIHJlZml0JywgbnVsbGFibGU6IHRydWUsIGRlZmF1bHRWYWx1ZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ3Nob3dGaXRMaW5lJywgREcuVFlQRS5CT09MLCB7Y2F0ZWdvcnk6ICdGaXR0aW5nJywgZGVmYXVsdFZhbHVlOiB0cnVlfSksXG4gIERHLlByb3BlcnR5LmpzKCdzaG93UG9pbnRzJywgREcuVFlQRS5TVFJJTkcsIC8vIHJld3JpdGUgZGVzY3JpcHRpb25cbiAgICB7Y2F0ZWdvcnk6ICdGaXR0aW5nJywgZGVzY3JpcHRpb246ICdXaGV0aGVyIHBvaW50cy9jYW5kbGVzdGlja3Mvbm9uZSBzaG91bGQgYmUgcmVuZGVyZWQnLFxuICAgICAgZGVmYXVsdFZhbHVlOiAncG9pbnRzJywgY2hvaWNlczogWydwb2ludHMnLCAnY2FuZGxlc3RpY2tzJywgJ2JvdGgnXX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnc2hvd0N1cnZlQ29uZmlkZW5jZUludGVydmFsJywgREcuVFlQRS5CT09MLFxuICAgIHtjYXRlZ29yeTogJ0ZpdHRpbmcnLCBkZXNjcmlwdGlvbjogJ1doZXRoZXIgY29uZmlkZW5jZSBpbnRlcnZhbHMgc2hvdWxkIGJlIHJlbmRlcmVkJywgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGNhcHRpb246ICdDb25maWRlbmNlIGludGVydmFsJ30pLFxuICBERy5Qcm9wZXJ0eS5qcygnbWFya2VyVHlwZScsIERHLlRZUEUuU1RSSU5HLCB7Y2F0ZWdvcnk6ICdSZW5kZXJpbmcnLCBkZWZhdWx0VmFsdWU6ICdjaXJjbGUnLFxuICAgIGNob2ljZXM6IFsnYXN0ZXJpc2snLCAnY2lyY2xlJywgJ2Nyb3NzIGJvcmRlcicsICdkaWFtb25kJywgJ3NxdWFyZScsICdzdGFyJyxcbiAgICAgICd0cmlhbmdsZSBib3R0b20nLCAndHJpYW5nbGUgbGVmdCcsICd0cmlhbmdsZSByaWdodCcsICd0cmlhbmdsZSB0b3AnXSwgbnVsbGFibGU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdsaW5lU3R5bGUnLCBERy5UWVBFLlNUUklORywge2NhdGVnb3J5OiAnUmVuZGVyaW5nJywgZGVmYXVsdFZhbHVlOiAnc29saWQnLFxuICAgIGNob2ljZXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCcsICdkYXNoZG90dGVkJ10sIG51bGxhYmxlOiBmYWxzZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnZHJvcGxpbmVzJywgREcuVFlQRS5TVFJJTkdfTElTVCwge2Rlc2NyaXB0aW9uOiAnV2hldGhlciBzcGVjaWZpYyBkcm9wbGluZXMgc2hvdWxkIGJlIHJlbmRlcmVkJyxcbiAgICBjaG9pY2VzOiBEUk9QTElORVMsIGlucHV0VHlwZTogJ011bHRpQ2hvaWNlJ30pLFxuXTtcblxuZXhwb3J0IGNvbnN0IEZJVF9GVU5DVElPTl9TSUdNT0lEID0gJ3NpZ21vaWQnO1xuZXhwb3J0IGNvbnN0IEZJVF9GVU5DVElPTl9MSU5FQVIgPSAnbGluZWFyJztcblxuZXhwb3J0IGNvbnN0IEZJVF9TVEFUU19SU1FVQVJFRCA9ICdyU3F1YXJlZCc7XG5leHBvcnQgY29uc3QgRklUX1NUQVRTX0FVQyA9ICdhdWMnO1xuXG5cbi8vIFRPRE8/OiBhZGQgbWV0aG9kIHRvIHJldHVybiBwYXJhbWV0ZXJzIC0gZ2V0IHBhcmFtZXRlcnMgZnJvbSBmaXQgZnVuY3Rpb25cbi8qKiBDbGFzcyBmb3IgdGhlIGZpdCBmdW5jdGlvbnMgKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaXRGdW5jdGlvbiB7XG4gIGFic3RyYWN0IGdldCBuYW1lKCk6IHN0cmluZztcbiAgYWJzdHJhY3QgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdO1xuICBhYnN0cmFjdCB5KHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcik6IG51bWJlcjtcbiAgYWJzdHJhY3QgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogbnVtYmVyW107XG59XG5cbi8qKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGxpbmVhciBmdW5jdGlvbiAqL1xuZXhwb3J0IGNsYXNzIExpbmVhckZ1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb24ge1xuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBGSVRfRlVOQ1RJT05fTElORUFSO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydTbG9wZScsICdJbnRlcmNlcHQnXTtcbiAgfVxuXG4gIHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbGluZWFyKHBhcmFtcywgeCk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gICAgbGV0IG1pbkluZGV4ID0gMDtcbiAgICBsZXQgbWF4SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHhbaV0gPCB4W21pbkluZGV4XSlcbiAgICAgICAgbWluSW5kZXggPSBpO1xuICAgICAgaWYgKHhbaV0gPiB4W21heEluZGV4XSlcbiAgICAgICAgbWF4SW5kZXggPSBpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbHRhWCA9IHhbbWF4SW5kZXhdIC0geFttaW5JbmRleF07XG4gICAgY29uc3QgZGVsdGFZID0geVttYXhJbmRleF0gLSB5W21pbkluZGV4XTtcbiAgICBjb25zdCBBID0gZGVsdGFZIC8gZGVsdGFYO1xuICAgIGNvbnN0IEIgPSB5W21heEluZGV4XSAtIEEgKiB4W21heEluZGV4XTtcbiAgICByZXR1cm4gW0EsIEJdO1xuICB9XG59XG5cbi8qKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHNpZ21vaWQgZnVuY3Rpb24gKi9cbmV4cG9ydCBjbGFzcyBTaWdtb2lkRnVuY3Rpb24gZXh0ZW5kcyBGaXRGdW5jdGlvbiB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9TSUdNT0lEO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydUb3AnLCAnQm90dG9tJywgJ1Nsb3BlJywgJ0lDNTAnXTtcbiAgfVxuXG4gIHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc2lnbW9pZChwYXJhbXMsIHgpO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGRhdGFCb3VuZHMgPSBERy5SZWN0LmZyb21YWUFycmF5cyh4LCB5KTtcbiAgICBjb25zdCBtZWRZID0gKGRhdGFCb3VuZHMuYm90dG9tIC0gZGF0YUJvdW5kcy50b3ApIC8gMiArIGRhdGFCb3VuZHMudG9wO1xuICAgIGxldCBtYXhZSW50ZXJ2YWwgPSBkYXRhQm91bmRzLmJvdHRvbSAtIGRhdGFCb3VuZHMudG9wO1xuICAgIGxldCBuZWFyZXN0WEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbnRlcnZhbCA9IE1hdGguYWJzKHlbaV0gLSBtZWRZKTtcbiAgICAgIGlmIChjdXJyZW50SW50ZXJ2YWwgPCBtYXhZSW50ZXJ2YWwpIHtcbiAgICAgICAgbWF4WUludGVydmFsID0gY3VycmVudEludGVydmFsO1xuICAgICAgICBuZWFyZXN0WEluZGV4ID0gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeEF0TWVkWSA9IHhbbmVhcmVzdFhJbmRleF07XG4gICAgY29uc3Qgc2xvcGUgPSB5WzBdID4geVt5Lmxlbmd0aCAtIDFdID8gMSA6IC0xO1xuXG4gICAgLy8gcGFyYW1zIGFyZTogW21heCwgdGFuLCBJQzUwLCBtaW5dXG4gICAgcmV0dXJuIFtkYXRhQm91bmRzLmJvdHRvbSwgc2xvcGUsIHhBdE1lZFksIGRhdGFCb3VuZHMudG9wXTtcbiAgfVxufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHVzZXIgSlMgZnVuY3Rpb25zICovXG5leHBvcnQgY2xhc3MgSnNGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uIHtcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9wYXJhbWV0ZXJOYW1lczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB5RnVuYzogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIGdldEluaXRQYXJhbXNGdW5jOiAoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKSA9PiBudW1iZXJbXSwgcGFyYW1ldGVyTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgIHRoaXMuX3BhcmFtZXRlck5hbWVzID0gcGFyYW1ldGVyTmFtZXM7XG5cbiAgICB0aGlzLnkgPSB5RnVuYztcbiAgICB0aGlzLmdldEluaXRpYWxQYXJhbWV0ZXJzID0gZ2V0SW5pdFBhcmFtc0Z1bmM7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgZ2V0IHBhcmFtZXRlck5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVyTmFtZXM7XG4gIH1cblxuICB5KHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG5cbi8vIE9iamVjdCB3aXRoIGZpdCBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBmaXRGdW5jdGlvbnM6IHtbaW5kZXg6IHN0cmluZ106IEZpdEZ1bmN0aW9ufSA9IHtcbiAgJ2xpbmVhcic6IG5ldyBMaW5lYXJGdW5jdGlvbigpLFxuICAnc2lnbW9pZCc6IG5ldyBTaWdtb2lkRnVuY3Rpb24oKSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZpdE9wdGlvbnMge1xuICBlcnJvck1vZGVsOiBGaXRFcnJvck1vZGVsVHlwZTtcbiAgY29uZmlkZW5jZUxldmVsOiBudW1iZXI7XG4gIHN0YXRpc3RpY3M6IGJvb2xlYW47XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlT2JqZWN0aXZlRnVuY3Rpb24oZXJyb3JNb2RlbDogRml0RXJyb3JNb2RlbFR5cGUpOiBPYmplY3RpdmVGdW5jdGlvbiB7XG4gIGxldCBvZjogT2JqZWN0aXZlRnVuY3Rpb247XG5cbiAgc3dpdGNoIChlcnJvck1vZGVsKSB7XG4gIGNhc2UgRml0RXJyb3JNb2RlbC5DT05TVEFOVDpcbiAgICBvZiA9IG9iamVjdGl2ZU5vcm1hbENvbnN0YW50O1xuICAgIGJyZWFrO1xuICBjYXNlIEZpdEVycm9yTW9kZWwuUFJPUE9SVElPTkFMOlxuICAgIG9mID0gb2JqZWN0aXZlTm9ybWFsUHJvcG9ydGlvbmFsO1xuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIG9mID0gb2JqZWN0aXZlTm9ybWFsQ29uc3RhbnQ7XG4gICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gb2Y7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU9wdGltaXphYmxlKGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LCBjdXJ2ZUZ1bmN0aW9uOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsXG4gIG9mOiBPYmplY3RpdmVGdW5jdGlvbiwgZml4ZWQ6IG51bWJlcltdKTogT3B0aW1pemFibGUge1xuICByZXR1cm4ge1xuICAgIGdldFZhbHVlOiAocGFyYW1ldGVyczogbnVtYmVyW10pID0+IHtcbiAgICAgIHJldHVybiBvZihjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbWV0ZXJzKS52YWx1ZTtcbiAgICB9LFxuICAgIGdldEdyYWRpZW50OiAocGFyYW1ldGVyczogbnVtYmVyW10sIGdyYWRpZW50OiBudW1iZXJbXSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICBncmFkaWVudFtpXSA9IGZpeGVkLmluY2x1ZGVzKGkpID8gMCA6IGdldE9iamVjdGl2ZURlcml2YXRpdmUob2YsIGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtZXRlcnMsIGkpO1xuXG4gICAgICByZXR1cm4gZ3JhZGllbnQ7XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yQ3JlYXRlRml0RnVuY3Rpb24oc2VyaWVzRml0RnVuYzogc3RyaW5nIHwgSUZpdEZ1bmN0aW9uRGVzY3JpcHRpb24pOiBGaXRGdW5jdGlvbiB7XG4gIGlmICh0eXBlb2Ygc2VyaWVzRml0RnVuYyA9PT0gJ3N0cmluZycpXG4gICAgcmV0dXJuIGZpdEZ1bmN0aW9uc1tzZXJpZXNGaXRGdW5jXTtcbiAgZWxzZSBpZiAoIWZpdEZ1bmN0aW9uc1tzZXJpZXNGaXRGdW5jLm5hbWVdKSB7XG4gICAgY29uc3QgbmFtZSA9IHNlcmllc0ZpdEZ1bmMubmFtZTtcbiAgICBjb25zdCBwYXJhbU5hbWVzID0gc2VyaWVzRml0RnVuYy5wYXJhbWV0ZXJOYW1lcztcbiAgICBjb25zdCBmaXRGdW5jdGlvblBhcnRzID0gc2VyaWVzRml0RnVuYy5mdW5jdGlvbi5zcGxpdCgnPT4nKS5tYXAoKGVsZW0pID0+IGVsZW0udHJpbSgpKTtcbiAgICBjb25zdCBnZXRJbml0UGFyYW1zUGFydHMgPSBzZXJpZXNGaXRGdW5jLmdldEluaXRpYWxQYXJhbWV0ZXJzLnNwbGl0KCc9PicpLm1hcCgoZWxlbSkgPT4gZWxlbS50cmltKCkpO1xuICAgIGNvbnN0IGZpdEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGZpdEZ1bmN0aW9uUGFydHNbMF0uc2xpY2UoMSwgZml0RnVuY3Rpb25QYXJ0c1swXS5sZW5ndGggLSAxKSxcbiAgICAgIGAke2ZpdEZ1bmN0aW9uUGFydHNbMV0uaW5jbHVkZXMoJzsnKSA/ICcnIDogJ3JldHVybiAnfSR7Zml0RnVuY3Rpb25QYXJ0c1sxXX1gKTtcbiAgICBjb25zdCBnZXRJbml0UGFyYW1zRnVuYyA9IG5ldyBGdW5jdGlvbihnZXRJbml0UGFyYW1zUGFydHNbMF0uc2xpY2UoMSwgZ2V0SW5pdFBhcmFtc1BhcnRzWzBdLmxlbmd0aCAtIDEpLFxuICAgICAgYHJldHVybiAke2dldEluaXRQYXJhbXNQYXJ0c1sxXX1gKTtcbiAgICBjb25zdCBmaXRGdW5jID0gbmV3IEpzRnVuY3Rpb24obmFtZSwgKGZpdEZ1bmN0aW9uIGFzIChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciksXG4gICAgICAoZ2V0SW5pdFBhcmFtc0Z1bmMgYXMgKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSkgPT4gbnVtYmVyW10pLCBwYXJhbU5hbWVzKTtcbiAgICBmaXRGdW5jdGlvbnNbbmFtZV0gPSBmaXRGdW5jO1xuICB9XG5cbiAgcmV0dXJuIGZpdEZ1bmN0aW9uc1tzZXJpZXNGaXRGdW5jLm5hbWVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml0RGF0YShkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgZml0RnVuY3Rpb246IEZpdEZ1bmN0aW9uLCBlcnJvck1vZGVsOiBGaXRFcnJvck1vZGVsVHlwZSxcbiAgcGFyYW1ldGVyQm91bmRzPzogRml0UGFyYW1Cb3VuZHNbXSk6IEZpdEN1cnZlIHtcbiAgY29uc3QgY3VydmVGdW5jdGlvbiA9IGZpdEZ1bmN0aW9uLnk7XG4gIGNvbnN0IHBhcmFtVmFsdWVzID0gZml0RnVuY3Rpb24uZ2V0SW5pdGlhbFBhcmFtZXRlcnMoZGF0YS54LCBkYXRhLnkpO1xuXG4gIGNvbnN0IG9mID0gY3JlYXRlT2JqZWN0aXZlRnVuY3Rpb24oZXJyb3JNb2RlbCk7XG4gIGNvbnN0IGZpeGVkOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgb3ZlckxpbWl0cyA9IHRydWU7XG5cbiAgd2hpbGUgKG92ZXJMaW1pdHMpIHtcbiAgICBjb25zdCBvcHRpbWl6YWJsZSA9IGNyZWF0ZU9wdGltaXphYmxlKGRhdGEsIGN1cnZlRnVuY3Rpb24sIG9mLCBmaXhlZCk7XG4gICAgbGltaXRlZE1lbW9yeUJGR1Mob3B0aW1pemFibGUsIHBhcmFtVmFsdWVzKTtcbiAgICBsaW1pdGVkTWVtb3J5QkZHUyhvcHRpbWl6YWJsZSwgcGFyYW1WYWx1ZXMpO1xuXG4gICAgb3ZlckxpbWl0cyA9IGZhbHNlO1xuICAgIGlmICghcGFyYW1ldGVyQm91bmRzKVxuICAgICAgYnJlYWs7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlckJvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhcmFtZXRlckJvdW5kc1tpXT8ubWF4ICE9PSB1bmRlZmluZWQgJiYgcGFyYW1WYWx1ZXNbaV0gPiBwYXJhbWV0ZXJCb3VuZHNbaV0ubWF4ISkge1xuICAgICAgICBvdmVyTGltaXRzID0gdHJ1ZTtcbiAgICAgICAgZml4ZWQucHVzaChpKTtcbiAgICAgICAgcGFyYW1WYWx1ZXNbaV0gPSBwYXJhbWV0ZXJCb3VuZHNbaV0ubWF4ITtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1ldGVyQm91bmRzW2ldPy5taW4gIT09IHVuZGVmaW5lZCAmJiBwYXJhbVZhbHVlc1tpXSA8IHBhcmFtZXRlckJvdW5kc1tpXS5taW4hKSB7XG4gICAgICAgIG92ZXJMaW1pdHMgPSB0cnVlO1xuICAgICAgICBmaXhlZC5wdXNoKGkpO1xuICAgICAgICBwYXJhbVZhbHVlc1tpXSA9IHBhcmFtZXRlckJvdW5kc1tpXS5taW4hO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBmaXR0ZWRDdXJ2ZSA9IGdldEZpdHRlZEN1cnZlKGN1cnZlRnVuY3Rpb24sIHBhcmFtVmFsdWVzKTtcblxuICByZXR1cm4ge1xuICAgIGZpdHRlZEN1cnZlOiBmaXR0ZWRDdXJ2ZSxcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbVZhbHVlcyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpdHRlZEN1cnZlKGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgcGFyYW1WYWx1ZXM6IG51bWJlcltdKTpcbiAoeDogbnVtYmVyKSA9PiBudW1iZXIge1xuICByZXR1cm4gKHg6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiBjdXJ2ZUZ1bmN0aW9uKHBhcmFtVmFsdWVzLCB4KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnZlQ29uZmlkZW5jZUludGVydmFscyhkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgcGFyYW1WYWx1ZXM6IG51bWJlcltdLFxuICBjdXJ2ZUZ1bmN0aW9uOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsIGNvbmZpZGVuY2VMZXZlbDogbnVtYmVyID0gMC4wNSwgZXJyb3JNb2RlbDogRml0RXJyb3JNb2RlbFR5cGUpOlxuICBGaXRDb25maWRlbmNlSW50ZXJ2YWxzIHtcbiAgY29uc3Qgb2YgPSBjcmVhdGVPYmplY3RpdmVGdW5jdGlvbihlcnJvck1vZGVsKTtcblxuICBjb25zdCBlcnJvciA9IGVycm9yTW9kZWwgPT09IEZpdEVycm9yTW9kZWwuUFJPUE9SVElPTkFMID9cbiAgICBvZihjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbVZhbHVlcykubXVsdCA6XG4gICAgb2YoY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1WYWx1ZXMpLmNvbnN0O1xuXG4gIGNvbnN0IHF1YW50aWxlID0galN0YXQubm9ybWFsLmludigxIC0gY29uZmlkZW5jZUxldmVsLzIsIDAsIDEpO1xuXG4gIGNvbnN0IHRvcCA9ICh4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGN1cnZlRnVuY3Rpb24ocGFyYW1WYWx1ZXMsIHgpO1xuICAgIGlmIChlcnJvck1vZGVsID09PSBGaXRFcnJvck1vZGVsLkNPTlNUQU5UKVxuICAgICAgcmV0dXJuIHZhbHVlICsgcXVhbnRpbGUgKiBlcnJvcjtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdmFsdWUgKyBxdWFudGlsZSAqIE1hdGguYWJzKHZhbHVlKSAqIGVycm9yO1xuICB9O1xuXG4gIGNvbnN0IGJvdHRvbSA9ICh4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGN1cnZlRnVuY3Rpb24ocGFyYW1WYWx1ZXMsIHgpO1xuICAgIGlmIChlcnJvck1vZGVsID09PSBGaXRFcnJvck1vZGVsLkNPTlNUQU5UKVxuICAgICAgcmV0dXJuIHZhbHVlIC0gcXVhbnRpbGUgKiBlcnJvcjtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdmFsdWUgLSBxdWFudGlsZSAqIE1hdGguYWJzKHZhbHVlKSAqIGVycm9yO1xuICB9O1xuXG4gIHJldHVybiB7Y29uZmlkZW5jZVRvcDogdG9wLCBjb25maWRlbmNlQm90dG9tOiBib3R0b219O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdGlzdGljcyhkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgcGFyYW1WYWx1ZXM6IG51bWJlcltdLFxuICBjdXJ2ZUZ1bmN0aW9uOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsIHN0YXRpc3RpY3M6IGJvb2xlYW4gPSB0cnVlKTogRml0U3RhdGlzdGljcyB7XG4gIGNvbnN0IGZpdHRlZEN1cnZlID0gZ2V0Rml0dGVkQ3VydmUoY3VydmVGdW5jdGlvbiwgcGFyYW1WYWx1ZXMpO1xuXG4gIHJldHVybiB7XG4gICAgclNxdWFyZWQ6IHN0YXRpc3RpY3MgPyBnZXREZXRDb2VmZihmaXR0ZWRDdXJ2ZSwgZGF0YSkgOiB1bmRlZmluZWQsXG4gICAgYXVjOiBzdGF0aXN0aWNzID8gZ2V0QXVjKGZpdHRlZEN1cnZlLCBkYXRhKSA6IHVuZGVmaW5lZCxcbiAgICBpbnRlcmNlcHRYOiBwYXJhbVZhbHVlc1syXSxcbiAgICBpbnRlcmNlcHRZOiBmaXR0ZWRDdXJ2ZShwYXJhbVZhbHVlc1syXSksXG4gICAgc2xvcGU6IHBhcmFtVmFsdWVzWzFdLFxuICAgIHRvcDogcGFyYW1WYWx1ZXNbMF0sXG4gICAgYm90dG9tOiBwYXJhbVZhbHVlc1szXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludmVydGVkRnVuY3Rpb25zKGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LCBwYXJhbVZhbHVlczogbnVtYmVyW10sXG4gIGNvbmZpZGVuY2VMZXZlbDogbnVtYmVyID0gMC4wNSwgc3RhdGlzdGljczogYm9vbGVhbiA9IHRydWUpOiBGaXRJbnZlcnRlZEZ1bmN0aW9ucyB8IG51bGwge1xuICBjb25zdCBzdHVkZW50USA9IGpTdGF0LnN0dWRlbnR0LmludigxIC0gY29uZmlkZW5jZUxldmVsIC8gMiwgZGF0YS54Lmxlbmd0aCAtIHBhcmFtVmFsdWVzLmxlbmd0aCk7XG5cbiAgbGV0IGludjogKHk6IG51bWJlcikgPT4gbnVtYmVyID0gKHk6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiAwO1xuICB9O1xuICBsZXQgaW52VG9wOiAoeTogbnVtYmVyKSA9PiBudW1iZXIgPSAoeTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIDA7XG4gIH07XG4gIGxldCBpbnZCb3R0b206ICh5OiBudW1iZXIpID0+IG51bWJlciA9ICh5OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICBpZiAoc3RhdGlzdGljcykge1xuICAgIGludiA9ICh5OiBudW1iZXIpID0+IHtcbiAgICAgIC8vc2hvdWxkIGNoZWNrIGlmIG1vcmUgdGhhbiBib3R0b20gYW5kIGxlc3MgdGhhbiB0b3BcbiAgICAgIHJldHVybiBwYXJhbVZhbHVlc1syXSAvIE1hdGgucG93KChwYXJhbVZhbHVlc1swXSAtIHkpIC8gKHkgLSBwYXJhbVZhbHVlc1szXSksIDEgLyBwYXJhbVZhbHVlc1sxXSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVycm9yID0gZ2V0SW52RXJyb3IoaW52LCBkYXRhKTtcblxuICAgIGludlRvcCA9ICh5OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW52KHkpO1xuICAgICAgcmV0dXJuIHZhbHVlICsgc3R1ZGVudFEgKiBlcnJvciAvIE1hdGguc3FydChkYXRhLnkubGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgaW52Qm90dG9tID0gKHk6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnYoeSk7XG4gICAgICByZXR1cm4gdmFsdWUgLSBzdHVkZW50USAqIGVycm9yIC8gTWF0aC5zcXJ0KGRhdGEueS5sZW5ndGgpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW52ZXJ0ZWQ6IGludixcbiAgICAgIGludmVydGVkVG9wOiBpbnZUb3AsXG4gICAgICBpbnZlcnRlZEJvdHRvbTogaW52Qm90dG9tLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ21vaWQocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgQSA9IHBhcmFtc1swXTtcbiAgY29uc3QgQiA9IHBhcmFtc1sxXTtcbiAgY29uc3QgQyA9IHBhcmFtc1syXTtcbiAgY29uc3QgRCA9IHBhcmFtc1szXTtcbiAgcmV0dXJuIChEICsgKEEgLSBEKSAvICgxICsgTWF0aC5wb3coMTAsICh4IC0gQykgKiBCKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGluZWFyKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikge1xuICBjb25zdCBBID0gcGFyYW1zWzBdO1xuICBjb25zdCBCID0gcGFyYW1zWzFdO1xuICByZXR1cm4gQSAqIHggKyBCO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXVjKGZpdHRlZEN1cnZlOiAoeDogbnVtYmVyKSA9PiBudW1iZXIsIGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119KTogbnVtYmVyIHtcbiAgbGV0IGF1YyA9IDA7XG5cbiAgY29uc3QgbWluID0gTWF0aC5taW4oLi4uZGF0YS54KTtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4uZGF0YS54KTtcbiAgY29uc3QgaW50ZWdyYXRpb25TdGVwID0gKG1heCAtIG1pbikgLyAxMDAwO1xuXG4gIGZvciAobGV0IHggPSBtaW47IHggPCBtYXg7IHgrPSBpbnRlZ3JhdGlvblN0ZXApXG4gICAgYXVjICs9IGludGVncmF0aW9uU3RlcCAqIGZpdHRlZEN1cnZlKHgpO1xuXG4gIHJldHVybiBhdWM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXRDb2VmZihmaXR0ZWRDdXJ2ZTogKHg6IG51bWJlcikgPT4gbnVtYmVyLCBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSk6IG51bWJlciB7XG4gIGxldCBzc1JlcyA9IDA7XG4gIGxldCBzc1RvdCA9IDA7XG5cbiAgY29uc3QgeU1lYW4gPSBqU3RhdC5tZWFuKGRhdGEueSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLngubGVuZ3RoOyBpKyspIHtcbiAgICBzc1JlcyArPSBNYXRoLnBvdyhkYXRhLnlbaV0gLSBmaXR0ZWRDdXJ2ZShkYXRhLnhbaV0pLCAyKTtcbiAgICBzc1RvdCArPSBNYXRoLnBvdyhkYXRhLnlbaV0gLSB5TWVhbiwgMik7XG4gIH1cblxuICByZXR1cm4gMSAtIHNzUmVzIC8gc3NUb3Q7XG59XG5cbmZ1bmN0aW9uIGdldEludkVycm9yKHRhcmdldEZ1bmM6ICh5OiBudW1iZXIpID0+IG51bWJlciwgZGF0YToge3k6IG51bWJlcltdLCB4OiBudW1iZXJbXX0pOiBudW1iZXIge1xuICBsZXQgc2lnbWEgPSAwO1xuICBsZXQgc2lnbWFTcSA9IDA7XG5cbiAgY29uc3QgcmVzaWR1ZXNTcXVhcmVzID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLnkubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvYnMgPSBkYXRhLnhbaV07XG4gICAgY29uc3QgcHJlZCA9IHRhcmdldEZ1bmMoZGF0YS55W2ldKTtcbiAgICByZXNpZHVlc1NxdWFyZXNbaV0gPSBNYXRoLnBvdyhvYnMgLSBwcmVkLCAyKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIHNpZ21hU3EgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuXG4gIHNpZ21hU3EgLz0gcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDtcbiAgc2lnbWEgPSBNYXRoLnNxcnQoc2lnbWFTcSk7XG5cbiAgcmV0dXJuIHNpZ21hO1xufVxuXG5mdW5jdGlvbiBnZXRPYmplY3RpdmVEZXJpdmF0aXZlKG9mOiBPYmplY3RpdmVGdW5jdGlvbiwgY3VydmVGdW5jdGlvbjogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgcGFyYW1zOiBudW1iZXJbXSwgc2VsZWN0ZWRQYXJhbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3Qgc3RlcCA9IChwYXJhbXNbc2VsZWN0ZWRQYXJhbV0gKiAwLjAwMDEpID09PSAwID8gMC4wMDEgOiAocGFyYW1zW3NlbGVjdGVkUGFyYW1dICogMC4wMDAxKTtcbiAgY29uc3QgcGFyYW1zVG9wOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBwYXJhbXNCb3R0b206IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGkgPT09IHNlbGVjdGVkUGFyYW0pIHtcbiAgICAgIHBhcmFtc1RvcC5wdXNoKHBhcmFtc1tpXSArIHN0ZXApO1xuICAgICAgcGFyYW1zQm90dG9tLnB1c2gocGFyYW1zW2ldIC0gc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtc1RvcC5wdXNoKHBhcmFtc1tpXSk7XG4gICAgICBwYXJhbXNCb3R0b20ucHVzaChwYXJhbXNbaV0pO1xuICAgIH1cbiAgfVxuICBjb25zdCBkcnZUb3AgPSBvZihjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbXNUb3ApLnZhbHVlO1xuICBjb25zdCBkcnZCb3R0b20gPSBvZihjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbXNCb3R0b20pLnZhbHVlO1xuXG4gIHJldHVybiAoZHJ2VG9wIC0gZHJ2Qm90dG9tKSAvICgyICogc3RlcCk7XG59XG5cbmZ1bmN0aW9uIG9iamVjdGl2ZU5vcm1hbENvbnN0YW50KHRhcmdldEZ1bmM6IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlcixcbiAgZGF0YToge3k6IG51bWJlcltdLCB4OiBudW1iZXJbXX0sIHBhcmFtczogbnVtYmVyW10pOiBMaWtlbGlob29kIHtcbiAgLy9hc3N1cmUgb2JzZXJ2ZWQgYW5kIGFyZ3Mgc2FtZSBsZW5ndGhcbiAgY29uc3QgcGkgPSBNYXRoLlBJO1xuICBsZXQgc2lnbWEgPSAwO1xuICBsZXQgc2lnbWFTcSA9IDA7XG4gIGxldCBsaWtlbGlob29kID0gMDtcblxuICBjb25zdCByZXNpZHVlc1NxdWFyZXMgPSBuZXcgRmxvYXQzMkFycmF5KGRhdGEueC5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG9icyA9IGRhdGEueVtpXTtcbiAgICBjb25zdCBwcmVkID0gdGFyZ2V0RnVuYyhwYXJhbXMsIGRhdGEueFtpXSk7XG4gICAgcmVzaWR1ZXNTcXVhcmVzW2ldID0gTWF0aC5wb3cob2JzIC0gcHJlZCwgMik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7IGkrKylcbiAgICBzaWdtYVNxICs9IHJlc2lkdWVzU3F1YXJlc1tpXTtcblxuICBzaWdtYVNxIC89IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7XG4gIHNpZ21hID0gTWF0aC5zcXJ0KHNpZ21hU3EpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIGxpa2VsaWhvb2QgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldIC8gc2lnbWFTcSArIE1hdGgubG9nKDIgKiBwaSAqIHNpZ21hU3EpO1xuXG4gIHJldHVybiB7dmFsdWU6IC1saWtlbGlob29kLCBjb25zdDogc2lnbWEsIG11bHQ6IDB9O1xufVxuXG5mdW5jdGlvbiBvYmplY3RpdmVOb3JtYWxQcm9wb3J0aW9uYWwodGFyZ2V0RnVuYzogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICBkYXRhOiB7eTogbnVtYmVyW10sIHg6IG51bWJlcltdfSwgcGFyYW1zOiBudW1iZXJbXSk6IExpa2VsaWhvb2Qge1xuICAvL2Fzc3VyZSBvYnNlcnZlZCBhbmQgYXJncyBzYW1lIGxlbmd0aFxuICBjb25zdCBwaSA9IE1hdGguUEk7XG4gIGxldCBzaWdtYSA9IDA7XG4gIGxldCBzaWdtYVNxID0gMDtcbiAgbGV0IGxpa2VsaWhvb2QgPSAwO1xuXG4gIGNvbnN0IHJlc2lkdWVzU3F1YXJlcyA9IG5ldyBGbG9hdDMyQXJyYXkoZGF0YS54Lmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2JzID0gZGF0YS55W2ldO1xuICAgIGNvbnN0IHByZWQgPSB0YXJnZXRGdW5jKHBhcmFtcywgZGF0YS54W2ldKTtcbiAgICByZXNpZHVlc1NxdWFyZXNbaV0gPSBNYXRoLnBvdyhvYnMgLSBwcmVkLCAyKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIHNpZ21hU3EgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuXG4gIHNpZ21hU3EgLz0gcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDtcbiAgc2lnbWEgPSBNYXRoLnNxcnQoc2lnbWFTcSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgbGlrZWxpaG9vZCArPSByZXNpZHVlc1NxdWFyZXNbaV0gLyBzaWdtYVNxICsgTWF0aC5sb2coMiAqIHBpICogc2lnbWFTcSk7XG5cbiAgcmV0dXJuIHt2YWx1ZTogLWxpa2VsaWhvb2QsIGNvbnN0OiAwLCBtdWx0OiBzaWdtYX07XG59XG4iXX0=
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWN1cnZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZml0LWN1cnZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixvQ0FBb0M7QUFDcEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxzQkFBc0I7QUFDdEIsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFpQi9CLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixRQUFRLEVBQUUsVUFBVTtJQUNwQixZQUFZLEVBQUUsY0FBYztDQUM3QixDQUFDO0FBMENGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW9CRTtBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDO0FBRTlCLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLHNCQUFzQixDQUFDO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLHVCQUF1QixDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHO0lBQzlDLEdBQUcsRUFBRSxLQUFLO0lBQ1YsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBaUVsQyw0REFBNEQ7QUFDNUQsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFDRSxpQkFBWSxHQUFxQixFQUFFLENBQUM7UUFDcEMsa0JBQWEsR0FBc0IsRUFBRSxDQUFDLENBQUUsNkRBQTZEO1FBQ3JHLFdBQU0sR0FBaUIsRUFBRSxDQUFDO0lBQzVCLENBQUM7Q0FBQTtBQXdCRCwrRUFBK0U7QUFHL0UsZ0hBQWdIO0FB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QUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQzFDLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ2pGLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDekMsRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDO0lBQzlELEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDM0MsRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDO0lBQzlELEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDM0MsRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDO0lBQzlELEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVU7UUFDekYsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUMxRCxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUN2RixFQUFFLENBQUMs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SSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDOUM7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDN0MsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQyxPQUFPLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDN0MsVUFBVSxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBRTFFLE9BQU8sRUFBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW11bHRpLXNwYWNlcyAqL1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuaW1wb3J0IHtsaW1pdGVkTWVtb3J5QkZHU30gZnJvbSAnLi4vLi4vbGJmZ3MvbGJmZ3MnO1xuLy9AdHMtaWdub3JlOiBubyB0eXBlc1xuaW1wb3J0ICogYXMgalN0YXQgZnJvbSAnanN0YXQnO1xuXG5cbnR5cGUgT3B0aW1pemFibGUgPSB7XG4gIGdldFZhbHVlOiAocGFyYW1ldGVyczogbnVtYmVyW10pID0+IG51bWJlcixcbiAgZ2V0R3JhZGllbnQ6IChwYXJhbWV0ZXJzOiBudW1iZXJbXSwgZ3JhZGllbnQ6IG51bWJlcltdKSA9PiBudW1iZXJbXSxcbn1cblxudHlwZSBMaWtlbGlob29kID0ge1xuICB2YWx1ZTogbnVtYmVyLFxuICBjb25zdDogbnVtYmVyLFxuICBtdWx0OiBudW1iZXJcbn07XG5cbnR5cGUgT2JqZWN0aXZlRnVuY3Rpb24gPSAodGFyZ2V0RnVuYzogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICBkYXRhOiB7eDogbnVtYmVyW10sIHk6IG51bWJlcltdfSwgcGFyYW1zOiBudW1iZXJbXSkgPT4gTGlrZWxpaG9vZDtcblxuZXhwb3J0IGNvbnN0IEZpdEVycm9yTW9kZWwgPSB7XG4gIENPTlNUQU5UOiAnY29uc3RhbnQnLFxuICBQUk9QT1JUSU9OQUw6ICdwcm9wb3J0aW9uYWwnLFxufTtcblxuZXhwb3J0IHR5cGUgRml0UGFyYW1Cb3VuZHMgPSB7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xufTtcblxuLyoqIEZpdCBmdW5jdGlvbiBkZXNjcmlwdGlvbi4gQXBwbGllcyB0byBjdXN0b20gdXNlciBmaXQgZnVuY3Rpb25zLlxuICogUmVxdWlyZXMgSlMgYXJyb3cgZnVuY3Rpb25zIGZvciB0aGUgZml0IGZ1bmN0aW9ucyBhbmQgaW5pdGlhbCBwYXJhbWV0ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRml0RnVuY3Rpb25EZXNjcmlwdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZnVuY3Rpb246IHN0cmluZztcbiAgZ2V0SW5pdGlhbFBhcmFtZXRlcnM6IHN0cmluZztcbiAgcGFyYW1ldGVyTmFtZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgdHlwZSBGaXRDdXJ2ZSA9IHtcbiAgZml0dGVkQ3VydmU6ICh4OiBudW1iZXIpID0+IG51bWJlcjtcbiAgcGFyYW1ldGVyczogbnVtYmVyW107XG59O1xuXG5leHBvcnQgdHlwZSBGaXRDb25maWRlbmNlSW50ZXJ2YWxzID0ge1xuICBjb25maWRlbmNlVG9wOiAoeDogbnVtYmVyKSA9PiBudW1iZXI7XG4gIGNvbmZpZGVuY2VCb3R0b206ICh4OiBudW1iZXIpID0+IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpdFN0YXRpc3RpY3MgPSB7XG4gIHJTcXVhcmVkPzogbnVtYmVyLFxuICBhdWM/OiBudW1iZXIsXG4gIGludGVyY2VwdFg6IG51bWJlciwgLy8gcGFyYW1ldGVyc1syXVxuICBpbnRlcmNlcHRZOiBudW1iZXIsIC8vIGZpdHRlZEN1cnZlW3BhcmFtZXRlcnNbMl1dXG4gIHNsb3BlOiBudW1iZXIsIC8vIHBhcmFtZXRlcnNbMV1cbiAgdG9wOiBudW1iZXIsIC8vIHBhcmFtZXRlcnNbMF1cbiAgYm90dG9tOiBudW1iZXIsIC8vIHBhcmFtZXRlcnNbM11cbn07XG5cbmV4cG9ydCB0eXBlIEZpdEludmVydGVkRnVuY3Rpb25zID0ge1xuICBpbnZlcnRlZDogKHk6IG51bWJlcikgPT4gbnVtYmVyLFxuICBpbnZlcnRlZFRvcDogKHk6IG51bWJlcikgPT4gbnVtYmVyLFxuICBpbnZlcnRlZEJvdHRvbTogKHk6IG51bWJlcikgPT4gbnVtYmVyLFxufTtcblxuLyoqXG4gKiAgRGF0YWdyb2sgY3VydmUgZml0dGluZ1xuICpcbiAqIC0gRml0dGluZzogY29tcHV0aW5nIHBhcmFtZXRlcnMgb2YgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0byBiZXN0IGZpdCB0aGUgZGF0YVxuICogICAtIFVzZXMgQkZHUyBvcHRpbWl6YXRpb24gYWxnb3JpdGhtIChtdWx0aS10aHJlYWRpbmcgZm9yIHBlcmZvcm1hbmNlKS5cbiAqICAgICBGb3IgZG9zZS1yZXNwb25zZSBjdXJ2ZXMsIHdlIGFyZSB0eXBpY2FsbHkgZml0dGluZyB0aGUgc2lnbW9pZCBmdW5jdGlvblxuICogICAtIEFiaWxpdHkgdG8gZHluYW1pY2FsbHkgcmVnaXN0ZXIgY3VzdG9tIGZpdHRpbmcgZnVuY3Rpb25zXG4gKiAgICAgLSBBdXRvbWF0aWMgZml0IGZ1bmN0aW9uIGRldGVybWluYXRpb25cbiAqICAgICAtIENhY2hpbmcgb2YgY3VzdG9tIGZpdHRpbmcgZnVuY3Rpb25zXG4gKiAgIC0gQWJpbGl0eSB0byBnZXQgZml0dGluZyBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MgKHItc3F1YXJlZCwgY2xhc3NpZmljYXRpb24sIGV0YylcbiAqIC0gRGVlcCBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBEYXRhZ3JvayBncmlkXG4gKiAgIC0gRWl0aGVyIGZpdHRpbmcgb24gdGhlIGZseSwgb3IgdXNpbmcgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uICsgcGFyYW1ldGVyc1xuICogICAtIE11bHRpcGxlIHNlcmllcyBpbiBvbmUgY2VsbFxuICogICAtIENhbmRsZXN0aWNrcywgY29uZmlkZW5jZSBpbnRlcnZhbHMsIGFuZCBkcm9wbGluZXMgZHJhd2luZ1xuICogICAtIEFiaWxpdHkgdG8gZGVmaW5lIGNoYXJ0LCBtYXJrZXIsIG9yIGZpdHRpbmcgb3B0aW9ucyAoc3VjaCBhcyBmaXQgZnVuY3Rpb24gb3IgbWFya2VyIGNvbG9yKVxuICogICAgIG9uIHRoZSBjb2x1bW4gbGV2ZWwsIHdpdGggdGhlIGFiaWxpdHkgdG8gb3ZlcnJpZGUgaXQgb24gYSBncmlkIGNlbGwgb3IgcG9pbnQgbGV2ZWxcbiAqICAgLSBDbGlja2luZyBhIHBvaW50IGluIGEgY2hhcnQgd2l0aGluIGEgZ3JpZCBtYWtlcyBpdCBhbiBvdXRsaWVyIC0+IGN1cnZlIGlzIHJlLWZpdHRlZCBvbiB0aGUgZmx5XG4gKiAgIC0gQWJpbGl0eSB0byBzcGVjaWZ5IGEgY2hhcnQgYXMgXCJyZWZlcmVuY2VcIiBzbyB0aGF0IGl0IGlzIHNob3duIG9uIGV2ZXJ5IG90aGVyIGNoYXJ0IGZvciBjb21wYXJpc29uXG4gKiAtIEFiaWxpdHkgdG8gb3ZlcmxheSBjdXJ2ZXMgZnJvbSBtdWx0aXBsZSBncmlkIGNlbGxzIChzcGVjaWFsIHZpZXdlcilcbiAqIC0gV29yayB3aXRoIHNlcmllcyBzdG9yZWQgaW4gbXVsdGlwbGUgZm9ybWF0cyAoYmluYXJ5IGZvciBwZXJmb3JtYW5jZSwganNvbiBmb3IgZmxleGliaWxpdHksIGV0YylcbiovXG5cbmV4cG9ydCBjb25zdCBGSVRfU0VNX1RZUEUgPSAnZml0JztcbmV4cG9ydCBjb25zdCBGSVRfQ0VMTF9UWVBFID0gJ2ZpdCc7XG5leHBvcnQgY29uc3QgVEFHX0ZJVCA9ICcuZml0JztcblxuZXhwb3J0IGNvbnN0IENPTkZJREVOQ0VfSU5URVJWQUxfU1RST0tFX0NPTE9SID0gJ3JnYmEoMjU1LDE5MSw2MywwLjQpJztcbmV4cG9ydCBjb25zdCBDT05GSURFTkNFX0lOVEVSVkFMX0ZJTExfQ09MT1IgPSAncmdiYSgyNTUsMjM4LDIwNCwwLjMpJztcblxuZXhwb3J0IGNvbnN0IENVUlZFX0NPTkZJREVOQ0VfSU5URVJWQUxfQk9VTkRTID0ge1xuICBUT1A6ICd0b3AnLFxuICBCT1RUT006ICdib3R0b20nLFxufTtcblxuZXhwb3J0IGNvbnN0IERST1BMSU5FUyA9IFsnSUM1MCddO1xuXG5leHBvcnQgdHlwZSBGaXRNYXJrZXJUeXBlID0gJ2FzdGVyaXNrJyB8ICdjaXJjbGUnIHwgJ2Nyb3NzIGJvcmRlcicgfCAnZGlhbW9uZCcgfCAnc3F1YXJlJyB8ICdzdGFyJyB8ICd0cmlhbmdsZSBib3R0b20nIHxcbiAgJ3RyaWFuZ2xlIGxlZnQnIHwgJ3RyaWFuZ2xlIHJpZ2h0JyB8ICd0cmlhbmdsZSB0b3AnO1xuXG5leHBvcnQgdHlwZSBGaXRMaW5lU3R5bGUgPSAnc29saWQnIHwgJ2RvdHRlZCcgfCAnZGFzaGVkJyB8ICdkYXNoZG90dGVkJztcblxuZXhwb3J0IHR5cGUgRml0RXJyb3JNb2RlbFR5cGUgPSAnY29uc3RhbnQnIHwgJ3Byb3BvcnRpb25hbCc7XG5cbi8qKiBBIHBvaW50IGluIHRoZSBmaXQgc2VyaWVzLiBPbmx5IHggYW5kIHkgYXJlIHJlcXVpcmVkLiBDYW4gb3ZlcnJpZGUgc29tZSBmaWVsZHMgZGVmaW5lZCBpbiBJRml0U2VyaWVzT3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUZpdFBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIG91dGxpZXI/OiBib29sZWFuOyAgICAgICAvLyBpZiB0cnVlLCByZW5kZXJzIGFzICd4JyBhbmQgZ2V0cyBpZ25vcmVkIGZvciBjdXJ2ZSBmaXR0aW5nXG4gIGNvbG9yPzogc3RyaW5nOyAgICAgICAgICAvLyBvdmVycmlkZXMgdGhlIG1hcmtlciBjb2xvciBkZWZpbmVkIGluIElGaXRTZXJpZXNPcHRpb25zXG4gIG91dGxpZXJDb2xvcj86IHN0cmluZzsgICAvLyBvdmVycmlkZXMgdGhlIG91dGxpZXIgY29sb3IgZGVmaW5lZCBpbiBJRml0U2VyaWVzT3B0aW9uc1xuICBtYXJrZXI/OiBGaXRNYXJrZXJUeXBlOyAgLy8gb3ZlcnJpZGVzIHRoZSBtYXJrZXIgdHlwZSBkZWZpbmVkIGluIElGaXRTZXJpZXNPcHRpb25zXG4gIHNpemU/OiBudW1iZXI7ICAgICAgICAgICAvLyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgbWFya2VyIHNpemVcbiAgc3RkZXY/OiBudW1iZXI7ICAgICAgICAgIC8vIHdoZW4gZGVmaW5lZCwgcmVuZGVycyBhbiBlcnJvciBiYXIgY2FuZGxlc3RpY2tcbiAgLy8gbWluWT86IG51bWJlcjsgICAgICAgICAgIC8vIHdoZW4gZGVmaW5lZCwgdGhlIG1hcmtlciByZW5kZXJzIGFzIGEgY2FuZGxlc3RpY2sgd2l0aCB3aGlza2VycyBbbWluWSwgbWF4WV1cbiAgLy8gbWF4WT86IG51bWJlcjsgICAgICAgICAgIC8vIHdoZW4gZGVmaW5lZCwgdGhlIG1hcmtlciByZW5kZXJzIGFzIGEgY2FuZGxlc3RpY2sgd2l0aCB3aGlza2VycyBbbWluWSwgbWF4WV1cbn1cblxuLyoqIEEgc2VyaWVzIGNvbnNpc3RzIG9mIHBvaW50cywgaGFzIGEgbmFtZSwgYW5kIG9wdGlvbnMuXG4gKiBJZiBkZWZpbmVkLCBzZXJpZXNPcHRpb25zIGFyZSBtZXJnZWQgd2l0aCB7QGxpbmsgSUZpdENoYXJ0RGF0YS5zZXJpZXNPcHRpb25zfSAqL1xuZXhwb3J0IGludGVyZmFjZSBJRml0U2VyaWVzIGV4dGVuZHMgSUZpdFNlcmllc09wdGlvbnMge1xuICBwb2ludHM6IElGaXRQb2ludFtdO1xufVxuXG4vKiogQ2hhcnQgbGFiZWxzIG9wdGlvbnMuIENvbnRyb2xzIHRoZSBjaGFydCBsYWJlbHMuICovXG5leHBvcnQgaW50ZXJmYWNlIElGaXRDaGFydExhYmVsT3B0aW9ucyB7XG4gIHZpc2libGU6IGJvb2xlYW47ICAgICAgICAgLy8gaWYgdHJ1ZSwgcmVuZGVycyB0aGUgbGFiZWwgb24gdGhlIHBsb3RcbiAgY29sb3I6IHN0cmluZzsgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBsYWJlbCBjb2xvclxuICBuYW1lOiBzdHJpbmc7ICAgICAgICAgICAgIC8vIGRlZmluZXMgdGhlIGxhYmVsIG5hbWVcbn1cblxuLyoqIENoYXJ0IG9wdGlvbnMuIEZvciBmaXR0ZWQgY3VydmVzLCB0aGlzIG9iamVjdCBpcyBzdG9yZWQgaW4gdGhlIGdyaWQgY29sdW1uIHRhZ3MgYW5kIGlzIHVzZWQgYnkgdGhlIHJlbmRlcmVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRml0Q2hhcnRPcHRpb25zIHtcbiAgbWluWD86IG51bWJlcjtcbiAgbWluWT86IG51bWJlcjtcbiAgbWF4WD86IG51bWJlcjtcbiAgbWF4WT86IG51bWJlcjtcblxuICB0aXRsZT86IHN0cmluZzsgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBwbG90IHRpdGxlLiBJZiB0aGUgcGxvdCBzaXplIGlzIGVub3VnaCwgd2lsbCByZW5kZXIgaXQuXG4gIHhBeGlzTmFtZT86IHN0cmluZzsgICAgICAgIC8vIGRlZmluZXMgdGhlIHggYXhpcyBuYW1lLiBJZiB0aGUgcGxvdCBzaXplIGlzIGVub3VnaCwgd2lsbCByZW5kZXIgaXQuXG4gIHlBeGlzTmFtZT86IHN0cmluZzsgICAgICAgIC8vIGRlZmluZXMgdGhlIFkgYXhpcyBuYW1lLiBJZiB0aGUgcGxvdCBzaXplIGlzIGVub3VnaCwgd2lsbCByZW5kZXIgaXQuXG5cbiAgbG9nWD86IGJvb2xlYW47ICAgICAgICAgICAgLy8gZGVmaW5lcyB3aGV0aGVyIHRoZSB4IGRhdGEgc2hvdWxkIGJlIGxvZ2FyaXRobWljIG9yIG5vdFxuICBsb2dZPzogYm9vbGVhbjsgICAgICAgICAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdGhlIHkgZGF0YSBzaG91bGQgYmUgbG9nYXJpdGhtaWMgb3Igbm90XG5cbiAgYWxsb3dYWmVyb2VzPzogYm9vbGVhbjsgICAgLy8gZGVmaW5lcyB3aGV0aGVyIHggemVyb2VzIGFsbG93ZWQgZm9yIGxvZ2FyaXRobWljIGRhdGEgb3Igbm90XG4gIG1lcmdlU2VyaWVzPzogYm9vbGVhbjsgICAgIC8vIGRlZmluZXMgd2hldGhlciB0byBtZXJnZSBzZXJpZXMgb3Igbm90XG5cbiAgc2hvd0NvbHVtbkxhYmVsPzogYm9vbGVhbjsgLy8gZGVmaW5lcyB3aGV0aGVyIHRvIHNob3cgdGhlIGNvbHVtbiBsYWJlbCBpbiB0aGUgbGVnZW5kIG9yIG5vdFxuICBzaG93U3RhdGlzdGljcz86IHN0cmluZ1tdOyAvLyBkZWZpbmVzIHRoZSBzdGF0aXN0aWNzIHRoYXQgd291bGQgYmUgc2hvd24gb24gdGhlIHBsb3RcbiAgbGFiZWxPcHRpb25zPzogSUZpdENoYXJ0TGFiZWxPcHRpb25zW107IC8vIGNvbnRyb2xzIHRoZSBwbG90IGxhYmVsc1xufVxuXG4vKiogRGF0YSBmb3IgdGhlIGZpdCBjaGFydC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUZpdENoYXJ0RGF0YSB7XG4gIGNoYXJ0T3B0aW9ucz86IElGaXRDaGFydE9wdGlvbnM7XG4gIHNlcmllc09wdGlvbnM/OiBJRml0U2VyaWVzT3B0aW9uczsgIC8vIERlZmF1bHQgc2VyaWVzIG9wdGlvbnMuIEluZGl2aWR1YWwgc2VyaWVzIGNhbiBvdmVycmlkZSBpdC5cbiAgc2VyaWVzPzogSUZpdFNlcmllc1tdO1xufVxuXG4vKiogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBJRml0Q2hhcnREYXRhfSBpbnRlcmZhY2UgKi9cbmV4cG9ydCBjbGFzcyBGaXRDaGFydERhdGEgaW1wbGVtZW50cyBJRml0Q2hhcnREYXRhIHtcbiAgY2hhcnRPcHRpb25zOiBJRml0Q2hhcnRPcHRpb25zID0ge307XG4gIHNlcmllc09wdGlvbnM6IElGaXRTZXJpZXNPcHRpb25zID0ge307ICAvLyBEZWZhdWx0IHNlcmllcyBvcHRpb25zLiBJbmRpdmlkdWFsIHNlcmllcyBjYW4gb3ZlcnJpZGUgaXQuXG4gIHNlcmllczogSUZpdFNlcmllc1tdID0gW107XG59XG5cbi8qKiBTZXJpZXMgb3B0aW9ucyBjYW4gYmUgZWl0aGVyIGFwcGxpZWQgZ2xvYmFsbHkgb24gYSBjb2x1bW4gbGV2ZWwsIG9yIHBhcnRpYWxseSBvdmVycmlkZGVuIGluIHBhcnRpY3VsYXIgc2VyaWVzICovXG5leHBvcnQgaW50ZXJmYWNlIElGaXRTZXJpZXNPcHRpb25zIHtcbiAgbmFtZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250cm9scyB0aGUgc2VyaWVzIG5hbWVcbiAgZml0RnVuY3Rpb24/OiBzdHJpbmcgfCBJRml0RnVuY3Rpb25EZXNjcmlwdGlvbjsgLy8gY29udHJvbHMgdGhlIHNlcmllcyBmaXQgZnVuY3Rpb25cbiAgcGFyYW1ldGVycz86IG51bWJlcltdOyAgICAgICAgICAgICAgICAvLyBjb250cm9scyB0aGUgc2VyaWVzIHBhcmFtZXRlcnMsIGF1dG8tZml0dGluZyB3aGVuIG5vdCBkZWZpbmVkXG4gIHBhcmFtZXRlckJvdW5kcz86IEZpdFBhcmFtQm91bmRzW107ICAgLy8gZGVmaW5lcyB0aGUgYWNjZXB0YWJsZSByYW5nZSBvZiBlYWNoIHBhcmFtZXRlciwgd2hpY2ggaXMgdGFrZW4gaW50byBhY2NvdW50IGR1cmluZyB0aGUgZml0dGluZy4gU2VlIGFsc28gYHBhcmFtZXRlcnNgLlxuICBtYXJrZXJUeXBlPzogRml0TWFya2VyVHlwZTsgICAgICAgICAgIC8vIGRlZmluZXMgdGhlIHNlcmllcyBtYXJrZXIgdHlwZVxuICBsaW5lU3R5bGU/OiBGaXRMaW5lU3R5bGU7ICAgICAgICAgICAgIC8vIGRlZmluZXMgdGhlIHNlcmllcyBsaW5lIHN0eWxlXG4gIHBvaW50Q29sb3I/OiBzdHJpbmc7ICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZGl6ZWQgc2VyaWVzIHBvaW50IGNvbG9yXG4gIGZpdExpbmVDb2xvcj86IHN0cmluZzsgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZGl6ZWQgc2VyaWVzIGZpdCBsaW5lIGNvbG9yXG4gIGNvbmZpZGVuY2VJbnRlcnZhbENvbG9yPzogc3RyaW5nOyAgICAgLy8gb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZGl6ZWQgc2VyaWVzIGNvbmZpZGVuY2UgaW50ZXJ2YWwgY29sb3JcbiAgb3V0bGllckNvbG9yPzogc3RyaW5nOyAgICAgICAgICAgICAgICAvLyBvdmVycmlkZXMgdGhlIHN0YW5kYXJkaXplZCBzZXJpZXMgb3V0bGllciBjb2xvclxuICBjb25uZWN0RG90cz86IGJvb2xlYW47ICAgICAgICAgICAgICAgIC8vIGRlZmluZXMgd2hldGhlciB0byBjb25uZWN0IHRoZSBwb2ludHMgd2l0aCBsaW5lcyBvciBub3QuIElmIHRydWUgYW5kIHNob3dGaXRMaW5lIGlzIGZhbHNlIC0gZml0dGluZyBpcyBkaXNhYmxlZCAtIG90aGVyd2lzZSwgaXQgd2lsbCBiZSByZW5kZXJlZCBhY2NvcmRpbmdseSB0byB0aGUgcGFyYW1ldGVyIHZhbHVlLlxuICBzaG93Rml0TGluZT86IGJvb2xlYW47ICAgICAgICAgICAgICAgIC8vIGRlZmluZXMgd2hldGhlciB0byBzaG93IHRoZSBmaXQgbGluZSBvciBub3RcbiAgc2hvd1BvaW50cz86IHN0cmluZzsgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBkYXRhIGRpc3BsYXkgbW9kZVxuICBzaG93Q3VydmVDb25maWRlbmNlSW50ZXJ2YWw/OiBib29sZWFuOyAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb3Igbm90XG4gIGVycm9yTW9kZWw/OiBGaXRFcnJvck1vZGVsVHlwZTsgICAgICAgLy8gZGVmaW5lcyB0aGUgc2VyaWVzIGVycm9yIG1vZGVsXG4gIGNsaWNrVG9Ub2dnbGU/OiBib29sZWFuOyAgICAvLyBpZiB0cnVlLCBjbGlja2luZyBvbiB0aGUgcG9pbnQgdG9nZ2xlcyBpdHMgb3V0bGllciBzdGF0dXMgYW5kIGNhdXNlcyBjdXJ2ZSByZWZpdHRpbmdcbiAgbGFiZWxzPzoge1trZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW59OyAvLyBjb250cm9sbGVkIGJ5IElGaXRDaGFydERhdGEgbGFiZWxPcHRpb25zLCBzaG93cyBsYWJlbHNcbiAgZHJvcGxpbmVzPzogc3RyaW5nW107ICAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBkcm9wbGluZXMgdGhhdCB3b3VsZCBiZSBzaG93biBvbiB0aGUgcGxvdCAoSUM1MClcbiAgY29sdW1uTmFtZT86IHN0cmluZzsgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHRoZSBjb2x1bW4gbmFtZSB3aGVyZSB0aGUgc2VyaWVzIGlzIHN0b3JlZFxufVxuLy8gVE9ETzogc2hvdyBsYWJlbHMgaW4gcHJvcGVydHkgcGFuZWwgaWYgcHJlc2VudCwgY29sb3IgYnkgZGVmYXVsdCBmcm9tIHNlcmllc1xuXG5cbi8qKiBQcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUge0BsaW5rIEZpdFN0YXRpc3RpY3N9LiBVc2VmdWwgZm9yIGVkaXRpbmcsIGluaXRpYWxpemF0aW9uLCB0cmFuc2Zvcm1hdGlvbnMsIGV0Yy4gKi9cbmV4cG9ydCBjb25zdCBzdGF0aXN0aWNzUHJvcGVydGllczogREcuUHJvcGVydHlbXSA9IFtcbiAgREcuUHJvcGVydHkuanMoJ3JTcXVhcmVkJywgREcuVFlQRS5GTE9BVCwge3VzZXJFZGl0YWJsZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2F1YycsIERHLlRZUEUuRkxPQVQsIHt1c2VyRWRpdGFibGU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdpbnRlcmNlcHRZJywgREcuVFlQRS5GTE9BVCwge3VzZXJFZGl0YWJsZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2ludGVyY2VwdFgnLCBERy5UWVBFLkZMT0FULCB7dXNlckVkaXRhYmxlOiBmYWxzZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnc2xvcGUnLCBERy5UWVBFLkZMT0FULCB7dXNlckVkaXRhYmxlOiBmYWxzZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygndG9wJywgREcuVFlQRS5GTE9BVCwge3VzZXJFZGl0YWJsZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2JvdHRvbScsIERHLlRZUEUuRkxPQVQsIHt1c2VyRWRpdGFibGU6IGZhbHNlfSksXG5dO1xuXG4vKiogUHJvcGVydGllcyB0aGF0IGRlc2NyaWJlIHtAbGluayBJRml0Q2hhcnRPcHRpb25zfS4gVXNlZnVsIGZvciBlZGl0aW5nLCBpbml0aWFsaXphdGlvbiwgdHJhbnNmb3JtYXRpb25zLCBldGMuICovXG5leHBvcnQgY29uc3QgZml0Q2hhcnREYXRhUHJvcGVydGllczogREcuUHJvcGVydHlbXSA9IFtcbiAgLy8gU3R5bGUgYW5kIHpvb21cbiAgREcuUHJvcGVydHkuanMoJ21pblgnLCBERy5UWVBFLkZMT0FULCB7ZGVzY3JpcHRpb246ICdNaW5pbXVtIHZhbHVlIG9mIHRoZSBYIGF4aXMnLCBudWxsYWJsZTogdHJ1ZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnbWluWScsIERHLlRZUEUuRkxPQVQsIHtkZXNjcmlwdGlvbjogJ01pbmltdW0gdmFsdWUgb2YgdGhlIFkgYXhpcycsIG51bGxhYmxlOiB0cnVlfSksXG4gIERHLlByb3BlcnR5LmpzKCdtYXhYJywgREcuVFlQRS5GTE9BVCwge2Rlc2NyaXB0aW9uOiAnTWF4aW11bSB2YWx1ZSBvZiB0aGUgWCBheGlzJywgbnVsbGFibGU6IHRydWV9KSxcbiAgREcuUHJvcGVydHkuanMoJ21heFknLCBERy5UWVBFLkZMT0FULCB7ZGVzY3JpcHRpb246ICdNYXhpbXVtIHZhbHVlIG9mIHRoZSBZIGF4aXMnLCBudWxsYWJsZTogdHJ1ZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygndGl0bGUnLCBERy5UWVBFLlNUUklORywge251bGxhYmxlOiB0cnVlfSksXG4gIERHLlByb3BlcnR5LmpzKCd4QXhpc05hbWUnLCBERy5UWVBFLlNUUklORywge2Rlc2NyaXB0aW9uOlxuICAgICdMYWJlbCB0byBzaG93IG9uIHRoZSBYIGF4aXMuIElmIG5vdCBzcGVjaWZpZWQsIGNvcnJlc3BvbmRpbmcgZGF0YSBjb2x1bW4gbmFtZSBpcyB1c2VkJywgbnVsbGFibGU6IHRydWV9KSxcbiAgREcuUHJvcGVydHkuanMoJ3lBeGlzTmFtZScsIERHLlRZUEUuU1RSSU5HLCB7ZGVzY3JpcHRpb246XG4gICAgJ0xhYmVsIHRvIHNob3cgb24gdGhlIFkgYXhpcy4gSWYgbm90IHNwZWNpZmllZCwgY29ycmVzcG9uZGluZyBkYXRhIGNvbHVtbiBuYW1lIGlzIHVzZWQnLCBudWxsYWJsZTogdHJ1ZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnbG9nWCcsIERHLlRZUEUuQk9PTCwge2Rlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgWCBheGlzIHNob3VsZCBiZSBsb2dhcml0aG1pYycsIGRlZmF1bHRWYWx1ZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2xvZ1knLCBERy5UWVBFLkJPT0wsIHtkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIFkgYXhpcyBzaG91bGQgYmUgbG9nYXJpdGhtaWMnLCBkZWZhdWx0VmFsdWU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdhbGxvd1haZXJvZXMnLCBERy5UWVBFLkJPT0wsIHtkZXNjcmlwdGlvbjogJ1doZXRoZXIgeCB6ZXJvZXMgYWxsb3dlZCBmb3IgbG9nYXJpdGhtaWMgZGF0YSBvciBub3QnLCBkZWZhdWx0VmFsdWU6IHRydWV9KSxcbiAgREcuUHJvcGVydHkuanMoJ21lcmdlU2VyaWVzJywgREcuVFlQRS5CT09MLCB7ZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG1lcmdlIHNlcmllcyBvciBub3QnLCBkZWZhdWx0VmFsdWU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdzaG93Q29sdW1uTGFiZWwnLCBERy5UWVBFLkJPT0wsIHtkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB0aGUgY29sdW1uIGxhYmVsIGluIHRoZSBsZWdlbmQgb3Igbm90JywgZGVmYXVsdFZhbHVlOiBmYWxzZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnc2hvd1N0YXRpc3RpY3MnLCBERy5UWVBFLlNUUklOR19MSVNULCB7ZGVzY3JpcHRpb246ICdXaGV0aGVyIHNwZWNpZmljIHN0YXRpc3RpY3Mgc2hvdWxkIGJlIHJlbmRlcmVkJyxcbiAgICBjaG9pY2VzOiBzdGF0aXN0aWNzUHJvcGVydGllcy5tYXAoKGZycCkgPT4gZnJwLm5hbWUpLCBpbnB1dFR5cGU6ICdNdWx0aUNob2ljZScsXG4gICAgLy9AdHMtaWdub3JlXG4gICAgZnJpZW5kbHlOYW1lOiAnU3RhdGlzdGljcyd9KSxcbl07XG5cbi8qKiBQcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUge0BsaW5rIElGaXRTZXJpZXNPcHRpb25zfS4gVXNlZnVsIGZvciBlZGl0aW5nLCBpbml0aWFsaXphdGlvbiwgdHJhbnNmb3JtYXRpb25zLCBldGMuICovXG5leHBvcnQgY29uc3QgZml0U2VyaWVzUHJvcGVydGllczogREcuUHJvcGVydHlbXSA9IFtcbiAgREcuUHJvcGVydHkuanMoJ2ZpdEZ1bmN0aW9uJywgREcuVFlQRS5TVFJJTkcsXG4gICAge2NhdGVnb3J5OiAnRml0dGluZycsIGNob2ljZXM6IFsnc2lnbW9pZCcsICdsaW5lYXInXSwgZGVmYXVsdFZhbHVlOiAnc2lnbW9pZCd9KSxcbiAgREcuUHJvcGVydHkuanMoJ3BvaW50Q29sb3InLCBERy5UWVBFLlNUUklORyxcbiAgICB7Y2F0ZWdvcnk6ICdSZW5kZXJpbmcnLCBudWxsYWJsZTogdHJ1ZSwgaW5wdXRUeXBlOiAnQ29sb3InfSksXG4gIERHLlByb3BlcnR5LmpzKCdmaXRMaW5lQ29sb3InLCBERy5UWVBFLlNUUklORyxcbiAgICB7Y2F0ZWdvcnk6ICdSZW5kZXJpbmcnLCBudWxsYWJsZTogdHJ1ZSwgaW5wdXRUeXBlOiAnQ29sb3InfSksXG4gIERHLlByb3BlcnR5LmpzKCdvdXRsaWVyQ29sb3InLCBERy5UWVBFLlNUUklORyxcbiAgICB7Y2F0ZWdvcnk6ICdSZW5kZXJpbmcnLCBudWxsYWJsZTogdHJ1ZSwgaW5wdXRUeXBlOiAnQ29sb3InfSksXG4gIERHLlByb3BlcnR5LmpzKCdlcnJvck1vZGVsJywgREcuVFlQRS5TVFJJTkcsIHtjYXRlZ29yeTogJ0ZpdHRpbmcnLCBkZWZhdWx0VmFsdWU6ICdjb25zdGFudCcsXG4gICAgY2hvaWNlczogWydjb25zdGFudCcsICdwcm9wb3J0aW9uYWwnXSwgbnVsbGFibGU6IGZhbHNlfSksXG4gIERHLlByb3BlcnR5LmpzKCdjb25uZWN0RG90cycsIERHLlRZUEUuQk9PTCwge2NhdGVnb3J5OiAnRml0dGluZycsIGRlZmF1bHRWYWx1ZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2NsaWNrVG9Ub2dnbGUnLCBERy5UWVBFLkJPT0wsIHtjYXRlZ29yeTogJ0ZpdHRpbmcnLCBkZXNjcmlwdGlvbjpcbiAgICAnQ2xpY2sgb24gYSBwb2ludCB0byBtYXJrIGl0IGFzIG91dGxpZXIgYW5kIHJlZml0JywgbnVsbGFibGU6IHRydWUsIGRlZmF1bHRWYWx1ZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ3Nob3dGaXRMaW5lJywgREcuVFlQRS5CT09MLCB7Y2F0ZWdvcnk6ICdGaXR0aW5nJywgZGVmYXVsdFZhbHVlOiB0cnVlfSksXG4gIERHLlByb3BlcnR5LmpzKCdzaG93UG9pbnRzJywgREcuVFlQRS5TVFJJTkcsIC8vIHJld3JpdGUgZGVzY3JpcHRpb25cbiAgICB7Y2F0ZWdvcnk6ICdGaXR0aW5nJywgZGVzY3JpcHRpb246ICdXaGV0aGVyIHBvaW50cy9jYW5kbGVzdGlja3Mvbm9uZSBzaG91bGQgYmUgcmVuZGVyZWQnLFxuICAgICAgZGVmYXVsdFZhbHVlOiAncG9pbnRzJywgY2hvaWNlczogWydwb2ludHMnLCAnY2FuZGxlc3RpY2tzJywgJ2JvdGgnXX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnc2hvd0N1cnZlQ29uZmlkZW5jZUludGVydmFsJywgREcuVFlQRS5CT09MLFxuICAgIHtjYXRlZ29yeTogJ0ZpdHRpbmcnLCBkZXNjcmlwdGlvbjogJ1doZXRoZXIgY29uZmlkZW5jZSBpbnRlcnZhbHMgc2hvdWxkIGJlIHJlbmRlcmVkJywgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgZnJpZW5kbHlOYW1lOiAnQ29uZmlkZW5jZSBJbnRlcnZhbCd9KSxcbiAgREcuUHJvcGVydHkuanMoJ21hcmtlclR5cGUnLCBERy5UWVBFLlNUUklORywge2NhdGVnb3J5OiAnUmVuZGVyaW5nJywgZGVmYXVsdFZhbHVlOiAnY2lyY2xlJyxcbiAgICBjaG9pY2VzOiBbJ2FzdGVyaXNrJywgJ2NpcmNsZScsICdjcm9zcyBib3JkZXInLCAnZGlhbW9uZCcsICdzcXVhcmUnLCAnc3RhcicsXG4gICAgICAndHJpYW5nbGUgYm90dG9tJywgJ3RyaWFuZ2xlIGxlZnQnLCAndHJpYW5nbGUgcmlnaHQnLCAndHJpYW5nbGUgdG9wJ10sIG51bGxhYmxlOiBmYWxzZX0pLFxuICBERy5Qcm9wZXJ0eS5qcygnbGluZVN0eWxlJywgREcuVFlQRS5TVFJJTkcsIHtjYXRlZ29yeTogJ1JlbmRlcmluZycsIGRlZmF1bHRWYWx1ZTogJ3NvbGlkJyxcbiAgICBjaG9pY2VzOiBbJ3NvbGlkJywgJ2RvdHRlZCcsICdkYXNoZWQnLCAnZGFzaGRvdHRlZCddLCBudWxsYWJsZTogZmFsc2V9KSxcbiAgREcuUHJvcGVydHkuanMoJ2Ryb3BsaW5lcycsIERHLlRZUEUuU1RSSU5HX0xJU1QsIHtkZXNjcmlwdGlvbjogJ1doZXRoZXIgc3BlY2lmaWMgZHJvcGxpbmVzIHNob3VsZCBiZSByZW5kZXJlZCcsXG4gICAgY2hvaWNlczogRFJPUExJTkVTLCBpbnB1dFR5cGU6ICdNdWx0aUNob2ljZSd9KSxcbiAgREcuUHJvcGVydHkuanMoJ2NvbHVtbk5hbWUnLCBERy5UWVBFLlNUUklORywge2Rlc2NyaXB0aW9uOiAnQ29sdW1uIG5hbWUgd2hlcmUgdGhlIHNlcmllcyBpcyBzdG9yZWQnLCBkZWZhdWx0VmFsdWU6ICcnfSksXG5dO1xuXG5leHBvcnQgY29uc3QgRklUX0ZVTkNUSU9OX1NJR01PSUQgPSAnc2lnbW9pZCc7XG5leHBvcnQgY29uc3QgRklUX0ZVTkNUSU9OX0xJTkVBUiA9ICdsaW5lYXInO1xuXG5leHBvcnQgY29uc3QgRklUX1NUQVRTX1JTUVVBUkVEID0gJ3JTcXVhcmVkJztcbmV4cG9ydCBjb25zdCBGSVRfU1RBVFNfQVVDID0gJ2F1Yyc7XG5cblxuLy8gVE9ETz86IGFkZCBtZXRob2QgdG8gcmV0dXJuIHBhcmFtZXRlcnMgLSBnZXQgcGFyYW1ldGVycyBmcm9tIGZpdCBmdW5jdGlvblxuLyoqIENsYXNzIGZvciB0aGUgZml0IGZ1bmN0aW9ucyAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpdEZ1bmN0aW9uIHtcbiAgYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyO1xuICBhYnN0cmFjdCBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBudW1iZXJbXTtcbn1cblxuLyoqIENsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgbGluZWFyIGZ1bmN0aW9uICovXG5leHBvcnQgY2xhc3MgTGluZWFyRnVuY3Rpb24gZXh0ZW5kcyBGaXRGdW5jdGlvbiB7XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEZJVF9GVU5DVElPTl9MSU5FQVI7XG4gIH1cblxuICBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ1Nsb3BlJywgJ0ludGVyY2VwdCddO1xuICB9XG5cbiAgeShwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBsaW5lYXIocGFyYW1zLCB4KTtcbiAgfVxuXG4gIGdldEluaXRpYWxQYXJhbWV0ZXJzKHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICBsZXQgbWluSW5kZXggPSAwO1xuICAgIGxldCBtYXhJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoeFtpXSA8IHhbbWluSW5kZXhdKVxuICAgICAgICBtaW5JbmRleCA9IGk7XG4gICAgICBpZiAoeFtpXSA+IHhbbWF4SW5kZXhdKVxuICAgICAgICBtYXhJbmRleCA9IGk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsdGFYID0geFttYXhJbmRleF0gLSB4W21pbkluZGV4XTtcbiAgICBjb25zdCBkZWx0YVkgPSB5W21heEluZGV4XSAtIHlbbWluSW5kZXhdO1xuICAgIGNvbnN0IEEgPSBkZWx0YVkgLyBkZWx0YVg7XG4gICAgY29uc3QgQiA9IHlbbWF4SW5kZXhdIC0gQSAqIHhbbWF4SW5kZXhdO1xuICAgIHJldHVybiBbQSwgQl07XG4gIH1cbn1cblxuLyoqIENsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgc2lnbW9pZCBmdW5jdGlvbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ21vaWRGdW5jdGlvbiBleHRlbmRzIEZpdEZ1bmN0aW9uIHtcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRklUX0ZVTkNUSU9OX1NJR01PSUQ7XG4gIH1cblxuICBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ1RvcCcsICdCb3R0b20nLCAnU2xvcGUnLCAnSUM1MCddO1xuICB9XG5cbiAgeShwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBzaWdtb2lkKHBhcmFtcywgeCk7XG4gIH1cblxuICBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZGF0YUJvdW5kcyA9IERHLlJlY3QuZnJvbVhZQXJyYXlzKHgsIHkpO1xuICAgIGNvbnN0IG1lZFkgPSAoZGF0YUJvdW5kcy5ib3R0b20gLSBkYXRhQm91bmRzLnRvcCkgLyAyICsgZGF0YUJvdW5kcy50b3A7XG4gICAgbGV0IG1heFlJbnRlcnZhbCA9IGRhdGFCb3VuZHMuYm90dG9tIC0gZGF0YUJvdW5kcy50b3A7XG4gICAgbGV0IG5lYXJlc3RYSW5kZXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY3VycmVudEludGVydmFsID0gTWF0aC5hYnMoeVtpXSAtIG1lZFkpO1xuICAgICAgaWYgKGN1cnJlbnRJbnRlcnZhbCA8IG1heFlJbnRlcnZhbCkge1xuICAgICAgICBtYXhZSW50ZXJ2YWwgPSBjdXJyZW50SW50ZXJ2YWw7XG4gICAgICAgIG5lYXJlc3RYSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB4QXRNZWRZID0geFtuZWFyZXN0WEluZGV4XTtcbiAgICBjb25zdCBzbG9wZSA9IHlbMF0gPiB5W3kubGVuZ3RoIC0gMV0gPyAxIDogLTE7XG5cbiAgICAvLyBwYXJhbXMgYXJlOiBbbWF4LCB0YW4sIElDNTAsIG1pbl1cbiAgICByZXR1cm4gW2RhdGFCb3VuZHMuYm90dG9tLCBzbG9wZSwgeEF0TWVkWSwgZGF0YUJvdW5kcy50b3BdO1xuICB9XG59XG5cbi8qKiBDbGFzcyB0aGF0IGltcGxlbWVudHMgdXNlciBKUyBmdW5jdGlvbnMgKi9cbmV4cG9ydCBjbGFzcyBKc0Z1bmN0aW9uIGV4dGVuZHMgRml0RnVuY3Rpb24ge1xuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3BhcmFtZXRlck5hbWVzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHlGdW5jOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgZ2V0SW5pdFBhcmFtc0Z1bmM6ICh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pID0+IG51bWJlcltdLCBwYXJhbWV0ZXJOYW1lczogc3RyaW5nW10pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fcGFyYW1ldGVyTmFtZXMgPSBwYXJhbWV0ZXJOYW1lcztcblxuICAgIHRoaXMueSA9IHlGdW5jO1xuICAgIHRoaXMuZ2V0SW5pdGlhbFBhcmFtZXRlcnMgPSBnZXRJbml0UGFyYW1zRnVuYztcbiAgfVxuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJOYW1lcztcbiAgfVxuXG4gIHkocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFBhcmFtZXRlcnMoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuLy8gT2JqZWN0IHdpdGggZml0IGZ1bmN0aW9uc1xuZXhwb3J0IGNvbnN0IGZpdEZ1bmN0aW9uczoge1tpbmRleDogc3RyaW5nXTogRml0RnVuY3Rpb259ID0ge1xuICAnbGluZWFyJzogbmV3IExpbmVhckZ1bmN0aW9uKCksXG4gICdzaWdtb2lkJzogbmV3IFNpZ21vaWRGdW5jdGlvbigpLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJRml0T3B0aW9ucyB7XG4gIGVycm9yTW9kZWw6IEZpdEVycm9yTW9kZWxUeXBlO1xuICBjb25maWRlbmNlTGV2ZWw6IG51bWJlcjtcbiAgc3RhdGlzdGljczogYm9vbGVhbjtcbn1cblxuXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RpdmVGdW5jdGlvbihlcnJvck1vZGVsOiBGaXRFcnJvck1vZGVsVHlwZSk6IE9iamVjdGl2ZUZ1bmN0aW9uIHtcbiAgbGV0IG9mOiBPYmplY3RpdmVGdW5jdGlvbjtcblxuICBzd2l0Y2ggKGVycm9yTW9kZWwpIHtcbiAgY2FzZSBGaXRFcnJvck1vZGVsLkNPTlNUQU5UOlxuICAgIG9mID0gb2JqZWN0aXZlTm9ybWFsQ29uc3RhbnQ7XG4gICAgYnJlYWs7XG4gIGNhc2UgRml0RXJyb3JNb2RlbC5QUk9QT1JUSU9OQUw6XG4gICAgb2YgPSBvYmplY3RpdmVOb3JtYWxQcm9wb3J0aW9uYWw7XG4gICAgYnJlYWs7XG4gIGRlZmF1bHQ6XG4gICAgb2YgPSBvYmplY3RpdmVOb3JtYWxDb25zdGFudDtcbiAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBvZjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT3B0aW1pemFibGUoZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0sIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlcixcbiAgb2Y6IE9iamVjdGl2ZUZ1bmN0aW9uLCBmaXhlZDogbnVtYmVyW10pOiBPcHRpbWl6YWJsZSB7XG4gIHJldHVybiB7XG4gICAgZ2V0VmFsdWU6IChwYXJhbWV0ZXJzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgcmV0dXJuIG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtZXRlcnMpLnZhbHVlO1xuICAgIH0sXG4gICAgZ2V0R3JhZGllbnQ6IChwYXJhbWV0ZXJzOiBudW1iZXJbXSwgZ3JhZGllbnQ6IG51bWJlcltdKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgIGdyYWRpZW50W2ldID0gZml4ZWQuaW5jbHVkZXMoaSkgPyAwIDogZ2V0T2JqZWN0aXZlRGVyaXZhdGl2ZShvZiwgY3VydmVGdW5jdGlvbiwgZGF0YSwgcGFyYW1ldGVycywgaSk7XG5cbiAgICAgIHJldHVybiBncmFkaWVudDtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGaXRGdW5jdGlvbihzZXJpZXNGaXRGdW5jOiBzdHJpbmcgfCBJRml0RnVuY3Rpb25EZXNjcmlwdGlvbik6IEZpdEZ1bmN0aW9uIHtcbiAgaWYgKHR5cGVvZiBzZXJpZXNGaXRGdW5jID09PSAnc3RyaW5nJylcbiAgICByZXR1cm4gZml0RnVuY3Rpb25zW3Nlcmllc0ZpdEZ1bmNdO1xuICBlbHNlIGlmICghZml0RnVuY3Rpb25zW3Nlcmllc0ZpdEZ1bmMubmFtZV0pIHtcbiAgICBjb25zdCBuYW1lID0gc2VyaWVzRml0RnVuYy5uYW1lO1xuICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBzZXJpZXNGaXRGdW5jLnBhcmFtZXRlck5hbWVzO1xuICAgIGNvbnN0IGZpdEZ1bmN0aW9uUGFydHMgPSBzZXJpZXNGaXRGdW5jLmZ1bmN0aW9uLnNwbGl0KCc9PicpLm1hcCgoZWxlbSkgPT4gZWxlbS50cmltKCkpO1xuICAgIGNvbnN0IGdldEluaXRQYXJhbXNQYXJ0cyA9IHNlcmllc0ZpdEZ1bmMuZ2V0SW5pdGlhbFBhcmFtZXRlcnMuc3BsaXQoJz0+JykubWFwKChlbGVtKSA9PiBlbGVtLnRyaW0oKSk7XG4gICAgY29uc3QgZml0RnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oZml0RnVuY3Rpb25QYXJ0c1swXS5zbGljZSgxLCBmaXRGdW5jdGlvblBhcnRzWzBdLmxlbmd0aCAtIDEpLFxuICAgICAgYCR7Zml0RnVuY3Rpb25QYXJ0c1sxXS5pbmNsdWRlcygnOycpID8gJycgOiAncmV0dXJuICd9JHtmaXRGdW5jdGlvblBhcnRzWzFdfWApO1xuICAgIGNvbnN0IGdldEluaXRQYXJhbXNGdW5jID0gbmV3IEZ1bmN0aW9uKGdldEluaXRQYXJhbXNQYXJ0c1swXS5zbGljZSgxLCBnZXRJbml0UGFyYW1zUGFydHNbMF0ubGVuZ3RoIC0gMSksXG4gICAgICBgcmV0dXJuICR7Z2V0SW5pdFBhcmFtc1BhcnRzWzFdfWApO1xuICAgIGNvbnN0IGZpdEZ1bmMgPSBuZXcgSnNGdW5jdGlvbihuYW1lLCAoZml0RnVuY3Rpb24gYXMgKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyKSxcbiAgICAgIChnZXRJbml0UGFyYW1zRnVuYyBhcyAoeDogbnVtYmVyW10sIHk6IG51bWJlcltdKSA9PiBudW1iZXJbXSksIHBhcmFtTmFtZXMpO1xuICAgIGZpdEZ1bmN0aW9uc1tuYW1lXSA9IGZpdEZ1bmM7XG4gIH1cblxuICByZXR1cm4gZml0RnVuY3Rpb25zW3Nlcmllc0ZpdEZ1bmMubmFtZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXREYXRhKGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LCBmaXRGdW5jdGlvbjogRml0RnVuY3Rpb24sIGVycm9yTW9kZWw6IEZpdEVycm9yTW9kZWxUeXBlLFxuICBwYXJhbWV0ZXJCb3VuZHM/OiBGaXRQYXJhbUJvdW5kc1tdKTogRml0Q3VydmUge1xuICBjb25zdCBjdXJ2ZUZ1bmN0aW9uID0gZml0RnVuY3Rpb24ueTtcbiAgY29uc3QgcGFyYW1WYWx1ZXMgPSBmaXRGdW5jdGlvbi5nZXRJbml0aWFsUGFyYW1ldGVycyhkYXRhLngsIGRhdGEueSk7XG5cbiAgY29uc3Qgb2YgPSBjcmVhdGVPYmplY3RpdmVGdW5jdGlvbihlcnJvck1vZGVsKTtcbiAgY29uc3QgZml4ZWQ6IG51bWJlcltdID0gW107XG4gIGxldCBvdmVyTGltaXRzID0gdHJ1ZTtcblxuICB3aGlsZSAob3ZlckxpbWl0cykge1xuICAgIGNvbnN0IG9wdGltaXphYmxlID0gY3JlYXRlT3B0aW1pemFibGUoZGF0YSwgY3VydmVGdW5jdGlvbiwgb2YsIGZpeGVkKTtcbiAgICBsaW1pdGVkTWVtb3J5QkZHUyhvcHRpbWl6YWJsZSwgcGFyYW1WYWx1ZXMpO1xuICAgIGxpbWl0ZWRNZW1vcnlCRkdTKG9wdGltaXphYmxlLCBwYXJhbVZhbHVlcyk7XG5cbiAgICBvdmVyTGltaXRzID0gZmFsc2U7XG4gICAgaWYgKCFwYXJhbWV0ZXJCb3VuZHMpXG4gICAgICBicmVhaztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVyQm91bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGFyYW1ldGVyQm91bmRzW2ldPy5tYXggIT09IHVuZGVmaW5lZCAmJiBwYXJhbVZhbHVlc1tpXSA+IHBhcmFtZXRlckJvdW5kc1tpXS5tYXghKSB7XG4gICAgICAgIG92ZXJMaW1pdHMgPSB0cnVlO1xuICAgICAgICBmaXhlZC5wdXNoKGkpO1xuICAgICAgICBwYXJhbVZhbHVlc1tpXSA9IHBhcmFtZXRlckJvdW5kc1tpXS5tYXghO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbWV0ZXJCb3VuZHNbaV0/Lm1pbiAhPT0gdW5kZWZpbmVkICYmIHBhcmFtVmFsdWVzW2ldIDwgcGFyYW1ldGVyQm91bmRzW2ldLm1pbiEpIHtcbiAgICAgICAgb3ZlckxpbWl0cyA9IHRydWU7XG4gICAgICAgIGZpeGVkLnB1c2goaSk7XG4gICAgICAgIHBhcmFtVmFsdWVzW2ldID0gcGFyYW1ldGVyQm91bmRzW2ldLm1pbiE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpdHRlZEN1cnZlID0gZ2V0Rml0dGVkQ3VydmUoY3VydmVGdW5jdGlvbiwgcGFyYW1WYWx1ZXMpO1xuXG4gIHJldHVybiB7XG4gICAgZml0dGVkQ3VydmU6IGZpdHRlZEN1cnZlLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtVmFsdWVzLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rml0dGVkQ3VydmUoY3VydmVGdW5jdGlvbjogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLCBwYXJhbVZhbHVlczogbnVtYmVyW10pOlxuICh4OiBudW1iZXIpID0+IG51bWJlciB7XG4gIHJldHVybiAoeDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIGN1cnZlRnVuY3Rpb24ocGFyYW1WYWx1ZXMsIHgpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VydmVDb25maWRlbmNlSW50ZXJ2YWxzKGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LCBwYXJhbVZhbHVlczogbnVtYmVyW10sXG4gIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgY29uZmlkZW5jZUxldmVsOiBudW1iZXIgPSAwLjA1LCBlcnJvck1vZGVsOiBGaXRFcnJvck1vZGVsVHlwZSk6XG4gIEZpdENvbmZpZGVuY2VJbnRlcnZhbHMge1xuICBjb25zdCBvZiA9IGNyZWF0ZU9iamVjdGl2ZUZ1bmN0aW9uKGVycm9yTW9kZWwpO1xuXG4gIGNvbnN0IGVycm9yID0gZXJyb3JNb2RlbCA9PT0gRml0RXJyb3JNb2RlbC5QUk9QT1JUSU9OQUwgP1xuICAgIG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtVmFsdWVzKS5tdWx0IDpcbiAgICBvZihjdXJ2ZUZ1bmN0aW9uLCBkYXRhLCBwYXJhbVZhbHVlcykuY29uc3Q7XG5cbiAgY29uc3QgcXVhbnRpbGUgPSBqU3RhdC5ub3JtYWwuaW52KDEgLSBjb25maWRlbmNlTGV2ZWwvMiwgMCwgMSk7XG5cbiAgY29uc3QgdG9wID0gKHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gY3VydmVGdW5jdGlvbihwYXJhbVZhbHVlcywgeCk7XG4gICAgaWYgKGVycm9yTW9kZWwgPT09IEZpdEVycm9yTW9kZWwuQ09OU1RBTlQpXG4gICAgICByZXR1cm4gdmFsdWUgKyBxdWFudGlsZSAqIGVycm9yO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB2YWx1ZSArIHF1YW50aWxlICogTWF0aC5hYnModmFsdWUpICogZXJyb3I7XG4gIH07XG5cbiAgY29uc3QgYm90dG9tID0gKHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gY3VydmVGdW5jdGlvbihwYXJhbVZhbHVlcywgeCk7XG4gICAgaWYgKGVycm9yTW9kZWwgPT09IEZpdEVycm9yTW9kZWwuQ09OU1RBTlQpXG4gICAgICByZXR1cm4gdmFsdWUgLSBxdWFudGlsZSAqIGVycm9yO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB2YWx1ZSAtIHF1YW50aWxlICogTWF0aC5hYnModmFsdWUpICogZXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIHtjb25maWRlbmNlVG9wOiB0b3AsIGNvbmZpZGVuY2VCb3R0b206IGJvdHRvbX07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0aXN0aWNzKGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LCBwYXJhbVZhbHVlczogbnVtYmVyW10sXG4gIGN1cnZlRnVuY3Rpb246IChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpID0+IG51bWJlciwgc3RhdGlzdGljczogYm9vbGVhbiA9IHRydWUpOiBGaXRTdGF0aXN0aWNzIHtcbiAgY29uc3QgZml0dGVkQ3VydmUgPSBnZXRGaXR0ZWRDdXJ2ZShjdXJ2ZUZ1bmN0aW9uLCBwYXJhbVZhbHVlcyk7XG5cbiAgcmV0dXJuIHtcbiAgICByU3F1YXJlZDogc3RhdGlzdGljcyA/IGdldERldENvZWZmKGZpdHRlZEN1cnZlLCBkYXRhKSA6IHVuZGVmaW5lZCxcbiAgICBhdWM6IHN0YXRpc3RpY3MgPyBnZXRBdWMoZml0dGVkQ3VydmUsIGRhdGEpIDogdW5kZWZpbmVkLFxuICAgIGludGVyY2VwdFg6IHBhcmFtVmFsdWVzWzJdLFxuICAgIGludGVyY2VwdFk6IGZpdHRlZEN1cnZlKHBhcmFtVmFsdWVzWzJdKSxcbiAgICBzbG9wZTogcGFyYW1WYWx1ZXNbMV0sXG4gICAgdG9wOiBwYXJhbVZhbHVlc1swXSxcbiAgICBib3R0b206IHBhcmFtVmFsdWVzWzNdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW52ZXJ0ZWRGdW5jdGlvbnMoZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0sIHBhcmFtVmFsdWVzOiBudW1iZXJbXSxcbiAgY29uZmlkZW5jZUxldmVsOiBudW1iZXIgPSAwLjA1LCBzdGF0aXN0aWNzOiBib29sZWFuID0gdHJ1ZSk6IEZpdEludmVydGVkRnVuY3Rpb25zIHwgbnVsbCB7XG4gIGNvbnN0IHN0dWRlbnRRID0galN0YXQuc3R1ZGVudHQuaW52KDEgLSBjb25maWRlbmNlTGV2ZWwgLyAyLCBkYXRhLngubGVuZ3RoIC0gcGFyYW1WYWx1ZXMubGVuZ3RoKTtcblxuICBsZXQgaW52OiAoeTogbnVtYmVyKSA9PiBudW1iZXIgPSAoeTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIDA7XG4gIH07XG4gIGxldCBpbnZUb3A6ICh5OiBudW1iZXIpID0+IG51bWJlciA9ICh5OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gMDtcbiAgfTtcbiAgbGV0IGludkJvdHRvbTogKHk6IG51bWJlcikgPT4gbnVtYmVyID0gKHk6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIGlmIChzdGF0aXN0aWNzKSB7XG4gICAgaW52ID0gKHk6IG51bWJlcikgPT4ge1xuICAgICAgLy9zaG91bGQgY2hlY2sgaWYgbW9yZSB0aGFuIGJvdHRvbSBhbmQgbGVzcyB0aGFuIHRvcFxuICAgICAgcmV0dXJuIHBhcmFtVmFsdWVzWzJdIC8gTWF0aC5wb3coKHBhcmFtVmFsdWVzWzBdIC0geSkgLyAoeSAtIHBhcmFtVmFsdWVzWzNdKSwgMSAvIHBhcmFtVmFsdWVzWzFdKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZXJyb3IgPSBnZXRJbnZFcnJvcihpbnYsIGRhdGEpO1xuXG4gICAgaW52VG9wID0gKHk6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnYoeSk7XG4gICAgICByZXR1cm4gdmFsdWUgKyBzdHVkZW50USAqIGVycm9yIC8gTWF0aC5zcXJ0KGRhdGEueS5sZW5ndGgpO1xuICAgIH07XG5cbiAgICBpbnZCb3R0b20gPSAoeTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGludih5KTtcbiAgICAgIHJldHVybiB2YWx1ZSAtIHN0dWRlbnRRICogZXJyb3IgLyBNYXRoLnNxcnQoZGF0YS55Lmxlbmd0aCk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbnZlcnRlZDogaW52LFxuICAgICAgaW52ZXJ0ZWRUb3A6IGludlRvcCxcbiAgICAgIGludmVydGVkQm90dG9tOiBpbnZCb3R0b20sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbW9pZChwYXJhbXM6IG51bWJlcltdLCB4OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBBID0gcGFyYW1zWzBdO1xuICBjb25zdCBCID0gcGFyYW1zWzFdO1xuICBjb25zdCBDID0gcGFyYW1zWzJdO1xuICBjb25zdCBEID0gcGFyYW1zWzNdO1xuICByZXR1cm4gKEQgKyAoQSAtIEQpIC8gKDEgKyBNYXRoLnBvdygxMCwgKHggLSBDKSAqIEIpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lYXIocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSB7XG4gIGNvbnN0IEEgPSBwYXJhbXNbMF07XG4gIGNvbnN0IEIgPSBwYXJhbXNbMV07XG4gIHJldHVybiBBICogeCArIEI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdWMoZml0dGVkQ3VydmU6ICh4OiBudW1iZXIpID0+IG51bWJlciwgZGF0YToge3g6IG51bWJlcltdLCB5OiBudW1iZXJbXX0pOiBudW1iZXIge1xuICBsZXQgYXVjID0gMDtcblxuICBjb25zdCBtaW4gPSBNYXRoLm1pbiguLi5kYXRhLngpO1xuICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5kYXRhLngpO1xuICBjb25zdCBpbnRlZ3JhdGlvblN0ZXAgPSAobWF4IC0gbWluKSAvIDEwMDA7XG5cbiAgZm9yIChsZXQgeCA9IG1pbjsgeCA8IG1heDsgeCs9IGludGVncmF0aW9uU3RlcClcbiAgICBhdWMgKz0gaW50ZWdyYXRpb25TdGVwICogZml0dGVkQ3VydmUoeCk7XG5cbiAgcmV0dXJuIGF1Yztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERldENvZWZmKGZpdHRlZEN1cnZlOiAoeDogbnVtYmVyKSA9PiBudW1iZXIsIGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119KTogbnVtYmVyIHtcbiAgbGV0IHNzUmVzID0gMDtcbiAgbGV0IHNzVG90ID0gMDtcblxuICBjb25zdCB5TWVhbiA9IGpTdGF0Lm1lYW4oZGF0YS55KTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgIHNzUmVzICs9IE1hdGgucG93KGRhdGEueVtpXSAtIGZpdHRlZEN1cnZlKGRhdGEueFtpXSksIDIpO1xuICAgIHNzVG90ICs9IE1hdGgucG93KGRhdGEueVtpXSAtIHlNZWFuLCAyKTtcbiAgfVxuXG4gIHJldHVybiAxIC0gc3NSZXMgLyBzc1RvdDtcbn1cblxuZnVuY3Rpb24gZ2V0SW52RXJyb3IodGFyZ2V0RnVuYzogKHk6IG51bWJlcikgPT4gbnVtYmVyLCBkYXRhOiB7eTogbnVtYmVyW10sIHg6IG51bWJlcltdfSk6IG51bWJlciB7XG4gIGxldCBzaWdtYSA9IDA7XG4gIGxldCBzaWdtYVNxID0gMDtcblxuICBjb25zdCByZXNpZHVlc1NxdWFyZXMgPSBuZXcgRmxvYXQzMkFycmF5KGRhdGEueS5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEueS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG9icyA9IGRhdGEueFtpXTtcbiAgICBjb25zdCBwcmVkID0gdGFyZ2V0RnVuYyhkYXRhLnlbaV0pO1xuICAgIHJlc2lkdWVzU3F1YXJlc1tpXSA9IE1hdGgucG93KG9icyAtIHByZWQsIDIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgc2lnbWFTcSArPSByZXNpZHVlc1NxdWFyZXNbaV07XG5cbiAgc2lnbWFTcSAvPSByZXNpZHVlc1NxdWFyZXMubGVuZ3RoO1xuICBzaWdtYSA9IE1hdGguc3FydChzaWdtYVNxKTtcblxuICByZXR1cm4gc2lnbWE7XG59XG5cbmZ1bmN0aW9uIGdldE9iamVjdGl2ZURlcml2YXRpdmUob2Y6IE9iamVjdGl2ZUZ1bmN0aW9uLCBjdXJ2ZUZ1bmN0aW9uOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGRhdGE6IHt4OiBudW1iZXJbXSwgeTogbnVtYmVyW119LCBwYXJhbXM6IG51bWJlcltdLCBzZWxlY3RlZFBhcmFtOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBzdGVwID0gKHBhcmFtc1tzZWxlY3RlZFBhcmFtXSAqIDAuMDAwMSkgPT09IDAgPyAwLjAwMSA6IChwYXJhbXNbc2VsZWN0ZWRQYXJhbV0gKiAwLjAwMDEpO1xuICBjb25zdCBwYXJhbXNUb3A6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHBhcmFtc0JvdHRvbTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSA9PT0gc2VsZWN0ZWRQYXJhbSkge1xuICAgICAgcGFyYW1zVG9wLnB1c2gocGFyYW1zW2ldICsgc3RlcCk7XG4gICAgICBwYXJhbXNCb3R0b20ucHVzaChwYXJhbXNbaV0gLSBzdGVwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zVG9wLnB1c2gocGFyYW1zW2ldKTtcbiAgICAgIHBhcmFtc0JvdHRvbS5wdXNoKHBhcmFtc1tpXSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGRydlRvcCA9IG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtc1RvcCkudmFsdWU7XG4gIGNvbnN0IGRydkJvdHRvbSA9IG9mKGN1cnZlRnVuY3Rpb24sIGRhdGEsIHBhcmFtc0JvdHRvbSkudmFsdWU7XG5cbiAgcmV0dXJuIChkcnZUb3AgLSBkcnZCb3R0b20pIC8gKDIgKiBzdGVwKTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0aXZlTm9ybWFsQ29uc3RhbnQodGFyZ2V0RnVuYzogKHBhcmFtczogbnVtYmVyW10sIHg6IG51bWJlcikgPT4gbnVtYmVyLFxuICBkYXRhOiB7eTogbnVtYmVyW10sIHg6IG51bWJlcltdfSwgcGFyYW1zOiBudW1iZXJbXSk6IExpa2VsaWhvb2Qge1xuICAvL2Fzc3VyZSBvYnNlcnZlZCBhbmQgYXJncyBzYW1lIGxlbmd0aFxuICBjb25zdCBwaSA9IE1hdGguUEk7XG4gIGxldCBzaWdtYSA9IDA7XG4gIGxldCBzaWdtYVNxID0gMDtcbiAgbGV0IGxpa2VsaWhvb2QgPSAwO1xuXG4gIGNvbnN0IHJlc2lkdWVzU3F1YXJlcyA9IG5ldyBGbG9hdDMyQXJyYXkoZGF0YS54Lmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb2JzID0gZGF0YS55W2ldO1xuICAgIGNvbnN0IHByZWQgPSB0YXJnZXRGdW5jKHBhcmFtcywgZGF0YS54W2ldKTtcbiAgICByZXNpZHVlc1NxdWFyZXNbaV0gPSBNYXRoLnBvdyhvYnMgLSBwcmVkLCAyKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDsgaSsrKVxuICAgIHNpZ21hU3EgKz0gcmVzaWR1ZXNTcXVhcmVzW2ldO1xuXG4gIHNpZ21hU3EgLz0gcmVzaWR1ZXNTcXVhcmVzLmxlbmd0aDtcbiAgc2lnbWEgPSBNYXRoLnNxcnQoc2lnbWFTcSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgbGlrZWxpaG9vZCArPSByZXNpZHVlc1NxdWFyZXNbaV0gLyBzaWdtYVNxICsgTWF0aC5sb2coMiAqIHBpICogc2lnbWFTcSk7XG5cbiAgcmV0dXJuIHt2YWx1ZTogLWxpa2VsaWhvb2QsIGNvbnN0OiBzaWdtYSwgbXVsdDogMH07XG59XG5cbmZ1bmN0aW9uIG9iamVjdGl2ZU5vcm1hbFByb3BvcnRpb25hbCh0YXJnZXRGdW5jOiAocGFyYW1zOiBudW1iZXJbXSwgeDogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGRhdGE6IHt5OiBudW1iZXJbXSwgeDogbnVtYmVyW119LCBwYXJhbXM6IG51bWJlcltdKTogTGlrZWxpaG9vZCB7XG4gIC8vYXNzdXJlIG9ic2VydmVkIGFuZCBhcmdzIHNhbWUgbGVuZ3RoXG4gIGNvbnN0IHBpID0gTWF0aC5QSTtcbiAgbGV0IHNpZ21hID0gMDtcbiAgbGV0IHNpZ21hU3EgPSAwO1xuICBsZXQgbGlrZWxpaG9vZCA9IDA7XG5cbiAgY29uc3QgcmVzaWR1ZXNTcXVhcmVzID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLngubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLngubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvYnMgPSBkYXRhLnlbaV07XG4gICAgY29uc3QgcHJlZCA9IHRhcmdldEZ1bmMocGFyYW1zLCBkYXRhLnhbaV0pO1xuICAgIHJlc2lkdWVzU3F1YXJlc1tpXSA9IE1hdGgucG93KG9icyAtIHByZWQsIDIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNpZHVlc1NxdWFyZXMubGVuZ3RoOyBpKyspXG4gICAgc2lnbWFTcSArPSByZXNpZHVlc1NxdWFyZXNbaV07XG5cbiAgc2lnbWFTcSAvPSByZXNpZHVlc1NxdWFyZXMubGVuZ3RoO1xuICBzaWdtYSA9IE1hdGguc3FydChzaWdtYVNxKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc2lkdWVzU3F1YXJlcy5sZW5ndGg7IGkrKylcbiAgICBsaWtlbGlob29kICs9IHJlc2lkdWVzU3F1YXJlc1tpXSAvIHNpZ21hU3EgKyBNYXRoLmxvZygyICogcGkgKiBzaWdtYVNxKTtcblxuICByZXR1cm4ge3ZhbHVlOiAtbGlrZWxpaG9vZCwgY29uc3Q6IDAsIG11bHQ6IHNpZ21hfTtcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import { Optimizer, Likelihood } from './optimizer';
2
+ export declare class OptimizerNelder implements Optimizer {
3
+ optimize(params: Float32Array, objectiveFunc: (params: Float32Array) => Likelihood): Likelihood;
4
+ }
5
+ //# sourceMappingURL=opt-nelder-mead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opt-nelder-mead.d.ts","sourceRoot":"","sources":["opt-nelder-mead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,UAAU,EAAC,MAAM,aAAa,CAAC;AAElD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,QAAQ,CACN,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,UAAU,GAAI,UAAU;CAmJpE"}
@@ -0,0 +1,116 @@
1
+ export class OptimizerNelder {
2
+ optimize(params, objectiveFunc) {
3
+ const dim = params.length + 1;
4
+ const dimParams = params.length;
5
+ const optParams = new Array(dim);
6
+ const pointLikelihoods = new Array(dim);
7
+ for (let i = 0; i < dim; i++) {
8
+ optParams[i] = new Float32Array(dimParams);
9
+ for (let j = 0; j < dimParams; j++) {
10
+ optParams[i][j] = params[j];
11
+ if (i != 0) {
12
+ if (params[i - 1] == 0)
13
+ optParams[i][j] = 0.0001;
14
+ else
15
+ optParams[i][j] += 0.02 * params[i - 1];
16
+ }
17
+ }
18
+ pointLikelihoods[i] = objectiveFunc(optParams[i]);
19
+ }
20
+ const indexes = new Array(dim);
21
+ for (let i = 0; i < dim; i++)
22
+ indexes[i] = i;
23
+ const lastIndex = indexes.length - 1;
24
+ let iteration = 0;
25
+ const maxIter = 30;
26
+ const infinitesemal = 5e-6;
27
+ const tolerance = 1e-4;
28
+ let best = 0;
29
+ let previousBest = 0;
30
+ let noImprovment = 0;
31
+ const scaleReflection = 1;
32
+ const scaleExpansion = 2;
33
+ const scaleContraction = -0.5;
34
+ const centroid = new Float32Array(dimParams);
35
+ const reflectionPoint = new Float32Array(dimParams);
36
+ const expansionPoint = new Float32Array(dimParams);
37
+ const contractionPoint = new Float32Array(dimParams);
38
+ if (dim > 1) {
39
+ while (true) {
40
+ indexes.sort((a, b) => {
41
+ return pointLikelihoods[a].likelihood - pointLikelihoods[b].likelihood;
42
+ });
43
+ if (iteration >= maxIter)
44
+ break;
45
+ if (iteration == 0) {
46
+ best = pointLikelihoods[0].likelihood;
47
+ previousBest = 2 * pointLikelihoods[indexes[0]].likelihood;
48
+ }
49
+ iteration++;
50
+ best = pointLikelihoods[indexes[0]].likelihood;
51
+ if ((best + infinitesemal) / (previousBest + infinitesemal) - 1 > tolerance)
52
+ noImprovment = 0;
53
+ else {
54
+ ++noImprovment;
55
+ if (noImprovment > 2 * dim)
56
+ break;
57
+ }
58
+ previousBest = best;
59
+ //centroid
60
+ for (let i = 0; i < dimParams; i++)
61
+ centroid[i] = params[i];
62
+ for (let i = 0; i < dimParams; i++) {
63
+ let val = 0;
64
+ for (let j = 0; j < dim; j++) {
65
+ if (j != indexes[lastIndex])
66
+ val += optParams[j][i];
67
+ }
68
+ centroid[i] = val / (dim - 1);
69
+ }
70
+ // reflection
71
+ for (let i = 0; i < dimParams; i++)
72
+ reflectionPoint[i] = centroid[i];
73
+ for (let i = 0; i < dimParams; i++)
74
+ reflectionPoint[i] += scaleReflection * (centroid[i] - optParams[indexes[lastIndex]][i]);
75
+ const reflectionScore = objectiveFunc(reflectionPoint);
76
+ // expansion
77
+ if (reflectionScore.likelihood < pointLikelihoods[indexes[lastIndex]].likelihood) {
78
+ for (let i = 0; i < dimParams; i++)
79
+ expansionPoint[i] = centroid[i];
80
+ for (let i = 0; i < dimParams; i++)
81
+ expansionPoint[i] += scaleExpansion * (centroid[i] - optParams[indexes[lastIndex]][i]);
82
+ const expansionScore = objectiveFunc(expansionPoint);
83
+ if (expansionScore.likelihood < reflectionScore.likelihood) {
84
+ pointLikelihoods[indexes[lastIndex]] = expansionScore;
85
+ for (let i = 0; i < dimParams; i++)
86
+ optParams[indexes[lastIndex]][i] = expansionPoint[i];
87
+ continue;
88
+ }
89
+ else {
90
+ pointLikelihoods[indexes[lastIndex]] = reflectionScore;
91
+ for (let i = 0; i < dimParams; i++)
92
+ optParams[indexes[lastIndex]][i] = reflectionPoint[i];
93
+ continue;
94
+ }
95
+ }
96
+ // Contraction
97
+ for (let i = 0; i < dimParams; i++)
98
+ contractionPoint[i] = centroid[i];
99
+ for (let i = 0; i < dimParams; i++)
100
+ contractionPoint[i] += scaleContraction * (centroid[i] - optParams[indexes[lastIndex]][i]);
101
+ const contractionScore = objectiveFunc(contractionPoint);
102
+ if (contractionScore.likelihood < pointLikelihoods[indexes[lastIndex]].likelihood) {
103
+ pointLikelihoods[indexes[lastIndex]] = contractionScore;
104
+ for (let i = 0; i < dimParams; i++)
105
+ optParams[indexes[lastIndex]][i] = contractionPoint[i];
106
+ continue;
107
+ }
108
+ break;
109
+ }
110
+ }
111
+ for (let i = 0; i < dimParams; i++)
112
+ params[i] = optParams[indexes[0]][i];
113
+ return pointLikelihoods[0];
114
+ }
115
+ }
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0LW5lbGRlci1tZWFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib3B0LW5lbGRlci1tZWFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxlQUFlO0lBQzFCLFFBQVEsQ0FDTixNQUFvQixFQUNwQixhQUFtRDtRQUNuRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM5QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRWhDLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxDQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQWEsR0FBRyxDQUFDLENBQUM7UUFFcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNWLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUNwQixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDOzt3QkFFekIsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUMzQzthQUNGO1lBRUQsZ0JBQWdCLENBQUMs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QkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFN0YsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFFekQsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFO29CQUNqRixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztvQkFFeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUU7d0JBQ2hDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFekQsU0FBUztpQkFDVjtnQkFFRCxNQUFNO2FBQ1A7U0FDRjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkMsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09wdGltaXplciwgTGlrZWxpaG9vZH0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuXG5leHBvcnQgY2xhc3MgT3B0aW1pemVyTmVsZGVyIGltcGxlbWVudHMgT3B0aW1pemVyIHtcbiAgb3B0aW1pemUoXG4gICAgcGFyYW1zOiBGbG9hdDMyQXJyYXksXG4gICAgb2JqZWN0aXZlRnVuYzogKHBhcmFtczogRmxvYXQzMkFycmF5KSA9PiBMaWtlbGlob29kKSA6IExpa2VsaWhvb2Qge1xuICAgIGNvbnN0IGRpbSA9IHBhcmFtcy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IGRpbVBhcmFtcyA9IHBhcmFtcy5sZW5ndGg7XG5cbiAgICBjb25zdCBvcHRQYXJhbXMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihkaW0pO1xuICAgIGNvbnN0IHBvaW50TGlrZWxpaG9vZHMgPSBuZXcgQXJyYXk8TGlrZWxpaG9vZD4oZGltKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltOyBpKyspIHtcbiAgICAgIG9wdFBhcmFtc1tpXSA9IG5ldyBGbG9hdDMyQXJyYXkoZGltUGFyYW1zKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltUGFyYW1zOyBqKyspIHtcbiAgICAgICAgb3B0UGFyYW1zW2ldW2pdID0gcGFyYW1zW2pdO1xuICAgICAgICBpZiAoaSAhPSAwKSB7XG4gICAgICAgICAgaWYgKHBhcmFtc1tpIC0gMV0gPT0gMClcbiAgICAgICAgICAgIG9wdFBhcmFtc1tpXVtqXSA9IDAuMDAwMTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBvcHRQYXJhbXNbaV1bal0gKz0gMC4wMiAqIHBhcmFtc1tpIC0gMV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcG9pbnRMaWtlbGlob29kc1tpXSA9IG9iamVjdGl2ZUZ1bmMob3B0UGFyYW1zW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleGVzID0gbmV3IEFycmF5PG51bWJlcj4oZGltKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbTsgaSsrKVxuICAgICAgaW5kZXhlc1tpXSA9IGk7XG5cbiAgICBjb25zdCBsYXN0SW5kZXggPSBpbmRleGVzLmxlbmd0aCAtIDE7XG5cbiAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICBjb25zdCBtYXhJdGVyID0gMzA7XG4gICAgY29uc3QgaW5maW5pdGVzZW1hbCA9IDVlLTY7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMWUtNDtcblxuICAgIGxldCBiZXN0ID0gMDtcbiAgICBsZXQgcHJldmlvdXNCZXN0ID0gMDtcbiAgICBsZXQgbm9JbXByb3ZtZW50ID0gMDtcblxuICAgIGNvbnN0IHNjYWxlUmVmbGVjdGlvbiA9IDE7XG4gICAgY29uc3Qgc2NhbGVFeHBhbnNpb24gPSAyO1xuICAgIGNvbnN0IHNjYWxlQ29udHJhY3Rpb24gPSAtMC41O1xuXG4gICAgY29uc3QgY2VudHJvaWQgPSBuZXcgRmxvYXQzMkFycmF5KGRpbVBhcmFtcyk7XG4gICAgY29uc3QgcmVmbGVjdGlvblBvaW50ID0gbmV3IEZsb2F0MzJBcnJheShkaW1QYXJhbXMpO1xuICAgIGNvbnN0IGV4cGFuc2lvblBvaW50ID0gbmV3IEZsb2F0MzJBcnJheShkaW1QYXJhbXMpO1xuICAgIGNvbnN0IGNvbnRyYWN0aW9uUG9pbnQgPSBuZXcgRmxvYXQzMkFycmF5KGRpbVBhcmFtcyk7XG5cblxuICAgIGlmIChkaW0gPiAxKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpbmRleGVzLnNvcnQoKGE6bnVtYmVyLCBiOm51bWJlcikgPT4ge1xuICAgICAgICAgIHJldHVybiBwb2ludExpa2VsaWhvb2RzW2FdLmxpa2VsaWhvb2QgLSBwb2ludExpa2VsaWhvb2RzW2JdLmxpa2VsaWhvb2Q7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXRlcmF0aW9uID49IG1heEl0ZXIpXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgaWYgKGl0ZXJhdGlvbiA9PSAwKSB7XG4gICAgICAgICAgYmVzdCA9IHBvaW50TGlrZWxpaG9vZHNbMF0ubGlrZWxpaG9vZDtcbiAgICAgICAgICBwcmV2aW91c0Jlc3QgPSAyKnBvaW50TGlrZWxpaG9vZHNbaW5kZXhlc1swXV0ubGlrZWxpaG9vZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZXJhdGlvbisrO1xuXG4gICAgICAgIGJlc3QgPSBwb2ludExpa2VsaWhvb2RzW2luZGV4ZXNbMF1dLmxpa2VsaWhvb2Q7XG4gICAgICAgIGlmICgoYmVzdCArIGluZmluaXRlc2VtYWwpLyhwcmV2aW91c0Jlc3QgKyBpbmZpbml0ZXNlbWFsKSAtIDEgPiB0b2xlcmFuY2UpXG4gICAgICAgICAgbm9JbXByb3ZtZW50ID0gMDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgKytub0ltcHJvdm1lbnQ7XG4gICAgICAgICAgaWYgKG5vSW1wcm92bWVudCA+IDIgKiBkaW0pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzQmVzdCA9IGJlc3Q7XG5cbiAgICAgICAgLy9jZW50cm9pZFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVBhcmFtczsgaSsrKVxuICAgICAgICAgIGNlbnRyb2lkW2ldID0gcGFyYW1zW2ldO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgbGV0IHZhbCA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaW07IGorKykge1xuICAgICAgICAgICAgaWYgKGogIT0gaW5kZXhlc1tsYXN0SW5kZXhdKVxuICAgICAgICAgICAgICB2YWwgKz0gb3B0UGFyYW1zW2pdW2ldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNlbnRyb2lkW2ldID0gdmFsIC8gKGRpbSAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVmbGVjdGlvblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVBhcmFtczsgaSsrKVxuICAgICAgICAgIHJlZmxlY3Rpb25Qb2ludFtpXSA9IGNlbnRyb2lkW2ldO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVBhcmFtczsgaSsrKVxuICAgICAgICAgIHJlZmxlY3Rpb25Qb2ludFtpXSArPSBzY2FsZVJlZmxlY3Rpb24gKiAoY2VudHJvaWRbaV0gLSBvcHRQYXJhbXNbaW5kZXhlc1tsYXN0SW5kZXhdXVtpXSk7XG5cbiAgICAgICAgY29uc3QgcmVmbGVjdGlvblNjb3JlID0gb2JqZWN0aXZlRnVuYyhyZWZsZWN0aW9uUG9pbnQpO1xuXG4gICAgICAgIC8vIGV4cGFuc2lvblxuICAgICAgICBpZiAocmVmbGVjdGlvblNjb3JlLmxpa2VsaWhvb2QgPCBwb2ludExpa2VsaWhvb2RzW2luZGV4ZXNbbGFzdEluZGV4XV0ubGlrZWxpaG9vZCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltUGFyYW1zOyBpKyspXG4gICAgICAgICAgICBleHBhbnNpb25Qb2ludFtpXSA9IGNlbnRyb2lkW2ldO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltUGFyYW1zOyBpKyspXG4gICAgICAgICAgICBleHBhbnNpb25Qb2ludFtpXSArPSBzY2FsZUV4cGFuc2lvbiAqIChjZW50cm9pZFtpXSAtIG9wdFBhcmFtc1tpbmRleGVzW2xhc3RJbmRleF1dW2ldKTtcblxuICAgICAgICAgIGNvbnN0IGV4cGFuc2lvblNjb3JlID0gb2JqZWN0aXZlRnVuYyhleHBhbnNpb25Qb2ludCk7XG5cblxuICAgICAgICAgIGlmIChleHBhbnNpb25TY29yZS5saWtlbGlob29kIDwgcmVmbGVjdGlvblNjb3JlLmxpa2VsaWhvb2QpIHtcbiAgICAgICAgICAgIHBvaW50TGlrZWxpaG9vZHNbaW5kZXhlc1tsYXN0SW5kZXhdXSA9IGV4cGFuc2lvblNjb3JlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVBhcmFtczsgaSsrKVxuICAgICAgICAgICAgICBvcHRQYXJhbXNbaW5kZXhlc1tsYXN0SW5kZXhdXVtpXSA9IGV4cGFuc2lvblBvaW50W2ldO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9pbnRMaWtlbGlob29kc1tpbmRleGVzW2xhc3RJbmRleF1dID0gcmVmbGVjdGlvblNjb3JlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVBhcmFtczsgaSsrKVxuICAgICAgICAgICAgICBvcHRQYXJhbXNbaW5kZXhlc1tsYXN0SW5kZXhdXVtpXSA9IHJlZmxlY3Rpb25Qb2ludFtpXTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udHJhY3Rpb25cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW1QYXJhbXM7IGkrKylcbiAgICAgICAgICBjb250cmFjdGlvblBvaW50W2ldID0gY2VudHJvaWRbaV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltUGFyYW1zOyBpKyspXG4gICAgICAgICAgY29udHJhY3Rpb25Qb2ludFtpXSArPSBzY2FsZUNvbnRyYWN0aW9uICogKGNlbnRyb2lkW2ldIC0gb3B0UGFyYW1zW2luZGV4ZXNbbGFzdEluZGV4XV1baV0pO1xuXG4gICAgICAgIGNvbnN0IGNvbnRyYWN0aW9uU2NvcmUgPSBvYmplY3RpdmVGdW5jKGNvbnRyYWN0aW9uUG9pbnQpO1xuXG4gICAgICAgIGlmIChjb250cmFjdGlvblNjb3JlLmxpa2VsaWhvb2QgPCBwb2ludExpa2VsaWhvb2RzW2luZGV4ZXNbbGFzdEluZGV4XV0ubGlrZWxpaG9vZCkge1xuICAgICAgICAgIHBvaW50TGlrZWxpaG9vZHNbaW5kZXhlc1tsYXN0SW5kZXhdXSA9IGNvbnRyYWN0aW9uU2NvcmU7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVBhcmFtczsgaSsrKVxuICAgICAgICAgICAgb3B0UGFyYW1zW2luZGV4ZXNbbGFzdEluZGV4XV1baV0gPSBjb250cmFjdGlvblBvaW50W2ldO1xuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVBhcmFtczsgaSsrKVxuICAgICAgcGFyYW1zW2ldID0gb3B0UGFyYW1zW2luZGV4ZXNbMF1dW2ldO1xuXG4gICAgcmV0dXJuIHBvaW50TGlrZWxpaG9vZHNbMF07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ export declare const FitErrorModel: {
2
+ CONSTANT: string;
3
+ PROPORTIONAL: string;
4
+ };
5
+ export declare type Likelihood = {
6
+ likelihood: number;
7
+ likelihoodYs: number[];
8
+ residualSquaresSums: number[];
9
+ };
10
+ export declare abstract class FitFunction {
11
+ abstract solve(params: Float32Array, xs: Float32Array[]): NumericalSolution;
12
+ }
13
+ export declare abstract class Optimizer {
14
+ abstract optimize(params: Float32Array, objectiveFunc: (params: Float32Array) => Likelihood): Likelihood;
15
+ }
16
+ export declare type NumericalSolution = {
17
+ ys: Float32Array[];
18
+ devereges: boolean;
19
+ };
20
+ export declare function getLikelihood(func: FitFunction, params: Float32Array, sigmaTypes: string[], sigmaValues: number[], data: {
21
+ ys: Float32Array[];
22
+ xs: Float32Array[];
23
+ }): Likelihood;
24
+ export declare function fit(func: FitFunction, params: Float32Array, sigmaTypes: string[], data: {
25
+ ys: Float32Array[];
26
+ xs: Float32Array[];
27
+ }, optimizer: Optimizer): void;
28
+ //# sourceMappingURL=optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["optimizer.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;;CAGzB,CAAC;AAEF,oBAAY,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B,CAAC;AAEF,8BAAsB,WAAW;IAG/B,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,iBAAiB;CAE5E;AAED,8BAAsB,SAAS;IAC7B,QAAQ,CAAC,QAAQ,CACf,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,UAAU,GAClD,UAAU;CACd;AAED,oBAAY,iBAAiB,GAAG;IAC9B,EAAE,EAAE,YAAY,EAAG,CAAC;IACpB,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAiBD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EACpF,IAAI,EAAE;IAAC,EAAE,EAAE,YAAY,EAAE,CAAC;IAAC,EAAE,EAAE,YAAY,EAAE,CAAA;CAAC,GAAG,UAAU,CAyB5D;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,EAC/E,IAAI,EAAE;IAAC,EAAE,EAAE,YAAY,EAAE,CAAC;IAAC,EAAE,EAAE,YAAY,EAAE,CAAA;CAAC,EAAE,SAAS,EAAE,SAAS,QAmBrE"}
@@ -0,0 +1,63 @@
1
+ const INFINITY = Number.MAX_VALUE;
2
+ const PI = Math.PI;
3
+ export const FitErrorModel = {
4
+ CONSTANT: 'constant',
5
+ PROPORTIONAL: 'proportional',
6
+ };
7
+ export class FitFunction {
8
+ }
9
+ export class Optimizer {
10
+ }
11
+ function getResiduals(observed, predicted) {
12
+ const dimYtypes = predicted.length;
13
+ const residuals = new Array(dimYtypes);
14
+ for (let i = 0; i < dimYtypes; i++) {
15
+ const dimY = predicted[i].length;
16
+ residuals[i] = new Float32Array(dimY);
17
+ for (let j = 0; j < dimY; j++)
18
+ residuals[i][j] = observed[i][j] - predicted[i][j];
19
+ }
20
+ return residuals;
21
+ }
22
+ //sigma types number equal to data.ys.length, data.xs.length
23
+ export function getLikelihood(func, params, sigmaTypes, sigmaValues, data) {
24
+ const solution = func.solve(params, data.xs);
25
+ if (solution.devereges)
26
+ return { likelihood: INFINITY, likelihoodYs: [], residualSquaresSums: [] };
27
+ const residuals = getResiduals(data.ys, solution.ys);
28
+ const dimYtypes = data.ys.length;
29
+ const residualSquaresSums = new Array(dimYtypes);
30
+ const likelihoodYs = new Array(dimYtypes);
31
+ let likelihood = 0;
32
+ for (let i = 0; i < dimYtypes; i++) {
33
+ const dimY = solution.ys[i].length;
34
+ const sigmaSqare = sigmaValues[i] * sigmaValues[i];
35
+ for (let j = 0; j < dimY; j++) {
36
+ const square = residuals[i][j] * residuals[i][j];
37
+ likelihoodYs[i] += square / sigmaSqare + Math.log(2 * PI * sigmaSqare);
38
+ if (sigmaTypes[i] == FitErrorModel.PROPORTIONAL)
39
+ residualSquaresSums[i] += square / (solution.ys[i][j] * solution.ys[i][j]);
40
+ else
41
+ residualSquaresSums[i] += square;
42
+ }
43
+ likelihood += likelihoodYs[i];
44
+ }
45
+ return { likelihood, likelihoodYs, residualSquaresSums };
46
+ }
47
+ export function fit(func, params, sigmaTypes, data, optimizer) {
48
+ let convergenceIndicator = INFINITY / 2;
49
+ let convergenceIndicatorOld = INFINITY;
50
+ const dimYtypes = data.ys.length;
51
+ const sigmaValues = new Array(dimYtypes).fill(1);
52
+ const objectiveFunc = (params) => {
53
+ return getLikelihood(func, params, sigmaTypes, sigmaValues, data);
54
+ };
55
+ while (Math.abs(convergenceIndicator - convergenceIndicatorOld) > 0.001) {
56
+ const optimizedLikelihood = optimizer.optimize(params, objectiveFunc);
57
+ for (let i = 0; i < dimYtypes; i++)
58
+ sigmaValues[i] = Math.sqrt(optimizedLikelihood.residualSquaresSums[i] / data.ys[i].length);
59
+ convergenceIndicatorOld = convergenceIndicator;
60
+ convergenceIndicator = optimizedLikelihood.likelihood;
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib3B0aW1pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDbEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUVuQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUc7SUFDM0IsUUFBUSxFQUFFLFVBQVU7SUFDcEIsWUFBWSxFQUFFLGNBQWM7Q0FDN0IsQ0FBQztBQVFGLE1BQU0sT0FBZ0IsV0FBVztDQUtoQztBQUVELE1BQU0sT0FBZ0IsU0FBUztDQUs5QjtBQU9ELFNBQVMsWUFBWSxDQUFDLFFBQXdCLEVBQUUsU0FBeUI7SUFDdkUsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBZSxTQUFTLENBQUMsQ0FBQztJQUVyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDakMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQzNCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3REO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELDREQUE0RDtBQUM1RCxNQUFNLFVBQVUsYUFBYSxD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QW9CLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxLQUFLLEVBQUU7UUFDdkUsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV0RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRTtZQUNoQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNGLHVCQUF1QixHQUFHLG9CQUFvQixDQUFDO1FBQy9DLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQztLQUN2RDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IElORklOSVRZID0gTnVtYmVyLk1BWF9WQUxVRTtcbmNvbnN0IFBJID0gTWF0aC5QSTtcblxuZXhwb3J0IGNvbnN0IEZpdEVycm9yTW9kZWwgPSB7XG4gIENPTlNUQU5UOiAnY29uc3RhbnQnLFxuICBQUk9QT1JUSU9OQUw6ICdwcm9wb3J0aW9uYWwnLFxufTtcblxuZXhwb3J0IHR5cGUgTGlrZWxpaG9vZCA9IHtcbiAgbGlrZWxpaG9vZDogbnVtYmVyLFxuICBsaWtlbGlob29kWXM6IG51bWJlcltdLFxuICByZXNpZHVhbFNxdWFyZXNTdW1zOiBudW1iZXJbXVxufTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpdEZ1bmN0aW9uIHtcbiAgLy8gYWJzdHJhY3QgZ2V0IG5hbWUoKTogc3RyaW5nO1xuICAvLyBhYnN0cmFjdCBnZXQgcGFyYW1ldGVyTmFtZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IHNvbHZlKHBhcmFtczogRmxvYXQzMkFycmF5LCB4czogRmxvYXQzMkFycmF5W10pOiBOdW1lcmljYWxTb2x1dGlvbjtcbiAgLy9hYnN0cmFjdCBnZXRJbml0aWFsUGFyYW1ldGVycyh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pOiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wdGltaXplciB7XG4gIGFic3RyYWN0IG9wdGltaXplKFxuICAgIHBhcmFtczogRmxvYXQzMkFycmF5LFxuICAgIG9iamVjdGl2ZUZ1bmM6IChwYXJhbXM6IEZsb2F0MzJBcnJheSkgPT4gTGlrZWxpaG9vZFxuICApOiBMaWtlbGlob29kXG59XG5cbmV4cG9ydCB0eXBlIE51bWVyaWNhbFNvbHV0aW9uID0ge1xuICB5czogRmxvYXQzMkFycmF5IFtdLFxuICBkZXZlcmVnZXM6IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gZ2V0UmVzaWR1YWxzKG9ic2VydmVkOiBGbG9hdDMyQXJyYXlbXSwgcHJlZGljdGVkOiBGbG9hdDMyQXJyYXlbXSk6IEZsb2F0MzJBcnJheVtdIHtcbiAgY29uc3QgZGltWXR5cGVzID0gcHJlZGljdGVkLmxlbmd0aDtcbiAgY29uc3QgcmVzaWR1YWxzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oZGltWXR5cGVzKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbVl0eXBlczsgaSsrKSB7XG4gICAgY29uc3QgZGltWSA9IHByZWRpY3RlZFtpXS5sZW5ndGg7XG4gICAgcmVzaWR1YWxzW2ldID0gbmV3IEZsb2F0MzJBcnJheShkaW1ZKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRpbVk7IGorKylcbiAgICAgIHJlc2lkdWFsc1tpXVtqXSA9IG9ic2VydmVkW2ldW2pdIC0gcHJlZGljdGVkW2ldW2pdO1xuICB9XG5cbiAgcmV0dXJuIHJlc2lkdWFscztcbn1cblxuLy9zaWdtYSB0eXBlcyBudW1iZXIgZXF1YWwgdG8gZGF0YS55cy5sZW5ndGgsIGRhdGEueHMubGVuZ3RoXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlrZWxpaG9vZChcbiAgZnVuYzogRml0RnVuY3Rpb24sIHBhcmFtczogRmxvYXQzMkFycmF5LCBzaWdtYVR5cGVzOiBzdHJpbmdbXSwgc2lnbWFWYWx1ZXM6IG51bWJlcltdLFxuICBkYXRhOiB7eXM6IEZsb2F0MzJBcnJheVtdLCB4czogRmxvYXQzMkFycmF5W119KTogTGlrZWxpaG9vZCB7XG4gIGNvbnN0IHNvbHV0aW9uID0gZnVuYy5zb2x2ZShwYXJhbXMsIGRhdGEueHMpO1xuICBpZiAoc29sdXRpb24uZGV2ZXJlZ2VzKVxuICAgIHJldHVybiB7bGlrZWxpaG9vZDogSU5GSU5JVFksIGxpa2VsaWhvb2RZczogW10sIHJlc2lkdWFsU3F1YXJlc1N1bXM6IFtdfTtcblxuICBjb25zdCByZXNpZHVhbHMgPSBnZXRSZXNpZHVhbHMoZGF0YS55cywgc29sdXRpb24ueXMpO1xuICBjb25zdCBkaW1ZdHlwZXMgPSBkYXRhLnlzLmxlbmd0aDtcbiAgY29uc3QgcmVzaWR1YWxTcXVhcmVzU3VtcyA9IG5ldyBBcnJheTxudW1iZXI+KGRpbVl0eXBlcyk7XG4gIGNvbnN0IGxpa2VsaWhvb2RZcyA9IG5ldyBBcnJheTxudW1iZXI+KGRpbVl0eXBlcyk7XG4gIGxldCBsaWtlbGlob29kID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW1ZdHlwZXM7IGkrKykge1xuICAgIGNvbnN0IGRpbVkgPSBzb2x1dGlvbi55c1tpXS5sZW5ndGg7XG4gICAgY29uc3Qgc2lnbWFTcWFyZSA9IHNpZ21hVmFsdWVzW2ldKnNpZ21hVmFsdWVzW2ldO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltWTsgaisrKSB7XG4gICAgICBjb25zdCBzcXVhcmUgPSByZXNpZHVhbHNbaV1bal0qcmVzaWR1YWxzW2ldW2pdO1xuICAgICAgbGlrZWxpaG9vZFlzW2ldICs9IHNxdWFyZS9zaWdtYVNxYXJlICsgTWF0aC5sb2coMipQSSpzaWdtYVNxYXJlKTtcbiAgICAgIGlmIChzaWdtYVR5cGVzW2ldID09IEZpdEVycm9yTW9kZWwuUFJPUE9SVElPTkFMKVxuICAgICAgICByZXNpZHVhbFNxdWFyZXNTdW1zW2ldICs9IHNxdWFyZS8oc29sdXRpb24ueXNbaV1bal0qc29sdXRpb24ueXNbaV1bal0pO1xuICAgICAgZWxzZVxuICAgICAgICByZXNpZHVhbFNxdWFyZXNTdW1zW2ldICs9IHNxdWFyZTtcbiAgICB9XG4gICAgbGlrZWxpaG9vZCArPSBsaWtlbGlob29kWXNbaV07XG4gIH1cblxuICByZXR1cm4ge2xpa2VsaWhvb2QsIGxpa2VsaWhvb2RZcywgcmVzaWR1YWxTcXVhcmVzU3Vtc307XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXQoZnVuYzogRml0RnVuY3Rpb24sIHBhcmFtczogRmxvYXQzMkFycmF5LCBzaWdtYVR5cGVzOiBzdHJpbmdbXSxcbiAgZGF0YToge3lzOiBGbG9hdDMyQXJyYXlbXSwgeHM6IEZsb2F0MzJBcnJheVtdfSwgb3B0aW1pemVyOiBPcHRpbWl6ZXIpIHtcbiAgbGV0IGNvbnZlcmdlbmNlSW5kaWNhdG9yID0gSU5GSU5JVFkgLyAyO1xuICBsZXQgY29udmVyZ2VuY2VJbmRpY2F0b3JPbGQgPSBJTkZJTklUWTtcbiAgY29uc3QgZGltWXR5cGVzID0gZGF0YS55cy5sZW5ndGg7XG4gIGNvbnN0IHNpZ21hVmFsdWVzID0gbmV3IEFycmF5PG51bWJlcj4oZGltWXR5cGVzKS5maWxsKDEpO1xuXG4gIGNvbnN0IG9iamVjdGl2ZUZ1bmMgPSAocGFyYW1zOiBGbG9hdDMyQXJyYXkpID0+IHtcbiAgICByZXR1cm4gZ2V0TGlrZWxpaG9vZChmdW5jLCBwYXJhbXMsIHNpZ21hVHlwZXMsIHNpZ21hVmFsdWVzLCBkYXRhKTtcbiAgfTtcblxuICB3aGlsZSAoTWF0aC5hYnMoY29udmVyZ2VuY2VJbmRpY2F0b3IgLSBjb252ZXJnZW5jZUluZGljYXRvck9sZCkgPiAwLjAwMSkge1xuICAgIGNvbnN0IG9wdGltaXplZExpa2VsaWhvb2QgPSBvcHRpbWl6ZXIub3B0aW1pemUocGFyYW1zLCBvYmplY3RpdmVGdW5jKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltWXR5cGVzOyBpKyspXG4gICAgICBzaWdtYVZhbHVlc1tpXSA9IE1hdGguc3FydChvcHRpbWl6ZWRMaWtlbGlob29kLnJlc2lkdWFsU3F1YXJlc1N1bXNbaV0vZGF0YS55c1tpXS5sZW5ndGgpO1xuXG4gICAgY29udmVyZ2VuY2VJbmRpY2F0b3JPbGQgPSBjb252ZXJnZW5jZUluZGljYXRvcjtcbiAgICBjb252ZXJnZW5jZUluZGljYXRvciA9IG9wdGltaXplZExpa2VsaWhvb2QubGlrZWxpaG9vZDtcbiAgfVxufVxuIl19