@datagrok/sequence-translator 1.0.16 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +4 -3
- package/CHANGELOG.md +3 -0
- package/detectors.js +8 -28
- package/dist/package-test.js +2 -72987
- package/dist/package-test.js.map +1 -0
- package/dist/package.js +2 -72192
- package/dist/package.js.map +1 -0
- package/files/axolabs-style.json +97 -0
- package/files/codes-to-symbols.json +66 -0
- package/files/formats-to-helm.json +59 -0
- package/files/linkers.json +22 -0
- package/files/monomer-lib.json +1094 -0
- package/link-bio +7 -0
- package/package.json +30 -26
- package/scripts/build-monomer-lib.py +391 -122
- package/src/demo/demo-st-ui.ts +71 -0
- package/src/demo/handle-error.ts +12 -0
- package/src/model/axolabs/axolabs-tab.ts +111 -0
- package/src/model/axolabs/const.ts +33 -0
- package/src/{axolabs → model/axolabs}/draw-svg.ts +1 -1
- package/src/{axolabs → model/axolabs}/helpers.ts +7 -5
- package/src/model/const.ts +19 -0
- package/src/model/data-loading-utils/const.ts +8 -0
- package/src/model/data-loading-utils/json-loader.ts +38 -0
- package/src/model/data-loading-utils/types.ts +30 -0
- package/src/model/format-translation/const.ts +8 -0
- package/src/model/format-translation/conversion-utils.ts +48 -0
- package/src/model/format-translation/format-converter.ts +107 -0
- package/src/model/helpers.ts +12 -0
- package/src/model/monomer-lib/const.ts +3 -0
- package/src/model/monomer-lib/lib-wrapper.ts +106 -0
- package/src/model/parsing-validation/format-detector.ts +57 -0
- package/src/model/parsing-validation/sequence-validator.ts +52 -0
- package/src/model/sequence-to-structure-utils/const.ts +1 -0
- package/src/{structures-works → model/sequence-to-structure-utils}/mol-transformations.ts +61 -87
- package/src/model/sequence-to-structure-utils/monomer-code-parser.ts +92 -0
- package/src/model/sequence-to-structure-utils/sdf-tab.ts +94 -0
- package/src/model/sequence-to-structure-utils/sequence-to-molfile.ts +409 -0
- package/src/package.ts +106 -77
- package/src/tests/const.ts +17 -0
- package/src/tests/smiles-tests.ts +32 -457
- package/src/view/const/main-tab.ts +3 -0
- package/src/view/const/view.ts +10 -0
- package/src/view/css/axolabs-tab.css +1 -0
- package/src/view/css/colored-text-input.css +27 -0
- package/src/view/css/main-tab.css +46 -0
- package/src/view/css/sdf-tab.css +39 -0
- package/src/view/monomer-lib-viewer/viewer.ts +22 -0
- package/src/view/tabs/axolabs.ts +720 -0
- package/src/view/tabs/main.ts +174 -0
- package/src/view/tabs/sdf.ts +173 -0
- package/src/view/utils/app-info-dialog.ts +18 -0
- package/src/view/utils/colored-input/colored-text-input.ts +56 -0
- package/src/view/utils/colored-input/input-painters.ts +44 -0
- package/src/view/utils/draw-molecule.ts +86 -0
- package/src/view/utils/molecule-img.ts +106 -0
- package/src/view/view.ts +129 -0
- package/tsconfig.json +12 -18
- package/webpack.config.js +17 -4
- package/README.md +0 -84
- package/css/style.css +0 -18
- package/img/Sequence Translator Axolabs.png +0 -0
- package/jest.config.js +0 -33
- package/setup-unlink-clean.cmd +0 -14
- package/setup.cmd +0 -14
- package/setup.sh +0 -37
- package/src/__jest__/remote.test.ts +0 -77
- package/src/__jest__/test-node.ts +0 -97
- package/src/apps/oligo-sd-file-app.ts +0 -58
- package/src/autostart/ICDs.ts +0 -3
- package/src/autostart/IDPs.ts +0 -3
- package/src/autostart/calculations.ts +0 -40
- package/src/autostart/constants.ts +0 -37
- package/src/autostart/registration.ts +0 -241
- package/src/autostart/salts.ts +0 -2
- package/src/autostart/sources.ts +0 -3
- package/src/autostart/users.ts +0 -3
- package/src/axolabs/constants.ts +0 -101
- package/src/axolabs/define-pattern.ts +0 -873
- package/src/helpers.ts +0 -28
- package/src/main/main-view.ts +0 -262
- package/src/structures-works/const.ts +0 -5
- package/src/structures-works/converters.ts +0 -323
- package/src/structures-works/from-monomers.ts +0 -267
- package/src/structures-works/map.ts +0 -720
- package/src/structures-works/save-sense-antisense.ts +0 -91
- package/src/structures-works/sequence-codes-tools.ts +0 -344
- package/src/utils/parse.ts +0 -27
- package/src/utils/sdf-add-columns.ts +0 -118
- package/src/utils/sdf-save-table.ts +0 -56
- package/test-SequenceTranslator-6288c2fbe346-cce4ac1d.html +0 -259
- package/vendors/openchemlib-full.js +0 -293
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-test.js","mappings":"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","sources":["webpack://sequencetranslator/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://sequencetranslator/./src/view/css/colored-text-input.css","webpack://sequencetranslator/./src/view/css/main-tab.css","webpack://sequencetranslator/./src/view/css/sdf-tab.css","webpack://sequencetranslator/./node_modules/css-loader/dist/runtime/api.js","webpack://sequencetranslator/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://sequencetranslator/./node_modules/save-svg-as-png/lib/saveSvgAsPng.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://sequencetranslator/./src/model/const.ts","webpack://sequencetranslator/./src/model/data-loading-utils/const.ts","webpack://sequencetranslator/./src/model/data-loading-utils/json-loader.ts","webpack://sequencetranslator/./src/model/helpers.ts","webpack://sequencetranslator/./src/model/monomer-lib/lib-wrapper.ts","webpack://sequencetranslator/./src/model/sequence-to-structure-utils/monomer-code-parser.ts","webpack://sequencetranslator/./src/model/sequence-to-structure-utils/const.ts","webpack://sequencetranslator/./src/model/sequence-to-structure-utils/sequence-to-molfile.ts","webpack://sequencetranslator/external var \"ui\"","webpack://sequencetranslator/external var \"rxjs\"","webpack://sequencetranslator/./src/view/css/main-tab.css?3649","webpack://sequencetranslator/external var \"$\"","webpack://sequencetranslator/./node_modules/@datagrok-libraries/chem-meta/src/formats/molfile-v2k-const.js","webpack://sequencetranslator/./src/view/css/colored-text-input.css?9087","webpack://sequencetranslator/./src/view/utils/molecule-img.ts","webpack://sequencetranslator/./src/view/css/sdf-tab.css?64e5","webpack://sequencetranslator/./src/model/axolabs/helpers.ts","webpack://sequencetranslator/./src/model/axolabs/draw-svg.ts","webpack://sequencetranslator/external var \"wu\"","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://sequencetranslator/./node_modules/fastest-levenshtein/esm/mod.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/utils.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://sequencetranslator/./src/package.ts","webpack://sequencetranslator/external var \"DG\"","webpack://sequencetranslator/external var \"grok\"","webpack://sequencetranslator/webpack/bootstrap","webpack://sequencetranslator/webpack/runtime/compat get default export","webpack://sequencetranslator/webpack/runtime/define property getters","webpack://sequencetranslator/webpack/runtime/hasOwnProperty shorthand","webpack://sequencetranslator/webpack/runtime/make namespace object","webpack://sequencetranslator/webpack/runtime/nonce","webpack://sequencetranslator/./src/tests/const.ts","webpack://sequencetranslator/./src/tests/smiles-tests.ts","webpack://sequencetranslator/./src/package-test.ts"],"sourcesContent":["var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nexport const tests = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report) {\n this.catchUnhandled = true;\n this.report = false;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);\n this.options = options;\n this.test = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n let result = '';\n try {\n result = yield test();\n }\n catch (e) {\n reject(e);\n }\n resolve(result);\n }));\n });\n }\n}\nexport function testEvent(event, handler, trigger, ms = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n let sub;\n return new Promise((resolve, reject) => {\n sub = event.subscribe((args) => {\n try {\n handler(args);\n }\n catch (e) {\n reject(e);\n }\n sub.unsubscribe();\n resolve('OK');\n });\n setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('timeout');\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected) {\n if (actual !== expected)\n throw new Error(`Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001) {\n const areEqual = Math.abs(actual - expected) < tolerance;\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests) {\n currentCategory = category;\n tests();\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nexport function runTests(options) {\n var _a, _b, _c, _d;\n var _e;\n return __awaiter(this, void 0, void 0, function* () {\n const results = [];\n const packageName = (_b = (_a = grok.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_e = options).testContext) !== null && _c !== void 0 ? _c : (_e.testContext = new TestContext());\n grok.shell.lastError = '';\n for (const [key, value] of Object.entries(tests)) {\n if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {\n if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))\n continue;\n }\n console.log(`Started ${key} category`);\n try {\n if (value.before)\n yield value.before();\n }\n catch (x) {\n value.beforeStatus = x.toString();\n }\n const t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];\n const res = [];\n for (let i = 0; i < t.length; i++)\n res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));\n const data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');\n try {\n if (value.after)\n yield value.after();\n }\n catch (x) {\n value.afterStatus = x.toString();\n }\n if (value.afterStatus)\n data.push({ category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n if (options.testContext.catchUnhandled) {\n yield delay(1000);\n if (grok.shell.lastError.length > 0) {\n results.push({\n category: 'Unhandled exceptions',\n name: 'exceptions',\n result: grok.shell.lastError, success: false, ms: 0, skipped: false\n });\n }\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const successful = results.filter((r) => r.success).length;\n const skipped = results.filter((r) => r.skipped).length;\n const failed = results.filter((r) => !r.success);\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: packageName\n };\n for (const r of failed)\n Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });\n logger.log(description, params, 'package-tested');\n }\n return results;\n });\n}\nfunction execTest(t, predicate) {\n var _a, _b, _c;\n return __awaiter(this, void 0, void 0, function* () {\n let r;\n const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));\n const skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;\n const skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;\n if (!skip)\n console.log(`Started ${t.category} ${t.name}`);\n const start = new Date();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else\n r = { success: true, result: (_c = yield t.test()) !== null && _c !== void 0 ? _c : 'OK', ms: 0, skipped: false };\n }\n catch (x) {\n r = { success: false, result: x.toString(), ms: 0, skipped: false };\n }\n const stop = new Date();\n // @ts-ignore\n r.ms = stop - start;\n if (!skip)\n console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n return r;\n });\n}\n/* Waits [ms] milliseconds */\nexport function delay(ms) {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((r) => setTimeout(r, ms));\n });\n}\nexport function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const interval = setInterval(() => {\n if (checkHandler()) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n });\n });\n}\nexport function isDialogPresent(dialogTitle) {\n for (let i = 0; i < DG.Dialog.getOpenDialogs().length; i++) {\n if (DG.Dialog.getOpenDialogs()[i].title == dialogTitle)\n return true;\n }\n return false;\n}\nexport function testViewer(v, df, detectSemanticTypes = false) {\n return __awaiter(this, void 0, void 0, function* () {\n if (detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n const viewerName = `[name=viewer-${v.replace(/\\s+/g, '-')} i]`;\n const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,\n ${viewerName} input,${viewerName} h1,${viewerName} a`;\n const res = [];\n try {\n let viewer = tv.addViewer(v);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);\n res.push(Array.from(tv.viewers).length);\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n df.rows.select((row) => row.idx > 1 && row.idx < 7);\n for (let i = 7; i < 12; i++)\n df.filter.set(i, false);\n df.currentRowIdx = 1;\n const props = viewer.getOptions(true).look;\n const newProps = {};\n Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);\n viewer.setOptions(newProps);\n yield delay(250);\n const layout = tv.saveLayout();\n const oldProps = viewer.getOptions().look;\n tv.resetLayout();\n res.push(Array.from(tv.viewers).length);\n tv.loadLayout(layout);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);\n yield delay(250);\n res.push(Array.from(tv.viewers).length);\n viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');\n expectArray(res, [2, 1, 2]);\n expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));\n }\n finally {\n tv.close();\n grok.shell.closeTable(df);\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBTXRCO0FBTkQsV0FBaUIsTUFBTTtJQUVyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUhlLGNBQU8sVUFHdEIsQ0FBQTtBQUNILENBQUMsRUFOZ0IsTUFBTSxLQUFOLE1BQU0sUUFNdEI7QUFRRCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFZLGNBQXdCLEVBQUUsTUFBZ0I7UUFIdEQsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdiLElBQUksY0FBYyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUN2RSxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUFBLENBQUM7Q0FDSDtBQUVELE1BQU0sT0FBTyxJQUFJO0lBTWYsWUFBWSxRQUFnQixFQUFFLElBQVksRUFBRSxJQUF3QixFQUFFLE9BQXFCOztRQUN6RixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFH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SyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUUsQ0FBQztZQUNoRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDNUU7Z0JBQVM7WUFDUixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nXG4gIH1cbn0gPSB7fTtcblxuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RGbG9hdChhY3R1YWw6IG51bWJlciwgZXhwZWN0ZWQ6IG51bWJlciwgdG9sZXJhbmNlID0gMC4wMDEpOiB2b2lkIHtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZXhwZWN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgZm9yIChjb25zdCBbZXhwZWN0ZWRLZXksIGV4cGVjdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxbZXhwZWN0ZWRLZXldO1xuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUoYWN0dWFsVmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZShleHBlY3RlZFZhbHVlKSlcbiAgICAgIGV4cGVjdEZsb2F0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWw6IEFycmF5TGlrZTxhbnk+LCBleHBlY3RlZDogQXJyYXlMaWtlPGFueT4pIHtcbiAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBleHBlY3RlZC5sZW5ndGg7XG5cbiAgaWYgKGFjdHVhbExlbmd0aCAhPSBleHBlY3RlZExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldICE9IGV4cGVjdGVkW2ldKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkW2ldfSBhdCBwb3NpdGlvbiAke2l9LCBnb3QgJHthY3R1YWxbaV19YCk7XG4gIH1cbn1cblxuLyogRGVmaW5lcyBhIHRlc3Qgc3VpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZywgdGVzdHM6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzKCk7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzogeyBjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dCB9KSB7XG4gIGNvbnN0IHJlc3VsdHM6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZ3Jvay5mdW5jdGlvbnMuZ2V0Q3VycmVudENhbGwoKT8uZnVuYz8ucGFja2FnZTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtrZXl9IGNhdGVnb3J5YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlTmFtZVxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBza2lwUmVhc29uISwgbXM6IDAsIHNraXBwZWQ6IHRydWV9O1xuICAgIGVsc2VcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBhd2FpdCB0LnRlc3QoKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICByID0ge3N1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfVxuICBjb25zdCBzdG9wID0gbmV3IERhdGUoKTtcbiAgLy8gQHRzLWlnbm9yZVxuICByLm1zID0gc3RvcCAtIHN0YXJ0O1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG5cbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKCkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKClbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IERHLkRhdGFGcmFtZSwgZGV0ZWN0U2VtYW50aWNUeXBlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZXRlY3RTZW1hbnRpY1R5cGVzKSBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICBjb25zdCByZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBsZXQgdmlld2VyID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjKSA9PiBjLnZhbHVlID0gbnVsbCk7XG4gICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgIGZvciAobGV0IGkgPSA3OyBpIDwgMTI7IGkrKykgZGYuZmlsdGVyLnNldChpLCBmYWxzZSk7XG4gICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgY29uc3QgcHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucyh0cnVlKS5sb29rO1xuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoKGspID0+IHR5cGVvZiBwcm9wc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFwcm9wc1trXSk7XG4gICAgdmlld2VyLnNldE9wdGlvbnMobmV3UHJvcHMpO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdHYuc2F2ZUxheW91dCgpO1xuICAgIGNvbnN0IG9sZFByb3BzID0gdmlld2VyLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHR2LmxvYWRMYXlvdXQobGF5b3V0KTtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBmcm9tIGxheW91dCcsIDMwMDApO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodikgPT4gdi50eXBlICE9PSAnR3JpZCcpITtcbiAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHZpZXdlci5nZXRPcHRpb25zKCkubG9vayksIEpTT04uc3RyaW5naWZ5KG9sZFByb3BzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdHYuY2xvc2UoKTtcbiAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICB9XG59XG4iXX0=","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".colored-text-input > textarea {\\n width: 100%;\\n -webkit-text-fill-color: transparent;\\n background-color: transparent;\\n position: relative;\\n z-index: 1;\\n resize: none;\\n height: 22px; /* Fine tuned value to avoid \\\"jumping\\\" of the textarea upon autoresize */\\n}\\n\\n.colored-text-input > div {\\n /* The values here are fine tuned to those of the ui.input textarea in order\\n * to achieve precise overlap */\\n overflow: auto;\\n position: absolute;\\n pointer-events: none;\\n cursor: text;\\n z-index: 0;\\n max-width: 100%;\\n padding: 2px;\\n line-height: normal;\\n font-family: 'Roboto Mono', 'Roboto Mono Local', monospace;\\n font-size: 12px;\\n color: transparent;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/css/colored-text-input.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,WAAW;EACX,oCAAoC;EACpC,6BAA6B;EAC7B,kBAAkB;EAClB,UAAU;EACV,YAAY;EACZ,YAAY,EAAE,wEAAwE;AACxF;;AAEA;EACE;iCAC+B;EAC/B,cAAc;EACd,kBAAkB;EAClB,oBAAoB;EACpB,YAAY;EACZ,UAAU;EACV,eAAe;EACf,YAAY;EACZ,mBAAmB;EACnB,0DAA0D;EAC1D,eAAe;EACf,kBAAkB;EAClB,qBAAqB;EACrB,qBAAqB;AACvB\",\"sourcesContent\":[\".colored-text-input > textarea {\\n width: 100%;\\n -webkit-text-fill-color: transparent;\\n background-color: transparent;\\n position: relative;\\n z-index: 1;\\n resize: none;\\n height: 22px; /* Fine tuned value to avoid \\\"jumping\\\" of the textarea upon autoresize */\\n}\\n\\n.colored-text-input > div {\\n /* The values here are fine tuned to those of the ui.input textarea in order\\n * to achieve precise overlap */\\n overflow: auto;\\n position: absolute;\\n pointer-events: none;\\n cursor: text;\\n z-index: 0;\\n max-width: 100%;\\n padding: 2px;\\n line-height: normal;\\n font-family: 'Roboto Mono', 'Roboto Mono Local', monospace;\\n font-size: 12px;\\n color: transparent;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Naming convention: class names should begin with st and tab name (main, axo, sdf) to avoid naming collitions */\\n.st-main-input-table {\\n width: 100%;\\n}\\n\\n.st-main-input-table td:has(textarea) {\\n width: 100%;\\n padding-right: 20px;\\n}\\n\\n.st-main-input-table td:has(select) {\\n min-width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-main-output-table {\\n margin-top: 20px;\\n margin-right: 20px;\\n margin-bottom: 10px;\\n}\\n\\n.st-main-output-table table {\\n width: 100%;\\n table-layout: fixed;\\n}\\n\\n/* .st-main-output-table table tbody tr td { */\\n/* max-width: 20%; */\\n/* } */\\n\\n.st-main-output-table td {\\n padding-top: 6px;\\n padding-bottom: 6px;\\n}\\n.st-main-output-table tr:nth-child(even) {\\n background-color: var(--grey-1);\\n}\\n\\n.st-main-output-table td:nth-child(odd) {\\n width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-main-output-table td a {\\n overflow-wrap: break-word;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/css/main-tab.css\"],\"names\":[],\"mappings\":\"AAAA,iHAAiH;AACjH;EACE,WAAW;AACb;;AAEA;EACE,WAAW;EACX,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,mBAAmB;AACrB;;AAEA,8CAA8C;AAC9C,sBAAsB;AACtB,MAAM;;AAEN;EACE,gBAAgB;EAChB,mBAAmB;AACrB;AACA;EACE,+BAA+B;AACjC;;AAEA;EACE,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,yBAAyB;AAC3B\",\"sourcesContent\":[\"/* Naming convention: class names should begin with st and tab name (main, axo, sdf) to avoid naming collitions */\\n.st-main-input-table {\\n width: 100%;\\n}\\n\\n.st-main-input-table td:has(textarea) {\\n width: 100%;\\n padding-right: 20px;\\n}\\n\\n.st-main-input-table td:has(select) {\\n min-width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-main-output-table {\\n margin-top: 20px;\\n margin-right: 20px;\\n margin-bottom: 10px;\\n}\\n\\n.st-main-output-table table {\\n width: 100%;\\n table-layout: fixed;\\n}\\n\\n/* .st-main-output-table table tbody tr td { */\\n/* max-width: 20%; */\\n/* } */\\n\\n.st-main-output-table td {\\n padding-top: 6px;\\n padding-bottom: 6px;\\n}\\n.st-main-output-table tr:nth-child(even) {\\n background-color: var(--grey-1);\\n}\\n\\n.st-main-output-table td:nth-child(odd) {\\n width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-main-output-table td a {\\n overflow-wrap: break-word;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Naming convention: class names should begin with st and tab name (main, axo, sdf) to avoid naming collitions */\\n\\n.st-sdf-body {\\n padding-right: 20px;\\n}\\n\\n.st-sdf-input-form {\\n text-align: right;\\n vertical-align: top;\\n min-width: 95px;\\n}\\n\\n.st-sdf-direction-choice label {\\n min-width: 100px;\\n float: right;\\n}\\n\\n.st-sdf-direction-choice div {\\n justify-content: right;\\n}\\n\\n.st-sdf-text-input-td { /* Style for td containing textarea */\\n width: 100%;\\n}\\n\\n.st-sdf-mol-img {\\n margin-right: 30px;\\n float: right;\\n}\\n\\n.st-sdf-bool-button-block {\\n justify-content: right;\\n margin-bottom: 10px;\\n}\\n\\n.st-sdf-bottom {\\n flex-direction: row-reverse;\\n padding-top: 20px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/css/sdf-tab.css\"],\"names\":[],\"mappings\":\"AAAA,iHAAiH;;AAEjH;EACE,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,mBAAmB;EACnB,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,sBAAsB;AACxB;;AAEA,wBAAwB,qCAAqC;EAC3D,WAAW;AACb;;AAEA;EACE,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,2BAA2B;EAC3B,iBAAiB;AACnB\",\"sourcesContent\":[\"/* Naming convention: class names should begin with st and tab name (main, axo, sdf) to avoid naming collitions */\\n\\n.st-sdf-body {\\n padding-right: 20px;\\n}\\n\\n.st-sdf-input-form {\\n text-align: right;\\n vertical-align: top;\\n min-width: 95px;\\n}\\n\\n.st-sdf-direction-choice label {\\n min-width: 100px;\\n float: right;\\n}\\n\\n.st-sdf-direction-choice div {\\n justify-content: right;\\n}\\n\\n.st-sdf-text-input-td { /* Style for td containing textarea */\\n width: 100%;\\n}\\n\\n.st-sdf-mol-img {\\n margin-right: 30px;\\n float: right;\\n}\\n\\n.st-sdf-bool-button-block {\\n justify-content: right;\\n margin-bottom: 10px;\\n}\\n\\n.st-sdf-bottom {\\n flex-direction: row-reverse;\\n padding-top: 20px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","'use strict';\n\n(function () {\n var out$ = typeof exports != 'undefined' && exports || typeof define != 'undefined' && {} || this || window;\n if (typeof define !== 'undefined') define('save-svg-as-png', [], function () {\n return out$;\n });\n out$.default = out$;\n\n var xmlNs = 'http://www.w3.org/2000/xmlns/';\n var xhtmlNs = 'http://www.w3.org/1999/xhtml';\n var svgNs = 'http://www.w3.org/2000/svg';\n var doctype = '<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\" [<!ENTITY nbsp \" \">]>';\n var urlRegex = /url\\([\"']?(.+?)[\"']?\\)/;\n var fontFormats = {\n woff2: 'font/woff2',\n woff: 'font/woff',\n otf: 'application/x-font-opentype',\n ttf: 'application/x-font-ttf',\n eot: 'application/vnd.ms-fontobject',\n sfnt: 'application/font-sfnt',\n svg: 'image/svg+xml'\n };\n\n var isElement = function isElement(obj) {\n return obj instanceof HTMLElement || obj instanceof SVGElement;\n };\n var requireDomNode = function requireDomNode(el) {\n if (!isElement(el)) throw new Error('an HTMLElement or SVGElement is required; got ' + el);\n };\n var requireDomNodePromise = function requireDomNodePromise(el) {\n return new Promise(function (resolve, reject) {\n if (isElement(el)) resolve(el);else reject(new Error('an HTMLElement or SVGElement is required; got ' + el));\n });\n };\n var isExternal = function isExternal(url) {\n return url && url.lastIndexOf('http', 0) === 0 && url.lastIndexOf(window.location.host) === -1;\n };\n\n var getFontMimeTypeFromUrl = function getFontMimeTypeFromUrl(fontUrl) {\n var formats = Object.keys(fontFormats).filter(function (extension) {\n return fontUrl.indexOf('.' + extension) > 0;\n }).map(function (extension) {\n return fontFormats[extension];\n });\n if (formats) return formats[0];\n console.error('Unknown font format for ' + fontUrl + '. Fonts may not be working correctly.');\n return 'application/octet-stream';\n };\n\n var arrayBufferToBase64 = function arrayBufferToBase64(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n for (var i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }return window.btoa(binary);\n };\n\n var getDimension = function getDimension(el, clone, dim) {\n var v = el.viewBox && el.viewBox.baseVal && el.viewBox.baseVal[dim] || clone.getAttribute(dim) !== null && !clone.getAttribute(dim).match(/%$/) && parseInt(clone.getAttribute(dim)) || el.getBoundingClientRect()[dim] || parseInt(clone.style[dim]) || parseInt(window.getComputedStyle(el).getPropertyValue(dim));\n return typeof v === 'undefined' || v === null || isNaN(parseFloat(v)) ? 0 : v;\n };\n\n var getDimensions = function getDimensions(el, clone, width, height) {\n if (el.tagName === 'svg') return {\n width: width || getDimension(el, clone, 'width'),\n height: height || getDimension(el, clone, 'height')\n };else if (el.getBBox) {\n var _el$getBBox = el.getBBox(),\n x = _el$getBBox.x,\n y = _el$getBBox.y,\n _width = _el$getBBox.width,\n _height = _el$getBBox.height;\n\n return {\n width: x + _width,\n height: y + _height\n };\n }\n };\n\n var reEncode = function reEncode(data) {\n return decodeURIComponent(encodeURIComponent(data).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n var c = String.fromCharCode('0x' + p1);\n return c === '%' ? '%25' : c;\n }));\n };\n\n var uriToBlob = function uriToBlob(uri) {\n var byteString = window.atob(uri.split(',')[1]);\n var mimeString = uri.split(',')[0].split(':')[1].split(';')[0];\n var buffer = new ArrayBuffer(byteString.length);\n var intArray = new Uint8Array(buffer);\n for (var i = 0; i < byteString.length; i++) {\n intArray[i] = byteString.charCodeAt(i);\n }\n return new Blob([buffer], { type: mimeString });\n };\n\n var query = function query(el, selector) {\n if (!selector) return;\n try {\n return el.querySelector(selector) || el.parentNode && el.parentNode.querySelector(selector);\n } catch (err) {\n console.warn('Invalid CSS selector \"' + selector + '\"', err);\n }\n };\n\n var detectCssFont = function detectCssFont(rule, href) {\n // Match CSS font-face rules to external links.\n // @font-face {\n // src: local('Abel'), url(https://fonts.gstatic.com/s/abel/v6/UzN-iejR1VoXU2Oc-7LsbvesZW2xOQ-xsNqO47m55DA.woff2);\n // }\n var match = rule.cssText.match(urlRegex);\n var url = match && match[1] || '';\n if (!url || url.match(/^data:/) || url === 'about:blank') return;\n var fullUrl = url.startsWith('../') ? href + '/../' + url : url.startsWith('./') ? href + '/.' + url : url;\n return {\n text: rule.cssText,\n format: getFontMimeTypeFromUrl(fullUrl),\n url: fullUrl\n };\n };\n\n var inlineImages = function inlineImages(el) {\n return Promise.all(Array.from(el.querySelectorAll('image')).map(function (image) {\n var href = image.getAttributeNS('http://www.w3.org/1999/xlink', 'href') || image.getAttribute('href');\n if (!href) return Promise.resolve(null);\n if (isExternal(href)) {\n href += (href.indexOf('?') === -1 ? '?' : '&') + 't=' + new Date().valueOf();\n }\n return new Promise(function (resolve, reject) {\n var canvas = document.createElement('canvas');\n var img = new Image();\n img.crossOrigin = 'anonymous';\n img.src = href;\n img.onerror = function () {\n return reject(new Error('Could not load ' + href));\n };\n img.onload = function () {\n canvas.width = img.width;\n canvas.height = img.height;\n canvas.getContext('2d').drawImage(img, 0, 0);\n image.setAttributeNS('http://www.w3.org/1999/xlink', 'href', canvas.toDataURL('image/png'));\n resolve(true);\n };\n });\n }));\n };\n\n var cachedFonts = {};\n var inlineFonts = function inlineFonts(fonts) {\n return Promise.all(fonts.map(function (font) {\n return new Promise(function (resolve, reject) {\n if (cachedFonts[font.url]) return resolve(cachedFonts[font.url]);\n\n var req = new XMLHttpRequest();\n req.addEventListener('load', function () {\n // TODO: it may also be worth it to wait until fonts are fully loaded before\n // attempting to rasterize them. (e.g. use https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet)\n var fontInBase64 = arrayBufferToBase64(req.response);\n var fontUri = font.text.replace(urlRegex, 'url(\"data:' + font.format + ';base64,' + fontInBase64 + '\")') + '\\n';\n cachedFonts[font.url] = fontUri;\n resolve(fontUri);\n });\n req.addEventListener('error', function (e) {\n console.warn('Failed to load font from: ' + font.url, e);\n cachedFonts[font.url] = null;\n resolve(null);\n });\n req.addEventListener('abort', function (e) {\n console.warn('Aborted loading font from: ' + font.url, e);\n resolve(null);\n });\n req.open('GET', font.url);\n req.responseType = 'arraybuffer';\n req.send();\n });\n })).then(function (fontCss) {\n return fontCss.filter(function (x) {\n return x;\n }).join('');\n });\n };\n\n var cachedRules = null;\n var styleSheetRules = function styleSheetRules() {\n if (cachedRules) return cachedRules;\n return cachedRules = Array.from(document.styleSheets).map(function (sheet) {\n try {\n return { rules: sheet.cssRules, href: sheet.href };\n } catch (e) {\n console.warn('Stylesheet could not be loaded: ' + sheet.href, e);\n return {};\n }\n });\n };\n\n var inlineCss = function inlineCss(el, options) {\n var _ref = options || {},\n selectorRemap = _ref.selectorRemap,\n modifyStyle = _ref.modifyStyle,\n modifyCss = _ref.modifyCss,\n fonts = _ref.fonts,\n excludeUnusedCss = _ref.excludeUnusedCss;\n\n var generateCss = modifyCss || function (selector, properties) {\n var sel = selectorRemap ? selectorRemap(selector) : selector;\n var props = modifyStyle ? modifyStyle(properties) : properties;\n return sel + '{' + props + '}\\n';\n };\n var css = [];\n var detectFonts = typeof fonts === 'undefined';\n var fontList = fonts || [];\n styleSheetRules().forEach(function (_ref2) {\n var rules = _ref2.rules,\n href = _ref2.href;\n\n if (!rules) return;\n Array.from(rules).forEach(function (rule) {\n if (typeof rule.style != 'undefined') {\n if (query(el, rule.selectorText)) css.push(generateCss(rule.selectorText, rule.style.cssText));else if (detectFonts && rule.cssText.match(/^@font-face/)) {\n var font = detectCssFont(rule, href);\n if (font) fontList.push(font);\n } else if (!excludeUnusedCss) {\n css.push(rule.cssText);\n }\n }\n });\n });\n\n return inlineFonts(fontList).then(function (fontCss) {\n return css.join('\\n') + fontCss;\n });\n };\n\n var downloadOptions = function downloadOptions() {\n if (!navigator.msSaveOrOpenBlob && !('download' in document.createElement('a'))) {\n return { popup: window.open() };\n }\n };\n\n out$.prepareSvg = function (el, options, done) {\n requireDomNode(el);\n\n var _ref3 = options || {},\n _ref3$left = _ref3.left,\n left = _ref3$left === undefined ? 0 : _ref3$left,\n _ref3$top = _ref3.top,\n top = _ref3$top === undefined ? 0 : _ref3$top,\n w = _ref3.width,\n h = _ref3.height,\n _ref3$scale = _ref3.scale,\n scale = _ref3$scale === undefined ? 1 : _ref3$scale,\n _ref3$responsive = _ref3.responsive,\n responsive = _ref3$responsive === undefined ? false : _ref3$responsive,\n _ref3$excludeCss = _ref3.excludeCss,\n excludeCss = _ref3$excludeCss === undefined ? false : _ref3$excludeCss;\n\n return inlineImages(el).then(function () {\n var clone = el.cloneNode(true);\n clone.style.backgroundColor = (options || {}).backgroundColor || el.style.backgroundColor;\n\n var _getDimensions = getDimensions(el, clone, w, h),\n width = _getDimensions.width,\n height = _getDimensions.height;\n\n if (el.tagName !== 'svg') {\n if (el.getBBox) {\n if (clone.getAttribute('transform') != null) {\n clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\\(.*?\\)/, ''));\n }\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.appendChild(clone);\n clone = svg;\n } else {\n console.error('Attempted to render non-SVG element', el);\n return;\n }\n }\n\n clone.setAttribute('version', '1.1');\n clone.setAttribute('viewBox', [left, top, width, height].join(' '));\n if (!clone.getAttribute('xmlns')) clone.setAttributeNS(xmlNs, 'xmlns', svgNs);\n if (!clone.getAttribute('xmlns:xlink')) clone.setAttributeNS(xmlNs, 'xmlns:xlink', 'http://www.w3.org/1999/xlink');\n\n if (responsive) {\n clone.removeAttribute('width');\n clone.removeAttribute('height');\n clone.setAttribute('preserveAspectRatio', 'xMinYMin meet');\n } else {\n clone.setAttribute('width', width * scale);\n clone.setAttribute('height', height * scale);\n }\n\n Array.from(clone.querySelectorAll('foreignObject > *')).forEach(function (foreignObject) {\n foreignObject.setAttributeNS(xmlNs, 'xmlns', foreignObject.tagName === 'svg' ? svgNs : xhtmlNs);\n });\n\n if (excludeCss) {\n var outer = document.createElement('div');\n outer.appendChild(clone);\n var src = outer.innerHTML;\n if (typeof done === 'function') done(src, width, height);else return { src: src, width: width, height: height };\n } else {\n return inlineCss(el, options).then(function (css) {\n var style = document.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = '<![CDATA[\\n' + css + '\\n]]>';\n\n var defs = document.createElement('defs');\n defs.appendChild(style);\n clone.insertBefore(defs, clone.firstChild);\n\n var outer = document.createElement('div');\n outer.appendChild(clone);\n var src = outer.innerHTML.replace(/NS\\d+:href/gi, 'xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href');\n\n if (typeof done === 'function') done(src, width, height);else return { src: src, width: width, height: height };\n });\n }\n });\n };\n\n out$.svgAsDataUri = function (el, options, done) {\n requireDomNode(el);\n return out$.prepareSvg(el, options).then(function (_ref4) {\n var src = _ref4.src,\n width = _ref4.width,\n height = _ref4.height;\n\n var svgXml = 'data:image/svg+xml;base64,' + window.btoa(reEncode(doctype + src));\n if (typeof done === 'function') {\n done(svgXml, width, height);\n }\n return svgXml;\n });\n };\n\n out$.svgAsPngUri = function (el, options, done) {\n requireDomNode(el);\n\n var _ref5 = options || {},\n _ref5$encoderType = _ref5.encoderType,\n encoderType = _ref5$encoderType === undefined ? 'image/png' : _ref5$encoderType,\n _ref5$encoderOptions = _ref5.encoderOptions,\n encoderOptions = _ref5$encoderOptions === undefined ? 0.8 : _ref5$encoderOptions,\n canvg = _ref5.canvg;\n\n var convertToPng = function convertToPng(_ref6) {\n var src = _ref6.src,\n width = _ref6.width,\n height = _ref6.height;\n\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n var pixelRatio = window.devicePixelRatio || 1;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n canvas.style.width = canvas.width + 'px';\n canvas.style.height = canvas.height + 'px';\n context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n\n if (canvg) canvg(canvas, src);else context.drawImage(src, 0, 0);\n\n var png = void 0;\n try {\n png = canvas.toDataURL(encoderType, encoderOptions);\n } catch (e) {\n if (typeof SecurityError !== 'undefined' && e instanceof SecurityError || e.name === 'SecurityError') {\n console.error('Rendered SVG images cannot be downloaded in this browser.');\n return;\n } else throw e;\n }\n if (typeof done === 'function') done(png, canvas.width, canvas.height);\n return Promise.resolve(png);\n };\n\n if (canvg) return out$.prepareSvg(el, options).then(convertToPng);else return out$.svgAsDataUri(el, options).then(function (uri) {\n return new Promise(function (resolve, reject) {\n var image = new Image();\n image.onload = function () {\n return resolve(convertToPng({\n src: image,\n width: image.width,\n height: image.height\n }));\n };\n image.onerror = function () {\n reject('There was an error loading the data URI as an image on the following SVG\\n' + window.atob(uri.slice(26)) + 'Open the following link to see browser\\'s diagnosis\\n' + uri);\n };\n image.src = uri;\n });\n });\n };\n\n out$.download = function (name, uri, options) {\n if (navigator.msSaveOrOpenBlob) navigator.msSaveOrOpenBlob(uriToBlob(uri), name);else {\n var saveLink = document.createElement('a');\n if ('download' in saveLink) {\n saveLink.download = name;\n saveLink.style.display = 'none';\n document.body.appendChild(saveLink);\n try {\n var blob = uriToBlob(uri);\n var url = URL.createObjectURL(blob);\n saveLink.href = url;\n saveLink.onclick = function () {\n return requestAnimationFrame(function () {\n return URL.revokeObjectURL(url);\n });\n };\n } catch (e) {\n console.error(e);\n console.warn('Error while getting object URL. Falling back to string URL.');\n saveLink.href = uri;\n }\n saveLink.click();\n document.body.removeChild(saveLink);\n } else if (options && options.popup) {\n options.popup.document.title = name;\n options.popup.location.replace(uri);\n }\n }\n };\n\n out$.saveSvg = function (el, name, options) {\n var downloadOpts = downloadOptions(); // don't inline, can't be async\n return requireDomNodePromise(el).then(function (el) {\n return out$.svgAsDataUri(el, options || {});\n }).then(function (uri) {\n return out$.download(name, uri, downloadOpts);\n });\n };\n\n out$.saveSvgAsPng = function (el, name, options) {\n var downloadOpts = downloadOptions(); // don't inline, can't be async\n return requireDomNodePromise(el).then(function (el) {\n return out$.svgAsPngUri(el, options || {});\n }).then(function (uri) {\n return out$.download(name, uri, downloadOpts);\n });\n };\n})();","\"use strict\";\n\nvar stylesInDOM = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n\n return updater;\n}\n\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n\n stylesInDOM.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n/* istanbul ignore next */\n\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n}\n/* istanbul ignore next */\n\n\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n}\n\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\n\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\n\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n\n var needLayer = typeof obj.layer !== \"undefined\";\n\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n\n css += obj.css;\n\n if (needLayer) {\n css += \"}\";\n }\n\n if (obj.media) {\n css += \"}\";\n }\n\n if (obj.supports) {\n css += \"}\";\n }\n\n var sourceMap = obj.sourceMap;\n\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n options.styleTagTransform(css, styleElement, options.options);\n}\n\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n\n styleElement.parentNode.removeChild(styleElement);\n}\n/* istanbul ignore next */\n\n\nfunction domAPI(options) {\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\n\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n\n styleElement.appendChild(document.createTextNode(css));\n }\n}\n\nmodule.exports = styleTagTransform;","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport const DELIMITER = ';'; // what is the need for this?\nexport const NUCLEOTIDES = ['A', 'G', 'C', 'U', 'T'];\n\nexport const TECHNOLOGIES = {\n DNA: 'DNA',\n RNA: 'RNA',\n ASO_GAPMERS: 'ASOGapmers',\n SI_RNA: 'siRNA',\n};\n\nexport enum DEFAULT_FORMATS {\n HELM = 'HELM',\n AXOLABS = 'Axolabs',\n}\n","export const LIB_PATH = 'System:AppData/SequenceTranslator';\nexport const DEFAULT_LIB_FILENAME = 'monomer-lib.json';\n\nexport const APP_PATH = 'System:AppData/SequenceTranslator';\nexport const AXOLABS_STYLE_FILENAME = 'axolabs-style.json';\nexport const CODES_TO_HELM_DICT_FILENAME = 'formats-to-helm.json';\nexport const CODES_TO_SYMBOLS_FILENAME = 'codes-to-symbols.json';\nexport const MONOMERS_WITH_PHOSPHATE_LINKERS = 'linkers.json';\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {APP_PATH, AXOLABS_STYLE_FILENAME, CODES_TO_HELM_DICT_FILENAME, CODES_TO_SYMBOLS_FILENAME, MONOMERS_WITH_PHOSPHATE_LINKERS} from './const';\nimport {AxolabsStyle, FormatToHELMDict, CodeToSymbol} from './types';\n\nconst fileSource = new DG.FileSource(APP_PATH);\n\nexport let axolabsStyleMap: AxolabsStyle;\nexport let codesToHelmDictionary: FormatToHELMDict;\nexport let codesToSymbolsDictionary: CodeToSymbol;\nexport let monomersWithPhosphateLinkers: {[key: string]: string[]};\n\nexport async function getJsonData(): Promise<void> {\n const data = [axolabsStyleMap, codesToHelmDictionary, codesToSymbolsDictionary, monomersWithPhosphateLinkers];\n\n if (data.every((item) => item !== undefined))\n return;\n\n axolabsStyleMap = await parse(AXOLABS_STYLE_FILENAME);\n codesToHelmDictionary = await parse(CODES_TO_HELM_DICT_FILENAME);\n codesToSymbolsDictionary = await parse(CODES_TO_SYMBOLS_FILENAME);\n monomersWithPhosphateLinkers = await parse(MONOMERS_WITH_PHOSPHATE_LINKERS);\n}\n\nasync function parse(path: string): Promise<any> {\n let parsedJson: string;\n try {\n parsedJson = JSON.parse(await fileSource.readAsText(path))\n } catch (err: any) {\n const errMsg: string = err.hasOwnProperty('message') ? err.message : err.toString();\n throw new Error(`Error loading json from ${path}:` + errMsg);\n }\n return parsedJson;\n}\n\n","import * as DG from 'datagrok-api/dg';\n\nexport function sortByReverseLength(array: string[]): string[] {\n return array.sort((a, b) => b.length - a.length);\n}\n\nexport function download(name: string, href: string): void {\n const element = document.createElement('a');\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + href);\n element.setAttribute('download', name);\n element.click();\n}\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_package} from '../../package';\n\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\n\nimport {HELM_REQUIRED_FIELDS as REQ, HELM_OPTIONAL_FIELDS as OPT} from '@datagrok-libraries/bio/src/utils/const';\nimport {META_FIELDS as MET} from './const';\nimport {codesToSymbolsDictionary} from '../../model/data-loading-utils/json-loader';\n\nexport class MonomerLibWrapper {\n private constructor() {\n const lib = _package.monomerLib;\n if (lib === null)\n throw new Error('SequenceTranslator: monomer library is null');\n this.lib = lib!;\n this.allMonomers = this.getAllMonomers();\n }\n\n private lib: IMonomerLib;\n private static instance?: MonomerLibWrapper;\n private allMonomers: Monomer[];\n\n private formatMonomerForViewer(sourceObj: Monomer): {[key: string]: string} {\n const formattedObject: {[key: string]: string} = {};\n formattedObject[REQ.NAME] = sourceObj[REQ.SYMBOL];\n formattedObject[REQ.SYMBOL] = sourceObj[REQ.SYMBOL];\n formattedObject[REQ.MOLFILE] = sourceObj[REQ.MOLFILE];\n\n return formattedObject;\n }\n\n private getAllMonomers(): Monomer[] {\n const polymerTypes = this.lib.getPolymerTypes();\n let result: Monomer[] = [];\n for (const polymerType of polymerTypes) {\n const monomerSymbols = this.lib.getMonomerSymbolsByType(polymerType);\n const monomersByType: Monomer[] = monomerSymbols\n .map((monomerSymbol) => this.lib.getMonomer(polymerType, monomerSymbol))\n .filter((monomer): monomer is Monomer => monomer !== null);\n result = result.concat(monomersByType);\n }\n return result;\n }\n\n private getMonomer(monomerSymbol: string): Monomer {\n const monomer = this.lib.getMonomer('RNA', monomerSymbol);\n if (monomer === undefined)\n throw new Error(`SequenceTranslator: no monomer with symbol ${monomerSymbol}`);\n return monomer!;\n }\n\n static getInstance(): MonomerLibWrapper {\n if (MonomerLibWrapper.instance === undefined)\n MonomerLibWrapper.instance = new MonomerLibWrapper();\n return MonomerLibWrapper.instance!;\n }\n\n getMolfileBySymbol(monomerSymbol: string): string {\n const monomer = this.getMonomer(monomerSymbol);\n return monomer.molfile;\n }\n\n getNaturalAnalogBySymbol(monomerSymbol: string): string {\n const monomer = this.getMonomer(monomerSymbol);\n const naturalAnalog = monomer.naturalAnalog;\n if (!naturalAnalog)\n throw new Error(`ST: no natural analog for ${monomerSymbol}`);\n return naturalAnalog!;\n }\n\n // todo: a better criterion\n isModification(monomerSymbol: string): boolean {\n const molfile = this.getMolfileBySymbol(monomerSymbol);\n return (molfile.includes('MODIFICATION')) ? true : false;\n }\n\n getCodeToSymbolMap(format: string): Map<string, string> {\n return new Map<string, string>(Object.entries(codesToSymbolsDictionary[format]));\n }\n\n getCodesByFormat(format: string): string[] {\n return Object.keys(codesToSymbolsDictionary[format]);\n }\n\n getTableForViewer(): DG.DataFrame {\n const formattedObjects = this.allMonomers.map((monomer) => this.formatMonomerForViewer(monomer));\n const df = DG.DataFrame.fromObjects(formattedObjects)!;\n return df;\n }\n\n getCodesToWeightsMap(): Map<string, number> {\n const codesToWeightsMap = new Map<string, number>();\n Object.entries(codesToSymbolsDictionary).forEach(([_, dict]) => {\n Object.entries(dict).forEach(([code, monomerSymbol]) => {\n const monomer = this.getMonomer(monomerSymbol);\n const weight = monomer[OPT.META]?.[MET.MOLWEIGHT];\n codesToWeightsMap.set(code, weight);\n });\n });\n return codesToWeightsMap;\n }\n}\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {PHOSPHATE_SYMBOL} from './const';\nimport {sortByReverseLength} from '../helpers';\nimport {MonomerLibWrapper} from '../monomer-lib/lib-wrapper';\nimport {monomersWithPhosphateLinkers} from '../data-loading-utils/json-loader';\n\n/** Wrapper for parsing a strand and getting a sequence of monomer IDs (with\n * omitted linkers, if needed) */\nexport class MonomerSequenceParser {\n constructor(\n private sequence: string, private invert: boolean = false,\n // todo: remove from the list of parameters\n private codeMap: Map<string, string>\n ) {\n this.lib = MonomerLibWrapper.getInstance();\n }\n\n private lib: MonomerLibWrapper;\n\n /** Get sequence of parsed monomer symbols, which are unique short names for\n * the monomers within the Monomer Library */\n parseSequence(): string[] {\n const parsedRawCodes = this.parseRawSequence();\n return this.addLinkers(parsedRawCodes);\n }\n\n private addLinkers(parsedRawCodes: string[]) {\n const monomerSymbolSequence: string[] = [];\n parsedRawCodes.forEach((code, i) => {\n const monomerSymbol = this.getSymbolForCode(code);\n if (i > 0 && monomerHasLeftPhosphateLinker(monomerSymbol))\n monomerSymbolSequence.pop();\n\n monomerSymbolSequence.push(monomerSymbol);\n\n const isPhosphate = monomerIsPhosphateLinker(monomerSymbol);\n const lastMonomer = i === parsedRawCodes.length - 1;\n const nextMonomerIsPhosphate = (i + 1 < parsedRawCodes.length && monomerIsPhosphateLinker(this.getSymbolForCode(parsedRawCodes[i + 1])));\n\n // todo: refactor as molfile-specific\n if (!isPhosphate && !monomerHasRightPhosphateLinker(monomerSymbol) && !nextMonomerIsPhosphate && !lastMonomer) {\n monomerSymbolSequence.push(PHOSPHATE_SYMBOL);\n }\n });\n return monomerSymbolSequence;\n }\n\n private getSymbolForCode(code: string): string {\n let monomerSymbol = this.codeMap.get(code);\n // todo: remove as a legacy workaround, codeMap must contain all the\n // symbols, and symbols are not codes\n monomerSymbol ??= code;\n return monomerSymbol;\n }\n\n private parseRawSequence(): string[] {\n const allCodesOfFormat = this.getAllCodesOfFormat();\n const parsedCodes = [];\n let i = 0;\n while (i < this.sequence.length) {\n const code = allCodesOfFormat.find(\n (s: string) => s === this.sequence.substring(i, i + s.length)\n )!;\n this.invert ? parsedCodes.unshift(code) : parsedCodes.push(code);\n i += code.length;\n }\n return parsedCodes;\n }\n\n // todo: port to monomer handler\n private getAllCodesOfFormat(): string[] {\n let allCodesInTheFormat = Array.from(this.codeMap.keys());\n return sortByReverseLength(allCodesInTheFormat);\n }\n}\n\n// todo: to be eliminated after full helm support\nfunction monomerHasLeftPhosphateLinker(monomerSymbol: string): boolean {\n return monomersWithPhosphateLinkers['left'].includes(monomerSymbol);\n}\n\nfunction monomerHasRightPhosphateLinker(monomerSymbol: string): boolean {\n return monomersWithPhosphateLinkers['right'].includes(monomerSymbol);\n}\n\nfunction monomerIsPhosphateLinker(monomerSymbol: string): boolean {\n return monomersWithPhosphateLinkers['phosphate'].includes(monomerSymbol);\n}\n","export const PHOSPHATE_SYMBOL = 'p';\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {MonomerSequenceParser} from './monomer-code-parser';\nimport {MonomerLibWrapper} from '../monomer-lib/lib-wrapper';\n\nexport class SequenceToMolfileConverter {\n constructor(\n sequence: string, invert: boolean = false, format: string\n ) {\n this.lib = MonomerLibWrapper.getInstance();\n const codeToSymbolMap = this.lib.getCodeToSymbolMap(format);\n this.parser = new MonomerSequenceParser(sequence, invert, codeToSymbolMap);\n }\n\n private parser: MonomerSequenceParser;\n private lib: MonomerLibWrapper;\n\n convert(): string {\n const parsedSequence = this.parser.parseSequence();\n const monomerMolfiles: string[] = [];\n parsedSequence.forEach((monomerSymbol, idx) => {\n const monomerMolfile = this.getMonomerMolfile(monomerSymbol, idx);\n monomerMolfiles.push(monomerMolfile);\n })\n return this.getPolymerMolfile(monomerMolfiles);\n }\n\n private getMonomerMolfile(monomerSymbol: string, idx: number): string {\n const molBlock = this.lib.getMolfileBySymbol(monomerSymbol);\n if (this.lib.isModification(monomerSymbol))\n return (idx === 0) ? this.reflect(molBlock) : molBlock;\n else\n return this.rotateNucleotidesV3000(molBlock);\n }\n\n private getPolymerMolfile(monomerMolfiles: string[]) {\n return this.linkV3000(monomerMolfiles);\n }\n\n private reflect(molBlock: string): string {\n const coordinates = this.extractAtomDataV3000(molBlock);\n const natom = coordinates.atomIndex.length;\n\n const indexFivePrime = coordinates.atomIndex.indexOf(1);\n const indexThreePrime = coordinates.atomIndex.indexOf(natom);\n\n const xCenter = (coordinates.x[indexThreePrime] + coordinates.x[indexFivePrime]) / 2;\n const yCenter = (coordinates.y[indexThreePrime] + coordinates.y[indexFivePrime]) / 2;\n\n //place to center\n for (let i = 0; i < natom; i++) {\n coordinates.x[i] -= xCenter;\n coordinates.y[i] -= yCenter;\n }\n\n //place to center\n for (let i = 0; i < natom; i++)\n coordinates.x[i] = -coordinates.x[i];\n\n //place to right\n const xShift = coordinates.x[indexFivePrime];\n for (let i = 0; i < natom; i++)\n coordinates.x[i] -= xShift;\n\n //rewrite molBlock\n let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates\n index = molBlock.indexOf('\\n', index);\n let indexEnd = index;\n for (let i = 0; i < natom; i++) {\n index = molBlock.indexOf('V30', index) + 4;\n index = molBlock.indexOf(' ', index) + 1;\n index = molBlock.indexOf(' ', index) + 1;\n indexEnd = molBlock.indexOf(' ', index) + 1;\n indexEnd = molBlock.indexOf(' ', indexEnd);\n\n molBlock = molBlock.slice(0, index) +\n coordinates.x[i] + ' ' + coordinates.y[i] +\n molBlock.slice(indexEnd);\n\n index = molBlock.indexOf('\\n', index) + 1;\n }\n\n return molBlock;\n }\n\n private extractAtomDataV3000(molBlock: string) {\n const numbers = this.extractAtomsBondsNumbersV3000(molBlock);\n let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates\n index = molBlock.indexOf('\\n', index);\n let indexEnd = index;\n\n const indexes: number[] = Array(numbers.natom);\n const types: string[] = Array(numbers.natom);\n const x: number[] = Array(numbers.natom);\n const y: number[] = Array(numbers.natom);\n\n for (let i = 0; i < numbers.natom; i++) {\n index = molBlock.indexOf('V30', index) + 4;\n indexEnd = molBlock.indexOf(' ', index);\n indexes[i] = parseInt(molBlock.substring(index, indexEnd));\n\n index = indexEnd + 1;\n indexEnd = molBlock.indexOf(' ', index);\n types[i] = molBlock.substring(index, indexEnd);\n\n index = indexEnd + 1;\n indexEnd = molBlock.indexOf(' ', index);\n x[i] = parseFloat(molBlock.substring(index, indexEnd));\n\n index = indexEnd + 1;\n indexEnd = molBlock.indexOf(' ', index);\n y[i] = parseFloat(molBlock.substring(index, indexEnd));\n\n index = molBlock.indexOf('\\n', index) + 1;\n }\n\n return {atomIndex: indexes, atomType: types, x: x, y: y};\n }\n\n private extractAtomsBondsNumbersV3000(molBlock: string): { natom: number, nbond: number } {\n molBlock = molBlock.replaceAll('\\r', ''); //equalize old and new sdf standards\n let index = molBlock.indexOf('COUNTS') + 7; // V3000 index for atoms and bonds number\n let indexEnd = molBlock.indexOf(' ', index);\n\n const atomsNumber = parseInt(molBlock.substring(index, indexEnd));\n index = indexEnd + 1;\n indexEnd = molBlock.indexOf(' ', index);\n const bondsNumber = parseInt(molBlock.substring(index, indexEnd));\n\n return {natom: atomsNumber, nbond: bondsNumber};\n }\n\n private rotateNucleotidesV3000(molBlock: string): string {\n const coordinates = this.extractAtomDataV3000(molBlock);\n const natom = coordinates.atomIndex.length;\n\n const indexFivePrime = coordinates.atomIndex.indexOf(1);\n const indexThreePrime = coordinates.atomIndex.indexOf(natom);\n\n //fix 5 prime if inadequate\n if (natom > 8)\n this.fix5Prime(coordinates, indexFivePrime, indexThreePrime);\n\n const xCenter = (coordinates.x[indexThreePrime] + coordinates.x[indexFivePrime]) / 2;\n const yCenter = (coordinates.y[indexThreePrime] + coordinates.y[indexFivePrime]) / 2;\n\n //place to center\n for (let i = 0; i < natom; i++) {\n coordinates.x[i] -= xCenter;\n coordinates.y[i] -= yCenter;\n }\n\n let angle = 0;\n if (coordinates.x[indexFivePrime] === 0) {\n angle = coordinates.y[indexFivePrime] > coordinates.y[indexThreePrime] ? Math.PI / 2 : 3 * Math.PI / 2;\n } else if (coordinates.y[indexFivePrime] === 0) {\n angle = coordinates.x[indexFivePrime] > coordinates.x[indexThreePrime] ? Math.PI : 0;\n } else {\n const derivative = coordinates.y[indexFivePrime] / coordinates.x[indexFivePrime];\n angle = derivative > 0 ?\n (coordinates.x[indexFivePrime] > 0 ? Math.PI - Math.atan(derivative) : Math.PI * 2 - Math.atan(derivative)) :\n (coordinates.x[indexFivePrime] > 0 ? -Math.PI - Math.atan(derivative) : Math.atan(derivative));\n }\n\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n\n for (let i = 0; i < natom; i++) {\n const xAdd = coordinates.x[i];\n coordinates.x[i] = xAdd * cos - coordinates.y[i] * sin;\n coordinates.y[i] = xAdd * sin + coordinates.y[i] * cos;\n }\n\n //place to right\n const xShift = coordinates.x[indexFivePrime];\n for (let i = 0; i < natom; i++)\n coordinates.x[i] -= xShift;\n\n //rewrite molBlock\n let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates\n index = molBlock.indexOf('\\n', index);\n let indexEnd = index;\n for (let i = 0; i < natom; i++) {\n index = molBlock.indexOf('V30', index) + 4;\n index = molBlock.indexOf(' ', index) + 1;\n index = molBlock.indexOf(' ', index) + 1;\n indexEnd = molBlock.indexOf(' ', index) + 1;\n indexEnd = molBlock.indexOf(' ', indexEnd);\n\n molBlock = molBlock.slice(0, index) +\n coordinates.x[i] + ' ' + coordinates.y[i] +\n molBlock.slice(indexEnd);\n\n index = molBlock.indexOf('\\n', index) + 1;\n }\n\n return molBlock;\n }\n\n\n private linkV3000(molBlocks: string[], useChirality: boolean = true): string {\n let macroMolBlock = '\\nDatagrok macromolecule handler\\n\\n';\n macroMolBlock += ' 0 0 0 0 0 0 999 V3000\\n';\n macroMolBlock += 'M V30 BEGIN CTAB\\n';\n let atomBlock = '';\n let bondBlock = '';\n let collectionBlock = '';\n const collection: number [] = [];\n let natom = 0;\n let nbond = 0;\n let xShift = 0;\n\n for (let i = 0; i < molBlocks.length; i++) {\n const isBoundary = molBlocks[i].includes('MODIFICATION') && i === 0;\n let specLength = 0;\n if (isBoundary) {\n const coordinates = this.extractAtomDataV3000(molBlocks[i]);\n specLength = coordinates.atomIndex.length;\n }\n\n\n molBlocks[i] = molBlocks[i].replaceAll('(-\\nM V30 ', '(')\n .replaceAll('-\\nM V30 ', '').replaceAll(' )', ')');\n const numbers = this.extractAtomsBondsNumbersV3000(molBlocks[i]);\n const coordinates = this.extractAtomDataV3000(molBlocks[i]);\n\n let indexAtoms = molBlocks[i].indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates\n indexAtoms = molBlocks[i].indexOf('\\n', indexAtoms);\n let index = indexAtoms;\n let indexEnd = indexAtoms;\n\n for (let j = 0; j < numbers.natom; j++) {\n if (coordinates.atomIndex[j] !== 1 || i === 0) {\n //rewrite atom number\n index = molBlocks[i].indexOf('V30', index) + 4;\n indexEnd = molBlocks[i].indexOf(' ', index);\n let atomNumber = 0;\n if (isBoundary) {\n atomNumber = parseInt(molBlocks[i].substring(index, indexEnd));\n if (atomNumber === 1)\n atomNumber = specLength;\n else if (atomNumber === specLength)\n atomNumber = 1;\n atomNumber += natom;\n } else {\n atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;\n }\n molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);\n\n //rewrite coordinates\n index = molBlocks[i].indexOf(' ', index) + 1;\n index = molBlocks[i].indexOf(' ', index) + 1;\n indexEnd = molBlocks[i].indexOf(' ', index);\n\n const totalShift = xShift - coordinates.x[0];\n let coordinate =\n Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)) + totalShift)) / 10000;\n molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);\n\n index = molBlocks[i].indexOf(' ', index) + 1;\n indexEnd = molBlocks[i].indexOf(' ', index);\n coordinate =\n Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)))) / 10000;\n molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);\n\n index = molBlocks[i].indexOf('\\n', index) + 1;\n } else {\n index = molBlocks[i].indexOf('M V30', index) - 1;\n indexEnd = molBlocks[i].indexOf('\\n', index + 1);\n molBlocks[i] = molBlocks[i].slice(0, index) + molBlocks[i].slice(indexEnd);\n }\n }\n\n const indexAtomsEnd = molBlocks[i].indexOf('M V30 END ATOM');\n atomBlock += molBlocks[i].substring(indexAtoms + 1, indexAtomsEnd);\n\n let indexBonds = molBlocks[i].indexOf('M V30 BEGIN BOND'); // V3000 index for bonds\n indexBonds = molBlocks[i].indexOf('\\n', indexBonds);\n index = indexBonds;\n indexEnd = indexBonds;\n\n for (let j = 0; j < numbers.nbond; j++) {\n //rewrite bond number\n index = molBlocks[i].indexOf('V30', index) + 4;\n indexEnd = molBlocks[i].indexOf(' ', index);\n const bondNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + nbond;\n molBlocks[i] = molBlocks[i].slice(0, index) + bondNumber + molBlocks[i].slice(indexEnd);\n\n //rewrite atom pair in bond\n index = molBlocks[i].indexOf(' ', index) + 1;\n index = molBlocks[i].indexOf(' ', index) + 1;\n indexEnd = molBlocks[i].indexOf(' ', index);\n let atomNumber = 0;\n if (isBoundary) {\n atomNumber = parseInt(molBlocks[i].substring(index, indexEnd));\n if (atomNumber === 1)\n atomNumber = specLength;\n else if (atomNumber === specLength)\n atomNumber = 1;\n atomNumber += natom;\n } else {\n atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;\n }\n\n molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);\n index = molBlocks[i].indexOf(' ', index) + 1;\n indexEnd = Math.min(molBlocks[i].indexOf('\\n', index), molBlocks[i].indexOf(' ', index));\n atomNumber = 0;\n if (isBoundary) {\n atomNumber = parseInt(molBlocks[i].substring(index, indexEnd));\n if (atomNumber === 1)\n atomNumber = specLength;\n else if (atomNumber === specLength)\n atomNumber = 1;\n atomNumber += natom;\n } else {\n atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;\n }\n molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);\n\n index = molBlocks[i].indexOf('\\n', index) + 1;\n }\n\n const indexBondEnd = molBlocks[i].indexOf('M V30 END BOND');\n bondBlock += molBlocks[i].substring(indexBonds + 1, indexBondEnd);\n\n let indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=('); // V3000 index for collections\n\n while (indexCollection !== -1) {\n indexCollection += 28;\n const collectionEnd = molBlocks[i].indexOf(')', indexCollection);\n const collectionEntries = molBlocks[i].substring(indexCollection, collectionEnd).split(' ').slice(1);\n collectionEntries.forEach((e) => {\n collection.push(parseInt(e) + natom);\n });\n indexCollection = collectionEnd;\n indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=(', indexCollection);\n }\n\n natom += numbers.natom - 1;\n nbond += numbers.nbond;\n if (isBoundary)\n xShift += Math.max(...coordinates.x);\n else\n xShift += coordinates.x[numbers.natom - 1] - coordinates.x[0];\n }\n\n const entries = 4;\n const collNumber = Math.ceil(collection.length / entries);\n\n collectionBlock += 'M V30 MDLV30/STEABS ATOMS=(' + collection.length + ' -\\n';\n for (let i = 0; i < collNumber; i++) {\n collectionBlock += 'M V30 ';\n const entriesCurrent = i + 1 === collNumber ? collection.length - (collNumber - 1) * entries : entries;\n for (let j = 0; j < entriesCurrent; j++) {\n collectionBlock += (j + 1 === entriesCurrent) ?\n (i === collNumber - 1 ? collection[entries * i + j] + ')\\n' : collection[entries * i + j] + ' -\\n') :\n collection[entries * i + j] + ' ';\n }\n }\n\n //generate file\n natom++;\n macroMolBlock += 'M V30 COUNTS ' + natom + ' ' + nbond + ' 0 0 0\\n';\n macroMolBlock += 'M V30 BEGIN ATOM\\n';\n macroMolBlock += atomBlock;\n macroMolBlock += 'M V30 END ATOM\\n';\n macroMolBlock += 'M V30 BEGIN BOND\\n';\n macroMolBlock += bondBlock;\n macroMolBlock += 'M V30 END BOND\\n';\n if (useChirality && collection.length > 0) {\n macroMolBlock += 'M V30 BEGIN COLLECTION\\n';\n macroMolBlock += collectionBlock;\n macroMolBlock += 'M V30 END COLLECTION\\n';\n } else { macroMolBlock = macroMolBlock.replace(/ CFG=\\d/g, ' '); }\n\n macroMolBlock += 'M V30 END CTAB\\n';\n macroMolBlock += 'M END';\n\n return macroMolBlock;\n }\n\n private fix5Prime(coordinates: { atomIndex: number[], atomType: string[], x: number[], y: number[] },\n indexFivePrime: number, indexThreePrime: number) {\n const indexFivePrimeNeighbour = indexFivePrime + 1;\n const xShift = coordinates.x[indexFivePrimeNeighbour];\n const yShift = coordinates.y[indexFivePrimeNeighbour];\n const base3PrimeX = coordinates.x[indexThreePrime] - xShift;\n const base3PrimeY = coordinates.y[indexThreePrime] - yShift;\n const base5PrimeX = coordinates.x[indexFivePrime] - xShift;\n const base5PrimeY = coordinates.y[indexFivePrime] - yShift;\n\n const rotated5PrimeX = base5PrimeX * Math.cos(Math.PI * 2 / 3) - base5PrimeY * Math.sin(Math.PI * 2 / 3);\n const rotated5PrimeY = base5PrimeX * Math.sin(Math.PI * 2 / 3) + base5PrimeY * Math.cos(Math.PI * 2 / 3);\n\n const dx = base5PrimeX - base3PrimeX;\n const dy = base5PrimeY - base3PrimeY;\n const dxRotated = rotated5PrimeX - base3PrimeX;\n const dyRotated = rotated5PrimeY - base3PrimeY;\n\n if (Math.sqrt(dyRotated * dyRotated + dxRotated * dxRotated) >= Math.sqrt(dy * dy + dx * dx)) {\n coordinates.x[indexFivePrime] = rotated5PrimeX + xShift;\n coordinates.y[indexFivePrime] = rotated5PrimeY + yShift;\n }\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs;","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./main-tab.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./main-tab.css\";\n export default content && content.locals ? content.locals : undefined;\n","const __WEBPACK_NAMESPACE_OBJECT__ = $;","/** Constants related to the structure of Molfile V2K */\nexport var V2K_CONST;\n(function (V2K_CONST) {\n V2K_CONST[\"HEADER\"] = \"V2000\";\n V2K_CONST[V2K_CONST[\"NUM_OF_HEADER_LINES\"] = 3] = \"NUM_OF_HEADER_LINES\";\n V2K_CONST[V2K_CONST[\"NUM_OF_COUNTS_DIGITS\"] = 3] = \"NUM_OF_COUNTS_DIGITS\";\n V2K_CONST[V2K_CONST[\"ATOM_TYPE_COL\"] = 4] = \"ATOM_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"FIRST_BONDED_ATOM_COL\"] = 1] = \"FIRST_BONDED_ATOM_COL\";\n V2K_CONST[V2K_CONST[\"BOND_TYPE_COL\"] = 3] = \"BOND_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"RGP_SHIFT\"] = 8] = \"RGP_SHIFT\";\n V2K_CONST[\"RGP_LINE\"] = \"M RGP\";\n V2K_CONST[\"A_LINE\"] = \"A \";\n V2K_CONST[\"END\"] = \"M END\";\n})(V2K_CONST || (V2K_CONST = {}));\nexport const MALFORMED_MOL_V2000 = `\nMalformed\n\n 0 0 0 0 0 0 0 0 0 0999 V2000\nM END`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12MmstY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2xmaWxlLXYyay1jb25zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3REFBd0Q7QUFDeEQsTUFBTSxDQUFOLElBQVksU0FlWDtBQWZELFdBQVksU0FBUztJQUNuQiw2QkFBZ0IsQ0FBQTtJQUNoQix1RUFBdUIsQ0FBQTtJQUV2Qix5RUFBd0IsQ0FBQTtJQUN4QiwyREFBaUIsQ0FBQTtJQUNqQiwyRUFBeUIsQ0FBQTtJQUN6QiwyREFBaUIsQ0FBQTtJQUdqQixtREFBYSxDQUFBO0lBQ2IsZ0NBQW1CLENBQUE7SUFDbkIsMkJBQWMsQ0FBQTtJQUVkLDJCQUFjLENBQUE7QUFDaEIsQ0FBQyxFQWZXLFNBQVMsS0FBVCxTQUFTLFFBZXBCO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7Ozs7T0FJNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb25zdGFudHMgcmVsYXRlZCB0byB0aGUgc3RydWN0dXJlIG9mIE1vbGZpbGUgVjJLICovXG5leHBvcnQgZW51bSBWMktfQ09OU1Qge1xuICBIRUFERVIgPSAnVjIwMDAnLFxuICBOVU1fT0ZfSEVBREVSX0xJTkVTID0gMyxcblxuICBOVU1fT0ZfQ09VTlRTX0RJR0lUUyA9IDMsXG4gIEFUT01fVFlQRV9DT0wgPSA0LFxuICBGSVJTVF9CT05ERURfQVRPTV9DT0wgPSAxLFxuICBCT05EX1RZUEVfQ09MID0gMyxcblxuXG4gIFJHUF9TSElGVCA9IDgsXG4gIFJHUF9MSU5FID0gJ00gIFJHUCcsXG4gIEFfTElORSA9ICdBICAnLFxuXG4gIEVORCA9ICdNICBFTkQnLFxufVxuXG5leHBvcnQgY29uc3QgTUFMRk9STUVEX01PTF9WMjAwMCA9IGBcbk1hbGZvcm1lZFxuXG4gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDA5OTkgVjIwMDBcbk0gIEVORGA7XG4iXX0=","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./colored-text-input.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./colored-text-input.css\";\n export default content && content.locals ? content.locals : undefined;\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\nimport $ from 'cash-dom';\n\nconst InvalidMolfileError = class extends Error {\n constructor(message: string) { super(message); }\n};\n\nexport class MoleculeImage {\n constructor(molblok: string) {\n this.molblock = molblok;\n }\n\n private _validMolBlock: string;\n get molblock(): string { return this._validMolBlock; }\n\n set molblock(value: string) {\n try {\n this.validateMolBlock(value);\n } catch (error) {\n if (error instanceof InvalidMolfileError)\n value = '';\n const errorMessage = errorToConsole(error);\n console.error(errorMessage);\n }\n this._validMolBlock = value;\n }\n\n private validateMolBlock(molblock: string): void {\n // todo: add a sound criterion\n if (molblock === '')\n throw new InvalidMolfileError('MoleculeImage: invalid molblock');\n }\n\n private async drawMolBlockOnCanvas(canvas: HTMLCanvasElement): Promise<void> {\n try {\n await grok.functions.call('Chem:canvasMol', {\n x: 0, y: 0, w: canvas.width, h: canvas.height, canvas: canvas,\n molString: this.molblock, scaffoldMolString: '',\n options: {normalizeDepiction: false, straightenDepiction: false}\n });\n } catch (err) {\n const errStr = errorToConsole(err);\n console.error(errStr);\n }\n };\n\n private getMoleculeDimensions(): {height: number, width: number} {\n const molData = MolfileHandler.getInstance(this.molblock);\n const width: number = Math.max(...molData.x) - Math.min(...molData.x);\n const height: number = Math.max(...molData.y) - Math.min(...molData.y);\n return {height: height, width: width};\n }\n\n private async zoomIn(): Promise<void> {\n const dialog = ui.dialog('Molecule');\n const dialogDivStyle = {\n overflowX: 'scroll',\n };\n const dialogDiv = ui.div([], {style: dialogDivStyle});\n\n const height = $(window).height() * 0.7;\n const molDimensions = this.getMoleculeDimensions();\n\n const zoomRatio = height / molDimensions.height;\n\n const dialogCanvasHeight = height;\n const dialogCanvasWidth = molDimensions.width * zoomRatio;\n\n const dialogCanvas = ui.canvas(dialogCanvasWidth, dialogCanvasHeight);\n await this.drawMolBlockOnCanvas(dialogCanvas);\n\n dialogDiv.appendChild(dialogCanvas);\n dialog.add(dialogDiv).showModal(true);\n }\n\n public async drawMolecule(\n moleculeImgDiv: HTMLDivElement,\n canvasWidth: number, canvasHeight: number\n ): Promise<void> {\n moleculeImgDiv.innerHTML = '';\n\n const canvas = ui.canvas(canvasWidth * window.devicePixelRatio, canvasHeight * window.devicePixelRatio);\n\n // Draw zoomed-out molecule\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n canvas.style.borderStyle = 'solid';\n canvas.style.borderColor = 'var(--grey-3)';\n canvas.style.borderWidth = 'thin';\n this.drawMolBlockOnCanvas(canvas);\n\n // Dialog with zoomed-in molecule\n $(canvas).on('click', async () => { await this.zoomIn(); });\n $(canvas).on('mouseover', () => $(canvas).css('cursor', 'grab')); // for some reason 'zoom-in' value wouldn't work\n $(canvas).on('mouseout', () => $(canvas).css('cursor', 'default'));\n\n moleculeImgDiv.append(canvas);\n }\n}\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./sdf-tab.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./sdf-tab.css\";\n export default content && content.locals ? content.locals : undefined;\n","import {NUCLEOTIDES} from '../const';\nimport {axolabsStyleMap} from '../data-loading-utils/json-loader';\n\nexport function isOverhang(modification: string): boolean {\n return modification.slice(-3) === '(o)';\n}\n\nexport function isOneDigitNumber(n: number): boolean {\n return n < 10;\n}\n\n// https://uxdesign.cc/star-rating-make-svg-great-again-d4ce4731347e\nexport function getPointsToDrawStar(centerX: number, centerY: number): string {\n const innerCirclePoints = 5; // a 5 point star\n const innerRadius = 15 / innerCirclePoints;\n const innerOuterRadiusRatio = 2; // outter circle is x2 the inner\n const outerRadius = innerRadius * innerOuterRadiusRatio;\n const angle = Math.PI / innerCirclePoints;\n const angleOffsetToCenterStar = 60;\n const totalNumberOfPoints = innerCirclePoints * 2; // 10 in a 5-points star\n\n let points = '';\n for (let i = 0; i < totalNumberOfPoints; i++) {\n const r = (i % 2 === 0) ? outerRadius : innerRadius;\n const currentX = centerX + Math.cos(i * angle + angleOffsetToCenterStar) * r;\n const currentY = centerY + Math.sin(i * angle + angleOffsetToCenterStar) * r;\n points += `${currentX},${currentY} `;\n }\n return points;\n}\n\nexport function countOverhangsOnTheRightEdge(modifications: string[]): number {\n let i = 0;\n while (i < modifications.length && isOverhang(modifications[i]))\n i++;\n return (i === modifications.length - 1) ? 0 : i;\n}\n\nexport function textWidth(text: string, font: number): number {\n const context = document.createElement('canvas').getContext('2d');\n // @ts-ignore\n context.font = String(font);\n // @ts-ignore\n return 2 * context.measureText(text).width;\n}\n\nexport function textInsideCircle(bases: string[], index: number): string {\n return (isOverhang(bases[index]) || !NUCLEOTIDES.includes(bases[index])) ? '' : bases[index];\n}\n\nexport function fontColorVisibleOnBackground(base: string): string {\n const AXOLABS_MAP = axolabsStyleMap;\n const rgbIntList = AXOLABS_MAP[base].color.match(/\\d+/g)!.map((e) => Number(e));\n return (rgbIntList[0] * 0.299 + rgbIntList[1] * 0.587 + rgbIntList[2] * 0.114) > 186 ? '#33333' : '#ffffff';\n}\n\nexport function baseColor(base: string): string {\n const AXOLABS_MAP = axolabsStyleMap;\n return AXOLABS_MAP[base].color;\n}\n\nexport const svg = {\n xmlns: 'http://www.w3.org/2000/svg',\n render: function(width: number, height: number): Element {\n const e = document.createElementNS(this.xmlns, 'svg');\n e.setAttribute('id', 'mySvg');\n e.setAttribute('width', String(width));\n e.setAttribute('height', String(height));\n return e;\n },\n circle: function(x: number, y: number, radius: number, color: string): Element {\n const e = document.createElementNS(this.xmlns, 'circle');\n e.setAttribute('cx', String(x));\n e.setAttribute('cy', String(y));\n e.setAttribute('r', String(radius));\n e.setAttribute('fill', color);\n return e;\n },\n text: function(text: string, x: number, y: number, fontSize: number, color: string): Element {\n const e = document.createElementNS(this.xmlns, 'text');\n e.setAttribute('x', String(x));\n e.setAttribute('y', String(y));\n e.setAttribute('font-size', String(fontSize));\n e.setAttribute('font-weight', 'normal');\n e.setAttribute('font-family', 'Arial');\n e.setAttribute('fill', color);\n e.innerHTML = text;\n return e;\n },\n star: function(x: number, y: number, fill: string): Element {\n const e = document.createElementNS(this.xmlns, 'polygon');\n e.setAttribute('points', getPointsToDrawStar(x, y));\n e.setAttribute('fill', fill);\n return e;\n },\n};\n","import {NUCLEOTIDES} from '../const';\nimport {isOverhang, svg, textWidth, countOverhangsOnTheRightEdge, baseColor, textInsideCircle,\n fontColorVisibleOnBackground, isOneDigitNumber} from './helpers';\n\nconst BASE_RADIUS = 15;\nconst BASE_DIAMETER = 2 * BASE_RADIUS;\nconst shiftToAlignTwoDigitNumberNearCircle = -10;\nconst shiftToAlignOneDigitNumberNearCircle = -5;\nconst LEGEND_RADIUS = 6;\nconst PS_LINKAGE_RADIUS = 5;\nconst BASE_FONT_SIZE = 17;\nconst LEGEND_FONT_SIZE = 14;\nconst PS_LINKAGE_COLOR = 'red';\nconst FONT_COLOR = 'var(--grey-6)';\nconst TITLE_FONT_COLOR = 'black';\nconst MODIFICATIONS_COLOR = 'red';\nconst SS_LEFT_TEXT = 'SS: 5\\'';\nconst AS_LEFT_TEXT = 'AS: 3\\'';\nconst SS_RIGHT_TEXT = '3\\'';\nconst AS_RIGHT_TEXT = '5\\'';\n\nconst WIDTH_OF_LEFT_TEXT = Math.max(\n textWidth(SS_LEFT_TEXT, BASE_FONT_SIZE),\n textWidth(AS_LEFT_TEXT, BASE_FONT_SIZE),\n);\n\nconst WIDTH_OF_RIGHT_TEXT = Math.max(\n textWidth(SS_RIGHT_TEXT, BASE_FONT_SIZE),\n textWidth(AS_RIGHT_TEXT, BASE_FONT_SIZE),\n);\n\nconst X = {\n TITLE: BASE_RADIUS, // Math.round(width / 4),\n LEFT_TEXTS: 0,\n};\nconst X_OF_LEFT_MODIFICATIONS = X.LEFT_TEXTS + WIDTH_OF_LEFT_TEXT - 5;\n\nconst Y = {\n TITLE: BASE_RADIUS,\n SS_INDICES: 2 * BASE_RADIUS,\n SS_CIRCLES: 3.5 * BASE_RADIUS,\n SS_TEXTS: 4 * BASE_RADIUS,\n AS_CIRCLES: 6.5 * BASE_RADIUS,\n AS_TEXTS: 7 * BASE_RADIUS,\n AS_INDICES: 8.5 * BASE_RADIUS,\n comment: (asExists: boolean) => (asExists) ? 11 * BASE_RADIUS : 8.5 * BASE_RADIUS,\n circlesInLegends: (asExists: boolean) => (asExists) ? 9.5 * BASE_RADIUS : 6 * BASE_RADIUS,\n textLegend: (asExists: boolean) => (asExists) ? 10 * BASE_RADIUS - 3 : Y.AS_CIRCLES - 3,\n svgHeight: (asExists: boolean) => (asExists) ? 11 * BASE_RADIUS : 9 * BASE_RADIUS,\n};\n\nexport function drawAxolabsPattern(\n patternName: string, asExists: boolean, ssBases: string[],\n asBases: string[], ssPtoStatuses: boolean[], asPtoStatuses: boolean[],\n ss3Modification: string, ss5Modification: string,\n as3Modification: string, as5Modification: string, comment: string,\n enumerateModifications: string[],\n): Element {\n function equidistantXForLegend(index: number): number {\n return Math.round((index + startFrom) * width / (uniqueBases.length + startFrom) + LEGEND_RADIUS);\n }\n\n function xOfBaseCircles(index: number, rightOverhangs: number): number {\n return widthOfRightModification +\n (resultingNumberOfNucleotidesInStrands - index + rightOverhangs + 1) * BASE_DIAMETER;\n }\n\n function shiftToAlignNumberNearCircle(bases: string[], generalIndex: number, nucleotideIndex: number): number {\n return (isOneDigitNumber(nucleotideIndex) || NUCLEOTIDES.includes(bases[generalIndex])) ?\n shiftToAlignOneDigitNumberNearCircle : shiftToAlignTwoDigitNumberNearCircle;\n }\n\n ssBases = ssBases.reverse();\n ssPtoStatuses = ssPtoStatuses.reverse();\n\n const ssRightOverhangs = countOverhangsOnTheRightEdge(ssBases);\n const asRightOverhangs = countOverhangsOnTheRightEdge(asBases);\n\n const resultingNumberOfNucleotidesInStrands = Math.max(\n ssBases.length - ssRightOverhangs,\n asBases.length - asRightOverhangs,\n );\n\n const widthOfRightOverhangs = Math.max(ssRightOverhangs, asRightOverhangs);\n const widthOfBases = BASE_DIAMETER * (resultingNumberOfNucleotidesInStrands + widthOfRightOverhangs);\n\n const widthOfLeftModification = Math.max(\n textWidth(ss3Modification, BASE_FONT_SIZE),\n textWidth(as5Modification, BASE_FONT_SIZE),\n );\n\n const widthOfRightModification = Math.max(\n textWidth(ss5Modification, BASE_FONT_SIZE),\n textWidth(as3Modification, BASE_FONT_SIZE),\n );\n\n const uniqueBases = asExists ?\n [...new Set(ssBases.concat(asBases))] :\n [...new Set(ssBases)];\n\n const isPtoExist = asExists ?\n ssPtoStatuses.concat(asPtoStatuses).includes(true) :\n ssPtoStatuses.includes(true);\n\n const startFrom = isPtoExist ? 1 : 0;\n\n const xOfSsRightModifications = ssRightOverhangs * BASE_DIAMETER + xOfBaseCircles(-0.5, 0);\n const xOfAsRightModifications = asRightOverhangs * BASE_DIAMETER + xOfBaseCircles(-0.5, 0);\n\n const xOfRightTexts = Math.max(xOfSsRightModifications, xOfAsRightModifications) + widthOfLeftModification +\n BASE_DIAMETER * widthOfRightOverhangs;\n\n const width = WIDTH_OF_LEFT_TEXT + widthOfLeftModification + widthOfBases + widthOfRightModification +\n WIDTH_OF_RIGHT_TEXT + BASE_DIAMETER;\n const image = svg.render(width, Y.svgHeight(asExists));\n\n image.append(\n svg.text(SS_LEFT_TEXT, X.LEFT_TEXTS, Y.SS_TEXTS, BASE_FONT_SIZE, FONT_COLOR),\n asExists ? svg.text(AS_LEFT_TEXT, X.LEFT_TEXTS, Y.AS_TEXTS, BASE_FONT_SIZE, FONT_COLOR) : '',\n svg.text(SS_RIGHT_TEXT, xOfRightTexts, Y.SS_TEXTS, BASE_FONT_SIZE, FONT_COLOR),\n asExists ? svg.text(AS_RIGHT_TEXT, xOfRightTexts, Y.AS_TEXTS, BASE_FONT_SIZE, FONT_COLOR) : '',\n svg.text(ss5Modification, X_OF_LEFT_MODIFICATIONS, Y.SS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR),\n asExists ? svg.text(as3Modification, X_OF_LEFT_MODIFICATIONS, Y.AS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR) : '',\n svg.text(ss3Modification, xOfSsRightModifications, Y.SS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR),\n asExists ? svg.text(as5Modification, xOfAsRightModifications, Y.AS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR) : '',\n svg.text(comment, X.LEFT_TEXTS, Y.comment(asExists), LEGEND_FONT_SIZE, FONT_COLOR),\n isPtoExist ? svg.star(BASE_RADIUS, Y.circlesInLegends(asExists), PS_LINKAGE_COLOR) : '',\n isPtoExist ? svg.text('ps linkage', 2 * BASE_RADIUS - 8, Y.textLegend(asExists), LEGEND_FONT_SIZE, FONT_COLOR) : '',\n );\n\n const numberOfSsNucleotides = ssBases.filter((value) => !isOverhang(value)).length;\n let nucleotideCounter = numberOfSsNucleotides;\n for (let i = ssBases.length - 1; i > -1; i--) {\n const xOfNumbers = xOfBaseCircles(i, ssRightOverhangs) +\n shiftToAlignNumberNearCircle(ssBases, ssBases.length - i, numberOfSsNucleotides - nucleotideCounter);\n if (!isOverhang(ssBases[i]))\n nucleotideCounter--;\n const n = (!isOverhang(ssBases[i]) && enumerateModifications.includes(ssBases[i])) ?\n String(numberOfSsNucleotides - nucleotideCounter) : '';\n image.append(\n svg.text(n, xOfNumbers, Y.SS_INDICES, LEGEND_FONT_SIZE, FONT_COLOR),\n svg.circle(xOfBaseCircles(i, ssRightOverhangs), Y.SS_CIRCLES, BASE_RADIUS, baseColor(ssBases[i])),\n svg.text(textInsideCircle(ssBases, i), xOfNumbers, Y.SS_TEXTS, BASE_FONT_SIZE,\n fontColorVisibleOnBackground(ssBases[i])),\n ssPtoStatuses[i] ?\n svg.star(xOfBaseCircles(i, ssRightOverhangs) + BASE_RADIUS, Y.SS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) :\n '',\n );\n }\n image.append(\n ssPtoStatuses[ssBases.length] ?\n svg.star(xOfBaseCircles(ssBases.length, ssRightOverhangs) +\n BASE_RADIUS, Y.SS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) : '',\n );\n\n const numberOfAsNucleotides = asBases.filter((value) => !isOverhang(value)).length;\n if (asExists) {\n let nucleotideCounter = numberOfAsNucleotides;\n for (let i = asBases.length - 1; i > -1; i--) {\n if (!isOverhang(asBases[i]))\n nucleotideCounter--;\n const xOfNumbers = xOfBaseCircles(i, asRightOverhangs) +\n shiftToAlignNumberNearCircle(asBases, i, nucleotideCounter + 1);\n const n = (!isOverhang(asBases[i]) && enumerateModifications.includes(asBases[i])) ?\n String(nucleotideCounter + 1) : '';\n image.append(\n svg.text(n, xOfNumbers, Y.AS_INDICES, LEGEND_FONT_SIZE, FONT_COLOR),\n svg.circle(xOfBaseCircles(i, asRightOverhangs), Y.AS_CIRCLES, BASE_RADIUS, baseColor(asBases[i])),\n svg.text(textInsideCircle(asBases, i),\n xOfBaseCircles(i, asRightOverhangs) + shiftToAlignNumberNearCircle(asBases, i, nucleotideCounter + 1),\n Y.AS_TEXTS, BASE_FONT_SIZE, fontColorVisibleOnBackground(asBases[i])),\n asPtoStatuses[i] ? svg.star(xOfBaseCircles(i, asRightOverhangs) +\n BASE_RADIUS, Y.AS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) : '',\n );\n }\n image.append(\n asPtoStatuses[asBases.length] ?\n svg.star(xOfBaseCircles(asBases.length, asRightOverhangs) + BASE_RADIUS, Y.AS_TEXTS + PS_LINKAGE_RADIUS,\n PS_LINKAGE_COLOR) : '',\n );\n }\n\n const title = `${patternName} for ${numberOfSsNucleotides}${(asExists ? `/${numberOfAsNucleotides}` : '')}mer`;\n image.append(svg.text(title, X.TITLE, Y.TITLE, BASE_FONT_SIZE, TITLE_FONT_COLOR));\n for (let i = 0; i < uniqueBases.length; i++) {\n image.append(\n svg.circle(equidistantXForLegend(i), Y.circlesInLegends(asExists), LEGEND_RADIUS, baseColor(uniqueBases[i])),\n svg.text(uniqueBases[i], equidistantXForLegend(i) + LEGEND_RADIUS + 4, Y.textLegend(asExists), LEGEND_FONT_SIZE,\n FONT_COLOR),\n );\n }\n return image;\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","/** Alphabet candidate type */\nexport class CandidateType {\n constructor(name, alphabet, cutoff) {\n this.name = name;\n this.alphabet = alphabet;\n this.cutoff = cutoff;\n }\n}\n/** Alphabet candidate similarity type */\nexport class CandidateSimType extends CandidateType {\n constructor(candidate, freq, similarity) {\n super(candidate.name, candidate.alphabet, candidate.cutoff);\n this.freq = freq;\n this.similarity = similarity;\n }\n}\n//# sourceMappingURL=types.js.map","import { CandidateType } from './types';\nexport const monomerRe = /(\\[[A-Za-z0-9-_]+\\]|.)/g;\nexport const Alphabets = new class {\n constructor() {\n this.fasta = {\n peptide: new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n ]),\n dna: new Set(['A', 'C', 'G', 'T']),\n rna: new Set(['A', 'C', 'G', 'U']),\n };\n }\n}();\nexport const candidateAlphabets = [\n new CandidateType(\"PT\" /* ALPHABET.PT */, Alphabets.fasta.peptide, 0.50),\n new CandidateType(\"DNA\" /* ALPHABET.DNA */, Alphabets.fasta.dna, 0.55),\n new CandidateType(\"RNA\" /* ALPHABET.RNA */, Alphabets.fasta.rna, 0.55),\n];\n//# sourceMappingURL=consts.js.map","const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n","// Blosum 62 matrix for protein sequences\nconst BLOSUM62 = [[4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4],\n [-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4],\n [-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4],\n [-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4],\n [-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4],\n [-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4],\n [-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4],\n [-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4],\n [-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4],\n [-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4],\n [-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4],\n [-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4],\n [-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4],\n [1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4],\n [0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4],\n [-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4],\n [-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4],\n [0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4],\n [-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4],\n [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1]];\n// Protein indexes for BLOSUM matrix\nconst ProtIndexes = {\n 'A': 0, 'R': 1, 'N': 2, 'D': 3, 'C': 4, 'Q': 5, 'E': 6, 'G': 7, 'H': 8,\n 'I': 9, 'L': 10, 'K': 11, 'M': 12, 'F': 13, 'P': 14, 'S': 15, 'T': 16,\n 'W': 17, 'Y': 18, 'V': 19, 'B': 20, 'Z': 21, 'X': 22, '*': 23\n};\nconst defaultArgs = {\n gapOpen: 8,\n gapExtend: 2,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\n/** Returns a function that calculates the distance between two sequences based on gap penalty and matrix\n * @param {Partial<NeedlemanWunchArgs>}args - arguments for Needleman-Wunch algorithm like gap penalty, Scoring matrix..\n * @return {mmDistanceFunctionType} - function that calculates the distance between two sequences\n*/\nexport function needlemanWunch(args) {\n return (seq1, seq2) => {\n const { gapOpen, gapExtend, scoringMatrix, alphabetIndexes } = { ...defaultArgs, ...args };\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix = [\n new Array(seq1.length + 1).fill(0),\n new Array(seq1.length + 1).fill(0)\n ];\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps = new Array(seq1.length + 1).fill(false);\n const horizontalGaps = new Array(seq1.length + 1).fill(false);\n //variables to keep track which row we are in\n // they will swap places on each iteration\n let prevRow = 0;\n let currRow = 1;\n // Initialize first row\n for (let i = 1; i < seq1.length + 1; i++)\n matrix[0][i] = -gapOpen - (i - 1) * gapExtend;\n // Calculate the rest of the matrix\n for (let i = 1; i < seq2.length + 1; i++) {\n matrix[currRow][0] = -gapOpen - (i - 1) * gapExtend;\n for (let j = 1; j < seq1.length + 1; j++) {\n const diagonal = matrix[prevRow][j - 1] + scoringMatrix[alphabetIndexes[seq1[j - 1]]][alphabetIndexes[seq2[i - 1]]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen);\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(diagonal, left, top);\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n }\n else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\n }\n else {\n verticalGaps[j] = true;\n horizontalGaps[j] = false;\n }\n }\n // Swap rows\n prevRow = currRow;\n currRow = (currRow + 1) % 2;\n }\n // as the matrix is the similarity matrix, but we are interested in distance,\n // we need compare it to perfect match score to get reasonable distance\n const perfectMatchSeq1 = seq1.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n .reduce((a, b) => a + b, 0);\n const perfectMatchSeq2 = seq2.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n .reduce((a, b) => a + b, 0);\n const maxScore = Math.max(perfectMatchSeq1, perfectMatchSeq2);\n return (maxScore - matrix[prevRow][seq1.length]) / maxScore;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZGxlbWFuLXd1bnNjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lZWRsZW1hbi13dW5zY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEseUNBQXlDO0FBQ3pDLE1BQU0sUUFBUSxHQUNkLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFD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QUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDOUQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIEJsb3N1bSA2MiBtYXRyaXggZm9yIHByb3RlaW4gc2VxdWVuY2VzXG5jb25zdCBCTE9TVU02MjpBcnJheTxBcnJheTxudW1iZXI+PiA9XG5bWzQsIC0xLCAtMiwgLTIsIDAsIC0xLCAtMSwgMCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDAsIC0zLCAtMiwgMCwgLTIsIC0xLCAwLCAtNF0sXG4gIFstMSwgNSwgMCwgLTIsIC0zLCAxLCAwLCAtMiwgMCwgLTMsIC0yLCAyLCAtMSwgLTMsIC0yLCAtMSwgLTEsIC0zLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTRdLFxuICBbLTIsIDAsIDYsIDEsIC0zLCAwLCAwLCAwLCAxLCAtMywgLTMsIDAsIC0yLCAtMywgLTIsIDEsIDAsIC00LCAtMiwgLTMsIDMsIDAsIC0xLCAtNF0sXG4gIFstMiwgLTIsIDEsIDYsIC0zLCAwLCAyLCAtMSwgLTEsIC0zLCAtNCwgLTEsIC0zLCAtMywgLTEsIDAsIC0xLCAtNCwgLTMsIC0zLCA0LCAxLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgOSwgLTMsIC00LCAtMywgLTMsIC0xLCAtMSwgLTMsIC0xLCAtMiwgLTMsIC0xLCAtMSwgLTIsIC0yLCAtMSwgLTMsIC0zLCAtMiwgLTRdLFxuICBbLTEsIDEsIDAsIDAsIC0zLCA1LCAyLCAtMiwgMCwgLTMsIC0yLCAxLCAwLCAtMywgLTEsIDAsIC0xLCAtMiwgLTEsIC0yLCAwLCAzLCAtMSwgLTRdLFxuICBbLTEsIDAsIDAsIDIsIC00LCAyLCA1LCAtMiwgMCwgLTMsIC0zLCAxLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTMsIC0yLCAtMiwgMSwgNCwgLTEsIC00XSxcbiAgWzAsIC0yLCAwLCAtMSwgLTMsIC0yLCAtMiwgNiwgLTIsIC00LCAtNCwgLTIsIC0zLCAtMywgLTIsIDAsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtNF0sXG4gIFstMiwgMCwgMSwgLTEsIC0zLCAwLCAwLCAtMiwgOCwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtMiwgLTEsIC0yLCAtMiwgMiwgLTMsIDAsIDAsIC0xLCAtNF0sXG4gIFstMSwgLTMsIC0zLCAtMywgLTEsIC0zLCAtMywgLTQsIC0zLCA0LCAyLCAtMywgMSwgMCwgLTMsIC0yLCAtMSwgLTMsIC0xLCAzLCAtMywgLTMsIC0xLCAtNF0sXG4gIFstMSwgLTIsIC0zLCAtNCwgLTEsIC0yLCAtMywgLTQsIC0zLCAyLCA0LCAtMiwgMiwgMCwgLTMsIC0yLCAtMSwgLTIsIC0xLCAxLCAtNCwgLTMsIC0xLCAtNF0sXG4gIFstMSwgMiwgMCwgLTEsIC0zLCAxLCAxLCAtMiwgLTEsIC0zLCAtMiwgNSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDAsIDEsIC0xLCAtNF0sXG4gIFstMSwgLTEsIC0yLCAtMywgLTEsIDAsIC0yLCAtMywgLTIsIDEsIDIsIC0xLCA1LCAwLCAtMiwgLTEsIC0xLCAtMSwgLTEsIDEsIC0zLCAtMSwgLTEsIC00XSxcbiAgWy0yLCAtMywgLTMsIC0zLCAtMiwgLTMsIC0zLCAtMywgLTEsIDAsIDAsIC0zLCAwLCA2LCAtNCwgLTIsIC0yLCAxLCAzLCAtMSwgLTMsIC0zLCAtMSwgLTRdLFxuICBbLTEsIC0yLCAtMiwgLTEsIC0zLCAtMSwgLTEsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC00LCA3LCAtMSwgLTEsIC00LCAtMywgLTIsIC0yLCAtMSwgLTIsIC00XSxcbiAgWzEsIC0xLCAxLCAwLCAtMSwgMCwgMCwgMCwgLTEsIC0yLCAtMiwgMCwgLTEsIC0yLCAtMSwgNCwgMSwgLTMsIC0yLCAtMiwgMCwgMCwgMCwgLTRdLFxuICBbMCwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDUsIC0yLCAtMiwgMCwgLTEsIC0xLCAwLCAtNF0sXG4gIFstMywgLTMsIC00LCAtNCwgLTIsIC0yLCAtMywgLTIsIC0yLCAtMywgLTIsIC0zLCAtMSwgMSwgLTQsIC0zLCAtMiwgMTEsIDIsIC0zLCAtNCwgLTMsIC0yLCAtNF0sXG4gIFstMiwgLTIsIC0yLCAtMywgLTIsIC0xLCAtMiwgLTMsIDIsIC0xLCAtMSwgLTIsIC0xLCAzLCAtMywgLTIsIC0yLCAyLCA3LCAtMSwgLTMsIC0yLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgLTEsIC0yLCAtMiwgLTMsIC0zLCAzLCAxLCAtMiwgMSwgLTEsIC0yLCAtMiwgMCwgLTMsIC0xLCA0LCAtMywgLTIsIC0xLCAtNF0sXG4gIFstMiwgLTEsIDMsIDQsIC0zLCAwLCAxLCAtMSwgMCwgLTMsIC00LCAwLCAtMywgLTMsIC0yLCAwLCAtMSwgLTQsIC0zLCAtMywgNCwgMSwgLTEsIC00XSxcbiAgWy0xLCAwLCAwLCAxLCAtMywgMywgNCwgLTIsIDAsIC0zLCAtMywgMSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDEsIDQsIC0xLCAtNF0sXG4gIFswLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTIsIDAsIDAsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC00XSxcbiAgWy00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgMV1dO1xuXG4vLyBQcm90ZWluIGluZGV4ZXMgZm9yIEJMT1NVTSBtYXRyaXhcbmNvbnN0IFByb3RJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfSA9IHtcbiAgJ0EnOiAwLCAnUic6IDEsICdOJzogMiwgJ0QnOiAzLCAnQyc6IDQsICdRJzogNSwgJ0UnOiA2LCAnRyc6IDcsICdIJzogOCxcbiAgJ0knOiA5LCAnTCc6IDEwLCAnSyc6IDExLCAnTSc6IDEyLCAnRic6IDEzLCAnUCc6IDE0LCAnUyc6IDE1LCAnVCc6IDE2LFxuICAnVyc6IDE3LCAnWSc6IDE4LCAnVic6IDE5LCAnQic6IDIwLCAnWic6IDIxLCAnWCc6IDIyLCAnKic6IDIzXG59O1xuXG5pbnRlcmZhY2UgTmVlZGxlbWFuV3VuY2hBcmdzIHtcbiAgZ2FwT3BlbjogbnVtYmVyO1xuICBnYXBFeHRlbmQ6IG51bWJlcjtcbiAgc2NvcmluZ01hdHJpeDogbnVtYmVyW11bXTtcbiAgYWxwaGFiZXRJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfTtcbn1cblxuY29uc3QgZGVmYXVsdEFyZ3M6IE5lZWRsZW1hbld1bmNoQXJncyA9IHtcbiAgZ2FwT3BlbjogOCxcbiAgZ2FwRXh0ZW5kOiAyLFxuICBzY29yaW5nTWF0cml4OiBCTE9TVU02MixcbiAgYWxwaGFiZXRJbmRleGVzOiBQcm90SW5kZXhlc1xufTtcblxuLyoqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyBiYXNlZCBvbiBnYXAgcGVuYWx0eSBhbmQgbWF0cml4XG4gKiBAcGFyYW0ge1BhcnRpYWw8TmVlZGxlbWFuV3VuY2hBcmdzPn1hcmdzIC0gYXJndW1lbnRzIGZvciBOZWVkbGVtYW4tV3VuY2ggYWxnb3JpdGhtIGxpa2UgZ2FwIHBlbmFsdHksIFNjb3JpbmcgbWF0cml4Li5cbiAqIEByZXR1cm4ge21tRGlzdGFuY2VGdW5jdGlvblR5cGV9IC0gZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXNcbiovXG5leHBvcnQgZnVuY3Rpb24gbmVlZGxlbWFuV3VuY2goYXJnczogUGFydGlhbDxOZWVkbGVtYW5XdW5jaEFyZ3M+KTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpIDogbnVtYmVyID0+IHtcbiAgICBjb25zdCB7Z2FwT3BlbiwgZ2FwRXh0ZW5kLCBzY29yaW5nTWF0cml4LCBhbHBoYWJldEluZGV4ZXN9ID0gey4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzfTtcbiAgICAvLyBBcyB3ZSBkb24ndCBuZWVkIHRyYWNlYmFjaywgbm8gbmVlZCB0byBzdG9yZSB0aGUgd2hvbGUgbWF0cml4XG4gICAgLy8gSW50ZWFkLCB3ZSB3aWxsIHN0b3JlIG9ubHkgdGhlIGxhc3QgdHdvIHJvd3NcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW10gPSBbXG4gICAgICBuZXcgQXJyYXk8bnVtYmVyPihzZXExLmxlbmd0aCArIDEpLmZpbGwoMCksXG4gICAgICBuZXcgQXJyYXk8bnVtYmVyPihzZXExLmxlbmd0aCArIDEpLmZpbGwoMClcbiAgICBdO1xuICAgIC8vIHNpbWlsYXJseSwgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgb3BlcmF0aW9uIGxlZCB0byB0aGUgY3VycmVudCBjZWxsXG4gICAgLy8gaS5lLiB3aGV0aGVyIHdlIGNhbWUgZnJvbSB0aGUgbGVmdCwgdG9wIG9yIGRpYWdvbmFsIHRvIGFzc2lnbiBnYXAgb3Blbi9nYXAgZXh0ZW5kIHBlbmFsdHlcbiAgICBjb25zdCB2ZXJ0aWNhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArIDEpLmZpbGwoZmFsc2UpO1xuICAgIGNvbnN0IGhvcml6b250YWxHYXBzOiBib29sZWFuW10gPSBuZXcgQXJyYXk8Ym9vbGVhbj4oc2VxMS5sZW5ndGggKyAxKS5maWxsKGZhbHNlKTtcblxuICAgIC8vdmFyaWFibGVzIHRvIGtlZXAgdHJhY2sgd2hpY2ggcm93IHdlIGFyZSBpblxuICAgIC8vIHRoZXkgd2lsbCBzd2FwIHBsYWNlcyBvbiBlYWNoIGl0ZXJhdGlvblxuICAgIGxldCBwcmV2Um93ID0gMDtcbiAgICBsZXQgY3VyclJvdyA9IDE7XG4gICAgLy8gSW5pdGlhbGl6ZSBmaXJzdCByb3dcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlcTEubGVuZ3RoICsgMTsgaSsrKVxuICAgICAgbWF0cml4WzBdW2ldID0gLWdhcE9wZW4gLSAoaSAtIDEpICogZ2FwRXh0ZW5kO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZXN0IG9mIHRoZSBtYXRyaXhcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlcTIubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICBtYXRyaXhbY3VyclJvd11bMF0gPSAtZ2FwT3BlbiAtIChpIC0gMSkgKiBnYXBFeHRlbmQ7XG4gICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlcTEubGVuZ3RoICsgMTsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRpYWdvbmFsID1cbiAgICAgICAgICBtYXRyaXhbcHJldlJvd11baiAtIDFdICsgc2NvcmluZ01hdHJpeFthbHBoYWJldEluZGV4ZXNbc2VxMVtqIC0gMV1dXVthbHBoYWJldEluZGV4ZXNbc2VxMltpIC0gMV1dXTtcbiAgICAgICAgY29uc3QgdG9wID0gbWF0cml4W3ByZXZSb3ddW2pdIC0gKHZlcnRpY2FsR2Fwc1tqXSA/IGdhcEV4dGVuZCA6IGdhcE9wZW4gKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IG1hdHJpeFtjdXJyUm93XVtqIC0gMV0gLSAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID8gZ2FwRXh0ZW5kIDogZ2FwT3Blbik7XG4gICAgICAgIG1hdHJpeFtjdXJyUm93XVtqXSA9IE1hdGgubWF4KFxuICAgICAgICAgIGRpYWdvbmFsLCBsZWZ0LCB0b3BcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGdhcCBhcnJheXNcbiAgICAgICAgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gZGlhZ29uYWwpIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gbGVmdCkge1xuICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSB0cnVlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN3YXAgcm93c1xuICAgICAgcHJldlJvdyA9IGN1cnJSb3c7XG4gICAgICBjdXJyUm93ID0gKGN1cnJSb3cgKyAxKSAlIDI7XG4gICAgfVxuICAgIC8vIGFzIHRoZSBtYXRyaXggaXMgdGhlIHNpbWlsYXJpdHkgbWF0cml4LCBidXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gZGlzdGFuY2UsXG4gICAgLy8gd2UgbmVlZCBjb21wYXJlIGl0IHRvIHBlcmZlY3QgbWF0Y2ggc2NvcmUgdG8gZ2V0IHJlYXNvbmFibGUgZGlzdGFuY2VcbiAgICBjb25zdCBwZXJmZWN0TWF0Y2hTZXExID0gc2VxMS5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCBwZXJmZWN0TWF0Y2hTZXEyID0gc2VxMi5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCBtYXhTY29yZSA9IE1hdGgubWF4KHBlcmZlY3RNYXRjaFNlcTEsIHBlcmZlY3RNYXRjaFNlcTIpO1xuICAgIHJldHVybiAobWF4U2NvcmUgLSBtYXRyaXhbcHJldlJvd11bc2VxMS5sZW5ndGhdKSAvIG1heFNjb3JlO1xuICB9O1xufVxuIl19","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunch } from './needleman-wunsch';\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport var MmDistanceFunctionsNames;\n(function (MmDistanceFunctionsNames) {\n MmDistanceFunctionsNames[\"HAMMING\"] = \"Hamming\";\n MmDistanceFunctionsNames[\"LEVENSHTEIN\"] = \"Levenshtein\";\n MmDistanceFunctionsNames[\"NEEDLEMANN_WUNSCH\"] = \"Needlemann-Wunsch\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0FBQzNDLENBQUMsRUFKVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBSW5DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCdcbn07XG5cbmV4cG9ydCBjb25zdCBtbURpc3RhbmNlRnVuY3Rpb25zOiBSZWNvcmQ8TW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLCAodmFsdWU/OiBhbnkpID0+IG1tRGlzdGFuY2VGdW5jdGlvblR5cGU+ID0ge1xuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBoYW1taW5nLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbGV2ZW5zdGVpbixcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF06IG5lZWRsZW1hbld1bmNoXG59O1xuIl19","export function hamming() {\n return (seq1, seq2) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n if (seq1.length !== seq2.length)\n diff = Math.abs(seq1.length - seq2.length);\n let result = 0;\n for (let i = 0; i < Math.min(seq1.length, seq2.length); i++) {\n if (seq1[i] !== seq2[i])\n result++;\n }\n result += diff;\n result /= Math.max(seq1.length, seq2.length);\n return result;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLE9BQU87SUFDckIsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUNwQywrREFBK0Q7UUFDL0QsK0ZBQStGO1FBQy9GLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTTtZQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLEVBQUUsQ0FBQztTQUNaO1FBQ0QsTUFBTSxJQUFJLElBQUksQ0FBQztRQUNmLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvblR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZygpOiBtbURpc3RhbmNlRnVuY3Rpb25UeXBlIHtcbiAgcmV0dXJuIChzZXExOiBzdHJpbmcsIHNlcTI6IHN0cmluZykgPT4ge1xuICAgIC8vIGhhbW1pbmcgZGlzdGFuY2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHNhbWUgc2l6ZSBzdHJpbmdzLFxuICAgIC8vIGJ1dCBzdGlsbCwgbGV0cyBhZGQgYSBjaGVjayBhbmQgaWYgdGhleSBhcmUgbm90IHNhbWUgbGVuZ3RoIGFkZCB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcmVzdWx0XG4gICAgbGV0IGRpZmYgPSAwO1xuICAgIGlmIChzZXExLmxlbmd0aCAhPT0gc2VxMi5sZW5ndGgpXG4gICAgICBkaWZmID0gTWF0aC5hYnMoc2VxMS5sZW5ndGggLSBzZXEyLmxlbmd0aCk7XG5cbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHNlcTEubGVuZ3RoLCBzZXEyLmxlbmd0aCk7IGkrKykge1xuICAgICAgaWYgKHNlcTFbaV0gIT09IHNlcTJbaV0pXG4gICAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgICByZXN1bHQgKz0gZGlmZjtcbiAgICByZXN1bHQgLz0gTWF0aC5tYXgoc2VxMS5sZW5ndGgsIHNlcTIubGVuZ3RoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIl19","import { distance } from 'fastest-levenshtein';\nexport function levenstein() {\n return (seq1, seq2) => {\n return distance(seq1, seq2) / Math.max(seq1.length, seq2.length);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZW5zdGVpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxldmVuc3RlaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGlzdGFuY2V9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxldmVuc3RlaW4oKTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gZGlzdGFuY2Uoc2VxMSwgc2VxMikgLyBNYXRoLm1heChzZXExLmxlbmd0aCwgc2VxMi5sZW5ndGgpO1xuICB9O1xufVxuIl19","import * as DG from 'datagrok-api/dg';\nimport { candidateAlphabets } from './macromolecule/consts';\nimport { detectAlphabet, getSplitterForColumn, getSplitterWithSeparator } from './macromolecule/utils';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport { getMonomerLibHelper } from '../monomer-works/monomer-utils';\nexport const Tags = new class {\n constructor() {\n /** Column's temp slot name for a UnitsHandler object */\n this.uhTemp = `units-handler.${DG.SEMTYPE.MACROMOLECULE}`;\n }\n}();\n/** Class for handling notation units in Macromolecule columns */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== \"fasta\" /* NOTATION.FASTA */)\n throw new Error(`The column of notation '${\"fasta\" /* NOTATION.FASTA */}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n uh.column.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n UnitsHandler.setTags(uh);\n }\n static setUnitsToSeparatorColumn(uh, separator) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== \"separator\" /* NOTATION.SEPARATOR */)\n throw new Error(`The column of notation '${\"separator\" /* NOTATION.SEPARATOR */}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n if (!separator)\n throw new Error(`The column of notation '${\"separator\" /* NOTATION.SEPARATOR */}' must have the separator tag.`);\n uh.column.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n uh.column.setTag(\"separator\" /* TAGS.separator */, separator);\n UnitsHandler.setTags(uh);\n }\n static setUnitsToHelmColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`The column of notation '${\"helm\" /* NOTATION.HELM */}' must be '${DG.SEMTYPE.MACROMOLECULE}'`);\n uh.column.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n UnitsHandler.setTags(uh);\n }\n /** From detectMacromolecule */\n static setTags(uh) {\n const units = uh.column.getTag(DG.TAGS.UNITS);\n const stats = uh.stats;\n const alphabetIsMultichar = Object.keys(stats.freq).some((m) => m.length > 1);\n if ([\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */].includes(units)) {\n // Empty monomer alphabet is not allowed\n if (Object.keys(stats.freq).length === 0)\n throw new Error('Alphabet is empty');\n const aligned = stats.sameLength ? \"SEQ.MSA\" /* ALIGNMENT.SEQ_MSA */ : \"SEQ\" /* ALIGNMENT.SEQ */;\n uh.column.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n const alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n uh.column.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n if (alphabet === \"UN\" /* ALPHABET.UN */) {\n const alphabetSize = Object.keys(stats.freq).length;\n const alphabetIsMultichar = Object.keys(stats.freq).some((m) => m.length > 1);\n uh.column.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, alphabetSize.toString());\n uh.column.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, alphabetIsMultichar ? 'true' : 'false');\n }\n }\n }\n get units() { return this._units; }\n get column() { return this._column; }\n get notation() { return this._notation; }\n get defaultGapSymbol() { return this._defaultGapSymbol; }\n get separator() {\n const separator = this.column.getTag(\"separator\" /* TAGS.separator */) ?? undefined;\n if (this.notation === \"separator\" /* NOTATION.SEPARATOR */ && separator === undefined)\n throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);\n return separator;\n }\n get aligned() {\n const aligned = this.column.getTag(\"aligned\" /* TAGS.aligned */);\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!aligned && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag aligned not set');\n return aligned;\n }\n /** Alphabet name (upper case) */\n get alphabet() {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!alphabet && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag alphabet not set');\n return alphabet;\n }\n get helmCompatible() {\n return this.column.getTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */);\n }\n getAlphabetSize() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */) {\n const alphabetSizeStr = this.column.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n let alphabetSize;\n if (alphabetSizeStr) {\n alphabetSize = parseInt(alphabetSizeStr);\n }\n else {\n // calculate alphabetSize on demand\n const stats = this.stats;\n alphabetSize = Object.keys(stats.freq).length;\n }\n return alphabetSize;\n }\n else {\n switch (this.alphabet) {\n case \"PT\" /* ALPHABET.PT */:\n return 20;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return 4;\n case 'NT':\n console.warn(`Unexpected alphabet 'NT'.`);\n return 4;\n default:\n throw new Error(`Unexpected alphabet '${this.alphabet}'.`);\n }\n }\n }\n getAlphabetIsMultichar() {\n if (this.notation === \"helm\" /* NOTATION.HELM */)\n return true;\n else if (this.alphabet !== \"UN\" /* ALPHABET.UN */)\n return false;\n else\n return this.column.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) === 'true';\n }\n /** */\n get splitted() {\n if (this._splitted === null) {\n const splitter = this.getSplitter();\n const colLength = this._column.length;\n this._splitted = new Array(colLength);\n const catIdxList = this._column.getRawData();\n const catList = this._column.categories;\n for (let rowI = 0; rowI < colLength; rowI++) {\n const seq = catList[catIdxList[rowI]];\n this._splitted[rowI] = splitter(seq);\n }\n }\n return this._splitted;\n }\n get stats() {\n if (this._stats === null) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of this.splitted) {\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n this._stats = { freq: freq, sameLength: sameLength };\n }\n return this._stats;\n }\n isFasta() { return this.notation === \"fasta\" /* NOTATION.FASTA */; }\n isSeparator() { return this.notation === \"separator\" /* NOTATION.SEPARATOR */; }\n isHelm() { return this.notation === \"helm\" /* NOTATION.HELM */; }\n isRna() { return this.alphabet === \"RNA\" /* ALPHABET.RNA */; }\n isDna() { return this.alphabet === \"DNA\" /* ALPHABET.DNA */; }\n isPeptide() { return this.alphabet === \"PT\" /* ALPHABET.PT */; }\n isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }\n isHelmCompatible() { return this.helmCompatible === 'true'; }\n /** Associate notation types with the corresponding units */\n /**\n * @return {NOTATION} Notation associated with the units type\n */\n getNotation() {\n if (this.units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return \"fasta\" /* NOTATION.FASTA */;\n else if (this.units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return \"separator\" /* NOTATION.SEPARATOR */;\n else if (this.units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return \"helm\" /* NOTATION.HELM */;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\n }\n /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} targetNotation\n * @return {DG.Column}\n */\n getNewColumn(targetNotation, separator) {\n const col = this.column;\n const len = col.length;\n const name = targetNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, targetNotation);\n if (targetNotation === \"separator\" /* NOTATION.SEPARATOR */) {\n if (!separator)\n throw new Error(`Notation \\'${\"separator\" /* NOTATION.SEPARATOR */}\\' requires separator value.`);\n newColumn.setTag(\"separator\" /* TAGS.separator */, separator);\n }\n newColumn.setTag(DG.TAGS.CELL_RENDERER, 'Macromolecule'); // cell.renderer\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n const srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (srcAlphabet)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (targetNotation == \"helm\" /* NOTATION.HELM */) {\n srcAlphabetSize = this.getAlphabetSize().toString();\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n }\n return newColumn;\n }\n /**\n * Create a new empty column using templateCol as a template\n *\n * @param {DG.Column} templateCol the properties and units of this column are used as a\n * template to build the new one\n * @return {DG.Column}\n */\n static getNewColumn(templateCol) {\n const col = UnitsHandler.getOrCreate(templateCol);\n const targetNotation = col.notation;\n return col.getNewColumn(targetNotation);\n }\n /**\n * A helper function checking the validity of the 'units' string\n *\n * @param {string} units the string to be validated\n * @return {boolean}\n */\n static unitsStringIsValid(units) {\n units = units.toLowerCase();\n const prefixes = [\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */, \"helm\" /* NOTATION.HELM */];\n const postfixes = ['rna', 'dna', 'pt'];\n const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));\n return prefixCriterion;\n }\n /**\n * Construct a new column of semantic type MACROMOLECULE from the list of\n * specified parameters\n *\n * @param {number} len the length of the new column\n * @param {string} name the name of the new column\n * @param {string} units the units of the new column\n * @return {DG.Column}\n */\n static getNewColumnFromParams(len, name, units) {\n // WARNING: in this implementation is is impossible to verify the uniqueness\n // of the new column's name\n // TODO: verify the validity of units parameter\n if (!UnitsHandler.unitsStringIsValid(units))\n throw new Error('Invalid format of \\'units\\' parameter');\n const newColumn = DG.Column.fromList('string', name, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, units);\n return newColumn;\n }\n /** Gets function to split seq value to monomers */\n getSplitter() {\n return getSplitterForColumn(this._column);\n }\n getDistanceFunctionName() {\n // TODO add support for helm and separator notation\n if (!this.isFasta())\n throw new Error('Only FASTA notation is supported');\n if (this.isMsa())\n return MmDistanceFunctionsNames.HAMMING;\n switch (this.alphabet) {\n // As DNA and RNA scoring matrices are same as identity matrices(mostly),\n // we can use very fast and optimized Levenshtein distance library\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n case \"PT\" /* ALPHABET.PT */:\n return MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH;\n // For default case, let's use Levenshtein distance\n default:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n }\n }\n getDistanceFunction() {\n return mmDistanceFunctions[this.getDistanceFunctionName()]();\n }\n // checks if the separator notation is compatible with helm library\n async checkHelmCompatibility() {\n // check first for the column tag to avoid extra processing\n if (this.column.tags.has(\".isHelmCompatible\" /* TAGS.isHelmCompatible */))\n return this.column.getTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */) === 'true';\n // get the monolmer lib and check against the column\n const monomerLibHelper = await getMonomerLibHelper();\n const bioLib = monomerLibHelper.getBioLib();\n // retrieve peptides\n const peptides = bioLib.getMonomerSymbolsByType(\"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */.toString());\n // convert the peptides list to a set for faster lookup\n const peptidesSet = new Set(peptides);\n // get splitter for given separator and check if all monomers are in the lib\n const splitterFunc = getSplitterWithSeparator(this.separator);\n // iterate over the columns, split them and check if all monomers are in the lib\n //TODO maybe add missing threshhold so that if there are not too many missing monomers\n // the column is still considered helm compatible\n for (const row of this.column.categories) {\n const monomers = splitterFunc(row);\n for (const monomer of monomers) {\n if (!peptidesSet.has(monomer)) {\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'false');\n return false;\n }\n }\n }\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'true');\n return true;\n }\n constructor(col) {\n this._splitted = null;\n this._stats = null;\n this._column = col;\n const units = this._column.getTag(DG.TAGS.UNITS);\n if (units !== null && units !== undefined)\n this._units = units;\n else\n throw new Error('Units are not specified in column');\n this._notation = this.getNotation();\n this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :\n (this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n if (!this.column.tags.has(\"aligned\" /* TAGS.aligned */) || !this.column.tags.has(\"alphabet\" /* TAGS.alphabet */) ||\n (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) && !this.isHelm() && this.alphabet === \"UN\" /* ALPHABET.UN */)) {\n // The following detectors and setters are to be called because the column is likely\n // as the UnitsHandler constructor was called on the column.\n if (this.isFasta()) {\n UnitsHandler.setUnitsToFastaColumn(this);\n }\n else if (this.isSeparator()) {\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n UnitsHandler.setUnitsToSeparatorColumn(this, separator);\n }\n else if (this.isHelm()) {\n UnitsHandler.setUnitsToHelmColumn(this);\n }\n else {\n throw new Error(`Unexpected units '${this.column.getTag(DG.TAGS.UNITS)}'.`);\n }\n }\n // if (!this.column.tags.has(TAGS.alphabetSize)) {\n // if (this.isHelm())\n // throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // else if (['UN'].includes(this.alphabet))\n // throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // }\n if (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */)) {\n if (this.isHelm()) {\n this.column.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, 'true');\n }\n else if (['UN'].includes(this.alphabet)) {\n throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n }\n }\n }\n /** Gets a column's UnitsHandler object from temp slot or creates a new and stores it to the temp slot. */\n static getOrCreate(col) {\n if (!(Tags.uhTemp in col.temp))\n col.temp[Tags.uhTemp] = new UnitsHandler(col);\n return col.temp[Tags.uhTemp];\n }\n}\nUnitsHandler._defaultGapSymbolsDict = {\n HELM: '*',\n SEPARATOR: '',\n FASTA: '-',\n};\n//# sourceMappingURL=units-handler.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { CandidateSimType } from './types';\nimport { Alphabets, candidateAlphabets, monomerRe } from './consts';\nimport { UnitsHandler } from '../units-handler';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorDotProduct, vectorLength } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../../aminoacids';\nimport { NucleotidesPalettes } from '../../nucleotides';\nimport { UnknownSeqPalettes } from '../../unknown';\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStatsForCol(seqCol, minLength, splitter) {\n const cats = seqCol.categories;\n const splitted = wu(seqCol.getRawData())\n .map((catI) => splitter(seqCol.categories[catI]));\n return getStats(splitted, minLength);\n}\nfunction getStats(splitted, minLength) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of splitted) {\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param {any} seq object with sequence\n * @return {string[]} array of monomers\n */\nexport function splitterAsFasta(seq) {\n return seq.toString().replace(monomerRe, '.$1').slice(1).split('.').map((monomer) => {\n if (monomer.startsWith('[') && monomer.endsWith(']'))\n return monomer.slice(1, -1);\n else if (monomer === '-')\n return '';\n else\n return monomer;\n });\n}\n/** Gets method to split sequence by separator\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n return seq.split(separator, limit);\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @return {string[]}\n */\nexport function splitterAsHelm(seq) {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return mmList.map(mmPostProcess);\n}\n/** Get splitter method to split sequences to monomers\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\n/** Generate splitter function for sequence column\n * @param {DG.Column} col\n * @return {SplitterFunc} Splitter function\n */\nexport function getSplitterForColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`Get splitter for semType \"${DG.SEMTYPE.MACROMOLECULE}\" only.`);\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n return getSplitter(units, separator);\n}\nconst longMonomerPartRe = /(\\w+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || (shortAminoMatch?.length ?? 0) > 1;\n const shortAmino = shortAminoMatch?.[0] ?? ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return Alphabets.fasta.dna;\n case \"RNA\" /* ALPHABET.RNA */:\n return Alphabets.fasta.rna;\n case \"PT\" /* ALPHABET.PT */:\n return Alphabets.fasta.peptide;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\n/** From detectMacromolecule */\nexport function detectAlphabet(freq, candidates, gapSymbol = '-') {\n const candidatesSims = candidates.map((c) => {\n const sim = getAlphabetSimilarity(freq, c.alphabet, gapSymbol);\n return new CandidateSimType(c, freq, sim);\n });\n let alphabetName;\n const maxSim = Math.max(...candidatesSims.map((cs) => cs.similarity > cs.cutoff ? cs.similarity : -1));\n if (maxSim > 0) {\n const sim = candidatesSims.find((cs) => cs.similarity === maxSim);\n alphabetName = sim.name;\n }\n else {\n alphabetName = \"UN\" /* ALPHABET.UN */;\n }\n return alphabetName;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const uh = UnitsHandler.getOrCreate(seqCol);\n alphabet = uh.alphabet;\n }\n else {\n const stats = getStatsForCol(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case \"PT\" /* ALPHABET.PT */:\n return AminoacidsPalettes.GrokGroups;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n }) ?? null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=utils.js.map","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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LENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=seq-palettes.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = monomer[0]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = monomer[1]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (monomer[0]?.toLowerCase() == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=aminoacids.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=nucleotides.js.map","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=unknown.js.map","// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport { HELM_CORE_FIELDS, jsonSdfMonomerLibDict, MONOMER_ENCODE_MAX, MONOMER_ENCODE_MIN, SDF_MONOMER_NAME } from '../utils/const';\nimport { getSplitter } from '../utils/macromolecule/utils';\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag(\"separator\" /* TAGS.separator */);\n const splitterFunc = getSplitter(units, sep);\n const encodedStringArray = [];\n for (let i = 0; i < col.length; ++i) {\n let encodedMonomerStr = '';\n const monomers = splitterFunc(col.get(i));\n monomers.forEach((m) => {\n if (!monomerSymbolDict[m]) {\n if (encodeSymbol > MONOMER_ENCODE_MAX) {\n grok.shell.error(`Not enough symbols to encode monomers`);\n return null;\n }\n monomerSymbolDict[m] = encodeSymbol;\n encodeSymbol++;\n }\n encodedMonomerStr += String.fromCodePoint(monomerSymbolDict[m]);\n });\n encodedStringArray.push(encodedMonomerStr);\n }\n return DG.Column.fromStrings('encodedMolecules', encodedStringArray);\n}\nexport function getMolfilesFromSeq(col, monomersLibObject) {\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n for (let i = 0; i < col.length; ++i) {\n const macroMolecule = col.get(i);\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n // what is the reason of double conversion?\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n }\n return molFiles;\n}\nexport function getMolfilesFromSingleSeq(cell, monomersLibObject) {\n const units = cell.column.tags[DG.TAGS.UNITS];\n const sep = cell.column.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const macroMolecule = cell.value;\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n return molFiles;\n}\nexport function createMomomersMolDict(lib) {\n const dict = {};\n lib.forEach((it) => {\n if (it['polymerType'] === 'PEPTIDE') {\n const monomerObject = {};\n HELM_CORE_FIELDS.forEach((field) => {\n monomerObject[field] = it[field];\n });\n dict[it[\"symbol\" /* HELM_FIELDS.SYMBOL */]] = monomerObject;\n }\n });\n return dict;\n}\nexport function createJsonMonomerLibFromSdf(table) {\n const resultLib = [];\n for (let i = 0; i < table.rowCount; i++) {\n const monomer = {};\n Object.keys(jsonSdfMonomerLibDict).forEach((key) => {\n if (key === \"symbol\" /* HELM_FIELDS.SYMBOL */) {\n const monomerSymbol = table.get(jsonSdfMonomerLibDict[key], i);\n monomer[key] = monomerSymbol === '.' ? table.get(SDF_MONOMER_NAME, i) : monomerSymbol;\n }\n else if (key === \"rgroups\" /* HELM_FIELDS.RGROUPS */) {\n const rgroups = table.get(jsonSdfMonomerLibDict[key], i).split('\\n');\n const jsonRgroups = [];\n rgroups.forEach((g) => {\n const rgroup = {};\n const altAtom = g.substring(g.lastIndexOf(']') + 1);\n const radicalNum = g.match(/\\[R(\\d+)\\]/)[1];\n rgroup[\"capGroupSmiles\" /* HELM_RGROUP_FIELDS.CAP_GROUP_SMILES */] = altAtom === 'H' ? `[*:${radicalNum}][H]` : `O[*:${radicalNum}]`;\n rgroup[\"alternateId\" /* HELM_RGROUP_FIELDS.ALTERNATE_ID */] = altAtom === 'H' ? `R${radicalNum}-H` : `R${radicalNum}-OH`;\n rgroup[\"capGroupName\" /* HELM_RGROUP_FIELDS.CAP_GROUP_NAME */] = altAtom === 'H' ? `H` : `OH`;\n rgroup[\"label\" /* HELM_RGROUP_FIELDS.LABEL */] = `R${radicalNum}`;\n jsonRgroups.push(rgroup);\n });\n monomer[key] = jsonRgroups;\n }\n else {\n if (jsonSdfMonomerLibDict[key])\n monomer[key] = table.get(jsonSdfMonomerLibDict[key], i);\n }\n });\n resultLib.push(monomer);\n }\n return resultLib;\n}\nexport async function getMonomerLibHelper() {\n const funcList = DG.Func.find({ package: 'Bio', name: 'getMonomerLibHelper' });\n if (funcList.length === 0)\n throw new Error('Package \"Bio\" must be installer for MonomerLibraryHelper.');\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\n//# sourceMappingURL=monomer-utils.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {SequenceTranslatorUI} from './view/view';\nimport {LIB_PATH, DEFAULT_LIB_FILENAME} from './model/data-loading-utils/const';\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {getJsonData} from './model/data-loading-utils/json-loader';\nimport {SequenceToMolfileConverter} from './model/sequence-to-structure-utils/sequence-to-molfile';\nimport {linkStrandsV3000} from './model/sequence-to-structure-utils/mol-transformations';\nimport {MonomerLibWrapper} from './model/monomer-lib/lib-wrapper';\nimport {FormatDetector} from './model/parsing-validation/format-detector';\nimport {SequenceValidator} from './model/parsing-validation/sequence-validator';\nimport {demoDesignPatternUI, demoVisualizeDuplexUI, demoTranslateSequenceUI} from './demo/demo-st-ui';\n\nclass StPackage extends DG.Package {\n private _monomerLib?: IMonomerLib;\n\n get monomerLib(): IMonomerLib {\n if (!this._monomerLib)\n throw new Error ('ST: monomer lib not loaded')\n return this._monomerLib!;\n }\n\n public async initMonomerLib(): Promise<void> {\n if (this._monomerLib !== undefined)\n return;\n\n const pi: DG.TaskBarProgressIndicator = DG.TaskBarProgressIndicator.create(\n 'Initializing Sequence Translator monomer library ...');\n try {\n const libHelper: IMonomerLibHelper = await getMonomerLibHelper();\n this._monomerLib = await libHelper.readLibrary(LIB_PATH, DEFAULT_LIB_FILENAME);\n } catch (err: any) {\n const errMsg: string = err.hasOwnProperty('message') ? err.message : err.toString();\n throw new Error('Sequence Translator: Loading monomer library error: ' + errMsg);\n } finally {\n pi.close();\n }\n }\n}\n\nexport const _package: StPackage = new StPackage();\n\n//name: Sequence Translator\n//tags: app\nexport async function sequenceTranslatorApp(): Promise<void> {\n const pi: DG.TaskBarProgressIndicator = DG.TaskBarProgressIndicator.create('Loading Sequence Translator app ...');\n\n try {\n await initSequenceTranslatorLibData();\n const v = new SequenceTranslatorUI();\n await v.createLayout();\n } catch (err: any) {\n const errMsg: string = err.hasOwnProperty('message') ? err.message : err.toString();\n grok.shell.error(`Loading Sequence Translator application error: ` + errMsg);\n throw err;\n } finally {\n pi.close();\n }\n}\n\n//name: initSequenceTranslatorLibData\nexport async function initSequenceTranslatorLibData(): Promise<void> {\n await getJsonData();\n await _package.initMonomerLib();\n}\n\n//name: getCodeToWeightsMap\n//output: object result\nexport function getCodeToWeightsMap(): {[key: string]: number} {\n const map = MonomerLibWrapper.getInstance().getCodesToWeightsMap();\n return Object.fromEntries(map);\n}\n\n//name: validateSequence\n//input: string sequence\n//output: bool result\nexport function validateSequence(sequence: string): boolean {\n const validator = new SequenceValidator(sequence);\n const format = (new FormatDetector(sequence).getFormat());\n return (format === null) ? false : validator.isValidSequence(format!);\n}\n\n//name: validateSequence\n//input: string sequence\n//input: bool invert\n//output: string result\nexport function getMolfileFromGcrsSequence(sequence: string, invert: boolean): string {\n return (new SequenceToMolfileConverter(sequence, invert, 'GCRS')).convert();\n}\n\n//name: linkStrands\n//input: object strands\n//input: bool invert\n//output: string result\nexport function linkStrands(strands: { senseStrands: string[], antiStrands: string[] }): string {\n return linkStrandsV3000(strands, true);\n}\n\n//name: demoTranslateSequence\n//meta.demoPath: Bioinformatics | Oligonucleotide Sequence: Translate\n//description: Translate oligonucleotide sequences across various formats accepted by different synthesizers\n//meta.path: /apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Translate\nexport async function demoTranslateSequence(): Promise<void> {\n await demoTranslateSequenceUI();\n}\n\n//name: demoDesignPattern\n//meta.demoPath: Bioinformatics | Oligonucleotide Sequence: Design\n//description: Design a modification pattern for an oligonucleotide sequence\n//meta.path:%20/apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Visualize%20duplex\nexport async function demoDesignPattern(): Promise<void> {\n await demoDesignPatternUI();\n}\n\n//name: demoVisualizeDuplex\n//meta.demoPath: Bioinformatics | Oligonucleotide Sequence: Visualize duplex\n//description: Visualize duplex and save SDF\n//meta.path:%20/apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Visualize%20duplex\nexport async function demoVisualizeDuplex(): Promise<void> {\n await demoVisualizeDuplexUI();\n}\n","module.exports = DG;","module.exports = grok;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","export const axolabsToSmiles: {[key: string]: string} = {\n 'usCfCfUfGfAf': 'CO[C@@H]1[C@H](OP(=O)(S)OC[C@H]2O[C@@H](n3ccc(N)nc3=O)[C@H](F)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3ccc(N)nc3=O)[C@H](F)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3ccc(=O)[nH]c3=O)[C@H](F)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](F)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3cnc4c(N)ncnc43)[C@H](F)[C@@H]2O)[C@@H](CO)O[C@H]1n1ccc(=O)[nH]c1=O',\n\n 'usAfsusgsgsg': 'CO[C@@H]1[C@H](OP(=O)(S)OC[C@H]2O[C@@H](n3cnc4c(N)ncnc43)[C@H](F)[C@@H]2OP(=O)(S)OC[C@H]2O[C@@H](n3ccc(=O)[nH]c3=O)[C@H](OC)[C@@H]2OP(=O)(S)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](OC)[C@@H]2OP(=O)(S)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](OC)[C@@H]2OP(=O)(S)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](OC)[C@@H]2O)[C@@H](CO)O[C@H]1n1ccc(=O)[nH]c1=O',\n\n 'UfUfUfsCfsuacg': 'CO[C@@H]1[C@H](OP(=O)(O)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](OC)[C@@H]2O)[C@@H](COP(=O)(O)O[C@@H]2[C@@H](COP(=O)(O)O[C@@H]3[C@@H](COP(=O)(S)O[C@@H]4[C@@H](COP(=O)(S)O[C@@H]5[C@@H](COP(=O)(O)O[C@@H]6[C@@H](COP(=O)(O)O[C@@H]7[C@@H](CO)O[C@@H](n8ccc(=O)[nH]c8=O)[C@@H]7F)O[C@@H](n7ccc(=O)[nH]c7=O)[C@@H]6F)O[C@@H](n6ccc(=O)[nH]c6=O)[C@@H]5F)O[C@@H](n5ccc(N)nc5=O)[C@@H]4F)O[C@@H](n4ccc(=O)[nH]c4=O)[C@@H]3OC)O[C@@H](n3cnc4c(N)ncnc43)[C@@H]2OC)O[C@H]1n1ccc(N)nc1=O',\n\n 'susususauasu': 'CO[C@@H]1[C@H](O)[C@@H](COP(=O)(S)O[C@@H]2[C@@H](COP(=O)(O)O[C@@H]3[C@@H](COP(=O)(O)O[C@@H]4[C@@H](COP(=O)(S)O[C@@H]5[C@@H](COP(=O)(S)O[C@@H]6[C@@H](COP(=O)(S)O[C@@H]7[C@@H](COP(=O)(O)S)O[C@@H](n8ccc(=O)[nH]c8=O)[C@@H]7OC)O[C@@H](n7ccc(=O)[nH]c7=O)[C@@H]6OC)O[C@@H](n6ccc(=O)[nH]c6=O)[C@@H]5OC)O[C@@H](n5cnc6c(N)ncnc65)[C@@H]4OC)O[C@@H](n4ccc(=O)[nH]c4=O)[C@@H]3OC)O[C@@H](n3cnc4c(N)ncnc43)[C@@H]2OC)O[C@H]1n1ccc(=O)[nH]c1=O',\n\n 'CfGfCfsGfsCf': 'Nc1ccn([C@@H]2O[C@H](COP(=O)(S)O[C@@H]3[C@@H](COP(=O)(S)O[C@@H]4[C@@H](COP(=O)(O)O[C@@H]5[C@@H](COP(=O)(O)O[C@@H]6[C@@H](CO)O[C@@H](n7ccc(N)nc7=O)[C@@H]6F)O[C@@H](n6cnc7c(=O)[nH]c(N)nc76)[C@@H]5F)O[C@@H](n5ccc(N)nc5=O)[C@@H]4F)O[C@@H](n4cnc5c(=O)[nH]c(N)nc54)[C@@H]3F)[C@@H](O)[C@H]2F)c(=O)n1',\n\n 'acacacsacsac': 'CO[C@@H]1[C@H](O)[C@@H](COP(=O)(O)O[C@@H]2[C@@H](COP(=O)(S)O[C@@H]3[C@@H](COP(=O)(O)O[C@@H]4[C@@H](COP(=O)(S)O[C@@H]5[C@@H](COP(=O)(O)O[C@@H]6[C@@H](COP(=O)(O)O[C@@H]7[C@@H](COP(=O)(O)O[C@@H]8[C@@H](COP(=O)(O)O[C@@H]9[C@@H](COP(=O)(O)O[C@@H]%10[C@@H](CO)O[C@@H](n%11cnc%12c(N)ncnc%12%11)[C@@H]%10OC)O[C@@H](n%10ccc(N)nc%10=O)[C@@H]9OC)O[C@@H](n9cnc%10c(N)ncnc%109)[C@@H]8OC)O[C@@H](n8ccc(N)nc8=O)[C@@H]7OC)O[C@@H](n7cnc8c(N)ncnc87)[C@@H]6OC)O[C@@H](n6ccc(N)nc6=O)[C@@H]5OC)O[C@@H](n5cnc6c(N)ncnc65)[C@@H]4OC)O[C@@H](n4ccc(N)nc4=O)[C@@H]3OC)O[C@@H](n3cnc4c(N)ncnc43)[C@@H]2OC)O[C@H]1n1ccc(N)nc1=O',\n\n 'cccgggusug': 'CO[C@@H]1[C@H](OP(=O)(O)OC[C@H]2O[C@@H](n3ccc(N)nc3=O)[C@H](OC)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3ccc(N)nc3=O)[C@H](OC)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](OC)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](OC)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](OC)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3ccc(=O)[nH]c3=O)[C@H](OC)[C@@H]2OP(=O)(S)OC[C@H]2O[C@@H](n3ccc(=O)[nH]c3=O)[C@H](OC)[C@@H]2OP(=O)(O)OC[C@H]2O[C@@H](n3cnc4c(=O)[nH]c(N)nc43)[C@H](OC)[C@@H]2O)[C@@H](CO)O[C@H]1n1ccc(N)nc1=O',\n\n 'UfAfCfGfGfCfAfUf': 'Nc1ccn([C@@H]2O[C@H](COP(=O)(O)O[C@@H]3[C@@H](COP(=O)(O)O[C@@H]4[C@@H](CO)O[C@@H](n5ccc(=O)[nH]c5=O)[C@@H]4F)O[C@@H](n4cnc5c(N)ncnc54)[C@@H]3F)[C@@H](OP(=O)(O)OC[C@H]3O[C@@H](n4cnc5c(=O)[nH]c(N)nc54)[C@H](F)[C@@H]3OP(=O)(O)OC[C@H]3O[C@@H](n4cnc5c(=O)[nH]c(N)nc54)[C@H](F)[C@@H]3OP(=O)(O)OC[C@H]3O[C@@H](n4ccc(N)nc4=O)[C@H](F)[C@@H]3OP(=O)(O)OC[C@H]3O[C@@H](n4cnc5c(N)ncnc54)[C@H](F)[C@@H]3OP(=O)(O)OC[C@H]3O[C@@H](n4ccc(=O)[nH]c4=O)[C@H](F)[C@@H]3O)[C@H]2F)c(=O)n1'\n}\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {before, category, expect, test} from '@datagrok-libraries/utils/src/test';\nimport {DEFAULT_FORMATS} from '../model/const';\nimport {getJsonData} from '../model/data-loading-utils/json-loader';\nimport {axolabsToSmiles} from './const';\nimport {_package} from '../package';\nimport {SequenceToMolfileConverter} from '../model/sequence-to-structure-utils/sequence-to-molfile';\n\nfunction getSmiles(strand: string, format: string): string {\n const molfile = (new SequenceToMolfileConverter(strand, false, format)).convert();\n return DG.chem.convert(molfile, DG.chem.Notation.MolBlock, DG.chem.Notation.Smiles);\n}\n\nconst AXOLABS = DEFAULT_FORMATS.AXOLABS;\n\ncategory('Axolabs to smiles', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n for (const strand of Object.keys(axolabsToSmiles)) {\n test(`${strand} to SMILES`, async () => {\n const expected = axolabsToSmiles[strand];\n const result = getSmiles(strand, AXOLABS);\n expect(result, expected);\n });\n }\n});\n","import * as DG from 'datagrok-api/dg';\nimport {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';\nimport './tests/smiles-tests';\n\nexport const _package = new DG.Package();\nexport {tests};\n\n//name: test\n//input: string category {optional: true}\n//input: string test {optional: true}\n//input: object testContext {optional: true}\n//output: dataframe result\nexport async function test(category: string, test: string, testContext: TestContext): Promise<DG.DataFrame> {\n const data = await runTests({category, test, testContext});\n return DG.DataFrame.fromObjects(data)!;\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","tests","currentCategory","assure","notNull","name","Error","TestContext","constructor","catchUnhandled","report","this","undefined","Test","category","test","options","_a","timeout","push","expect","actual","expected","before","runTests","_b","_c","_d","_e","results","packageName","func","package","console","log","testContext","key","Object","entries","toLowerCase","startsWith","x","beforeStatus","toString","t","res","i","length","execTest","data","all","filter","d","after","afterStatus","success","ms","skipped","r","setTimeout","delay","logger","successful","failed","description","params","assign","predicate","skip","skipReason","start","Date","stop","___CSS_LOADER_EXPORT___","module","id","exports","cssWithMappingToString","list","map","item","content","needLayer","concat","join","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","sourceMapping","out$","window","default","xmlNs","svgNs","urlRegex","fontFormats","woff2","woff","otf","ttf","eot","sfnt","svg","isElement","obj","HTMLElement","SVGElement","requireDomNode","el","requireDomNodePromise","getDimension","clone","dim","v","viewBox","baseVal","getAttribute","match","parseInt","getBoundingClientRect","style","getComputedStyle","getPropertyValue","isNaN","parseFloat","uriToBlob","uri","byteString","atob","split","mimeString","buffer","ArrayBuffer","intArray","Uint8Array","charCodeAt","Blob","type","cachedFonts","cachedRules","inlineCss","_ref","selectorRemap","modifyStyle","modifyCss","fonts","excludeUnusedCss","generateCss","selector","properties","css","detectFonts","fontList","Array","from","document","styleSheets","sheet","rules","cssRules","href","warn","forEach","_ref2","rule","querySelector","parentNode","err","query","selectorText","cssText","font","url","fontUrl","formats","fullUrl","text","format","keys","extension","indexOf","error","detectCssFont","req","XMLHttpRequest","addEventListener","fontInBase64","binary","bytes","byteLength","String","fromCharCode","arrayBufferToBase64","response","fontUri","replace","open","responseType","send","fontCss","inlineFonts","downloadOptions","navigator","msSaveOrOpenBlob","createElement","popup","prepareSvg","_ref3","_ref3$left","left","_ref3$top","top","w","width","h","height","_ref3$scale","scale","_ref3$responsive","responsive","_ref3$excludeCss","excludeCss","querySelectorAll","image","getAttributeNS","lastIndexOf","location","host","valueOf","canvas","img","Image","crossOrigin","src","onerror","onload","getContext","drawImage","setAttributeNS","toDataURL","inlineImages","cloneNode","backgroundColor","_getDimensions","tagName","getBBox","_el$getBBox","y","getDimensions","setAttribute","createElementNS","appendChild","removeAttribute","foreignObject","innerHTML","defs","insertBefore","firstChild","outer","svgAsDataUri","_ref4","svgXml","decodeURIComponent","p1","c","svgAsPngUri","_ref5","_ref5$encoderType","encoderType","_ref5$encoderOptions","encoderOptions","canvg","convertToPng","_ref6","context","pixelRatio","devicePixelRatio","setTransform","png","SecurityError","slice","download","saveLink","display","body","blob","URL","createObjectURL","onclick","requestAnimationFrame","revokeObjectURL","click","removeChild","title","saveSvg","downloadOpts","saveSvgAsPng","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","count","indexByIdentifier","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","target","styleTarget","HTMLIFrameElement","contentDocument","head","getTarget","element","setAttributes","attributes","styleElement","nonce","insertStyleElement","styleTagTransform","removeStyleElement","styleSheet","createTextNode","DEFAULT_FORMATS","LIB_PATH","DEFAULT_LIB_FILENAME","APP_PATH","AXOLABS_STYLE_FILENAME","CODES_TO_HELM_DICT_FILENAME","CODES_TO_SYMBOLS_FILENAME","MONOMERS_WITH_PHOSPHATE_LINKERS","fileSource","axolabsStyleMap","codesToHelmDictionary","codesToSymbolsDictionary","monomersWithPhosphateLinkers","async","getJsonData","every","parse","path","parsedJson","readAsText","errMsg","hasOwnProperty","message","sortByReverseLength","array","sort","a","b","MonomerLibWrapper","lib","_package","allMonomers","getAllMonomers","static","formatMonomerForViewer","sourceObj","formattedObject","polymerTypes","getPolymerTypes","polymerType","monomersByType","getMonomerSymbolsByType","monomerSymbol","getMonomer","monomer","instance","getMolfileBySymbol","molfile","getNaturalAnalogBySymbol","naturalAnalog","isModification","includes","getCodeToSymbolMap","Map","getCodesByFormat","getTableForViewer","formattedObjects","getCodesToWeightsMap","codesToWeightsMap","_","dict","code","weight","set","MonomerSequenceParser","sequence","invert","codeMap","parseSequence","parsedRawCodes","parseRawSequence","addLinkers","monomerSymbolSequence","getSymbolForCode","monomerHasLeftPhosphateLinker","pop","isPhosphate","monomerIsPhosphateLinker","lastMonomer","nextMonomerIsPhosphate","monomerHasRightPhosphateLinker","get","allCodesOfFormat","getAllCodesOfFormat","parsedCodes","find","s","substring","unshift","allCodesInTheFormat","SequenceToMolfileConverter","codeToSymbolMap","parser","convert","parsedSequence","monomerMolfiles","idx","monomerMolfile","getMonomerMolfile","getPolymerMolfile","molBlock","reflect","rotateNucleotidesV3000","linkV3000","coordinates","extractAtomDataV3000","natom","atomIndex","indexFivePrime","indexThreePrime","xCenter","yCenter","xShift","indexEnd","numbers","extractAtomsBondsNumbersV3000","indexes","types","atomType","replaceAll","atomsNumber","nbond","fix5Prime","angle","Math","PI","derivative","atan","cos","sin","xAdd","molBlocks","useChirality","macroMolBlock","atomBlock","bondBlock","collectionBlock","collection","isBoundary","specLength","indexAtoms","j","atomNumber","totalShift","coordinate","round","indexAtomsEnd","indexBonds","bondNumber","min","indexBondEnd","indexCollection","collectionEnd","max","collNumber","ceil","entriesCurrent","indexFivePrimeNeighbour","yShift","base3PrimeX","base3PrimeY","base5PrimeX","base5PrimeY","rotated5PrimeX","rotated5PrimeY","dx","dy","dxRotated","dyRotated","sqrt","ui","rxjs","$","V2K_CONST","measureText","wu","CandidateType","alphabet","cutoff","CandidateSimType","candidate","freq","similarity","super","monomerRe","fasta","peptide","Set","dna","rna","peq","Uint32Array","defaultArgs","gapOpen","gapExtend","scoringMatrix","alphabetIndexes","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","seq1","seq2","diff","abs","LEVENSHTEIN","tmp","n","m","lst","pv","mv","sc","eq","xv","myers_32","mhc","phc","hsize","vsize","vlen","pb","mb","xh","ph","mh","score","myers_x","distance","NEEDLEMANN_WUNSCH","args","matrix","fill","verticalGaps","horizontalGaps","prevRow","currRow","diagonal","perfectMatchSeq1","reduce","perfectMatchSeq2","maxScore","Tags","uhTemp","uh","column","semType","getTag","setTag","setTags","separator","units","stats","some","aligned","sameLength","candidates","gapSymbol","candidatesSims","sim","delete","freqA","alphabetA","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","vectorLength","getAlphabetSimilarity","alphabetName","maxSim","cs","detectAlphabet","alphabetSize","alphabetIsMultichar","_units","_column","notation","_notation","defaultGapSymbol","_defaultGapSymbol","isFasta","isSeparator","helmCompatible","getAlphabetSize","alphabetSizeStr","getAlphabetIsMultichar","splitted","_splitted","splitter","getSplitter","colLength","catIdxList","getRawData","catList","categories","rowI","seq","_stats","firstLength","mSeq","isHelm","isRna","isDna","isPeptide","isMsa","toUpperCase","isHelmCompatible","getNotation","getNewColumn","targetNotation","col","len","newColName","dataFrame","columns","getUnusedName","newColumn","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","templateCol","getOrCreate","p","unitsStringIsValid","limit","splitterAsFasta","getSplitterWithSeparator","splitterAsHelm","getSplitterForColumn","getDistanceFunctionName","getDistanceFunction","tags","peptides","getMonomerLibHelper","getBioLib","peptidesSet","splitterFunc","row","monomers","_defaultGapSymbolsDict","FASTA","HELM","SEPARATOR","setUnitsToFastaColumn","setUnitsToSeparatorColumn","setUnitsToHelmColumn","temp","Float32Array","sqrSum","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","Lesk","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","Aminoacids","scheme","isInner","inner","char","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","amino","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","StringUtils","hash","UnknownSeqPalette","UnknownColorPalette","values","pI","hashCode","color","dgColor","g","distToBlack","pow","correctColor","endsWith","buildPalette","helmRe","helmPp1Re","lastIndex","ea","exec","inSeq","mm","pp1M","funcList","prepare","call","getOutputParamValue","StPackage","_monomerLib","monomerLib","pi","libHelper","readLibrary","close","DG","grok","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","o","defineProperty","enumerable","prop","prototype","Symbol","toStringTag","nc","axolabsToSmiles","getSmiles","strand","AXOLABS"],"sourceRoot":""}
|