@datagrok-libraries/bio 0.0.6 → 0.0.8

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/.eslintrc.json CHANGED
@@ -6,10 +6,14 @@
6
6
  "extends": [
7
7
  "google"
8
8
  ],
9
+ "parser": "@typescript-eslint/parser",
9
10
  "parserOptions": {
10
11
  "ecmaVersion": 12,
11
12
  "sourceType": "module"
12
13
  },
14
+ "plugins": [
15
+ "@typescript-eslint"
16
+ ],
13
17
  "rules": {
14
18
  "indent": [
15
19
  "error",
@@ -19,11 +23,29 @@
19
23
  "error",
20
24
  120
21
25
  ],
26
+ "no-unused-vars": "warn",
22
27
  "require-jsdoc": "off",
23
- "spaced-comment": "off"
24
- },
25
- "parser": "@typescript-eslint/parser",
26
- "plugins": [
27
- "@typescript-eslint"
28
- ]
29
- }
28
+ "spaced-comment": "off",
29
+ "linebreak-style": "off",
30
+ "curly": [
31
+ "error",
32
+ "multi-or-nest",
33
+ "consistent"
34
+ ],
35
+ "brace-style": [
36
+ "error",
37
+ "1tbs",
38
+ {
39
+ "allowSingleLine": true
40
+ }
41
+ ],
42
+ "block-spacing": [2, "always"],
43
+ "comma-dangle": ["error", {
44
+ "arrays": "only-multiline",
45
+ "functions": "never",
46
+ "objects": "only-multiline",
47
+ "imports": "only-multiline"
48
+ }],
49
+ "guard-for-in": "off"
50
+ }
51
+ }
package/detectors.js CHANGED
@@ -1,3 +1,9 @@
1
+ import * as grok from 'datagrok-api/grok';
2
+ import * as ui from 'datagrok-api/ui';
3
+ import * as DG from 'datagrok-api/dg';
4
+ import {Aminoacids} from './src/aminoacids';
5
+ import {Nucleotides} from './src/nucleotides';
6
+
1
7
  /**
2
8
  * The class contains semantic type detectors.
3
9
  * Detectors are functions tagged with `DG.FUNC_TYPES.SEM_TYPE_DETECTOR`.
@@ -6,4 +12,45 @@
6
12
  * Follow this naming convention to ensure that your detectors are properly loaded.
7
13
  */
8
14
  class BioPackageDetectors extends DG.Package {
15
+ //tags: semTypeDetector
16
+ //input: column col
17
+ //output: string semType
18
+ detectNucleotidesSeq(col) {
19
+ const alphabet = Nucleotides.Names + {'-': 'gap'};
20
+ return DG.Detector.sampleCategories(col, (s) => {
21
+ return s.split('').every((n) => n in alphabet);
22
+ }) ? Nucleotides.SemType : null;
23
+ }
24
+
25
+ //tags: semTypeDetector
26
+ //input: column col
27
+ //output: string semType
28
+ detectAminoacidsSeq(col) {
29
+ const alphabet = Aminoacids.Names + {'-': 'gap'};
30
+ return DG.Detector.sampleCategories(col, (s) => {
31
+ return s.split('').every((aa) => aa in alphabet);
32
+ }) ? Aminoacids.SemType : null;
33
+ }
34
+
35
+ //tags: semTypeDetector
36
+ //input: column col
37
+ //output: string semType
38
+ detectMultipleAlignmentNucleotidesSeq(col) {
39
+ const alphabet = Nucleotides.Names + {'-': 'gap'};
40
+ const len = col.get(0).length;
41
+ return DG.Detector.sampleCategories(col, (s) => {
42
+ return s.length == len && s.split('').every((n) => n in alphabet);
43
+ }) ? Nucleotides.SemTypeMultipleAlignment : null;
44
+ }
45
+
46
+ //tags: semTypeDetector
47
+ //input: column col
48
+ //output: string semType
49
+ detectMultipleAlignmentAminoacidsSeq(col) {
50
+ const alphabet = Aminoacids.Names + {'-': 'gap'};
51
+ const len = col.get(0).length;
52
+ return DG.Detector.sampleCategories(col, (s) => {
53
+ return s.length == len && s.split('').every((aa) => aa in alphabet);
54
+ }) ? Aminoacids.SemTypeMultipleAlignment : null;
55
+ }
9
56
  }
package/package.json CHANGED
@@ -5,23 +5,23 @@
5
5
  },
6
6
  "beta": true,
7
7
  "friendlyName": "Datagrok bio library",
8
- "version": "0.0.6",
8
+ "version": "0.0.8",
9
9
  "description": "",
10
+ "main": "src/index.ts",
10
11
  "dependencies": {
11
- "datagrok-api": ">=0.108.0",
12
12
  "@datagrok-libraries/utils": ">=0.0.22",
13
13
  "cash-dom": "latest",
14
- "dayjs": "latest"
14
+ "datagrok-api": ">=0.108.0",
15
+ "dayjs": "latest",
16
+ "rxjs": "^6.5.5"
15
17
  },
16
18
  "devDependencies": {
17
- "typescript": "^4.2.3",
18
- "ts-loader": "^9.2.6",
19
- "webpack": "latest",
20
- "webpack-cli": "latest",
21
19
  "@typescript-eslint/eslint-plugin": "^4.29.1",
22
20
  "@typescript-eslint/parser": "^4.29.1",
23
- "eslint": "^7.32.0",
24
- "eslint-config-google": "^0.14.0"
21
+ "eslint": "latest",
22
+ "eslint-config-google": "latest",
23
+ "ts-loader": "^9.2.6",
24
+ "typescript": "^4.2.3"
25
25
  },
26
26
  "scripts": {
27
27
  "link": "npm link",
@@ -36,7 +36,7 @@
36
36
  "release-bio-public": "grok publish public --rebuild --release",
37
37
  "debug-bio-local": "grok publish local --rebuild",
38
38
  "release-bio-local": "grok publish local --rebuild --release",
39
- "lint": "eslint src --ext .ts",
40
- "lint-fix": "eslint src --ext .ts --fix"
39
+ "lint": "eslint \"./src/**/*.ts\"",
40
+ "lint-fix": "eslint \"./src/**/*.ts\" --fix"
41
41
  }
42
42
  }
@@ -0,0 +1,31 @@
1
+ import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
2
+ import { SeqPalette, SeqPaletteBase } from './seq-palettes';
3
+ export declare class AminoacidsPalettes extends SeqPaletteBase {
4
+ private static lesk;
5
+ static get Lesk(): SeqPalette;
6
+ private static grokGroups;
7
+ static get GrokGroups(): SeqPalette;
8
+ private static rasMol;
9
+ static get RasMol(): SeqPalette;
10
+ }
11
+ export declare class Aminoacids {
12
+ static readonly SemType: string;
13
+ static readonly SemTypeMultipleAlignment: string;
14
+ static undefinedColor: string;
15
+ static Names: StringDictionary;
16
+ static AASmiles: StringDictionary;
17
+ static AASmilesTruncated: StringDictionary;
18
+ /** TODO: Full?
19
+ */
20
+ static AAFullNames: StringDictionary;
21
+ static getPalette(scheme?: string): SeqPalette;
22
+ /**
23
+ * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted
24
+ *
25
+ * @param {string} c raw amino
26
+ * @return {[string, string]} outer and inner content
27
+ */
28
+ static getInnerOuter(c: string): [string, string];
29
+ static getColorAAPivot(monomer?: string, scheme?: 'grok'): [string, string, string, number];
30
+ }
31
+ //# sourceMappingURL=aminoacids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aminoacids.d.ts","sourceRoot":"","sources":["aminoacids.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AACjF,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAa;IAEhC,WAAkB,IAAI,IAAI,UAAU,CAWnC;IAED,OAAO,CAAC,MAAM,CAAC,UAAU,CAAa;IAEtC,WAAkB,UAAU,IAAI,UAAU,CAYzC;IAED,OAAO,CAAC,MAAM,CAAC,MAAM,CAAa;IAElC,WAAkB,MAAM,IAAI,UAAU,CA4BrC;CACF;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAgB;IAE/C,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAiC;IAEjF,MAAM,CAAC,cAAc,SAAsB;IAE3C,OAAc,KAAK,EAAE,gBAAgB,CAqBnC;IAEF,OAAc,QAAQ,EAAE,gBAAgB,CAqBtC;IAEF,OAAc,iBAAiB,EAAE,gBAAgB,CAqB/C;IAEF;OACG;IACH,OAAc,WAAW,EAAE,gBAAgB,CAqBzC;WAEY,UAAU,CAAC,MAAM,GAAE,MAAe,GAAG,UAAU;IAW7D;;;;;OAKG;WACW,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;WAmB1C,eAAe,CAAC,OAAO,GAAE,MAAW,EAAE,MAAM,GAAE,MAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;CA6C/G"}
@@ -0,0 +1,226 @@
1
+ import { SeqPaletteBase } from './seq-palettes';
2
+ export class AminoacidsPalettes extends SeqPaletteBase {
3
+ static get Lesk() {
4
+ if (this.lesk === void 0) {
5
+ this.lesk = this.makePalette([
6
+ [['G', 'A', 'S', 'T'], 'orange'],
7
+ [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],
8
+ [['N', 'Q', 'H'], 'magenta'],
9
+ [['D', 'E'], 'red'],
10
+ [['K', 'R'], 'all_blue'],
11
+ ]);
12
+ }
13
+ return this.lesk;
14
+ }
15
+ static get GrokGroups() {
16
+ if (this.grokGroups === void 0) {
17
+ this.grokGroups = this.makePalette([
18
+ [['C', 'U'], 'yellow'],
19
+ [['G', 'P'], 'red'],
20
+ [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],
21
+ [['R', 'H', 'K'], 'light_blue'],
22
+ [['D', 'E'], 'dark_blue'],
23
+ [['S', 'T', 'N', 'Q'], 'orange'],
24
+ ]);
25
+ }
26
+ return this.grokGroups;
27
+ }
28
+ static get RasMol() {
29
+ if (this.rasMol === void 0) {
30
+ this.rasMol = {
31
+ // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm
32
+ 'D': '#E60A0A',
33
+ 'E': '#E60A0A',
34
+ 'C': '#E6E600',
35
+ 'M': '#E6E600',
36
+ 'K': '#145AFF',
37
+ 'R': '#145AFF',
38
+ 'S': '#FA9600',
39
+ 'T': '#FA9600',
40
+ 'F': '#3232AA',
41
+ 'Y': '#3232AA',
42
+ 'N': '#00DCDC',
43
+ 'Q': '#00DCDC',
44
+ 'G': '#EBEBEB',
45
+ 'L': '#0F820F',
46
+ 'V': '#0F820F',
47
+ 'I': '#0F820F',
48
+ 'A': '#C8C8C8',
49
+ 'W': '#B45AB4',
50
+ 'H': '#8282D2',
51
+ 'P': '#DC9682',
52
+ 'others': '#BEA06E',
53
+ };
54
+ }
55
+ return this.rasMol;
56
+ }
57
+ }
58
+ export class Aminoacids {
59
+ static getPalette(scheme = 'grok') {
60
+ switch (scheme) {
61
+ case 'grok':
62
+ return AminoacidsPalettes.GrokGroups;
63
+ case 'lesk':
64
+ return AminoacidsPalettes.Lesk;
65
+ default:
66
+ throw new Error(`ChemPalette: scheme \`${scheme}\` does not exist`);
67
+ }
68
+ }
69
+ /**
70
+ * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted
71
+ *
72
+ * @param {string} c raw amino
73
+ * @return {[string, string]} outer and inner content
74
+ */
75
+ static getInnerOuter(c) {
76
+ let isInner = 0;
77
+ let inner = '';
78
+ let outer = '';
79
+ for (const char of c) {
80
+ if (char == '(')
81
+ isInner++;
82
+ else if (char == ')')
83
+ isInner--;
84
+ else if (isInner)
85
+ inner += char;
86
+ else
87
+ outer += char;
88
+ }
89
+ return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];
90
+ }
91
+ static getColorAAPivot(monomer = '', scheme = 'grok') {
92
+ var _a, _b, _c;
93
+ //const chemPaletteInstance = AAPalettes.GrokGroups();
94
+ const chemPaletteInstance = this.getPalette(scheme);
95
+ let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);
96
+ outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);
97
+ innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);
98
+ if (monomer.length == 1 || monomer[1] == '(') {
99
+ const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();
100
+ return amino in chemPaletteInstance ?
101
+ [chemPaletteInstance[amino], amino, innerMonomer, 1] :
102
+ [this.undefinedColor, outerMonomer, innerMonomer, 1];
103
+ }
104
+ if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {
105
+ if (monomer.length == 2 || monomer[2] == '(') {
106
+ const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();
107
+ return amino in chemPaletteInstance ?
108
+ [chemPaletteInstance[amino], amino, innerMonomer, 2] :
109
+ [this.undefinedColor, outerMonomer, innerMonomer, 2];
110
+ }
111
+ }
112
+ if (monomer.substring(0, 3) in this.AAFullNames) {
113
+ if (monomer.length == 3 || monomer[3] == '(') {
114
+ const amino = this.AAFullNames[monomer.substring(0, 3)];
115
+ return amino in chemPaletteInstance ?
116
+ [chemPaletteInstance[amino], amino, innerMonomer, 3] :
117
+ [this.undefinedColor, outerMonomer, innerMonomer, 3];
118
+ }
119
+ }
120
+ if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {
121
+ if (monomer.substring(1, 3) in this.AAFullNames) {
122
+ if (monomer.length == 4 || monomer[4] == '(') {
123
+ const amino = this.AAFullNames[monomer.substring(1, 3)];
124
+ return amino in chemPaletteInstance ?
125
+ [chemPaletteInstance[amino], amino, innerMonomer, 4] :
126
+ [this.undefinedColor, outerMonomer, innerMonomer, 4];
127
+ }
128
+ }
129
+ }
130
+ return [this.undefinedColor, outerMonomer, innerMonomer, 0];
131
+ }
132
+ }
133
+ Aminoacids.SemType = 'Aminoacids';
134
+ Aminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';
135
+ Aminoacids.undefinedColor = 'rgb(100,100,100)';
136
+ Aminoacids.Names = {
137
+ 'G': 'Glycine',
138
+ 'L': 'Leucine',
139
+ 'Y': 'Tyrosine',
140
+ 'S': 'Serine',
141
+ 'E': 'Glutamic acid',
142
+ 'Q': 'Glutamine',
143
+ 'D': 'Aspartic acid',
144
+ 'N': 'Asparagine',
145
+ 'F': 'Phenylalanine',
146
+ 'A': 'Alanine',
147
+ 'K': 'Lysine',
148
+ 'R': 'Arginine',
149
+ 'H': 'Histidine',
150
+ 'C': 'Cysteine',
151
+ 'V': 'Valine',
152
+ 'P': 'Proline',
153
+ 'W': 'Tryptophan',
154
+ 'I': 'Isoleucine',
155
+ 'M': 'Methionine',
156
+ 'T': 'Threonine',
157
+ };
158
+ Aminoacids.AASmiles = {
159
+ 'G': 'NCC(=O)O',
160
+ 'L': 'N[C@H](CC(C)C)C(=O)O',
161
+ 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',
162
+ 'S': 'NC(CO)C(=O)O',
163
+ 'E': 'N[C@@H](CCC(O)=O)C(=O)O',
164
+ 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',
165
+ 'D': 'N[C@@H](CC(O)=O)C(=O)O',
166
+ 'N': 'N[C@@H](CC(N)=O)C(=O)O',
167
+ 'F': 'NC(CC1=CC=CC=C1)C(=O)O',
168
+ 'A': 'N[C@H](C)C(=O)O',
169
+ 'K': 'NC(CCCCN)C(=O)O',
170
+ 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',
171
+ 'H': 'NC(CC1=CN=C[N]1)C(=O)O',
172
+ 'C': 'N[C@@H](CS)C(=O)O',
173
+ 'V': 'NC(C(C)C)C(=O)O',
174
+ 'P': 'N(CCC1)C1C(=O)O',
175
+ 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',
176
+ 'I': 'N[C@H]([C@H](C)CC)C(=O)O',
177
+ 'M': 'NC(CCSC)C(=O)O',
178
+ 'T': 'NC(C(O)C)C(=O)O',
179
+ };
180
+ Aminoacids.AASmilesTruncated = {
181
+ 'G': '*C*',
182
+ 'L': 'CC(C)C[C@H](*)*',
183
+ 'Y': 'C1=CC(=CC=C1CC(*)*)O',
184
+ 'S': 'OCC(*)C*',
185
+ 'E': '*[C@@H](CCC(O)=O)*',
186
+ 'Q': '*N[C@@H](CCC(N)=O)*',
187
+ 'D': '*[C@@H](CC(O)=O)*',
188
+ 'N': '*[C@@H](CC(N)=O)*',
189
+ 'F': 'C1=CC=C(C=C1)CC(*)*',
190
+ 'A': 'C[C@H](*)*',
191
+ 'K': 'C(CCN)CC(*)*',
192
+ 'R': '*[C@H](CCCNC(=N)C)*',
193
+ 'H': 'C1=C(NC=N1)CC(*)*',
194
+ 'C': 'C([C@@H](*)*)S',
195
+ 'V': 'CC(C)C(*)*',
196
+ 'P': 'C1CCN(*)C1*',
197
+ 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',
198
+ 'I': 'CC[C@H](C)[C@H](*)*',
199
+ 'M': 'CSCCC(*)*',
200
+ 'T': 'CC(O)C(*)*',
201
+ };
202
+ /** TODO: Full?
203
+ */
204
+ Aminoacids.AAFullNames = {
205
+ 'Ala': 'A',
206
+ 'Arg': 'R',
207
+ 'Asn': 'N',
208
+ 'Asp': 'D',
209
+ 'Cys': 'C',
210
+ 'Gln': 'Q',
211
+ 'Glu': 'E',
212
+ 'Gly': 'G',
213
+ 'His': 'H',
214
+ 'Ile': 'I',
215
+ 'Leu': 'L',
216
+ 'Lys': 'K',
217
+ 'Met': 'M',
218
+ 'Phe': 'F',
219
+ 'Pro': 'P',
220
+ 'Ser': 'S',
221
+ 'Thr': 'T',
222
+ 'Trp': 'W',
223
+ 'Tyr': 'Y',
224
+ 'Val': 'V',
225
+ };
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pbm9hY2lkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFtaW5vYWNpZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFhLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxjQUFjO0lBRzdDLE1BQU0sS0FBSyxJQUFJO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUM7YUFDekIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUlNLE1BQU0sS0FBSyxVQUFVO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDO2dCQUN0QixDQUFDLENBQUMsR0FBRyxF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QUFFLGFBQWE7SUFDbEIsR0FBRyxFQUFFLCtCQUErQjtJQUNwQyxHQUFHLEVBQUUscUJBQXFCO0lBQzFCLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxZQUFZO0NBQ2xCLENBQUM7QUFFRjtHQUNHO0FBQ1csc0JBQVcsR0FBcUI7SUFDNUMsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztDQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGVzazogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBMZXNrKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0cnLCAnQScsICdTJywgJ1QnXSwgJ29yYW5nZSddLFxuICAgICAgICBbWydDJywgJ1YnLCAnSScsICdMJywgJ1AnLCAnRicsICdZJywgJ00nLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAncmVkJ10sXG4gICAgICAgIFtbJ0snLCAnUiddLCAnYWxsX2JsdWUnXSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZXNrO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ3Jva0dyb3VwczogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBHcm9rR3JvdXBzKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0MnLCAnVSddLCAneWVsbG93J10sXG4gICAgICAgIFtbJ0cnLCAnUCddLCAncmVkJ10sXG4gICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ1InLCAnSCcsICdLJ10sICdsaWdodF9ibHVlJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAnZGFya19ibHVlJ10sXG4gICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyb2tHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByYXNNb2w6IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgUmFzTW9sKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnJhc01vbCA9IHtcbiAgICAgICAgLy8gaHR0cDovL2FjY2VzLmVucy1seW9uLmZyL2Jpb3RpYy9yYXN0b3AvaGVscC9jb2xvdXIuaHRtXG4gICAgICAgICdEJzogJyNFNjBBMEEnLCAvLyBhc3AsIGFzcGFydGljIGFjaWQsIGFzcFxuICAgICAgICAnRSc6ICcjRTYwQTBBJywgLy8gZ2x1LCBnbHV0YW1pYyBhY2lkXG4gICAgICAgICdDJzogJyNFNkU2MDAnLCAvLyBjeXMsIGN5c3RlaW5lXG4gICAgICAgICdNJzogJyNFNkU2MDAnLCAvLyBtZXQsIG1ldGhpb25pbmVcbiAgICAgICAgJ0snOiAnIzE0NUFGRicsIC8vIGx5cywgbHlzaW5lXG4gICAgICAgICdSJzogJyMxNDVBRkYnLCAvLyBhcmcsIGFyZ2luaW5lXG4gICAgICAgICdTJzogJyNGQTk2MDAnLCAvLyBzZXIsIHNlcmluZVxuICAgICAgICAnVCc6ICcjRkE5NjAwJywgLy8gdGhyLCB0aHJlb25pbmVcbiAgICAgICAgJ0YnOiAnIzMyMzJBQScsIC8vIHBoZSwgcGhlbnlsYWxhbmluZVxuICAgICAgICAnWSc6ICcjMzIzMkFBJywgLy8gdHlyLCB0eXJvc2luZVxuICAgICAgICAnTic6ICcjMDBEQ0RDJywgLy8gYXNuLCBhc3BhcmFnaW5lXG4gICAgICAgICdRJzogJyMwMERDREMnLCAvLyBnbG4sIGdsdXRhbWluZVxuICAgICAgICAnRyc6ICcjRUJFQkVCJywgLy8gZ2x5LCBnbHljaW5lXG4gICAgICAgICdMJzogJyMwRjgyMEYnLCAvLyBsZXUsIGxldWNpbmVcbiAgICAgICAgJ1YnOiAnIzBGODIwRicsIC8vIHZhbCwgdmFsaW5lXG4gICAgICAgICdJJzogJyMwRjgyMEYnLCAvLyBpbGUsIGlzb2xldWNpbmVcbiAgICAgICAgJ0EnOiAnI0M4QzhDOCcsIC8vIGFsYSwgYWxhbmluZVxuICAgICAgICAnVyc6ICcjQjQ1QUI0JywgLy8gdHJwLCB0cnlwdG9waGFuXG4gICAgICAgICdIJzogJyM4MjgyRDInLCAvLyBoaXMsIGhpc3RpZGluZVxuICAgICAgICAnUCc6ICcjREM5NjgyJywgLy8gcHJvLCBwcm9saW5lXG4gICAgICAgICdvdGhlcnMnOiAnI0JFQTA2RScsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHMge1xuICBzdGF0aWMgcmVhZG9ubHkgU2VtVHlwZTogc3RyaW5nID0gJ0FtaW5vYWNpZHMnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdBbWlub2FjaWRzTXVsdGlwbGVBbGlnbm1lbnQnO1xuXG4gIHN0YXRpYyB1bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdHJzogJ0dseWNpbmUnLFxuICAgICdMJzogJ0xldWNpbmUnLFxuICAgICdZJzogJ1R5cm9zaW5lJyxcbiAgICAnUyc6ICdTZXJpbmUnLFxuICAgICdFJzogJ0dsdXRhbWljIGFjaWQnLFxuICAgICdRJzogJ0dsdXRhbWluZScsXG4gICAgJ0QnOiAnQXNwYXJ0aWMgYWNpZCcsXG4gICAgJ04nOiAnQXNwYXJhZ2luZScsXG4gICAgJ0YnOiAnUGhlbnlsYWxhbmluZScsXG4gICAgJ0EnOiAnQWxhbmluZScsXG4gICAgJ0snOiAnTHlzaW5lJyxcbiAgICAnUic6ICdBcmdpbmluZScsXG4gICAgJ0gnOiAnSGlzdGlkaW5lJyxcbiAgICAnQyc6ICdDeXN0ZWluZScsXG4gICAgJ1YnOiAnVmFsaW5lJyxcbiAgICAnUCc6ICdQcm9saW5lJyxcbiAgICAnVyc6ICdUcnlwdG9waGFuJyxcbiAgICAnSSc6ICdJc29sZXVjaW5lJyxcbiAgICAnTSc6ICdNZXRoaW9uaW5lJyxcbiAgICAnVCc6ICdUaHJlb25pbmUnLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgQUFTbWlsZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnTkNDKD1PKU8nLFxuICAgICdMJzogJ05bQ0BIXShDQyhDKUMpQyg9TylPJyxcbiAgICAnWSc6ICdOQyhDQzE9Q0M9QyhPKUM9QzEpQyg9TylPJyxcbiAgICAnUyc6ICdOQyhDTylDKD1PKU8nLFxuICAgICdFJzogJ05bQ0BASF0oQ0NDKE8pPU8pQyg9TylPJyxcbiAgICAnUSc6ICdOW0NAQEhdKENDQyhOKT1PKUMoPU8pTycsXG4gICAgJ0QnOiAnTltDQEBIXShDQyhPKT1PKUMoPU8pTycsXG4gICAgJ04nOiAnTltDQEBIXShDQyhOKT1PKUMoPU8pTycsXG4gICAgJ0YnOiAnTkMoQ0MxPUNDPUNDPUMxKUMoPU8pTycsXG4gICAgJ0EnOiAnTltDQEhdKEMpQyg9TylPJyxcbiAgICAnSyc6ICdOQyhDQ0NDTilDKD1PKU8nLFxuICAgICdSJzogJ05bQ0BIXShDQ0NOQyg9TilDKUMoPU8pTycsXG4gICAgJ0gnOiAnTkMoQ0MxPUNOPUNbTl0xKUMoPU8pTycsXG4gICAgJ0MnOiAnTltDQEBIXShDUylDKD1PKU8nLFxuICAgICdWJzogJ05DKEMoQylDKUMoPU8pTycsXG4gICAgJ1AnOiAnTihDQ0MxKUMxQyg9TylPJyxcbiAgICAnVyc6ICdOW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpQyg9TylPJyxcbiAgICAnSSc6ICdOW0NASF0oW0NASF0oQylDQylDKD1PKU8nLFxuICAgICdNJzogJ05DKENDU0MpQyg9TylPJyxcbiAgICAnVCc6ICdOQyhDKE8pQylDKD1PKU8nLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgQUFTbWlsZXNUcnVuY2F0ZWQ6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnKkMqJyxcbiAgICAnTCc6ICdDQyhDKUNbQ0BIXSgqKSonLFxuICAgICdZJzogJ0MxPUNDKD1DQz1DMUNDKCopKilPJyxcbiAgICAnUyc6ICdPQ0MoKilDKicsXG4gICAgJ0UnOiAnKltDQEBIXShDQ0MoTyk9TykqJyxcbiAgICAnUSc6ICcqTltDQEBIXShDQ0MoTik9TykqJyxcbiAgICAnRCc6ICcqW0NAQEhdKENDKE8pPU8pKicsXG4gICAgJ04nOiAnKltDQEBIXShDQyhOKT1PKSonLFxuICAgICdGJzogJ0MxPUNDPUMoQz1DMSlDQygqKSonLFxuICAgICdBJzogJ0NbQ0BIXSgqKSonLFxuICAgICdLJzogJ0MoQ0NOKUNDKCopKicsXG4gICAgJ1InOiAnKltDQEhdKENDQ05DKD1OKUMpKicsXG4gICAgJ0gnOiAnQzE9QyhOQz1OMSlDQygqKSonLFxuICAgICdDJzogJ0MoW0NAQEhdKCopKilTJyxcbiAgICAnVic6ICdDQyhDKUMoKikqJyxcbiAgICAnUCc6ICdDMUNDTigqKUMxKicsXG4gICAgJ1cnOiAnKltDQEBIXShDYzFjMmNjY2NjMm4oW0hdKWMxKSonLFxuICAgICdJJzogJ0NDW0NASF0oQylbQ0BIXSgqKSonLFxuICAgICdNJzogJ0NTQ0NDKCopKicsXG4gICAgJ1QnOiAnQ0MoTylDKCopKicsXG4gIH07XG5cbiAgLyoqIFRPRE86IEZ1bGw/XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIEFBRnVsbE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBbGEnOiAnQScsXG4gICAgJ0FyZyc6ICdSJyxcbiAgICAnQXNuJzogJ04nLFxuICAgICdBc3AnOiAnRCcsXG4gICAgJ0N5cyc6ICdDJyxcbiAgICAnR2xuJzogJ1EnLFxuICAgICdHbHUnOiAnRScsXG4gICAgJ0dseSc6ICdHJyxcbiAgICAnSGlzJzogJ0gnLFxuICAgICdJbGUnOiAnSScsXG4gICAgJ0xldSc6ICdMJyxcbiAgICAnTHlzJzogJ0snLFxuICAgICdNZXQnOiAnTScsXG4gICAgJ1BoZSc6ICdGJyxcbiAgICAnUHJvJzogJ1AnLFxuICAgICdTZXInOiAnUycsXG4gICAgJ1Rocic6ICdUJyxcbiAgICAnVHJwJzogJ1cnLFxuICAgICdUeXInOiAnWScsXG4gICAgJ1ZhbCc6ICdWJyxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldFBhbGV0dGUoc2NoZW1lOiBzdHJpbmcgPSAnZ3JvaycpOiBTZXFQYWxldHRlIHtcbiAgICBzd2l0Y2ggKHNjaGVtZSkge1xuICAgIGNhc2UgJ2dyb2snOlxuICAgICAgcmV0dXJuIEFtaW5vYWNpZHNQYWxldHRlcy5Hcm9rR3JvdXBzO1xuICAgIGNhc2UgJ2xlc2snOlxuICAgICAgcmV0dXJuIEFtaW5vYWNpZHNQYWxldHRlcy5MZXNrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZW1QYWxldHRlOiBzY2hlbWUgXFxgJHtzY2hlbWV9XFxgIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZGl2aWRlZCBhbWlubyBhY2lkIHdpdGggaXRzIGNvbnRlbnQgaW4gdGhlIGJyYWNrZXQsIGlmIHRoZSBjb250ZW50IGlzIG51bWJlciwgdGhlbiBpdHMgb21pdHRlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYyByYXcgYW1pbm9cbiAgICogQHJldHVybiB7W3N0cmluZywgc3RyaW5nXX0gb3V0ZXIgYW5kIGlubmVyIGNvbnRlbnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJPdXRlcihjOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBsZXQgaXNJbm5lciA9IDA7XG4gICAgbGV0IGlubmVyID0gJyc7XG4gICAgbGV0IG91dGVyID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYykge1xuICAgICAgaWYgKGNoYXIgPT0gJygnKVxuICAgICAgICBpc0lubmVyKys7XG4gICAgICBlbHNlIGlmIChjaGFyID09ICcpJylcbiAgICAgICAgaXNJbm5lci0tO1xuICAgICAgZWxzZSBpZiAoaXNJbm5lcilcbiAgICAgICAgaW5uZXIgKz0gY2hhcjtcbiAgICAgIGVsc2VcbiAgICAgICAgb3V0ZXIgKz0gY2hhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlSW50KGlubmVyKSkgPyBbb3V0ZXIsICcnXSA6IFtvdXRlciwgaW5uZXJdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRDb2xvckFBUGl2b3QobW9ub21lcjogc3RyaW5nID0gJycsIHNjaGVtZTogJ2dyb2snID0gJ2dyb2snKTogW3N0cmluZywgc3RyaW5nLCBzdHJpbmcsIG51bWJlcl0ge1xuICAgIC8vY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IEFBUGFsZXR0ZXMuR3Jva0dyb3VwcygpO1xuICAgIGNvbnN0IGNoZW1QYWxldHRlSW5zdGFuY2UgPSB0aGlzLmdldFBhbGV0dGUoc2NoZW1lKTtcbiAgICBsZXQgW291dGVyTW9ub21lciwgaW5uZXJNb25vbWVyXSA9IHRoaXMuZ2V0SW5uZXJPdXRlcihtb25vbWVyKTtcbiAgICBvdXRlck1vbm9tZXIgPSAob3V0ZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtvdXRlck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IG91dGVyTW9ub21lcik7XG4gICAgaW5uZXJNb25vbWVyID0gKGlubmVyTW9ub21lci5sZW5ndGggPiA2ID8gYCR7aW5uZXJNb25vbWVyLnNsaWNlKDAsIDMpfS4uLmAgOiBpbm5lck1vbm9tZXIpO1xuXG4gICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDEgfHwgbW9ub21lclsxXSA9PSAnKCcpIHtcbiAgICAgIGNvbnN0IGFtaW5vID0gbW9ub21lclswXT8udG9VcHBlckNhc2UoKSE7XG4gICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDFdO1xuICAgIH1cblxuICAgIGlmIChtb25vbWVyWzBdID09ICdkJyAmJiBtb25vbWVyWzFdISBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlKSB7XG4gICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMiB8fCBtb25vbWVyWzJdID09ICcoJykge1xuICAgICAgICBjb25zdCBhbWlubyA9IG1vbm9tZXJbMV0/LnRvVXBwZXJDYXNlKCkhO1xuICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2VbYW1pbm9dLCBhbWlubywgaW5uZXJNb25vbWVyLCAyXSA6XG4gICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9ub21lci5zdWJzdHJpbmcoMCwgMykgaW4gdGhpcy5BQUZ1bGxOYW1lcykge1xuICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDMgfHwgbW9ub21lclszXSA9PSAnKCcpIHtcbiAgICAgICAgY29uc3QgYW1pbm8gPSB0aGlzLkFBRnVsbE5hbWVzW21vbm9tZXIuc3Vic3RyaW5nKDAsIDMpXTtcbiAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgM10gOlxuICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgM107XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vbm9tZXJbMF0/LnRvTG93ZXJDYXNlKCkgPT0gbW9ub21lclswXSkge1xuICAgICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDEsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDQgfHwgbW9ub21lcls0XSA9PSAnKCcpIHtcbiAgICAgICAgICBjb25zdCBhbWlubyA9IHRoaXMuQUFGdWxsTmFtZXNbbW9ub21lci5zdWJzdHJpbmcoMSwgMyldO1xuICAgICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgNF0gOlxuICAgICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCA0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDBdO1xuICB9XG59XG4iXX0=
package/src/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { SeqPalette } from './seq-palettes';
2
+ import { Aminoacids, AminoacidsPalettes } from './aminoacids';
3
+ import { Nucleotides, NucleotidesPalettes } from './nucleotides';
4
+ import { WebLogo, PositionInfo, PositionMonomerInfo } from './viewers/web-logo';
5
+ export { SeqPalette, AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides };
6
+ export { WebLogo, PositionInfo, PositionMonomerInfo };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAC,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAC,CAAC;AACtF,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAC,CAAC"}
package/src/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import { Aminoacids, AminoacidsPalettes } from './aminoacids';
2
+ import { Nucleotides, NucleotidesPalettes } from './nucleotides';
3
+ import { WebLogo, PositionInfo, PositionMonomerInfo } from './viewers/web-logo';
4
+ export { AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides };
5
+ export { WebLogo, PositionInfo, PositionMonomerInfo };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sRUFBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RSxPQUFPLEVBQWEsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBQyxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlcVBhbGV0dGV9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcbmltcG9ydCB7QW1pbm9hY2lkcywgQW1pbm9hY2lkc1BhbGV0dGVzfSBmcm9tICcuL2FtaW5vYWNpZHMnO1xuaW1wb3J0IHtOdWNsZW90aWRlcywgTnVjbGVvdGlkZXNQYWxldHRlc30gZnJvbSAnLi9udWNsZW90aWRlcyc7XG5pbXBvcnQge1dlYkxvZ28sIFBvc2l0aW9uSW5mbywgUG9zaXRpb25Nb25vbWVySW5mb30gZnJvbSAnLi92aWV3ZXJzL3dlYi1sb2dvJztcblxuZXhwb3J0IHtTZXFQYWxldHRlLCBBbWlub2FjaWRzUGFsZXR0ZXMsIEFtaW5vYWNpZHMsIE51Y2xlb3RpZGVzUGFsZXR0ZXMsIE51Y2xlb3RpZGVzfTtcbmV4cG9ydCB7V2ViTG9nbywgUG9zaXRpb25JbmZvLCBQb3NpdGlvbk1vbm9tZXJJbmZvfTtcblxuIl19
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ import {SeqPalette} from './seq-palettes';
2
+ import {Aminoacids, AminoacidsPalettes} from './aminoacids';
3
+ import {Nucleotides, NucleotidesPalettes} from './nucleotides';
4
+ import {WebLogo, PositionInfo, PositionMonomerInfo} from './viewers/web-logo';
5
+
6
+ export {SeqPalette, AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides};
7
+ export {WebLogo, PositionInfo, PositionMonomerInfo};
8
+
@@ -0,0 +1,12 @@
1
+ import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
2
+ import { SeqPalette, SeqPaletteBase } from './seq-palettes';
3
+ export declare class NucleotidesPalettes extends SeqPaletteBase {
4
+ private static chromatogram;
5
+ static get Chromatogram(): SeqPalette;
6
+ }
7
+ export declare class Nucleotides {
8
+ static readonly SemType: string;
9
+ static readonly SemTypeMultipleAlignment: string;
10
+ static Names: StringDictionary;
11
+ }
12
+ //# sourceMappingURL=nucleotides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nucleotides.d.ts","sourceRoot":"","sources":["nucleotides.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AACjF,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IAExC,WAAkB,YAAY,IAAI,UAAU,CAW3C;CACF;AAED,qBAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAuB;IAEtD,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAkC;IAElF,OAAc,KAAK,EAAE,gBAAgB,CAMnC;CACH"}
@@ -0,0 +1,27 @@
1
+ import { SeqPaletteBase } from './seq-palettes';
2
+ export class NucleotidesPalettes extends SeqPaletteBase {
3
+ static get Chromatogram() {
4
+ if (this.chromatogram === void 0) {
5
+ this.chromatogram = {
6
+ 'A': 'green',
7
+ 'C': 'blue',
8
+ 'G': 'black',
9
+ 'T': 'red', 'U': 'red',
10
+ 'others': 'gray',
11
+ };
12
+ }
13
+ return this.chromatogram;
14
+ }
15
+ }
16
+ export class Nucleotides {
17
+ }
18
+ Nucleotides.SemType = 'MultipleAlignment';
19
+ Nucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';
20
+ Nucleotides.Names = {
21
+ 'A': 'Adenine',
22
+ 'C': 'Cytosine',
23
+ 'G': 'Guanine',
24
+ 'T': 'Thymine',
25
+ 'U': 'Uracil',
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGVvdGlkZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWNsZW90aWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQWEsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGNBQWM7SUFHOUMsTUFBTSxLQUFLLFlBQVk7UUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUc7Z0JBQ2xCLEdBQUcsRUFBRSxPQUFPO2dCQUNaLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxPQUFPO2dCQUNaLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUs7Z0JBQ3RCLFFBQVEsRUFBRSxNQUFNO2FBQ2pCLENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sV0FBVzs7QUFDTixtQkFBTyxHQUFXLG1CQUFtQixDQUFDO0FBRXRDLG9DQUF3QixHQUFXLDhCQUE4QixDQUFDO0FBRXBFLGlCQUFLLEdBQXFCO0lBQ3RDLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFFBQVE7Q0FDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuaW1wb3J0IHtTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1NlcVBhbGV0dGUsIFNlcVBhbGV0dGVCYXNlfSBmcm9tICcuL3NlcS1wYWxldHRlcyc7XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlc1BhbGV0dGVzIGV4dGVuZHMgU2VxUGFsZXR0ZUJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBjaHJvbWF0b2dyYW06IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgQ2hyb21hdG9ncmFtKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmNocm9tYXRvZ3JhbSA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmNocm9tYXRvZ3JhbSA9IHtcbiAgICAgICAgJ0EnOiAnZ3JlZW4nLFxuICAgICAgICAnQyc6ICdibHVlJyxcbiAgICAgICAgJ0cnOiAnYmxhY2snLCAvLyBvcmFuZ2UgP1xuICAgICAgICAnVCc6ICdyZWQnLCAnVSc6ICdyZWQnLFxuICAgICAgICAnb3RoZXJzJzogJ2dyYXknLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hyb21hdG9ncmFtO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnTXVsdGlwbGVBbGlnbm1lbnQnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdOdWNsZW90aWRlc011bHRpcGxlQWxpZ25tZW50JztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBJzogJ0FkZW5pbmUnLFxuICAgICdDJzogJ0N5dG9zaW5lJyxcbiAgICAnRyc6ICdHdWFuaW5lJyxcbiAgICAnVCc6ICdUaHltaW5lJyxcbiAgICAnVSc6ICdVcmFjaWwnLFxuICB9O1xufVxuIl19
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["package.ts"],"names":[],"mappings":""}
package/src/package.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhY2thZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIiJdfQ==
@@ -0,0 +1,16 @@
1
+ export interface SeqPalette {
2
+ /**
3
+ * @param {string} m Monomer character
4
+ * @return {string} Color
5
+ */
6
+ [m: string]: string;
7
+ }
8
+ export declare class SeqPaletteBase {
9
+ /** Palette with shades of primary colors
10
+ */
11
+ private static colourPalette;
12
+ protected static makePalette(dt: [string[], string][], simplified?: boolean): {
13
+ [key: string]: string;
14
+ };
15
+ }
16
+ //# sourceMappingURL=seq-palettes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seq-palettes.d.ts","sourceRoot":"","sources":["seq-palettes.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB;OACG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa,CAqB1B;IAEF,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,UAAQ;;;CAW1E"}
@@ -0,0 +1,38 @@
1
+ export class SeqPaletteBase {
2
+ static makePalette(dt, simplified = false) {
3
+ const palette = {};
4
+ dt.forEach((cp) => {
5
+ const objList = cp[0];
6
+ const colour = cp[1];
7
+ objList.forEach((obj, ind) => {
8
+ palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];
9
+ });
10
+ });
11
+ return palette;
12
+ }
13
+ }
14
+ /** Palette with shades of primary colors
15
+ */
16
+ SeqPaletteBase.colourPalette = {
17
+ 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],
18
+ 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',
19
+ 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
20
+ 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',
21
+ 'rgb(31, 120, 150)'],
22
+ 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],
23
+ 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],
24
+ 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],
25
+ 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],
26
+ 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],
27
+ 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],
28
+ 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],
29
+ 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],
30
+ 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
31
+ 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],
32
+ 'pink': ['rgb(247,182,210)'],
33
+ 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],
34
+ 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],
35
+ 'yellow': ['rgb(188,189,34)'],
36
+ 'white': ['rgb(230,230,230)'],
37
+ };
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXBhbGV0dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXBhbGV0dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE1BQU0sT0FBTyxjQUFjO0lBMEJmLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBd0IsRUFBRSxVQUFVLEdBQUcsS0FBSztRQUN2RSxNQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7QUFuQ0Q7R0FDRztBQUNZLDRCQUFhLEdBQWdDO0lBQzFELFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO0lBQzFGLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtRQUNwRyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztJQUNuRixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0I7UUFDL0csbUJBQW1CLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDdkUsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDN0MsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7SUFDckUsV0FBVyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7SUFDckQsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7SUFDOUYsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDMUUsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDdEYsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDN0MsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7SUFDL0UsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEYsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7SUFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDL0MsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7SUFDMUYsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDN0IsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Q0FDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VxUGFsZXR0ZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbSBNb25vbWVyIGNoYXJhY3RlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbG9yXG4gICAqL1xuICBbbTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2VxUGFsZXR0ZUJhc2Uge1xuICAvKiogUGFsZXR0ZSB3aXRoIHNoYWRlcyBvZiBwcmltYXJ5IGNvbG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY29sb3VyUGFsZXR0ZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge1xuICAgICdvcmFuZ2UnOiBbJ3JnYigyNTUsMTg3LDEyMCknLCAncmdiKDI0NSwxNjcsMTAwKScsICdyZ2IoMjM1LDEzNyw3MCknLCAncmdiKDIwNSwgMTExLCA3MSknXSxcbiAgICAnYWxsX2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoNzQsMTYwLDc0KScsICdyZ2IoMjMsMTAzLDU3KScsICdyZ2IoMzAsMTEwLDk2KScsICdyZ2IoNjAsMTMxLDk1KScsXG4gICAgICAncmdiKDI0LDExMCw3OSknLCAncmdiKDE1MiwyMjMsMTM4KScsICdyZ2IoMTgyLCAyMjMsIDEzOCknLCAncmdiKDE1MiwgMTkzLCAxMzgpJ10sXG4gICAgJ2FsbF9ibHVlJzogWydyZ2IoMzEsMTE5LDE4MCknLCAncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxMjIsIDEwMiwgMTg5KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigxNDEsIDEyNCwgMjE3KScsXG4gICAgICAncmdiKDMxLCAxMjAsIDE1MCknXSxcbiAgICAnbWFnZW50YSc6IFsncmdiKDE2MiwxMDYsMTkyKScsICdyZ2IoMTk3LDE2NSwyMjQpJywgJ3JnYigyMDgsMTEzLDIxOCknXSxcbiAgICAncmVkJzogWydyZ2IoMjE0LDM5LDQwKScsICdyZ2IoMjU1LDE1MiwxNTApJ10sXG4gICAgJ3N0X2JsdWUnOiBbJ3JnYigyMywxOTAsMjA3KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigzMSwxMTksMTgwKSddLFxuICAgICdkYXJrX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMzEsIDEyMCwgMTUwKSddLFxuICAgICdsaWdodF9ibHVlJzogWydyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDE1OCwyMTgsMjI5KScsICdyZ2IoMTA4LCAyMTgsIDIyOSknLCAncmdiKDIzLDE5MCwyMjcpJ10sXG4gICAgJ2xpbGFjX2JsdWUnOiBbJ3JnYigxMjQsMTAyLDIxMSknLCAncmdiKDE0OSwxMzQsMjE3KScsICdyZ2IoOTcsIDgxLCAxNTApJ10sXG4gICAgJ2RhcmtfZ3JlZW4nOiBbJ3JnYigyMywxMDMsNTcpJywgJ3JnYigzMCwxMTAsOTYpJywgJ3JnYig2MCwxMzEsOTUpJywgJ3JnYigyNCwxMTAsNzkpJ10sXG4gICAgJ2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoNzQsMTYwLDc0KSddLFxuICAgICdsaWdodF9ncmVlbic6IFsncmdiKDE1MiwyMjMsMTM4KScsICdyZ2IoMTgyLCAyMjMsIDEzOCknLCAncmdiKDE1MiwgMTkzLCAxMzgpJ10sXG4gICAgJ3N0X2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigzOSwgMTc0LCA5NiknLCAncmdiKDc0LDE2MCw3NCknXSxcbiAgICAncGluayc6IFsncmdiKDI0NywxODIsMjEwKSddLFxuICAgICdicm93bic6IFsncmdiKDE0MCw4Niw3NSknLCAncmdiKDEwMiwgNjIsIDU0KSddLFxuICAgICdncmF5JzogWydyZ2IoMTI3LDEyNywxMjcpJywgJ3JnYigxOTksMTk5LDE5OSknLCAncmdiKDE5NiwxNTYsMTQ4KScsICdyZ2IoMjIyLCAyMjIsIDE4MCknXSxcbiAgICAneWVsbG93JzogWydyZ2IoMTg4LDE4OSwzNCknXSxcbiAgICAnd2hpdGUnOiBbJ3JnYigyMzAsMjMwLDIzMCknXSxcbiAgfTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIG1ha2VQYWxldHRlKGR0OiBbc3RyaW5nW10sIHN0cmluZ11bXSwgc2ltcGxpZmllZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgcGFsZXR0ZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGR0LmZvckVhY2goKGNwKSA9PiB7XG4gICAgICBjb25zdCBvYmpMaXN0ID0gY3BbMF07XG4gICAgICBjb25zdCBjb2xvdXIgPSBjcFsxXTtcbiAgICAgIG9iakxpc3QuZm9yRWFjaCgob2JqLCBpbmQpID0+IHtcbiAgICAgICAgcGFsZXR0ZVtvYmpdID0gdGhpcy5jb2xvdXJQYWxldHRlW2NvbG91cl1bc2ltcGxpZmllZCA/IDAgOiBpbmRdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhbGV0dGU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,67 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
3
+ declare module 'datagrok-api/src/grid' {
4
+ interface Rect {
5
+ contains(x: number, y: number): boolean;
6
+ }
7
+ }
8
+ declare global {
9
+ interface HTMLCanvasElement {
10
+ getCursorPosition(event: MouseEvent): DG.Point;
11
+ }
12
+ }
13
+ export declare class PositionMonomerInfo {
14
+ /** Sequences count with monomer in position
15
+ */
16
+ count: number;
17
+ /** Remember screen coords rect
18
+ */
19
+ bounds: DG.Rect;
20
+ constructor();
21
+ }
22
+ export declare class PositionInfo {
23
+ readonly name: string;
24
+ freq: {
25
+ [m: string]: PositionMonomerInfo;
26
+ };
27
+ rowCount: number;
28
+ /** freq = {}, rowCount = 0
29
+ * @param {string} name Name of position ('111A', '111.1', etc)
30
+ */
31
+ constructor(name: string);
32
+ }
33
+ export declare class WebLogo extends DG.JsViewer {
34
+ static residuesSet: string;
35
+ protected cp: StringDictionary | null;
36
+ private canvas?;
37
+ private slider?;
38
+ private textBaseline;
39
+ private axisHeight;
40
+ private positionWidth;
41
+ private seqCol;
42
+ private positions;
43
+ private rowsMasked;
44
+ private rowsNull;
45
+ minHeight: number;
46
+ maxHeight: number;
47
+ considerNullSequences: boolean;
48
+ sequenceColumnName: string;
49
+ startPositionName: string;
50
+ endPositionName: string;
51
+ private positionNames;
52
+ private startPosition;
53
+ private endPosition;
54
+ private get Length();
55
+ constructor();
56
+ init(): Promise<void>;
57
+ rootOnSizeChanged(args: any): void;
58
+ /** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().
59
+ */
60
+ updateSeqCol(): void;
61
+ onPropertyChanged(property: DG.Property): void;
62
+ onTableAttached(): void;
63
+ protected _nullSequence(fillerResidue?: string): string;
64
+ protected _calculate(): void;
65
+ render(recalc?: boolean): void;
66
+ }
67
+ //# sourceMappingURL=web-logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-logo.d.ts","sourceRoot":"","sources":["web-logo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AAOjF,OAAO,QAAQ,uBAAuB,CAAC;IACrC,UAAU,IAAI;QACZ,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACzC;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,iBAAiB;QACzB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC;KAChD;CACF;AAWD,qBAAa,mBAAmB;IAC9B;OACG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;OACG;IACH,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;;CAMjB;AAED,qBAAa,YAAY;IACvB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAA;KAAE,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;gBACS,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,OAAQ,SAAQ,EAAE,CAAC,QAAQ;IACtC,OAAc,WAAW,SAAiB;IAG1C,SAAS,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAG7C,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,MAAM,CAAC,CAAiB;IAChC,OAAO,CAAC,YAAY,CAAqB;IAEzC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,aAAa,CAAc;IAEnC,OAAO,CAAC,MAAM,CAA0B;IAExC,OAAO,CAAC,SAAS,CAAsB;IAEvC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAa;IAGtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,aAAa,CAAc;IAEnC,OAAO,CAAC,WAAW,CAAc;IAEjC,OAAO,KAAK,MAAM,GAAgE;;IAiB5E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmF3B,iBAAiB,CAAC,IAAI,EAAE,GAAG;IAmB3B;OACG;IACH,YAAY,IAAI,IAAI;IAuCpB,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,IAAI;IAyB9C,eAAe;IAiBf,SAAS,CAAC,aAAa,CAAC,aAAa,SAAM,GAAG,MAAM;IAOpD,SAAS,CAAC,UAAU;IAoFpB,MAAM,CAAC,MAAM,UAAO;CA8DrB"}
@@ -0,0 +1,345 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import * as ui from 'datagrok-api/ui';
11
+ import * as DG from 'datagrok-api/dg';
12
+ import * as rxjs from 'rxjs';
13
+ import { Aminoacids, AminoacidsPalettes } from '../aminoacids';
14
+ import { Nucleotides, NucleotidesPalettes } from '../nucleotides';
15
+ HTMLCanvasElement.prototype.getCursorPosition = function (event) {
16
+ const rect = this.getBoundingClientRect();
17
+ return new DG.Point(event.clientX - rect.left, event.clientY - rect.top);
18
+ };
19
+ DG.Rect.prototype.contains = function (x, y) {
20
+ return this.left <= x && x <= this.right && this.top <= y && y <= this.bottom;
21
+ };
22
+ export class PositionMonomerInfo {
23
+ constructor() {
24
+ this.count = 0;
25
+ this.bounds = new DG.Rect(0, 0, 0, 0);
26
+ }
27
+ }
28
+ export class PositionInfo {
29
+ /** freq = {}, rowCount = 0
30
+ * @param {string} name Name of position ('111A', '111.1', etc)
31
+ */
32
+ constructor(name) {
33
+ this.name = name;
34
+ this.freq = {};
35
+ this.rowCount = 0;
36
+ }
37
+ }
38
+ export class WebLogo extends DG.JsViewer {
39
+ constructor() {
40
+ super();
41
+ // private readonly colorScheme: ColorScheme = ColorSchemes[NucleotidesWebLogo.residuesSet];
42
+ this.cp = null;
43
+ this.axisHeight = 12;
44
+ this.positionWidth = 16;
45
+ this.seqCol = null;
46
+ // private maxLength: number = 100;
47
+ this.positions = [];
48
+ this.rowsMasked = 0;
49
+ this.rowsNull = 0;
50
+ this.positionNames = [];
51
+ this.startPosition = -1;
52
+ this.endPosition = -1;
53
+ this.textBaseline = 'top';
54
+ this.minHeight = this.float('minHeight', 50);
55
+ this.maxHeight = this.float('maxHeight', 100);
56
+ this.considerNullSequences = this.bool('considerNullSequences', false);
57
+ this.sequenceColumnName = this.string('sequenceColumnName', null);
58
+ this.startPositionName = this.string('startPositionName', null);
59
+ this.endPositionName = this.string('endPositionName', null);
60
+ }
61
+ get Length() { return this.endPosition - this.startPosition + 1; }
62
+ init() {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ this.canvas = ui.canvas();
65
+ this.canvas.style.width = '100%';
66
+ this.slider = ui.rangeSlider(0, 20, 2, 5);
67
+ this.slider.root.style.width = '100%';
68
+ this.slider.root.style.height = '12px';
69
+ // this.host = ui.divV([/*this.slider,*/this.canvas]);
70
+ const getMonomer = (p) => {
71
+ const jPos = Math.floor(p.x / this.positionWidth);
72
+ const position = this.positions[jPos];
73
+ if (position === void 0)
74
+ return [jPos, null, null];
75
+ const monomer = Object.keys(position.freq)
76
+ .find((m) => position.freq[m].bounds.contains(p.x, p.y));
77
+ if (monomer === undefined)
78
+ return [jPos, null, null];
79
+ return [jPos, monomer, position.freq[monomer]];
80
+ };
81
+ this.canvas.onmouseover = (e) => {
82
+ };
83
+ rxjs.fromEvent(this.canvas, 'mousemove').subscribe((e) => {
84
+ if (!this.canvas)
85
+ return;
86
+ const args = e;
87
+ const [jPos, monomer] = getMonomer(this.canvas.getCursorPosition(args));
88
+ //if (this.dataFrame && this.seqCol && monomer) {
89
+ if (this.dataFrame && this.seqCol && monomer) {
90
+ ui.tooltip.showRowGroup(this.dataFrame, (iRow) => {
91
+ const seq = this.seqCol.get(iRow);
92
+ const mSeq = seq ? seq[this.startPosition + jPos] : null;
93
+ return mSeq === monomer;
94
+ }, args.x + 16, args.y + 16);
95
+ }
96
+ else {
97
+ ui.tooltip.hide();
98
+ }
99
+ });
100
+ rxjs.fromEvent(this.canvas, 'mousedown').subscribe((e) => {
101
+ if (!this.canvas)
102
+ return;
103
+ const args = e;
104
+ const [jPos, monomer] = getMonomer(this.canvas.getCursorPosition(args));
105
+ // prevents deselect all rows if we miss monomer bounds
106
+ //if (this.dataFrame && this.seqCol && monomer) {
107
+ if (this.dataFrame && this.seqCol && monomer) {
108
+ this.dataFrame.selection.init((iRow) => {
109
+ const seq = this.seqCol.get(iRow);
110
+ const mSeq = seq ? seq[this.startPosition + jPos] : null;
111
+ return mSeq === monomer;
112
+ });
113
+ }
114
+ });
115
+ this.root.append(this.canvas);
116
+ // this.root.appendChild(this.slider.root);
117
+ // this.root.append(this.host);
118
+ // ui.onSizeChanged(this.canvas).subscribe(this.canvasOnSizeChanged.bind(this));
119
+ ui.onSizeChanged(this.root).subscribe(this.rootOnSizeChanged.bind(this));
120
+ this.render(true);
121
+ });
122
+ }
123
+ // canvasOnSizeChanged(args: any) {
124
+ // this.canvas.width = this.canvas.clientWidth;
125
+ // this.canvas.height = this.canvas.clientHeight;
126
+ // console.debug(`WebLogo.onSizeChanged() width=${this.canvas.width}, height=${this.canvas.height}`);
127
+ // this.render(false);
128
+ // }
129
+ rootOnSizeChanged(args) {
130
+ if (!this.canvas)
131
+ return;
132
+ // this.canvas.width calculate in this._calculate() method
133
+ const height = Math.min(this.maxHeight, Math.max(this.minHeight, this.root.clientHeight));
134
+ // if (this.canvas.width > this.root.clientWidth) /* horizontal scroller is enabled */
135
+ // height -= 6; /* free some space for horizontal scroller */
136
+ this.canvas.height = height;
137
+ this.canvas.style.height = `${height}px`;
138
+ // console.debug(`WebLogo.onRootSizeChanged() ` +
139
+ // `root.width=${this.root.clientWidth}, root.height=${this.root.clientHeight}, ` +
140
+ // `canvas.width=${this.canvas.width}, canvas.height=${this.canvas.height} .`);
141
+ this.render(true);
142
+ }
143
+ /** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().
144
+ */
145
+ updateSeqCol() {
146
+ if (this.dataFrame) {
147
+ this.seqCol = this.dataFrame.col(this.sequenceColumnName);
148
+ if (this.seqCol) {
149
+ let maxLength = 0;
150
+ for (const category of this.seqCol.categories)
151
+ maxLength = Math.max(maxLength, category.length);
152
+ // Get position names from data column tag 'positionNames'
153
+ const positionNamesTxt = this.seqCol.getTag('positionNames');
154
+ // Fallback if 'positionNames' tag is not provided
155
+ this.positionNames = positionNamesTxt ? positionNamesTxt.split(', ').map((n) => n.trim()) :
156
+ [...Array(maxLength).keys()].map((jPos) => `${jPos + 1}`);
157
+ this.startPosition = this.startPositionName && this.positionNames ?
158
+ this.positionNames.indexOf(this.startPositionName) : 0;
159
+ this.endPosition = this.endPositionName && this.positionNames ?
160
+ this.positionNames.indexOf(this.endPositionName) : maxLength;
161
+ //#region -- palette --
162
+ switch (this.seqCol.semType) {
163
+ case Aminoacids.SemTypeMultipleAlignment:
164
+ this.cp = AminoacidsPalettes.GrokGroups;
165
+ break;
166
+ case Nucleotides.SemTypeMultipleAlignment:
167
+ this.cp = NucleotidesPalettes.Chromatogram;
168
+ break;
169
+ }
170
+ //#endregion -- palette --
171
+ }
172
+ else {
173
+ this.cp = null;
174
+ this.positionNames = [];
175
+ this.startPosition = -1;
176
+ this.endPosition = -1;
177
+ }
178
+ }
179
+ this.render();
180
+ }
181
+ onPropertyChanged(property) {
182
+ super.onPropertyChanged(property);
183
+ switch (property.name) {
184
+ case 'considerNullSequences':
185
+ this.render();
186
+ break;
187
+ case 'sequenceColumnName':
188
+ this.updateSeqCol();
189
+ break;
190
+ case 'startPositionName':
191
+ this.updateSeqCol();
192
+ break;
193
+ case 'endPositionName':
194
+ this.updateSeqCol();
195
+ break;
196
+ case 'minHeight':
197
+ this.render(true);
198
+ break;
199
+ case 'maxHeight':
200
+ this.render(true);
201
+ break;
202
+ }
203
+ }
204
+ onTableAttached() {
205
+ this.updateSeqCol();
206
+ if (this.dataFrame !== void 0) {
207
+ // There are two approaches:
208
+ // first - look in the dataFrame for the first matching column by semType of the
209
+ // corresponding viewer (but we want only one class of a more universal viewer),
210
+ // second - draw column data if the passed column is of suitable semType
211
+ // We decided that we will not search, but we will display asked data if we can
212
+ // const semType = (<typeof NucleotidesWebLogo>(this.constructor)).residuesSet;
213
+ // this.seqCol = (this.dataFrame.columns as DG.ColumnList).bySemType(semType);
214
+ this.dataFrame.selection.onChanged.subscribe((_) => this.render());
215
+ this.dataFrame.filter.onChanged.subscribe((_) => this.render());
216
+ }
217
+ }
218
+ _nullSequence(fillerResidue = 'X') {
219
+ if (this.considerNullSequences)
220
+ return new Array(this.Length).fill(fillerResidue).join('');
221
+ return '';
222
+ }
223
+ _calculate() {
224
+ if (!this.canvas || !this.seqCol || !this.dataFrame || this.startPosition === -1 || this.endPosition === -1)
225
+ return;
226
+ const width = this.Length * this.positionWidth;
227
+ this.canvas.width = width;
228
+ this.canvas.style.width = `${width}px`;
229
+ this.root.style.width = `${this.canvas.width}px`;
230
+ this.positions = new Array(this.Length);
231
+ for (let jPos = 0; jPos < this.Length; jPos++) {
232
+ const posName = this.positionNames[this.startPosition + jPos];
233
+ this.positions[jPos] = new PositionInfo(posName);
234
+ }
235
+ // 2022-05-05 askalkin instructed to show WebLogo based on filter (not selection)
236
+ const indices = this.dataFrame.filter.getSelectedIndexes();
237
+ // const indices = this.dataFrame.selection.trueCount > 0 ? this.dataFrame.selection.getSelectedIndexes() :
238
+ // this.dataFrame.filter.getSelectedIndexes();
239
+ this.rowsMasked = indices.length;
240
+ this.rowsNull = 0;
241
+ for (const i of indices) {
242
+ let s = (this.seqCol.get(i));
243
+ if (!s) {
244
+ s = this._nullSequence();
245
+ ++this.rowsNull;
246
+ }
247
+ else {
248
+ for (let jPos = 0; jPos < this.Length; jPos++) {
249
+ const pmInfo = this.positions[jPos].freq;
250
+ const m = s[this.startPosition + jPos];
251
+ if (!(m in pmInfo))
252
+ pmInfo[m] = new PositionMonomerInfo();
253
+ pmInfo[m].count++;
254
+ }
255
+ }
256
+ }
257
+ //#region Polish freq counts
258
+ for (let jPos = 0; jPos < this.Length; jPos++) {
259
+ // delete this.positions[jPos].freq['-'];
260
+ this.positions[jPos].rowCount = 0;
261
+ for (const m in this.positions[jPos].freq)
262
+ this.positions[jPos].rowCount += this.positions[jPos].freq[m].count;
263
+ }
264
+ //#endregion
265
+ const maxHeight = this.canvas.height - this.axisHeight;
266
+ // console.debug(`WebLogo._calculate() maxHeight=${maxHeight}.`);
267
+ //#region Calculate screen
268
+ for (let jPos = 0; jPos < this.Length; jPos++) {
269
+ const freq = this.positions[jPos].freq;
270
+ const rowCount = this.positions[jPos].rowCount;
271
+ let y = this.axisHeight;
272
+ const entries = Object.entries(freq).sort((a, b) => {
273
+ if (a[0] !== '-' && b[0] !== '-')
274
+ return b[1].count - a[1].count;
275
+ else if (a[0] === '-' && b[0] === '-')
276
+ return 0;
277
+ else if (a[0] === '-')
278
+ return -1;
279
+ else /* (b[0] === '-') */
280
+ return +1;
281
+ });
282
+ for (const entry of entries) {
283
+ const pmInfo = entry[1];
284
+ // const m: string = entry[0];
285
+ const h = maxHeight * pmInfo.count / rowCount;
286
+ pmInfo.bounds = new DG.Rect(jPos * this.positionWidth, y, this.positionWidth, h);
287
+ y += h;
288
+ }
289
+ }
290
+ //#endregion
291
+ }
292
+ // reflect changes made to filter/selection
293
+ render(recalc = true) {
294
+ var _a;
295
+ if (!this.canvas || !this.seqCol || !this.dataFrame || !this.cp ||
296
+ this.startPosition === -1 || this.endPosition === -1)
297
+ return;
298
+ const g = this.canvas.getContext('2d');
299
+ if (!g)
300
+ return;
301
+ if (recalc)
302
+ this._calculate();
303
+ // let rowCount = this.rowsMasked;
304
+ // if (!this.considerNullSequences)
305
+ // rowCount -= this.rowsNull;
306
+ g.resetTransform();
307
+ g.clearRect(0, 0, this.canvas.width, this.canvas.height);
308
+ g.textBaseline = this.textBaseline;
309
+ for (let jPos = 0; jPos < this.Length; jPos++) {
310
+ const pos = this.positions[jPos];
311
+ g.resetTransform();
312
+ g.fillStyle = 'black';
313
+ g.textAlign = 'center';
314
+ g.font = '10px Roboto, Roboto Local, sans-serif';
315
+ const posNameTm = g.measureText(pos.name);
316
+ const jPosWidth = posNameTm.width < (this.positionWidth - 2) ? posNameTm.width : (this.positionWidth - 2);
317
+ g.setTransform(jPosWidth / posNameTm.width, 0, 0, 1, jPos * this.positionWidth + this.positionWidth / 2, 0);
318
+ g.fillText(pos.name, 0, 0);
319
+ for (const [monomer, pmInfo] of Object.entries(this.positions[jPos].freq)) {
320
+ if (monomer !== '-') {
321
+ const b = pmInfo.bounds;
322
+ const fontStyle = '16px Roboto, Roboto Local, sans-serif';
323
+ // Hacks to scale uppercase characters to target rectangle
324
+ const uppercaseLetterAscent = 0.25;
325
+ const uppercaseLetterHeight = 12.2;
326
+ g.resetTransform();
327
+ g.strokeStyle = 'lightgray';
328
+ g.lineWidth = 1;
329
+ g.rect(b.left, b.top, b.width, b.height);
330
+ g.fillStyle = (_a = this.cp[monomer]) !== null && _a !== void 0 ? _a : this.cp['other'];
331
+ g.textAlign = 'left';
332
+ g.font = fontStyle;
333
+ //g.fillRect(b.left, b.top, b.width, b.height);
334
+ const mTm = g.measureText(monomer);
335
+ // if (mM.actualBoundingBoxAscent != 0)
336
+ // console.debug(`m: ${m}, mM.actualBoundingBoxAscent: ${mM.actualBoundingBoxAscent}`);
337
+ g.setTransform(b.width / mTm.width, 0, 0, b.height / uppercaseLetterHeight, b.left, b.top);
338
+ g.fillText(monomer, 0, -uppercaseLetterAscent);
339
+ }
340
+ }
341
+ }
342
+ }
343
+ }
344
+ WebLogo.residuesSet = 'nucleotides';
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWxvZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWItbG9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFJN0IsT0FBTyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFnQmhFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxVQUFTLEtBQWlCO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQzFDLE9BQU8sSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRSxDQUFDLENBQUM7QUFFRixFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBUyxDQUFTLEVBQUUsQ0FBUztJQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ2hGLENBQUMsQ0FBQztBQUVGLE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7UUFDRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxD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bXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQgKiBhcyByeGpzIGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcblxuaW1wb3J0IHtBbWlub2FjaWRzLCBBbWlub2FjaWRzUGFsZXR0ZXN9IGZyb20gJy4uL2FtaW5vYWNpZHMnO1xuaW1wb3J0IHtOdWNsZW90aWRlcywgTnVjbGVvdGlkZXNQYWxldHRlc30gZnJvbSAnLi4vbnVjbGVvdGlkZXMnO1xuXG4vLyBVc2luZyBjb2xvciBzY2hlbWVzIGZyb20gY2hlbS1wYWxldHRlXG5cbmRlY2xhcmUgbW9kdWxlICdkYXRhZ3Jvay1hcGkvc3JjL2dyaWQnIHtcbiAgaW50ZXJmYWNlIFJlY3Qge1xuICAgIGNvbnRhaW5zKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgZ2V0Q3Vyc29yUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBERy5Qb2ludDtcbiAgfVxufVxuXG5IVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuZ2V0Q3Vyc29yUG9zaXRpb24gPSBmdW5jdGlvbihldmVudDogTW91c2VFdmVudCk6IERHLlBvaW50IHtcbiAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiBuZXcgREcuUG9pbnQoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKTtcbn07XG5cbkRHLlJlY3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRoaXMubGVmdCA8PSB4ICYmIHggPD0gdGhpcy5yaWdodCAmJiB0aGlzLnRvcCA8PSB5ICYmIHkgPD0gdGhpcy5ib3R0b207XG59O1xuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25Nb25vbWVySW5mbyB7XG4gIC8qKiBTZXF1ZW5jZXMgY291bnQgd2l0aCBtb25vbWVyIGluIHBvc2l0aW9uXG4gICAqL1xuICBjb3VudDogbnVtYmVyO1xuXG4gIC8qKiBSZW1lbWJlciBzY3JlZW4gY29vcmRzIHJlY3RcbiAgICovXG4gIGJvdW5kczogREcuUmVjdDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgICB0aGlzLmJvdW5kcyA9IG5ldyBERy5SZWN0KDAsIDAsIDAsIDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQb3NpdGlvbkluZm8ge1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBmcmVxOiB7IFttOiBzdHJpbmddOiBQb3NpdGlvbk1vbm9tZXJJbmZvIH07XG4gIHJvd0NvdW50OiBudW1iZXI7XG5cbiAgLyoqIGZyZXEgPSB7fSwgcm93Q291bnQgPSAwXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcG9zaXRpb24gKCcxMTFBJywgJzExMS4xJywgZXRjKVxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZyZXEgPSB7fTtcbiAgICB0aGlzLnJvd0NvdW50ID0gMDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2ViTG9nbyBleHRlbmRzIERHLkpzVmlld2VyIHtcbiAgcHVibGljIHN0YXRpYyByZXNpZHVlc1NldCA9ICdudWNsZW90aWRlcyc7XG5cbiAgLy8gcHJpdmF0ZSByZWFkb25seSBjb2xvclNjaGVtZTogQ29sb3JTY2hlbWUgPSBDb2xvclNjaGVtZXNbTnVjbGVvdGlkZXNXZWJMb2dvLnJlc2lkdWVzU2V0XTtcbiAgcHJvdGVjdGVkIGNwOiBTdHJpbmdEaWN0aW9uYXJ5IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gcHJpdmF0ZSByZWFkb25seSBob3N0OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSBjYW52YXM/OiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJpdmF0ZSBzbGlkZXI/OiBERy5SYW5nZVNsaWRlcjtcbiAgcHJpdmF0ZSB0ZXh0QmFzZWxpbmU6IENhbnZhc1RleHRCYXNlbGluZTtcblxuICBwcml2YXRlIGF4aXNIZWlnaHQ6IG51bWJlciA9IDEyO1xuICBwcml2YXRlIHBvc2l0aW9uV2lkdGg6IG51bWJlciA9IDE2O1xuXG4gIHByaXZhdGUgc2VxQ29sOiBERy5Db2x1bW4gfCBudWxsID0gbnVsbDtcbiAgLy8gcHJpdmF0ZSBtYXhMZW5ndGg6IG51bWJlciA9IDEwMDtcbiAgcHJpdmF0ZSBwb3NpdGlvbnM6IFBvc2l0aW9uSW5mb1tdID0gW107XG5cbiAgcHJpdmF0ZSByb3dzTWFza2VkOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJvd3NOdWxsOiBudW1iZXIgPSAwO1xuXG4gIC8vIFZpZXdlcidzIHByb3BlcnRpZXMgKGxpa2VseSB0aGV5IHNob3VsZCBiZSBwdWJsaWMgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgb3V0c2lkZSlcbiAgcHVibGljIG1pbkhlaWdodDogbnVtYmVyO1xuICBwdWJsaWMgbWF4SGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBjb25zaWRlck51bGxTZXF1ZW5jZXM6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXF1ZW5jZUNvbHVtbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHN0YXJ0UG9zaXRpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBlbmRQb3NpdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHBvc2l0aW9uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBzdGFydFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICBwcml2YXRlIGVuZFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICBwcml2YXRlIGdldCBMZW5ndGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb24gKyAxOyB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cbiAgICB0aGlzLm1pbkhlaWdodCA9IHRoaXMuZmxvYXQoJ21pbkhlaWdodCcsIDUwKTtcbiAgICB0aGlzLm1heEhlaWdodCA9IHRoaXMuZmxvYXQoJ21heEhlaWdodCcsIDEwMCk7XG5cbiAgICB0aGlzLmNvbnNpZGVyTnVsbFNlcXVlbmNlcyA9IHRoaXMuYm9vbCgnY29uc2lkZXJOdWxsU2VxdWVuY2VzJywgZmFsc2UpO1xuICAgIHRoaXMuc2VxdWVuY2VDb2x1bW5OYW1lID0gdGhpcy5zdHJpbmcoJ3NlcXVlbmNlQ29sdW1uTmFtZScsIG51bGwpO1xuXG4gICAgdGhpcy5zdGFydFBvc2l0aW9uTmFtZSA9IHRoaXMuc3RyaW5nKCdzdGFydFBvc2l0aW9uTmFtZScsIG51bGwpO1xuICAgIHRoaXMuZW5kUG9zaXRpb25OYW1lID0gdGhpcy5zdHJpbmcoJ2VuZFBvc2l0aW9uTmFtZScsIG51bGwpO1xuICB9XG5cbiAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNhbnZhcyA9IHVpLmNhbnZhcygpO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXG4gICAgdGhpcy5zbGlkZXIgPSB1aS5yYW5nZVNsaWRlcigwLCAyMCwgMiwgNSk7XG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICB0aGlzLnNsaWRlci5yb290LnN0eWxlLmhlaWdodCA9ICcxMnB4JztcblxuICAgIC8vIHRoaXMuaG9zdCA9IHVpLmRpdlYoWy8qdGhpcy5zbGlkZXIsKi90aGlzLmNhbnZhc10pO1xuXG4gICAgY29uc3QgZ2V0TW9ub21lciA9IChwOiBERy5Qb2ludCk6IFtudW1iZXIsIHN0cmluZyB8IG51bGwsIFBvc2l0aW9uTW9ub21lckluZm8gfCBudWxsXSA9PiB7XG4gICAgICBjb25zdCBqUG9zID0gTWF0aC5mbG9vcihwLnggLyB0aGlzLnBvc2l0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXTtcblxuICAgICAgaWYgKHBvc2l0aW9uID09PSB2b2lkIDApXG4gICAgICAgIHJldHVybiBbalBvcywgbnVsbCwgbnVsbF07XG5cbiAgICAgIGNvbnN0IG1vbm9tZXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uLmZyZXEpXG4gICAgICAgIC5maW5kKChtKSA9PiBwb3NpdGlvbi5mcmVxW21dLmJvdW5kcy5jb250YWlucyhwLngsIHAueSkpO1xuICAgICAgaWYgKG1vbm9tZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIFtqUG9zLCBudWxsLCBudWxsXTtcblxuICAgICAgcmV0dXJuIFtqUG9zLCBtb25vbWVyLCBwb3NpdGlvbi5mcmVxW21vbm9tZXJdXTtcbiAgICB9O1xuXG4gICAgdGhpcy5jYW52YXMub25tb3VzZW92ZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuXG4gICAgfTtcblxuICAgIHJ4anMuZnJvbUV2ZW50KHRoaXMuY2FudmFzLCAnbW91c2Vtb3ZlJykuc3Vic2NyaWJlKChlOiBFdmVudCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNhbnZhcylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcih0aGlzLmNhbnZhcy5nZXRDdXJzb3JQb3NpdGlvbihhcmdzKSk7XG5cbiAgICAgIC8vaWYgKHRoaXMuZGF0YUZyYW1lICYmIHRoaXMuc2VxQ29sICYmIG1vbm9tZXIpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiBtb25vbWVyKSB7XG4gICAgICAgIHVpLnRvb2x0aXAuc2hvd1Jvd0dyb3VwKHRoaXMuZGF0YUZyYW1lLCAoaVJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlcSA9IHRoaXMuc2VxQ29sIS5nZXQoaVJvdyk7XG4gICAgICAgICAgY29uc3QgbVNlcSA9IHNlcSA/IHNlcVt0aGlzLnN0YXJ0UG9zaXRpb24gKyBqUG9zXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG1TZXEgPT09IG1vbm9tZXI7XG4gICAgICAgIH0sIGFyZ3MueCArIDE2LCBhcmdzLnkgKyAxNik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1aS50b29sdGlwLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJ4anMuZnJvbUV2ZW50KHRoaXMuY2FudmFzLCAnbW91c2Vkb3duJykuc3Vic2NyaWJlKChlOiBFdmVudCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNhbnZhcylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcih0aGlzLmNhbnZhcy5nZXRDdXJzb3JQb3NpdGlvbihhcmdzKSk7XG5cbiAgICAgIC8vIHByZXZlbnRzIGRlc2VsZWN0IGFsbCByb3dzIGlmIHdlIG1pc3MgbW9ub21lciBib3VuZHNcbiAgICAgIC8vaWYgKHRoaXMuZGF0YUZyYW1lICYmIHRoaXMuc2VxQ29sICYmIG1vbm9tZXIpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiBtb25vbWVyKSB7XG4gICAgICAgIHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5pbml0KChpUm93KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VxID0gdGhpcy5zZXFDb2whLmdldChpUm93KTtcbiAgICAgICAgICBjb25zdCBtU2VxID0gc2VxID8gc2VxW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gbVNlcSA9PT0gbW9ub21lcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJvb3QuYXBwZW5kKHRoaXMuY2FudmFzKTtcbiAgICAvLyB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXIucm9vdCk7XG4gICAgLy8gdGhpcy5yb290LmFwcGVuZCh0aGlzLmhvc3QpO1xuXG4gICAgLy8gdWkub25TaXplQ2hhbmdlZCh0aGlzLmNhbnZhcykuc3Vic2NyaWJlKHRoaXMuY2FudmFzT25TaXplQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICB1aS5vblNpemVDaGFuZ2VkKHRoaXMucm9vdCkuc3Vic2NyaWJlKHRoaXMucm9vdE9uU2l6ZUNoYW5nZWQuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgfVxuXG4gIC8vIGNhbnZhc09uU2l6ZUNoYW5nZWQoYXJnczogYW55KSB7XG4gIC8vICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aDtcbiAgLy8gICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQ7XG4gIC8vICAgY29uc29sZS5kZWJ1ZyhgV2ViTG9nby5vblNpemVDaGFuZ2VkKCkgd2lkdGg9JHt0aGlzLmNhbnZhcy53aWR0aH0sIGhlaWdodD0ke3RoaXMuY2FudmFzLmhlaWdodH1gKTtcbiAgLy8gICB0aGlzLnJlbmRlcihmYWxzZSk7XG4gIC8vIH1cblxuICByb290T25TaXplQ2hhbmdlZChhcmdzOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY2FudmFzKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gdGhpcy5jYW52YXMud2lkdGggY2FsY3VsYXRlIGluIHRoaXMuX2NhbGN1bGF0ZSgpIG1ldGhvZFxuXG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4odGhpcy5tYXhIZWlnaHQsIE1hdGgubWF4KHRoaXMubWluSGVpZ2h0LCB0aGlzLnJvb3QuY2xpZW50SGVpZ2h0KSk7XG4gICAgLy8gaWYgKHRoaXMuY2FudmFzLndpZHRoID4gdGhpcy5yb290LmNsaWVudFdpZHRoKSAvKiBob3Jpem9udGFsIHNjcm9sbGVyIGlzIGVuYWJsZWQgKi9cbiAgICAvLyAgIGhlaWdodCAtPSA2OyAvKiBmcmVlIHNvbWUgc3BhY2UgZm9yIGhvcml6b250YWwgc2Nyb2xsZXIgKi9cbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcblxuICAgIC8vIGNvbnNvbGUuZGVidWcoYFdlYkxvZ28ub25Sb290U2l6ZUNoYW5nZWQoKSBgICtcbiAgICAvLyAgIGByb290LndpZHRoPSR7dGhpcy5yb290LmNsaWVudFdpZHRofSwgcm9vdC5oZWlnaHQ9JHt0aGlzLnJvb3QuY2xpZW50SGVpZ2h0fSwgYCArXG4gICAgLy8gICBgY2FudmFzLndpZHRoPSR7dGhpcy5jYW52YXMud2lkdGh9LCBjYW52YXMuaGVpZ2h0PSR7dGhpcy5jYW52YXMuaGVpZ2h0fSAuYCk7XG5cbiAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgfVxuXG4gIC8qKiBBc3NpZ25zIHtAbGluayBzZXFDb2x9IGFuZCB7QGxpbmsgY3B9IGJhc2VkIG9uIHtAbGluayBzZXF1ZW5jZUNvbHVtbk5hbWV9IGFuZCBjYWxscyB7QGxpbmsgcmVuZGVyfSgpLlxuICAgKi9cbiAgdXBkYXRlU2VxQ29sKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGFGcmFtZSkge1xuICAgICAgdGhpcy5zZXFDb2wgPSB0aGlzLmRhdGFGcmFtZS5jb2wodGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUpO1xuICAgICAgaWYgKHRoaXMuc2VxQ29sKSB7XG4gICAgICAgIGxldCBtYXhMZW5ndGggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMuc2VxQ29sLmNhdGVnb3JpZXMpXG4gICAgICAgICAgbWF4TGVuZ3RoID0gTWF0aC5tYXgobWF4TGVuZ3RoLCBjYXRlZ29yeS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIEdldCBwb3NpdGlvbiBuYW1lcyBmcm9tIGRhdGEgY29sdW1uIHRhZyAncG9zaXRpb25OYW1lcydcbiAgICAgICAgY29uc3QgcG9zaXRpb25OYW1lc1R4dCA9IHRoaXMuc2VxQ29sLmdldFRhZygncG9zaXRpb25OYW1lcycpO1xuICAgICAgICAvLyBGYWxsYmFjayBpZiAncG9zaXRpb25OYW1lcycgdGFnIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMgPSBwb3NpdGlvbk5hbWVzVHh0ID8gcG9zaXRpb25OYW1lc1R4dC5zcGxpdCgnLCAnKS5tYXAoKG4pID0+IG4udHJpbSgpKSA6XG4gICAgICAgICAgWy4uLkFycmF5KG1heExlbmd0aCkua2V5cygpXS5tYXAoKGpQb3MpID0+IGAke2pQb3MgKyAxfWApO1xuXG4gICAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbk5hbWUgJiYgdGhpcy5wb3NpdGlvbk5hbWVzID9cbiAgICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMuaW5kZXhPZih0aGlzLnN0YXJ0UG9zaXRpb25OYW1lKSA6IDA7XG4gICAgICAgIHRoaXMuZW5kUG9zaXRpb24gPSB0aGlzLmVuZFBvc2l0aW9uTmFtZSAmJiB0aGlzLnBvc2l0aW9uTmFtZXMgP1xuICAgICAgICAgIHRoaXMucG9zaXRpb25OYW1lcy5pbmRleE9mKHRoaXMuZW5kUG9zaXRpb25OYW1lKSA6IG1heExlbmd0aDtcblxuICAgICAgICAvLyNyZWdpb24gLS0gcGFsZXR0ZSAtLVxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2VxQ29sLnNlbVR5cGUpIHtcbiAgICAgICAgY2FzZSBBbWlub2FjaWRzLlNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDpcbiAgICAgICAgICB0aGlzLmNwID0gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTnVjbGVvdGlkZXMuU2VtVHlwZU11bHRpcGxlQWxpZ25tZW50OlxuICAgICAgICAgIHRoaXMuY3AgPSBOdWNsZW90aWRlc1BhbGV0dGVzLkNocm9tYXRvZ3JhbTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyNlbmRyZWdpb24gLS0gcGFsZXR0ZSAtLVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jcCA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zaXRpb25OYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSAtMTtcbiAgICAgICAgdGhpcy5lbmRQb3NpdGlvbiA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgb25Qcm9wZXJ0eUNoYW5nZWQocHJvcGVydHk6IERHLlByb3BlcnR5KTogdm9pZCB7XG4gICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZWQocHJvcGVydHkpO1xuXG4gICAgc3dpdGNoIChwcm9wZXJ0eS5uYW1lKSB7XG4gICAgY2FzZSAnY29uc2lkZXJOdWxsU2VxdWVuY2VzJzpcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZXF1ZW5jZUNvbHVtbk5hbWUnOlxuICAgICAgdGhpcy51cGRhdGVTZXFDb2woKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0YXJ0UG9zaXRpb25OYW1lJzpcbiAgICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlbmRQb3NpdGlvbk5hbWUnOlxuICAgICAgdGhpcy51cGRhdGVTZXFDb2woKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21pbkhlaWdodCc6XG4gICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21heEhlaWdodCc6XG4gICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uVGFibGVBdHRhY2hlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuXG4gICAgaWYgKHRoaXMuZGF0YUZyYW1lICE9PSB2b2lkIDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSB0d28gYXBwcm9hY2hlczpcbiAgICAgIC8vIGZpcnN0ICAtIGxvb2sgaW4gdGhlIGRhdGFGcmFtZSBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGNvbHVtbiBieSBzZW1UeXBlIG9mIHRoZVxuICAgICAgLy8gICAgICAgICAgY29ycmVzcG9uZGluZyB2aWV3ZXIgKGJ1dCB3ZSB3YW50IG9ubHkgb25lIGNsYXNzIG9mIGEgbW9yZSB1bml2ZXJzYWwgdmlld2VyKSxcbiAgICAgIC8vIHNlY29uZCAtIGRyYXcgY29sdW1uIGRhdGEgaWYgdGhlIHBhc3NlZCBjb2x1bW4gaXMgb2Ygc3VpdGFibGUgc2VtVHlwZVxuICAgICAgLy8gV2UgZGVjaWRlZCB0aGF0IHdlIHdpbGwgbm90IHNlYXJjaCwgYnV0IHdlIHdpbGwgZGlzcGxheSBhc2tlZCBkYXRhIGlmIHdlIGNhblxuICAgICAgLy8gY29uc3Qgc2VtVHlwZSA9ICg8dHlwZW9mIE51Y2xlb3RpZGVzV2ViTG9nbz4odGhpcy5jb25zdHJ1Y3RvcikpLnJlc2lkdWVzU2V0O1xuICAgICAgLy8gdGhpcy5zZXFDb2wgPSAodGhpcy5kYXRhRnJhbWUuY29sdW1ucyBhcyBERy5Db2x1bW5MaXN0KS5ieVNlbVR5cGUoc2VtVHlwZSk7XG5cbiAgICAgIHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnJlbmRlcigpKTtcbiAgICAgIHRoaXMuZGF0YUZyYW1lLmZpbHRlci5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnJlbmRlcigpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX251bGxTZXF1ZW5jZShmaWxsZXJSZXNpZHVlID0gJ1gnKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb25zaWRlck51bGxTZXF1ZW5jZXMpXG4gICAgICByZXR1cm4gbmV3IEFycmF5KHRoaXMuTGVuZ3RoKS5maWxsKGZpbGxlclJlc2lkdWUpLmpvaW4oJycpO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYWxjdWxhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8IHRoaXMuc3RhcnRQb3NpdGlvbiA9PT0gLTEgfHwgdGhpcy5lbmRQb3NpdGlvbiA9PT0gLTEpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuTGVuZ3RoICogdGhpcy5wb3NpdGlvbldpZHRoO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgdGhpcy5yb290LnN0eWxlLndpZHRoID0gYCR7dGhpcy5jYW52YXMud2lkdGh9cHhgO1xuXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBuZXcgQXJyYXkodGhpcy5MZW5ndGgpO1xuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgcG9zTmFtZTogc3RyaW5nID0gdGhpcy5wb3NpdGlvbk5hbWVzW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdO1xuICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10gPSBuZXcgUG9zaXRpb25JbmZvKHBvc05hbWUpO1xuICAgIH1cblxuICAgIC8vIDIwMjItMDUtMDUgYXNrYWxraW4gaW5zdHJ1Y3RlZCB0byBzaG93IFdlYkxvZ28gYmFzZWQgb24gZmlsdGVyIChub3Qgc2VsZWN0aW9uKVxuICAgIGNvbnN0IGluZGljZXMgPSB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XG4gICAgLy8gY29uc3QgaW5kaWNlcyA9IHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi50cnVlQ291bnQgPiAwID8gdGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLmdldFNlbGVjdGVkSW5kZXhlcygpIDpcbiAgICAvLyAgIHRoaXMuZGF0YUZyYW1lLmZpbHRlci5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcblxuICAgIHRoaXMucm93c01hc2tlZCA9IGluZGljZXMubGVuZ3RoO1xuICAgIHRoaXMucm93c051bGwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICAgIGxldCBzOiBzdHJpbmcgPSA8c3RyaW5nPih0aGlzLnNlcUNvbC5nZXQoaSkpO1xuXG4gICAgICBpZiAoIXMpIHtcbiAgICAgICAgcyA9IHRoaXMuX251bGxTZXF1ZW5jZSgpO1xuICAgICAgICArK3RoaXMucm93c051bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgICAgICBjb25zdCBwbUluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxO1xuICAgICAgICAgIGNvbnN0IG06IHN0cmluZyA9IHNbdGhpcy5zdGFydFBvc2l0aW9uICsgalBvc107XG4gICAgICAgICAgaWYgKCEobSBpbiBwbUluZm8pKVxuICAgICAgICAgICAgcG1JbmZvW21dID0gbmV3IFBvc2l0aW9uTW9ub21lckluZm8oKTtcblxuICAgICAgICAgIHBtSW5mb1ttXS5jb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8jcmVnaW9uIFBvbGlzaCBmcmVxIGNvdW50c1xuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgLy8gZGVsZXRlIHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXFbJy0nXTtcblxuICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQgPSAwO1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXEpXG4gICAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50ICs9IHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXFbbV0uY291bnQ7XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0IC0gdGhpcy5heGlzSGVpZ2h0O1xuICAgIC8vIGNvbnNvbGUuZGVidWcoYFdlYkxvZ28uX2NhbGN1bGF0ZSgpIG1heEhlaWdodD0ke21heEhlaWdodH0uYCk7XG5cbiAgICAvLyNyZWdpb24gQ2FsY3VsYXRlIHNjcmVlblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgZnJlcTogeyBbYzogc3RyaW5nXTogUG9zaXRpb25Nb25vbWVySW5mbyB9ID0gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcTtcbiAgICAgIGNvbnN0IHJvd0NvdW50ID0gdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQ7XG5cbiAgICAgIGxldCB5OiBudW1iZXIgPSB0aGlzLmF4aXNIZWlnaHQ7XG5cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhmcmVxKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhWzBdICE9PSAnLScgJiYgYlswXSAhPT0gJy0nKVxuICAgICAgICAgIHJldHVybiBiWzFdLmNvdW50IC0gYVsxXS5jb3VudDtcbiAgICAgICAgZWxzZSBpZiAoYVswXSA9PT0gJy0nICYmIGJbMF0gPT09ICctJylcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgZWxzZSBpZiAoYVswXSA9PT0gJy0nKVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgZWxzZSAvKiAoYlswXSA9PT0gJy0nKSAqL1xuICAgICAgICAgIHJldHVybiArMTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IHBtSW5mbzogUG9zaXRpb25Nb25vbWVySW5mbyA9IGVudHJ5WzFdO1xuICAgICAgICAvLyBjb25zdCBtOiBzdHJpbmcgPSBlbnRyeVswXTtcbiAgICAgICAgY29uc3QgaDogbnVtYmVyID0gbWF4SGVpZ2h0ICogcG1JbmZvLmNvdW50IC8gcm93Q291bnQ7XG5cbiAgICAgICAgcG1JbmZvLmJvdW5kcyA9IG5ldyBERy5SZWN0KGpQb3MgKiB0aGlzLnBvc2l0aW9uV2lkdGgsIHksIHRoaXMucG9zaXRpb25XaWR0aCwgaCk7XG4gICAgICAgIHkgKz0gaDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG4gIH1cblxuICAvLyByZWZsZWN0IGNoYW5nZXMgbWFkZSB0byBmaWx0ZXIvc2VsZWN0aW9uXG4gIHJlbmRlcihyZWNhbGMgPSB0cnVlKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8ICF0aGlzLmNwIHx8XG4gICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPT09IC0xIHx8IHRoaXMuZW5kUG9zaXRpb24gPT09IC0xKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgZyA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFnKSByZXR1cm47XG5cbiAgICBpZiAocmVjYWxjKVxuICAgICAgdGhpcy5fY2FsY3VsYXRlKCk7XG5cbiAgICAvLyBsZXQgcm93Q291bnQgPSB0aGlzLnJvd3NNYXNrZWQ7XG4gICAgLy8gaWYgKCF0aGlzLmNvbnNpZGVyTnVsbFNlcXVlbmNlcylcbiAgICAvLyAgIHJvd0NvdW50IC09IHRoaXMucm93c051bGw7XG5cbiAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgZy5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgZy50ZXh0QmFzZWxpbmUgPSB0aGlzLnRleHRCYXNlbGluZTtcblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgcG9zOiBQb3NpdGlvbkluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXTtcbiAgICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICAgIGcuZmlsbFN0eWxlID0gJ2JsYWNrJztcbiAgICAgIGcudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICBnLmZvbnQgPSAnMTBweCBSb2JvdG8sIFJvYm90byBMb2NhbCwgc2Fucy1zZXJpZic7XG4gICAgICBjb25zdCBwb3NOYW1lVG06IFRleHRNZXRyaWNzID0gZy5tZWFzdXJlVGV4dChwb3MubmFtZSk7XG4gICAgICBjb25zdCBqUG9zV2lkdGggPSBwb3NOYW1lVG0ud2lkdGggPCAodGhpcy5wb3NpdGlvbldpZHRoIC0gMikgPyBwb3NOYW1lVG0ud2lkdGggOiAodGhpcy5wb3NpdGlvbldpZHRoIC0gMik7XG4gICAgICBnLnNldFRyYW5zZm9ybShcbiAgICAgICAgalBvc1dpZHRoIC8gcG9zTmFtZVRtLndpZHRoLCAwLCAwLCAxLFxuICAgICAgICBqUG9zICogdGhpcy5wb3NpdGlvbldpZHRoICsgdGhpcy5wb3NpdGlvbldpZHRoIC8gMiwgMCk7XG4gICAgICBnLmZpbGxUZXh0KHBvcy5uYW1lLCAwLCAwKTtcblxuICAgICAgZm9yIChjb25zdCBbbW9ub21lciwgcG1JbmZvXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxKSkge1xuICAgICAgICBpZiAobW9ub21lciAhPT0gJy0nKSB7XG4gICAgICAgICAgY29uc3QgYiA9IHBtSW5mby5ib3VuZHM7XG5cbiAgICAgICAgICBjb25zdCBmb250U3R5bGUgPSAnMTZweCBSb2JvdG8sIFJvYm90byBMb2NhbCwgc2Fucy1zZXJpZic7XG4gICAgICAgICAgLy8gSGFja3MgdG8gc2NhbGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgdG8gdGFyZ2V0IHJlY3RhbmdsZVxuICAgICAgICAgIGNvbnN0IHVwcGVyY2FzZUxldHRlckFzY2VudCA9IDAuMjU7XG4gICAgICAgICAgY29uc3QgdXBwZXJjYXNlTGV0dGVySGVpZ2h0ID0gMTIuMjtcblxuICAgICAgICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ2xpZ2h0Z3JheSc7XG4gICAgICAgICAgZy5saW5lV2lkdGggPSAxO1xuICAgICAgICAgIGcucmVjdChiLmxlZnQsIGIudG9wLCBiLndpZHRoLCBiLmhlaWdodCk7XG4gICAgICAgICAgZy5maWxsU3R5bGUgPSB0aGlzLmNwW21vbm9tZXJdID8/IHRoaXMuY3BbJ290aGVyJ107XG4gICAgICAgICAgZy50ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgICAgZy5mb250ID0gZm9udFN0eWxlO1xuICAgICAgICAgIC8vZy5maWxsUmVjdChiLmxlZnQsIGIudG9wLCBiLndpZHRoLCBiLmhlaWdodCk7XG4gICAgICAgICAgY29uc3QgbVRtOiBUZXh0TWV0cmljcyA9IGcubWVhc3VyZVRleHQobW9ub21lcik7XG5cbiAgICAgICAgICAvLyBpZiAobU0uYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQgIT0gMClcbiAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoYG06ICR7bX0sIG1NLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50OiAke21NLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50fWApO1xuXG4gICAgICAgICAgZy5zZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgICBiLndpZHRoIC8gbVRtLndpZHRoLCAwLCAwLCBiLmhlaWdodCAvIHVwcGVyY2FzZUxldHRlckhlaWdodCxcbiAgICAgICAgICAgIGIubGVmdCwgYi50b3ApO1xuICAgICAgICAgIGcuZmlsbFRleHQobW9ub21lciwgMCwgLXVwcGVyY2FzZUxldHRlckFzY2VudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==