From 0c4fb20c66b6c4ed0286808777bb37e50d596451 Mon Sep 17 00:00:00 2001 From: David Brazda Date: Mon, 23 Oct 2023 21:36:15 +0200 Subject: [PATCH] prvni verze dynamicky ind --- testy/previewindicator.py | 19 + v2realbot/common/model.py | 2 + v2realbot/controller/services.py | 103 +- v2realbot/main.py | 15 +- v2realbot/ml/ml.py | 6 +- v2realbot/ml/mlutils.py | 4 +- v2realbot/static/index.html | 50 +- v2realbot/static/js/archivechart.js | 1014 +++--- v2realbot/static/js/libs/j-toml/j-toml.d.ts | 277 ++ v2realbot/static/js/libs/j-toml/j-toml.js | 3008 +++++++++++++++++ .../static/js/libs/j-toml/j-toml.min.d.ts | 277 ++ v2realbot/static/js/libs/j-toml/j-toml.min.js | 144 + .../static/js/libs/j-toml/j-toml.min.js.gz | Bin 0 -> 15635 bytes .../static/js/libs/j-toml/j-toml.min.js.map | 45 + .../js/libs/j-toml/j-toml.min.js.map.gz | Bin 0 -> 56486 bytes v2realbot/static/js/livewebsocket.js | 1 + v2realbot/static/js/mytables.js | 30 +- v2realbot/static/js/utils.js | 276 +- v2realbot/static/main.css | 64 + v2realbot/strategy/StrategyClassicSL.py | 8 +- v2realbot/strategy/base.py | 2 +- v2realbot/strategyblocks/indicators/RSI.py | 12 +- .../indicators/custom/_upscaled_rsi_wip.py | 2 + .../indicators/custom/basestats.py | 21 + .../custom/{statement.py => expression.py} | 10 +- .../strategyblocks/indicators/custom/ma.py | 2 +- 26 files changed, 4812 insertions(+), 580 deletions(-) create mode 100644 testy/previewindicator.py create mode 100644 v2realbot/static/js/libs/j-toml/j-toml.d.ts create mode 100644 v2realbot/static/js/libs/j-toml/j-toml.js create mode 100644 v2realbot/static/js/libs/j-toml/j-toml.min.d.ts create mode 100644 v2realbot/static/js/libs/j-toml/j-toml.min.js create mode 100644 v2realbot/static/js/libs/j-toml/j-toml.min.js.gz create mode 100644 v2realbot/static/js/libs/j-toml/j-toml.min.js.map create mode 100644 v2realbot/static/js/libs/j-toml/j-toml.min.js.map.gz rename v2realbot/strategyblocks/indicators/custom/{statement.py => expression.py} (78%) diff --git a/testy/previewindicator.py b/testy/previewindicator.py new file mode 100644 index 0000000..9efa6d7 --- /dev/null +++ b/testy/previewindicator.py @@ -0,0 +1,19 @@ + + +import v2realbot.controller.services as cs + +#[stratvars.indicators.vwma] +runner_id = "b44d6d8f-b44d-45b1-ad7a-7ee8b0facead" +toml = """ + type = "custom" + subtype = "vwma" + on_confirmed_only = true + cp.source = "vwap" + cp.ref_source = "volume" + cp.lookback = 50 +""" + +res, vals = cs.preview_indicator_byTOML(id=runner_id, toml=toml) + +print(res) +print(vals) diff --git a/v2realbot/common/model.py b/v2realbot/common/model.py index a9f04c9..e4a2a79 100644 --- a/v2realbot/common/model.py +++ b/v2realbot/common/model.py @@ -267,6 +267,8 @@ class RunArchiveDetail(BaseModel): trades: List[TradeUpdate] ext_data: Optional[dict] +class TomlInput(BaseModel): + toml: str # class Trade(BaseModel): # order: Order # value: float diff --git a/v2realbot/controller/services.py b/v2realbot/controller/services.py index ce8f3b1..f983a7c 100644 --- a/v2realbot/controller/services.py +++ b/v2realbot/controller/services.py @@ -5,9 +5,10 @@ from alpaca.data.historical import StockHistoricalDataClient from alpaca.data.requests import StockTradesRequest, StockBarsRequest from alpaca.data.enums import DataFeed from alpaca.data.timeframe import TimeFrame +from v2realbot.strategy.base import StrategyState from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Account, OrderSide from v2realbot.common.model import RunDay, StrategyInstance, Runner, RunRequest, RunArchive, RunArchiveView, RunArchiveDetail, RunArchiveChange, Bar, TradeEvent, TestList, Intervals, ConfigItem -from v2realbot.utils.utils import AttributeDict, zoneNY, zonePRG, dict_replace_value, Store, parse_toml_string, json_serial, is_open_hours, send_to_telegram +from v2realbot.utils.utils import AttributeDict, zoneNY, zonePRG, safe_get, dict_replace_value, Store, parse_toml_string, json_serial, is_open_hours, send_to_telegram from v2realbot.utils.ilog import delete_logs from v2realbot.common.PrescribedTradeModel import Trade, TradeDirection, TradeStatus, TradeStoplossType from datetime import datetime @@ -30,6 +31,9 @@ from datetime import timedelta, time from threading import Lock from v2realbot.common.db import pool, execute_with_retry, row_to_runarchive, row_to_runarchiveview from sqlite3 import OperationalError, Row +import v2realbot.strategyblocks.indicators.custom as ci +from v2realbot.interfaces.backtest_interface import BacktestInterface + #from pyinstrument import Profiler #adding lock to ensure thread safety of TinyDB (in future will be migrated to proper db) lock = Lock() @@ -1107,6 +1111,103 @@ def get_testlists(): # endregion +#WIP - possibility to add TOML indicator +# open issues: hodnoty dalsich indikatoru +def preview_indicator_byTOML(id: UUID, toml: str): + try: + res, toml_parsed = parse_toml_string(toml) + if res < 0: + return (-2, "toml invalid") + + print("parsed toml", toml_parsed) + + subtype = safe_get(toml_parsed, 'subtype', False) + if subtype is None: + return (-2, "subtype invalid") + + custom_params = safe_get(toml_parsed, "cp", None) + print("custom params",custom_params) + + #dotahne runner details + res, val = get_archived_runner_details_byID(id) + if res < 0: + return (-2, "no archived runner {id}") + + # class RunArchiveDetail(BaseModel): + # id: UUID + # name: str + # bars: dict + # #trades: Optional[dict] + # indicators: List[dict] + # statinds: dict + # trades: List[TradeUpdate] + # ext_data: Optional[dict] + + #TODO - conditional udelat podminku + # if value == "conditional": + # conditions = state.vars.indicators[indname]["cp"]["conditions"] + # for condname,condsettings in conditions.items(): + # state.vars.indicators[indname]["cp"]["conditions"][condname]["cond_dict"] = get_conditions_from_configuration(action=KW.change_val+"_if", section=condsettings) + # printanyway(f'creating workdict for {condname} value {state.vars.indicators[indname]["cp"]["conditions"][condname]["cond_dict"]}') + + #TODO - podporit i jine nez custom? + + + detail = RunArchiveDetail(**val) + #print("toto jsme si dotahnuli", detail.bars) + + #new dicts + new_bars = {key: [] for key in detail.bars.keys()} + new_bars = AttributeDict(**new_bars) + new_inds = {key: [] for key in detail.indicators[0].keys()} + new_inds = AttributeDict(**new_inds) + interface = BacktestInterface(symbol="X", bt=None) + + state = StrategyState(name="XX", symbol = "X", stratvars = toml, interface=interface) + + state.bars = new_bars + state.indicators = new_inds + + new_inds["new"] = [] + print("delka",len(detail.bars["close"])) + + #intitialize indicator mapping - in order to use eval in expression + local_dict_inds = {key: state.indicators[key] for key in state.indicators.keys() if key != "time"} + local_dict_bars = {key: state.bars[key] for key in state.bars.keys() if key != "time"} + + state.ind_mapping = {**local_dict_inds, **local_dict_bars} + print("IND MAPPING DONE:", state.ind_mapping) + + + print("subtype") + function = "ci."+subtype+"."+subtype + print("funkce", function) + custom_function = eval(function) + #iterujeme nad bary a on the fly pridavame novou hodnotu do vsech indikatoru a nakonec nad tim spustime indikator + #tak muzeme v toml pouzit i hodnoty ostatnich indikatoru + for i in range(len(detail.bars["close"])): + for key in detail.bars: + state.bars[key].append(detail.bars[key][i]) + for key in detail.indicators[0]: + state.indicators[key].append(detail.indicators[0][key][i]) + + new_inds["new"].append(0) + try: + res_code, new_val = custom_function(state, custom_params) + if res_code == 0: + new_inds["new"][-1]=new_val + except Exception as e: + print(str(e) + format_exc()) + + print("Done", f"delka {len(new_inds['new'])}", new_inds["new"]) + + return 0, new_inds["new"] + + except Exception as e: + print(str(e) + format_exc()) + return -2, str(e) + + # region CONFIG db services #TODO vytvorit modul pro dotahovani z pythonu (get_from_config(var_name, def_value) {)- stejne jako v js #TODO zvazit presunuti do TOML z JSONu diff --git a/v2realbot/main.py b/v2realbot/main.py index 2cf3eb7..f73b4ed 100644 --- a/v2realbot/main.py +++ b/v2realbot/main.py @@ -11,7 +11,7 @@ import uvicorn from uuid import UUID import v2realbot.controller.services as cs from v2realbot.utils.ilog import get_log_window -from v2realbot.common.model import StrategyInstance, RunnerView, RunRequest, Trade, RunArchive, RunArchiveView, RunArchiveDetail, Bar, RunArchiveChange, TestList, ConfigItem +from v2realbot.common.model import StrategyInstance, RunnerView, RunRequest, Trade, RunArchive, RunArchiveView, RunArchiveDetail, Bar, RunArchiveChange, TestList, ConfigItem, TomlInput from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Depends, HTTPException, status, WebSocketException, Cookie, Query from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles @@ -429,6 +429,19 @@ def _delete_archived_runners_byIDs(runner_ids: list[UUID]): elif res < 0: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Error: {res}:{id}") +#WIP - TOM indicator preview from frontend +#return indicator value for archived runner +@app.put("/archived_runners/{runner_id}/previewindicator", dependencies=[Depends(api_key_auth)], status_code=status.HTTP_200_OK) +def _preview_indicator_byTOML(runner_id: UUID, toml: TomlInput) -> list[float]: + #mozna pak pridat name + res, vals = cs.preview_indicator_byTOML(id=runner_id, toml=toml.toml) + if res == 0: return vals + elif res == -1: + raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Error: {res}:{vals}") + else: + raise HTTPException(status_code=status.HTTP_406_NOT_ACCEPTABLE, detail=f"Error not changed: {res}:{runner_id}:{vals}") + + #edit archived runner ("note",..) @app.patch("/archived_runners/{runner_id}", dependencies=[Depends(api_key_auth)]) def _edit_archived_runners(archChange: RunArchiveChange, runner_id: UUID): diff --git a/v2realbot/ml/ml.py b/v2realbot/ml/ml.py index 3ce205e..c2f6e24 100644 --- a/v2realbot/ml/ml.py +++ b/v2realbot/ml/ml.py @@ -7,7 +7,7 @@ import v2realbot.ml.mlutils as mu from v2realbot.utils.utils import slice_dict_lists import numpy as np from copy import deepcopy -from v2realbot.controller.services import get_archived_runnerslist_byBatchID +import v2realbot.controller.services as cs #Basic classes for machine learning #drzi model a jeho zakladni nastaveni @@ -138,10 +138,10 @@ class ModelML: print("loading runners for ",str(runner_id_list)) elif batch_id is not None: print("Loading runners for train_batch_id:", batch_id) - res, runner_ids = get_archived_runnerslist_byBatchID(batch_id) + res, runner_ids = cs.get_archived_runnerslist_byBatchID(batch_id) elif self.train_batch_id is not None: print("Loading runners for TRAINING BATCH self.train_batch_id:", self.train_batch_id) - res, runner_ids = get_archived_runnerslist_byBatchID(self.train_batch_id) + res, runner_ids = cs.get_archived_runnerslist_byBatchID(self.train_batch_id) #pripadne bereme z listu runneru else: runner_ids = self.train_runner_ids diff --git a/v2realbot/ml/mlutils.py b/v2realbot/ml/mlutils.py index 82ef7af..a8a561e 100644 --- a/v2realbot/ml/mlutils.py +++ b/v2realbot/ml/mlutils.py @@ -1,5 +1,5 @@ import numpy as np -from v2realbot.controller.services import get_archived_runner_details_byID +import v2realbot.controller.services as cs from joblib import load from v2realbot.config import DATA_DIR @@ -43,7 +43,7 @@ def merge_dicts(dict_list): # return merged_dict def load_runner(runner_id): - res, sada = get_archived_runner_details_byID(runner_id) + res, sada = cs.get_archived_runner_details_byID(runner_id) if res == 0: print("ok") else: diff --git a/v2realbot/static/index.html b/v2realbot/static/index.html index 79c04d6..98618ab 100644 --- a/v2realbot/static/index.html +++ b/v2realbot/static/index.html @@ -59,8 +59,17 @@ - + + + + + + + + + + +
diff --git a/v2realbot/static/js/archivechart.js b/v2realbot/static/js/archivechart.js index 3dae164..c668e9f 100644 --- a/v2realbot/static/js/archivechart.js +++ b/v2realbot/static/js/archivechart.js @@ -1,7 +1,9 @@ var tradeDetails = new Map(); var toolTip = null var CHART_SHOW_TEXT = get_from_config("CHART_SHOW_TEXT", false) - +// const myLibrary = _export; +// const TOML = window['j-toml'] +//console.log("TOML je", window) console.log("CHART_SHOW_TEXT archchart", CHART_SHOW_TEXT) // var vwapSeries = null // var volumeSeries = null @@ -33,7 +35,7 @@ function transform_data(data) { if ((data.ext_data !== null) && (data.ext_data.sl_history)) { data.ext_data.sl_history.forEach((histRecord, index, array) => { - console.log("plnime") + //console.log("plnime") //nova sada if (prev_id !== histRecord.id) { @@ -69,7 +71,7 @@ function transform_data(data) { sline_markers["position"] = "inBar" sline_markers["color"] = "#f5aa42" //sline_markers["shape"] = "circle" - console.log("SHOW_SL_DIGITS",SHOW_SL_DIGITS) + //console.log("SHOW_SL_DIGITS",SHOW_SL_DIGITS) sline_markers["text"] = SHOW_SL_DIGITS ? histRecord.sl_val.toFixed(3) : "" sl_line_markers_sada.push(sline_markers) @@ -245,7 +247,7 @@ function transform_data(data) { transformed["markers_line"] = markers_line transformed["sl_line"] = sl_line transformed["sl_line_markers"] = sl_line_markers - console.log("naplnene", sl_line, sl_line_markers) + //console.log("naplnene", sl_line, sl_line_markers) //console_log(JSON.stringify(transformed["sl_line"],null,2)) //console_log(JSON.stringify(transformed["sl_line_markers"],null,2)) //get additional indicators @@ -306,31 +308,546 @@ function prepare_data(archRunner, timeframe_amount, timeframe_unit, archivedRunn }) } +//pomocna sluzba pro naplneni indListu a charting indikatoru +function chart_indicators(data, visible, offset) { + //console.log("indikatory", JSON.stringify(data.indicators,null,2)) + //podobne v livewebsokcets.js - dat do jedne funkce + if (data.hasOwnProperty("indicators")) { + // console.log("jsme uvnitr indikatoru") + + //vraci se pole indicatoru, kazdy se svoji casovou osou (time) - nyni standard indikatory a cbar indikatory + var indicatorList = data.indicators + + //ze stratvars daneho runnera si dotahneme nastaveni indikatoru - pro zobrazeni v tooltipu + + //TOML parse + //console.log("PUVODNI", data.archRecord.stratvars_toml) + var stratvars_toml = TOML.parse(data.archRecord.stratvars_toml) + + + //console.log("ZPETNE STRINGIFIED", TOML.stringify(TOML.parse(data.archRecord.stratvars_toml), {newline: '\n'})) + //indicatory + //console.log("indicatory TOML", stratvars_toml.stratvars.indicators) + + indicatorList.forEach((indicators, index, array) => { + + //var indicators = data.indicators + //if there are indicators it means there must be at least two keys (time which is always present) + if (Object.keys(indicators).length > 1) { + for (const [key, value] of Object.entries(indicators)) { + if (key !== "time") { + //get cnf of indicator to display in the button tooltip + var cnf = null + //pokud je v nastaveni scale, pouzijeme tu + var scale = null + try { + if (addedInds[key]) { + cnf = addedInds[key] + scale = TOML.parse(cnf).scale + } + else + { + cnf = "#[stratvars.indicators."+key+"]"+TOML.stringify(stratvars_toml.stratvars.indicators[key], {newline: '\n'}) + scale = stratvars_toml.stratvars.indicators[key].scale + //cnf = TOML.stringify(stratvars_toml.stratvars.indicators[key], {newline: '\n'}) + //a = TOML.parse(cnf) + //console.log("PARSED again",a) + } + } + catch (e) { + //nic + } + + //initialize indicator and store reference to array + var obj = {name: key, series: null, cnf:cnf, added: ((addedInds[key])?1:null)} + + //start + //console.log(key) + //get configuation of indicator to display + conf = get_ind_config(key) + + //pokud neni v configuraci - zobrazujeme defaultne + + //INIT INDICATOR BASED on CONFIGURATION + + //DO BUDOUCNA zde udelat sorter a pripadny handling duplicit jako + //funkci do ktere muzu zavolat vse co pujde jako data do chartu + + //MOVE TO UTILS ro reuse?? + //if (conf && conf.display) { + if (conf && conf.embed) { + + //tranform data do správného formátru + items = [] + //var last = null + var last_time = 0 + var time = 0 + + //tento algoritmus z duplicit dela posloupnosti a srovna i pripadne nekonzistence + //napr z .911 .911 .912 udela .911 .912 .913 + value.forEach((element, index, array) => { + item = {} + //debug + //TOTO odstranit po identifikovani chyby + //if (indicators.time[index] !== undefined) { + //{console.log("problem",key,last)} + time = indicators.time[index] + + //pokud je nastaveny offset (zobrazujeme pouze bod vzdaleny N sekund od posledniho) + //vynechavame prvni iteraci, aby se nam naplnil last_time + if (offset && last_time !==0) { + if (last_time + offset > time) { + return; + } + } + + + if (last_time>=time) { + console.log(key, "problem v case - zarovnano",time, last_time, element) + + indicators.time[index] = indicators.time[index-1] + 0.000001 + } + item["time"] = indicators.time[index] + item["value"] = element + + last_time = indicators.time[index] + + if ((element == null) || (indicators.time[index] == null)) { + console.log("probelem u indikatoru",key, "nekonzistence", element, indicators.time[index]) + } + + //console.log("objekt indicatoru",item) + items.push(item) + //debug + //last = item + // } + // else + // { + // console.log("chybejici cas", key) + // } + }); + + //SERADIT PRO JISTOTU + //items.sort(sorter) + + //FIND DUPLICITIES + // last_time = 0 + // items.forEach((element, index, array) => { + // if (last_time >= element.time) { + // console.log("je duplicita/nekonzistence v ", element.time, element.value) + // } + // last_time = element.time + // }) + + + if (conf.embed) { + + if (conf.histogram) { + + obj.series = chart.addHistogramSeries({ + title: (conf.titlevisible?key:""), + color: colors.shift(), + priceFormat: {type: 'volume'}, + priceScaleId: (scale)?scale:conf.priceScaleId, + lastValueVisible: conf.lastValueVisible, + visible: conf.display}); + + obj.series.priceScale().applyOptions({ + // set the positioning of the volume series + scaleMargins: { + top: 0.7, // highest point of the series will be 70% away from the top + bottom: 0, + }, + }); + + } + else { + var barva = colors.shift() + obj.series = chart.addLineSeries({ + color: barva, + priceScaleId: (scale)?scale:conf.priceScaleId, + title: (conf.titlevisible?key:""), + lineWidth: 1, + visible: conf.display + }); + + // //existuje statinds se stejnym klicem - bereme z nej minimum slope + // a = data.statinds[key] + // console.log("pro klic" + key + ":"+a, JSON.stringify(a,null,2)) + // console.log(data.statinds[key].minimum_slope) + // console.log(JSON.stringify(data.statinds,null,2)) + //console.log((key in data.statinds), data.statinds, key) + if (key in data.statinds) { + //natvrdo nakreslime lajnu pro min angle + //TODO predelat na configuracne + const minSlopeLineOptopns = { + price: data.statinds[key].minimum_slope, + color: barva, + lineWidth: 1, + lineStyle: 2, // LineStyle.Dotted + axisLabelVisible: true, + title: "min", + }; + + const minSlopeLine = obj.series.createPriceLine(minSlopeLineOptopns); + + const maxSlopeLineOptopns = { + price: data.statinds[key].maximum_slope, + color: barva, + lineWidth: 1, + lineStyle: 2, // LineStyle.Dotted + axisLabelVisible: true, + title: "max", + }; + + const maxSlopeLine = obj.series.createPriceLine(maxSlopeLineOptopns); + + + + } + } + + + } + //INDICATOR on new pane + else { console.log("not implemented")} + + + //console.log("v chartovani",activatedButtons) + //pokud existuje v aktivnich pak zobrazujeme jako aktivni + if ((activatedButtons) && (activatedButtons.includes(obj.name))) { + //console.log("true",active?active:conf.display) + active = true + } + else {active = false} + //add options + obj.series.applyOptions({ + visible: active?active:visible, + lastValueVisible: false, + priceLineVisible: false, + }); + + //DEBUG + // if (key == 'tick_price') { + // console.log("problem tu",JSON.stringify(items)) + // } + //add data + obj.series.setData(items) + + // add to indList array - pole zobrazovanych indikatoru + indList.push(obj); + } + } + } + } + }) + } + //vwap a volume zatim jen v detailnim zobrazeni + if (!offset) { + //display vwap and volume + initialize_vwap() + vwapSeries.setData(data.transformed_data["vwap"]) + + initialize_volume() + volumeSeries.setData(data.transformed_data["volume"]) + console.log("volume") + } +} + +//pomocna +function remove_indicators() { + //reset COLORS + colors = reset_colors.slice() + + //remove CUSTOMS indicators if exists + indList.forEach((element, index, array) => { + if (element.series) { + //console.log(element.series, "tady series") + chart.removeSeries(element.series); + } + } + ); + indList = []; + //remove BASIC indicators + if (vwapSeries) { + chart.removeSeries(vwapSeries) + vwapSeries = null; + } + if (volumeSeries) { + chart.removeSeries(volumeSeries) + volumeSeries = null; + } +} + +//switch to interval pomocna funkce +function switch_to_interval(interval, data) { + if (!data) { + window.alert("no data switch to interval") + } + + //prip prpenuti prepisujeme candlestick a markery + if (candlestickSeries) { + last_range = chart.timeScale().getVisibleRange() + chart.removeSeries(candlestickSeries); + candlestickSeries = null + } + else { + last_range = null + } + + intitialize_candles() + candlestickSeries.setData(data.AllCandleSeriesesData.get(interval)); + + var containerlower = document.getElementById('lowercontainer'); + remove_indicators(); + btnElement = document.getElementById("indicatorsButtons") + if (btnElement) { + containerlower.removeChild(btnElement); + } + + if (interval == data.native_resolution) { + //indicators are in native resolution only + chart_indicators(data, false); + var indbuttonElement = populate_indicator_buttons(false); + } + else { + //na nepuvodnim grafu zobrazit jako offset a zobrazit jako neviditelne + chart_indicators(data,false,30) + //buttonky jako vypnute + var indbuttonElement = populate_indicator_buttons(false); + } + containerlower.append(indbuttonElement); + + + + display_buy_markers(data); + //TADY JSEM SKONCIL - toto nize predelat na hide button pro display bar markers + // btnElement = document.getElementById("pricelineButtons") + // var indbuttonElement = populate_indicator_buttons(false); + // if (btnElement) { + // container1.removeChild(btnElement); + // } + //container1.append(indbuttonElement); + + if (last_range) { + chart.timeScale().setVisibleRange(last_range); + } +} + +//displays (redraws) buy markers +function display_buy_markers(data) { + + transformed_data = data.transformed_data + // if (profitLine) { + // console.log(profitLine) + // chart.removeSeries(profitLine) + // console.log("nd") + // } + + if (avgBuyLine) { + chart.removeSeries(avgBuyLine) + } + + if (markersLine) { + chart.removeSeries(markersLine) + } + + if (slLine) { + slLine.forEach((series, index, array) => { + chart.removeSeries(series) + }) + slLine=[] + + } + // if (slLine) { + // chart.removeSeries(slLine) + // } + + //console.log("avgp_buy_line",JSON.stringify(transformed_data["avgp_buy_line"],null,2)) + //console.log("avgp_markers",JSON.stringify(transformed_data["avgp_markers"],null,2)) + + //if (transformed_data["sl_line"].length > 0) { + //console.log(JSON.stringify(transformed_data["sl_line"]), null,2) + //xx - ted bude slLine pole + transformed_data["sl_line"].forEach((slRecord, index, array) => { + + console.log("uvnitr") + slLine_temp = chart.addLineSeries({ + // title: "avgpbuyline", + color: '#e4c76d', + // color: 'transparent', + lineWidth: 1, + lastValueVisible: false + }); + + slLine_temp.applyOptions({ + lastValueVisible: false, + priceLineVisible: false, + }); + + slLine_temp.setData(slRecord); + slLine_temp.setMarkers(transformed_data["sl_line_markers"][index]); + slLine.push(slLine_temp) + + //xx + }) + + //} + + if (transformed_data["sum_profit_line"].length > 0) { + profitLine = chart.addLineSeries({ + // title: "avgpbuyline", e8c76d + color: '#99912b', + // color: 'transparent', + lineWidth: 1, + lastValueVisible: false + }); + + profitLine.applyOptions({ + lastValueVisible: false, + priceLineVisible: false, + priceScaleId: "own", + visible: false + }); + + + profitLine.setData(transformed_data["sum_profit_line"]); + //profitLine.setMarkers(transformed_data["sum_profit_line_markers"]); + } + + + if (transformed_data["avgp_buy_line"].length > 0) { + avgBuyLine = chart.addLineSeries({ + // title: "avgpbuyline", + color: '#e8c76d', + // color: 'transparent', + lineWidth: 1, + lastValueVisible: false + }); + + avgBuyLine.applyOptions({ + lastValueVisible: false, + priceLineVisible: false, + }); + + + avgBuyLine.setData(transformed_data["avgp_buy_line"]); + avgBuyLine.setMarkers(transformed_data["avgp_markers"]); + } + + markersLine = chart.addLineSeries({ + // title: "avgpbuyline", + // color: '#d6d1c3', + color: 'transparent', + lineWidth: 1, + lastValueVisible: false + }); + + //console.log("markers_line",JSON.stringify(transformed_data["markers_line"],null,2)) + //console.log("markers",JSON.stringify(transformed_data["markers"],null,2)) + + markersLine.setData(transformed_data["markers_line"]); + markersLine.setMarkers(transformed_data["markers"]) + + const container1 = document.getElementById('chart'); + + //chart.subscribeCrosshairMove(param => { + chart.subscribeCrosshairMove(param => { + //LEGEND SECTIOIN + firstRow.style.color = 'white'; + update_chart_legend(param); + + //TOOLTIP SECTION + //$('#trade-timestamp').val(param.time) + if ( + param.point === undefined || + !param.time || + param.point.x < 0 || + param.point.x > container1.clientWidth || + param.point.y < 0 || + param.point.y > container1.clientHeight + ) { + toolTip.style.display = 'none'; + } else { + //vyber serie s jakou chci pracovat - muzu i dynamicky + //je to mapa https://tradingview.github.io/lightweight-charts/docs/api/interfaces/MouseEventParams + + //key = series (key.seriestype vraci Line/Candlestick atp.) https://tradingview.github.io/lightweight-charts/docs/api/interfaces/SeriesOptionsMap + + toolTip.style.display = 'none'; + toolTip.innerHTML = ""; + var data = param.seriesData.get(markersLine); + var data2 = param.seriesData.get(avgBuyLine); + var profitdata = param.seriesData.get(profitLine); + if ((data !== undefined) || (data2 !== undefined)) { + //param.seriesData.forEach((value, key) => { + //console.log("key",key) + //console.log("value",value) + + //data = value + //DOCASNE VYPNUTO + toolTip.style.display = 'block'; + + //console.log(JSON.safeStringify(key)) + // if (toolTip.innerHTML == "") { + // toolTip.innerHTML = `
${param.time}
` + // } + buy_price = 0 + //u sell markeru nemame avgBuyLine + if (data2 !== undefined) { + buy_price = parseFloat(data2.value).toFixed(3) + } + + toolTip.innerHTML += `
POS:${tradeDetails.get(param.time).position_qty}/${buy_price}
T:${tradeDetails.get(param.time).order.qty}/${data.value}
`; + if (profitdata !== undefined) { + toolTip.innerHTML += `
P:${parseFloat(profitdata.value).toFixed(1)}
` + } + //inspirace + // toolTip.innerHTML = `
Apple Inc.
+ // ${Math.round(100 * price) / 100} + //
+ // ${dateStr} + //
`; + + + // Position tooltip according to mouse cursor position + toolTip.style.left = param.point.x+120 + 'px'; + toolTip.style.top = param.point.y + 'px'; + } + //}); + } + }); +} + //render chart of archived runs function chart_archived_run(archRecord, data, oneMinuteBars) { cleanup_chart() var transformed_data = transform_data(data) + data["transformed_data"] = transformed_data data["archRecord"] = archRecord //initialize resolutions - var native_resolution = data.bars.resolution[0]+"s" + data["native_resolution"] = data.bars.resolution[0]+"s" //console.log("native", native_resolution) //available intervals zatim jen 1m - var intervals = [native_resolution, '1m']; + var intervals = [data.native_resolution, '1m']; nativeData = transformed_data["bars"] //get one minute data //tbd prepare volume //console.log("oneMinuteData",oneMinuteBars) - var AllCandleSeriesesData = new Map([ - [native_resolution, nativeData ], + data["AllCandleSeriesesData"] = new Map([ + [data.native_resolution, nativeData ], ["1m", oneMinuteBars ], ]); - var switcherElement = createSimpleSwitcher(intervals, intervals[1], switch_to_interval); + //dame si data do globalni, abychom je mohli pouzivat jinde (trochu prasarna, predelat pak) + archData = data + + var switcherElement = createSimpleSwitcher(intervals, intervals[1], switch_to_interval, data); //define tooltip const container1 = document.getElementById('chart'); @@ -359,483 +876,9 @@ function chart_archived_run(archRecord, data, oneMinuteBars) { candlestickSeries = null //v pripade, ze neprojde get bars, nastavit na intervals[0] - switch_to_interval(intervals[1]) + switch_to_interval(intervals[1], data) chart.timeScale().fitContent(); - function switch_to_interval(interval) { - //prip prpenuti prepisujeme candlestick a markery - if (candlestickSeries) { - last_range = chart.timeScale().getVisibleRange() - chart.removeSeries(candlestickSeries); - candlestickSeries = null - } - else { - last_range = null - } - - intitialize_candles() - candlestickSeries.setData(AllCandleSeriesesData.get(interval)); - - remove_indicators(); - btnElement = document.getElementById("indicatorsButtons") - if (btnElement) { - containerlower.removeChild(btnElement); - } - - if (interval == native_resolution) { - //indicators are in native resolution only - display_indicators(data, false); - var indbuttonElement = populate_indicator_buttons(false); - } - else { - //na nepuvodnim grafu zobrazit jako offset a zobrazit jako neviditelne - display_indicators(data,false,30) - //buttonky jako vypnute - var indbuttonElement = populate_indicator_buttons(false); - } - containerlower.append(indbuttonElement); - - - display_buy_markers(); - //TADY JSEM SKONCIL - toto nize predelat na hide button pro display bar markers - // btnElement = document.getElementById("pricelineButtons") - // var indbuttonElement = populate_indicator_buttons(false); - // if (btnElement) { - // container1.removeChild(btnElement); - // } - //container1.append(indbuttonElement); - - if (last_range) { - chart.timeScale().setVisibleRange(last_range); - } - } - - //TBD - //pro kazdy identifikator zobrazime button na vypnuti zapnuti - //vybereme barvu pro kazdy identifikator - //zjistime typ idenitfikatoru - zatim right vs left - // input: data, offset(zobrazovat pouze hodnoty kazdych N sekund, visible) - function display_indicators(data, visible, offset) { - //console.log("indikatory", JSON.stringify(data.indicators,null,2)) - //podobne v livewebsokcets.js - dat do jedne funkce - if (data.hasOwnProperty("indicators")) { - // console.log("jsme uvnitr indikatoru") - - //vraci se pole indicatoru, kazdy se svoji casovou osou (time) - nyni standard indikatory a cbar indikatory - var indicatorList = data.indicators - - //ze stratvars daneho runnera si dotahneme nastaveni indikatoru - pro zobrazeni v tooltipu - var stratvars_toml = TOML.parse(data.archRecord.stratvars_toml) - //console.log(stratvars_toml.stratvars.indicators) - - indicatorList.forEach((indicators, index, array) => { - - //var indicators = data.indicators - //if there are indicators it means there must be at least two keys (time which is always present) - if (Object.keys(indicators).length > 1) { - for (const [key, value] of Object.entries(indicators)) { - if (key !== "time") { - //get cnf of indicator to display in the button tooltip - var cnf = null - try { - cnf = JSON.stringify(stratvars_toml.stratvars.indicators[key], null, 2) - } - catch (e) { - //nic - } - - //initialize indicator and store reference to array - var obj = {name: key, series: null, cnf:cnf} - - //start - //console.log(key) - //get configuation of indicator to display - conf = get_ind_config(key) - - //INIT INDICATOR BASED on CONFIGURATION - - //DO BUDOUCNA zde udelat sorter a pripadny handling duplicit jako - //funkci do ktere muzu zavolat vse co pujde jako data do chartu - - //MOVE TO UTILS ro reuse?? - //if (conf && conf.display) { - if (conf && conf.embed) { - - //tranform data do správného formátru - items = [] - //var last = null - var last_time = 0 - var time = 0 - - //tento algoritmus z duplicit dela posloupnosti a srovna i pripadne nekonzistence - //napr z .911 .911 .912 udela .911 .912 .913 - value.forEach((element, index, array) => { - item = {} - //debug - //TOTO odstranit po identifikovani chyby - //if (indicators.time[index] !== undefined) { - //{console.log("problem",key,last)} - time = indicators.time[index] - - //pokud je nastaveny offset (zobrazujeme pouze bod vzdaleny N sekund od posledniho) - //vynechavame prvni iteraci, aby se nam naplnil last_time - if (offset && last_time !==0) { - if (last_time + offset > time) { - return; - } - } - - - if (last_time>=time) { - console.log(key, "problem v case - zarovnano",time, last_time, element) - - indicators.time[index] = indicators.time[index-1] + 0.000001 - } - item["time"] = indicators.time[index] - item["value"] = element - - last_time = indicators.time[index] - - if ((element == null) || (indicators.time[index] == null)) { - console.log("probelem u indikatoru",key, "nekonzistence", element, indicators.time[index]) - } - - //console.log("objekt indicatoru",item) - items.push(item) - //debug - //last = item - // } - // else - // { - // console.log("chybejici cas", key) - // } - }); - - //SERADIT PRO JISTOTU - //items.sort(sorter) - - //FIND DUPLICITIES - // last_time = 0 - // items.forEach((element, index, array) => { - // if (last_time >= element.time) { - // console.log("je duplicita/nekonzistence v ", element.time, element.value) - // } - // last_time = element.time - // }) - - - if (conf.embed) { - - if (conf.histogram) { - - obj.series = chart.addHistogramSeries({ - title: (conf.titlevisible?conf.name:""), - color: colors.shift(), - priceFormat: {type: 'volume'}, - priceScaleId: conf.priceScaleId, - lastValueVisible: conf.lastValueVisible, - priceScaleId: conf.priceScaleId, - visible: conf.display}); - - obj.series.priceScale().applyOptions({ - // set the positioning of the volume series - scaleMargins: { - top: 0.7, // highest point of the series will be 70% away from the top - bottom: 0, - }, - }); - - } - else { - var barva = colors.shift() - obj.series = chart.addLineSeries({ - color: barva, - priceScaleId: conf.priceScaleId, - title: (conf.titlevisible?conf.name:""), - lineWidth: 1, - visible: conf.display - }); - - // //existuje statinds se stejnym klicem - bereme z nej minimum slope - // a = data.statinds[key] - // console.log("pro klic" + key + ":"+a, JSON.stringify(a,null,2)) - // console.log(data.statinds[key].minimum_slope) - // console.log(JSON.stringify(data.statinds,null,2)) - //console.log((key in data.statinds), data.statinds, key) - if (key in data.statinds) { - //natvrdo nakreslime lajnu pro min angle - //TODO predelat na configuracne - const minSlopeLineOptopns = { - price: data.statinds[key].minimum_slope, - color: barva, - lineWidth: 1, - lineStyle: 2, // LineStyle.Dotted - axisLabelVisible: true, - title: "min", - }; - - const minSlopeLine = obj.series.createPriceLine(minSlopeLineOptopns); - - const maxSlopeLineOptopns = { - price: data.statinds[key].maximum_slope, - color: barva, - lineWidth: 1, - lineStyle: 2, // LineStyle.Dotted - axisLabelVisible: true, - title: "max", - }; - - const maxSlopeLine = obj.series.createPriceLine(maxSlopeLineOptopns); - - - - } - } - - - } - //INDICATOR on new pane - else { console.log("not implemented")} - - //add options - obj.series.applyOptions({ - visible: visible, - lastValueVisible: false, - priceLineVisible: false, - }); - - //DEBUG - // if (key == 'tick_price') { - // console.log("problem tu",JSON.stringify(items)) - // } - //add data - obj.series.setData(items) - - // add to indList array - pole zobrazovanych indikatoru - indList.push(obj); - } - } - } - } - }) - } - //vwap a volume zatim jen v detailnim zobrazeni - if (!offset) { - //display vwap and volume - initialize_vwap() - vwapSeries.setData(transformed_data["vwap"]) - - initialize_volume() - volumeSeries.setData(transformed_data["volume"]) - console.log("volume") - } - } - - function remove_indicators() { - //reset COLORS - colors = reset_colors.slice() - - //remove CUSTOMS indicators if exists - indList.forEach((element, index, array) => { - if (element.series) { - //console.log(element.series, "tady series") - chart.removeSeries(element.series); - } - } - ); - indList = []; - //remove BASIC indicators - if (vwapSeries) { - chart.removeSeries(vwapSeries) - vwapSeries = null; - } - if (volumeSeries) { - chart.removeSeries(volumeSeries) - volumeSeries = null; - } - } - - //displays (redraws) buy markers - function display_buy_markers() { - - // if (profitLine) { - // console.log(profitLine) - // chart.removeSeries(profitLine) - // console.log("nd") - // } - - if (avgBuyLine) { - chart.removeSeries(avgBuyLine) - } - - if (markersLine) { - chart.removeSeries(markersLine) - } - - if (slLine) { - slLine.forEach((series, index, array) => { - chart.removeSeries(series) - }) - slLine=[] - - } - // if (slLine) { - // chart.removeSeries(slLine) - // } - - //console.log("avgp_buy_line",JSON.stringify(transformed_data["avgp_buy_line"],null,2)) - //console.log("avgp_markers",JSON.stringify(transformed_data["avgp_markers"],null,2)) - - //if (transformed_data["sl_line"].length > 0) { - //console.log(JSON.stringify(transformed_data["sl_line"]), null,2) - //xx - ted bude slLine pole - transformed_data["sl_line"].forEach((slRecord, index, array) => { - - console.log("uvnitr") - slLine_temp = chart.addLineSeries({ - // title: "avgpbuyline", - color: '#e4c76d', - // color: 'transparent', - lineWidth: 1, - lastValueVisible: false - }); - - slLine_temp.applyOptions({ - lastValueVisible: false, - priceLineVisible: false, - }); - - slLine_temp.setData(slRecord); - slLine_temp.setMarkers(transformed_data["sl_line_markers"][index]); - slLine.push(slLine_temp) - - //xx - }) - - //} - - if (transformed_data["sum_profit_line"].length > 0) { - profitLine = chart.addLineSeries({ - // title: "avgpbuyline", - color: '#e8c76d', - // color: 'transparent', - lineWidth: 1, - lastValueVisible: false - }); - - profitLine.applyOptions({ - lastValueVisible: false, - priceLineVisible: false, - priceScaleId: "own" - }); - - - profitLine.setData(transformed_data["sum_profit_line"]); - //profitLine.setMarkers(transformed_data["sum_profit_line_markers"]); - } - - - if (transformed_data["avgp_buy_line"].length > 0) { - avgBuyLine = chart.addLineSeries({ - // title: "avgpbuyline", - color: '#e8c76d', - // color: 'transparent', - lineWidth: 1, - lastValueVisible: false - }); - - avgBuyLine.applyOptions({ - lastValueVisible: false, - priceLineVisible: false, - }); - - - avgBuyLine.setData(transformed_data["avgp_buy_line"]); - avgBuyLine.setMarkers(transformed_data["avgp_markers"]); - } - - markersLine = chart.addLineSeries({ - // title: "avgpbuyline", - // color: '#d6d1c3', - color: 'transparent', - lineWidth: 1, - lastValueVisible: false - }); - - //console.log("markers_line",JSON.stringify(transformed_data["markers_line"],null,2)) - //console.log("markers",JSON.stringify(transformed_data["markers"],null,2)) - - markersLine.setData(transformed_data["markers_line"]); - markersLine.setMarkers(transformed_data["markers"]) - - //chart.subscribeCrosshairMove(param => { - chart.subscribeCrosshairMove(param => { - //LEGEND SECTIOIN - firstRow.style.color = 'white'; - update_chart_legend(param); - - //TOOLTIP SECTION - //$('#trade-timestamp').val(param.time) - if ( - param.point === undefined || - !param.time || - param.point.x < 0 || - param.point.x > container1.clientWidth || - param.point.y < 0 || - param.point.y > container1.clientHeight - ) { - toolTip.style.display = 'none'; - } else { - //vyber serie s jakou chci pracovat - muzu i dynamicky - //je to mapa https://tradingview.github.io/lightweight-charts/docs/api/interfaces/MouseEventParams - - //key = series (key.seriestype vraci Line/Candlestick atp.) https://tradingview.github.io/lightweight-charts/docs/api/interfaces/SeriesOptionsMap - - toolTip.style.display = 'none'; - toolTip.innerHTML = ""; - var data = param.seriesData.get(markersLine); - var data2 = param.seriesData.get(avgBuyLine); - var profitdata = param.seriesData.get(profitLine); - if ((data !== undefined) || (data2 !== undefined)) { - //param.seriesData.forEach((value, key) => { - //console.log("key",key) - //console.log("value",value) - - //data = value - //DOCASNE VYPNUTO - toolTip.style.display = 'block'; - - //console.log(JSON.safeStringify(key)) - // if (toolTip.innerHTML == "") { - // toolTip.innerHTML = `
${param.time}
` - // } - buy_price = 0 - //u sell markeru nemame avgBuyLine - if (data2 !== undefined) { - buy_price = parseFloat(data2.value).toFixed(3) - } - - toolTip.innerHTML += `
POS:${tradeDetails.get(param.time).position_qty}/${buy_price}
T:${tradeDetails.get(param.time).order.qty}/${data.value}
`; - if (profitdata !== undefined) { - toolTip.innerHTML += `
P:${parseFloat(profitdata.value).toFixed(1)}
` - } - //inspirace - // toolTip.innerHTML = `
Apple Inc.
- // ${Math.round(100 * price) / 100} - //
- // ${dateStr} - //
`; - - - // Position tooltip according to mouse cursor position - toolTip.style.left = param.point.x+120 + 'px'; - toolTip.style.top = param.point.y + 'px'; - } - //}); - } - }); - } - chart.subscribeClick(param => { $('#trade-timestamp').val(param.time) //toggle_vertical_line(param.time); @@ -899,6 +942,7 @@ function chart_archived_run(archRecord, data, oneMinuteBars) { //add status + $("#statusArchId").text(archRecord.id) $("#statusRegime").text("PAST RUN: "+archRecord.id) $("#statusName").text(archRecord.name) $("#statusMode").text(archRecord.mode) @@ -996,4 +1040,4 @@ function display_log(iterLogList, timestamp) { $('#messages').animate({ scrollTop: $('#lines')[0].scrollHeight}, 2000); -} \ No newline at end of file +} diff --git a/v2realbot/static/js/libs/j-toml/j-toml.d.ts b/v2realbot/static/js/libs/j-toml/j-toml.d.ts new file mode 100644 index 0000000..5c24e9d --- /dev/null +++ b/v2realbot/static/js/libs/j-toml/j-toml.d.ts @@ -0,0 +1,277 @@ +export as namespace TOML; +export = exports; + +declare namespace exports { + + export const version :'1.38.0'; + + export const parse : + & { + (this :void, source :Source, specificationVersion :1.0 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table; + (this :void, source :Source, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table; + (this :void, source :Source, options? :{ readonly joiner? :string, readonly bigint? :boolean | number, readonly x ? :XOptions }) :Table; + } + & { + readonly [SpecificationVersion in 1.0 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1] :{ + (this :void, source :Source, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table; + (this :void, source :Source, options? :{ readonly joiner? :string, readonly bigint? :boolean | number, readonly x ? :XOptions }) :Table; + } + }; + + export function stringify (this :void, rootTable :ReadonlyTable, options? :{ + readonly integer? :number + readonly newline? :'\n' | '\r\n' + readonly newlineAround? :'document' | 'section' | 'header' | 'pairs' | 'pair' + readonly indent? :string | number + readonly T? :'T' | 't' | ' ' + readonly Z? :'Z' | 'z' + readonly xNull? :boolean + readonly xBeforeNewlineInMultilineTable? :',' | '' + readonly forceInlineArraySpacing? :0 | 1 | 2 | 3 + }) :string; + + export function isSection (this :void, table :ReadonlyTable) :boolean; + export function isInline (this :void, value :ReadonlyTable | ReadonlyArray) :boolean; + + export function Section (this :void, table :T) :T; + export function inline (this :void, value :T, inlineMode? :0 | 1 | 2 | 3) :T; + export function inline (this :void, value :T) :T; + export const multiline :{ + readonly array :{ + + (this :void, array :T ) :T + } + + (this :void, table :T ) :T + (this :void, value :string ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object & String + (this :void, lines :readonly string[] ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object + (this :void, lines :readonly string[], value :string) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object & String + readonly basic :{ + (this :void, value :string ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object & String + (this :void, lines :readonly string[] ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object + (this :void, lines :readonly string[], value :string) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object & String + } + }; + export function basic (this :void, value :string ) :{ [_literal] :`"${string}"` } & object & String; + export function literal (this :void, literal :string ) :{ [_literal] :string | [ string, ...string[] ] } & object ; + export function literal (this :void, literal :string, value :string ) :{ [_literal] :string | [ string, ...string[] ] } & object & String; + export function literal (this :void, literal :string, value :number ) :{ [_literal] :string | [ string, ...string[] ] } & object & Number; + export function literal (this :void, literal :string, value :bigint ) :{ [_literal] :string | [ string, ...string[] ] } & object & BigInt; + export function literal (this :void, literal :TemplateStringsArray, ...chars :string[]) :{ [_literal] :string | [ string, ...string[] ] } & object ; + + export function commentFor (this :void, key :string) :symbol; + export const commentForThis :unique symbol; + + export { OffsetDateTime, LocalDateTime, LocalDate, LocalTime, Keys }; + + export { exports as default }; + +} + +declare class OffsetDateTime { + + readonly toJSON :Date['toJSON']; + + readonly [Symbol.toStringTag] :'OffsetDateTime'; + + readonly toISOString :(this :Readonly) => `${number}-${number}-${number}T${number}:${number}:${number}${'' | `.${number}`}${'Z' | `${'+' | '-'}${number}:${number}`}`; + readonly valueOf :(this :Readonly) => `${number}${'' | `.${number}`}`; + + private [OffsetDateTime_ISOString] :string; + private [OffsetDateTime_value] :string; + + constructor (literal :`${number}-${number}-${number}${'T' | 't' | ' '}${number}:${number}:${number}${'' | `.${number}`}${'Z' | 'z' | `${'+' | '-'}${number}:${number}`}`); + + readonly getUTCFullYear :(this :Readonly) => _1_10000; + readonly getUTCMonth :(this :Readonly) => _0_11; + readonly getUTCDate :(this :Readonly) => _1_31; + + readonly getUTCHours :(this :Readonly) => _0_23; + readonly getUTCMinutes :(this :Readonly) => _0_59; + readonly getUTCSeconds :(this :Readonly) => _0_59; + readonly getUTCMilliseconds :(this :Readonly) => _0_999; + + readonly getUTCDay :(this :Readonly) => _0_6; + readonly getTimezoneOffset :(this :Readonly) => _1439_1439; + readonly getTime :(this :Readonly) => number; + +} +declare class LocalDateTime { + + readonly toJSON :Date['toJSON']; + + readonly [Symbol.toStringTag] :'LocalDateTime'; + + readonly toISOString :(this :Readonly) => `${number}-${number}-${number}T${number}:${number}:${number}${'' | `.${number}`}`; + readonly valueOf :(this :Readonly) => `${number}`; + + private [LocalDateTime_ISOString] :string; + private [LocalDateTime_value] :string; + + constructor (literal :`${number}-${number}-${number}${'T' | 't' | ' '}${number}:${number}:${number}${'' | `.${number}`}`); + + readonly getFullYear :(this :Readonly) => _0_9999; + readonly setFullYear :(this :LocalDateTime, year :_0_9999) => void; + readonly getMonth :(this :Readonly) => _0_11; + readonly setMonth :(this :LocalDateTime, month :_0_11) => void; + readonly getDate :(this :Readonly) => _1_31; + readonly setDate :(this :LocalDateTime, date :_1_31) => void; + + readonly getHours :(this :Readonly) => _0_23; + readonly setHours :(this :LocalDateTime, hours :_0_23) => void; + readonly getMinutes :(this :Readonly) => _0_59; + readonly setMinutes :(this :LocalDateTime, min :_0_59) => void; + readonly getSeconds :(this :Readonly) => _0_59; + readonly setSeconds :(this :LocalDateTime, sec :_0_59) => void; + readonly getMilliseconds :(this :Readonly) => _0_999; + readonly setMilliseconds :(this :LocalDateTime, ms :_0_999) => void; + +} +declare class LocalDate { + + readonly toJSON :Date['toJSON']; + + readonly [Symbol.toStringTag] :'LocalDate'; + + readonly toISOString :(this :Readonly) => `${number}-${number}-${number}`; + readonly valueOf :(this :Readonly) => `${number}`; + + private [LocalDate_ISOString] :string; + private [LocalDate_value] :string; + + constructor (literal :`${number}-${number}-${number}`); + + readonly getFullYear :(this :Readonly) => _0_9999; + readonly setFullYear :(this :LocalDate, year :_0_9999) => void; + readonly getMonth :(this :Readonly) => _0_11; + readonly setMonth :(this :LocalDate, month :_0_11) => void; + readonly getDate :(this :Readonly) => _1_31; + readonly setDate :(this :LocalDate, date :_1_31) => void; + +} +declare class LocalTime { + + readonly toJSON :Date['toJSON']; + + readonly [Symbol.toStringTag] :'LocalTime'; + + readonly toISOString :(this :Readonly) => `${number}:${number}:${number}${'' | `.${number}`}`; + readonly valueOf :(this :Readonly) => `${number}`; + + private [LocalTime_ISOString] :string; + private [LocalTime_value] :string; + + constructor (literal :`${number}:${number}:${number}${'' | `.${number}`}`); + + readonly getHours :(this :Readonly) => _0_23; + readonly setHours :(this :LocalTime, hours :_0_23) => void; + readonly getMinutes :(this :Readonly) => _0_59; + readonly setMinutes :(this :LocalTime, min :_0_59) => void; + readonly getSeconds :(this :Readonly) => _0_59; + readonly setSeconds :(this :LocalTime, sec :_0_59) => void; + readonly getMilliseconds :(this :Readonly) => _0_999; + readonly setMilliseconds :(this :LocalTime, ms :_0_999) => void; + +} + +declare class Keys extends RegExp { + readonly lastIndex :number; + constructor (keys :ArrayLike); + readonly test :(this :Keys, key :string) => boolean; +} + +declare const _literal :unique symbol; + +type Source = string | ArrayBufferLike + | { + readonly path :string, + readonly data? :undefined, + readonly require : + | { + readonly resolve? :{ readonly paths? :undefined } + (this :void, id :'fs') :{ + readonly readFileSync :(this :void, path :string) => ArrayBufferLike + } + } + | { + readonly resolve :{ readonly paths :(this :void, request :string) => null | string[] } + (this :void, id :'path') :{ + readonly resolve :(this :void, dirname :string, filename :string) => string + } + (this :void, id :'fs') :{ + readonly readFileSync :(this :void, path :string) => ArrayBufferLike + } + }, + } + | { + readonly path :string, + readonly data :string | ArrayBufferLike, + readonly require? : + | { + readonly resolve? :{ readonly paths? :undefined } + } + | { + readonly resolve :{ readonly paths :(this :void, request :string) => null | string[] } + (this :void, id :'path') :{ + readonly resolve :(this :void, dirname :string, filename :string) => string + } + }, + }; + +type XOptions = null | { + readonly keys? :null | Keys, + readonly order? :boolean, + readonly exact? :boolean, + readonly multi? :boolean, + readonly longer? :boolean, + readonly string? :boolean, + readonly comment? :boolean, + readonly literal? :boolean, + readonly null? :boolean, + readonly tag? :null | ( + + (this :void, each : + | { table :Table, key :Key, tag :Tag } + | { array :Array, index :Index, tag :Tag } + | { table :Table, key :Key, array :Array, index :Index, tag :Tag } + ) => void + ), +}; + +type ReadonlyTable = object & { readonly [key :string] :ReadonlyValue }; +type ReadonlyArray = readonly ReadonlyValue[]; +type ReadonlyValue = + | { readonly [_literal] :string | readonly [ string, ...string[] ] } & object + | null | boolean | bigint | number | string + | ReadonlyDatetime | ReadonlyArray | ReadonlyTable +; +interface ReadonlyDatetime { readonly toISOString :(this :this) => string } + +type Table = object & { [key :string] :Value }; +type Array = Value[]; +type Value = + | object & BigInt & { [_literal] :string } + | object & Number & { [_literal] :string } + | object & String & { [_literal] :string | [ string, ...string[] ] } + | null | boolean | bigint | number | string + | Datetime | Array | Table +; +type Datetime = OffsetDateTime | LocalDateTime | LocalDate | LocalTime; +declare const OffsetDateTime_ISOString :unique symbol; +declare const OffsetDateTime_value :unique symbol; +declare const LocalDateTime_ISOString :unique symbol; +declare const LocalDateTime_value :unique symbol; +declare const LocalDate_ISOString :unique symbol; +declare const LocalDate_value :unique symbol; +declare const LocalTime_ISOString :unique symbol; +declare const LocalTime_value :unique symbol; + +type _1439_1439 = -1439 | {} & number | 1439; +type _1_10000 = -1 | {} & number | 10000; +type _0_9999 = 0 | {} & number | 9999; +type _0_999 = 0 | {} & number | 999; +type _0_6 = 0 | 1 | 2 | 3 | 4 | 5 | 6; +type _0_11 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; +type _0_23 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23; +type _1_31 = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31; +type _0_59 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59; diff --git a/v2realbot/static/js/libs/j-toml/j-toml.js b/v2realbot/static/js/libs/j-toml/j-toml.js new file mode 100644 index 0000000..452115c --- /dev/null +++ b/v2realbot/static/js/libs/j-toml/j-toml.js @@ -0,0 +1,3008 @@ +/*!@preserve@license + * 模块名称:j-toml + * 模块功能:龙腾道为汤小明语写的实现。从属于“简计划”。 +      An implementation of TOML written by LongTengDao. Belong to "Plan J". + * 模块版本:1.38.0 + * 许可条款:LGPL-3.0 + * 所属作者:龙腾道 (www.LongTengDao.com) + * 问题反馈:https://GitHub.com/LongTengDao/j-toml/issues + * 项目主页:https://GitHub.com/LongTengDao/j-toml/ + */ + +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : +typeof define === 'function' && define.amd ? define(factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.TOML = factory()); +})(this, (function () { 'use strict'; + +const version = '1.38.0'; + +const SyntaxError$1 = SyntaxError; + +const RangeError$1 = RangeError; + +const TypeError$1 = TypeError; + +const Error$1 = {if:Error}.if; + +const undefined$1 = void null; + +const BigInt$1 = typeof BigInt==='undefined' ? undefined$1 : BigInt; + +const RegExp$1 = RegExp; + +const WeakMap$1 = WeakMap; + +const get = WeakMap.prototype.get; + +const set = WeakMap.prototype.set; + +const create$1 = Object.create; + +const isSafeInteger = Number.isSafeInteger; + +const getOwnPropertyNames = Object.getOwnPropertyNames; + +const freeze = Object.freeze; + +const isPrototypeOf = Object.prototype.isPrototypeOf; + +const NULL = ( + /* j-globals: null.prototype (internal) */ + Object.seal + ? /*#__PURE__*/Object.preventExtensions(Object.create(null)) + : null + /* j-globals: null.prototype (internal) */ +); + +const bind = Function.prototype.bind; + +const test = RegExp.prototype.test; + +const exec = RegExp.prototype.exec; + +const apply$1 = Reflect.apply; + +const Proxy$1 = Proxy; + +const toStringTag = typeof Symbol==='undefined' ? undefined$1 : Symbol.toStringTag; + +const Object_defineProperty = Object.defineProperty; + +const assign$1 = Object.assign; + +const Object$1 = Object; + +const floor = Math.floor; + +const isArray$1 = Array.isArray; + +const Infinity = 1/0; + +const fromCharCode = String.fromCharCode; + +const Array$1 = Array; + +const hasOwnProperty = Object.prototype.hasOwnProperty; + +const propertyIsEnumerable = Object.prototype.propertyIsEnumerable; + +const apply = Function.prototype.apply; + +var isEnum = /*#__PURE__*/propertyIsEnumerable.call.bind(propertyIsEnumerable); +var hasOwn = ( + /* j-globals: Object.hasOwn (polyfill) */ + Object$1.hasOwn || /*#__PURE__*/function () { + return hasOwnProperty.bind + ? hasOwnProperty.call.bind(hasOwnProperty) + : function hasOwn (object, key) { return hasOwnProperty.call(object, key); }; + }() + /* j-globals: Object.hasOwn (polyfill) */ +); + +var create = Object$1.create; +function Descriptor (source) { + var target = create(NULL); + if ( hasOwn(source, 'value') ) { target.value = source.value; } + if ( hasOwn(source, 'writable') ) { target.writable = source.writable; } + if ( hasOwn(source, 'get') ) { target.get = source.get; } + if ( hasOwn(source, 'set') ) { target.set = source.set; } + if ( hasOwn(source, 'enumerable') ) { target.enumerable = source.enumerable; } + if ( hasOwn(source, 'configurable') ) { target.configurable = source.configurable; } + return target; +} + +const Default = ( + /* j-globals: default (internal) */ + function Default (exports, addOnOrigin) { + if ( !addOnOrigin && typeof exports!=='function' ) { + addOnOrigin = exports; + exports = create$1(NULL); + } + if ( assign$1 ) { assign$1(exports, addOnOrigin); } + else { for ( var key in addOnOrigin ) { if ( hasOwn(addOnOrigin, key) ) { exports[key] = addOnOrigin[key]; } } } + exports.default = exports; + if ( typeof exports==='function' ) { exports.prototype && freeze(exports.prototype); } + else if ( toStringTag ) { + var descriptor = create$1(NULL); + descriptor.value = 'Module'; + Object_defineProperty(exports, toStringTag, descriptor); + } + return freeze(exports); + } + /* j-globals: default (internal) */ +); + +/*!@preserve@license + * 模块名称:j-regexp + * 模块功能:可读性更好的正则表达式创建方式。从属于“简计划”。 +      More readable way for creating RegExp. Belong to "Plan J". + * 模块版本:8.2.0 + * 许可条款:LGPL-3.0 + * 所属作者:龙腾道 (www.LongTengDao.com) + * 问题反馈:https://GitHub.com/LongTengDao/j-regexp/issues + * 项目主页:https://GitHub.com/LongTengDao/j-regexp/ + */ + +var Test = bind + ? /*#__PURE__*/bind.bind(test ) + : function (re) { + return function (string) { + return test.call(re, string); + }; + }; + +var Exec = bind + ? /*#__PURE__*/bind.bind(exec ) + : function (re) { + return function (string) { + return exec.call(re, string); + }; + }; + +function __PURE__ (re ) { + var test = re.test = Test(re); + var exec = re.exec = Exec(re); + var source = test.source = exec.source = re.source; + test.unicode = exec.unicode = re.unicode; + test.ignoreCase = exec.ignoreCase = re.ignoreCase; + test.multiline = exec.multiline = source.indexOf('^')<0 && source.indexOf('$')<0 ? null : re.multiline; + test.dotAll = exec.dotAll = source.indexOf('.')<0 ? null : re.dotAll; + return re; +} +function theRegExp (re ) { return /*#__PURE__*/__PURE__(re); } + +var NT = /[\n\t]+/g; +var ESCAPE = /\\./g; +function graveAccentReplacer ($$ ) { return $$==='\\`' ? '`' : $$; } + +var includes = ''.includes + ? function (that , searchString ) { return that.includes(searchString); } + : function (that , searchString ) { return that.indexOf(searchString)>-1; }; + +function RE ( template ) { + var U = this.U; + var I = this.I; + var M = this.M; + var S = this.S; + var raw = template.raw; + var source = raw[0] .replace(NT, ''); + var index = 1; + var length = arguments.length; + while ( index!==length ) { + var value + + + + + + = arguments[index]; + if ( typeof value==='string' ) { source += value; } + else { + var value_source = value.source; + if ( typeof value_source!=='string' ) { throw TypeError$1('source'); } + if ( value.unicode===U ) { throw SyntaxError$1('unicode'); } + if ( value.ignoreCase===I ) { throw SyntaxError$1('ignoreCase'); } + if ( value.multiline===M && ( includes(value_source, '^') || includes(value_source, '$') ) ) { throw SyntaxError$1('multiline'); } + if ( value.dotAll===S && includes(value_source, '.') ) { throw SyntaxError$1('dotAll'); } + source += value_source; + } + source += raw[index++] .replace(NT, ''); + } + var re = RegExp$1(U ? source = source.replace(ESCAPE, graveAccentReplacer) : source, this.flags); + var test = re.test = Test(re); + var exec = re.exec = Exec(re); + test.source = exec.source = source; + test.unicode = exec.unicode = !U; + test.ignoreCase = exec.ignoreCase = !I; + test.multiline = exec.multiline = includes(source, '^') || includes(source, '$') ? !M : null; + test.dotAll = exec.dotAll = includes(source, '.') ? !S : null; + return re; +} + +var RE_bind = bind && /*#__PURE__*/bind.bind(RE ); + +function Context (flags ) { + return { + U: !includes(flags, 'u'), + I: !includes(flags, 'i'), + M: !includes(flags, 'm'), + S: !includes(flags, 's'), + flags: flags + }; +} + +var CONTEXT = /*#__PURE__*/Context(''); + +var newRegExp = Proxy$1 + ? /*#__PURE__*/new Proxy$1(RE, { + apply: function (RE, thisArg, args ) { return apply$1(RE, CONTEXT, args); } + , + get: function (RE, flags ) { return RE_bind(Context(flags)); } + , + defineProperty: function () { return false; } + , + preventExtensions: function () { return false; } + }) + : /*#__PURE__*/function () { + RE.apply = RE.apply; + var newRegExp = function () { return RE.apply(CONTEXT, arguments ); } ; + var d = 1; + var g = d*2; + var i = g*2; + var m = i*2; + var s = i*2; + var u = s*2; + var y = u*2; + var flags = y*2 - 1; + while ( flags-- ) { + ( function (context) { + newRegExp[context.flags] = function () { return RE.apply(context, arguments ); }; + } )(Context( + ( flags & d ? '' : 'd' ) + + + ( flags & g ? '' : 'g' ) + + + ( flags & i ? '' : 'i' ) + + + ( flags & m ? '' : 'm' ) + + + ( flags & s ? '' : 's' ) + + + ( flags & u ? '' : 'u' ) + + + ( flags & y ? '' : 'y' ) + )); + } + return freeze ? freeze(newRegExp) : newRegExp; + }(); + +var clearRegExp = '$_' in RegExp$1 + ? /*#__PURE__*/function () { + var REGEXP = /^/; + REGEXP.test = REGEXP.test; + return function clearRegExp (value ) { + REGEXP.test(''); + return value; + }; + }() + : function clearRegExp (value ) { + return value; + }; + +var clearRegExp$1 = clearRegExp; + +var NEED_TO_ESCAPE_IN_REGEXP = /^[$()*+\-.?[\\\]^{|]/; +var SURROGATE_PAIR = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/; +var GROUP = /*#__PURE__*/create$1(NULL) ; + +function groupify (branches , uFlag , noEscape ) { + var group = create$1(NULL) ; + var appendBranch = uFlag ? appendPointBranch : appendCodeBranch; + for ( var length = branches.length, index = 0; index (www.LongTengDao.com) + * 问题反馈:https://GitHub.com/LongTengDao/j-orderify/issues + * 项目主页:https://GitHub.com/LongTengDao/j-orderify/ + */ + +const Keeper = () => []; + +const newWeakMap = () => { + const weakMap = new WeakMap$1; + weakMap.has = weakMap.has; + weakMap.get = weakMap.get; + weakMap.set = weakMap.set; + return weakMap; +}; +const target2keeper = /*#__PURE__*/newWeakMap() + + + ; +const proxy2target = /*#__PURE__*/newWeakMap() + + + + ; +const target2proxy = /*#__PURE__*/newWeakMap() + + + ; + +const handlers = /*#__PURE__*/assign$1(create$1(NULL), { + defineProperty: (target , key , descriptor ) => { + if ( hasOwn(target, key) ) { + return Reflect_defineProperty(target, key, assign$1(create$1(NULL), descriptor)); + } + if ( Reflect_defineProperty(target, key, assign$1(create$1(NULL), descriptor)) ) { + const keeper = target2keeper.get(target) ; + keeper[keeper.length] = key; + return true; + } + return false; + }, + deleteProperty: (target , key ) => { + if ( Reflect_deleteProperty(target, key) ) { + const keeper = target2keeper.get(target) ; + const index = keeper.indexOf(key); + index<0 || --keeper.copyWithin(index, index + 1).length; + return true; + } + return false; + }, + ownKeys: (target ) => target2keeper.get(target) , + construct: (target , args , newTarget ) => orderify(Reflect_construct(target, args, newTarget)), + apply: (target , thisArg , args ) => orderify(apply$1(target, thisArg, args)), +}); + +const newProxy = (target , keeper ) => { + target2keeper.set(target, keeper); + const proxy = new Proxy$1 (target, handlers); + proxy2target.set(proxy, target); + return proxy; +}; + +const orderify = (object ) => { + if ( proxy2target.has(object) ) { return object; } + let proxy = target2proxy.get(object) ; + if ( proxy ) { return proxy; } + proxy = newProxy(object, assign$1(Keeper (), ownKeys(object))); + target2proxy.set(object, proxy); + return proxy; +}; + +const Null = /*#__PURE__*/function () { + function throwConstructing () { throw TypeError$1(`Super constructor Null cannot be invoked with 'new'`); } + function throwApplying () { throw TypeError$1(`Super constructor Null cannot be invoked without 'new'`); } + const Nullify = (constructor ) => { + delete constructor.prototype.constructor; + freeze(constructor.prototype); + return constructor; + }; + function Null ( constructor ) { + return new.target + ? new.target===Null + ? /*#__PURE__*/throwConstructing() + : /*#__PURE__*/newProxy(this, Keeper ()) + : typeof constructor==='function' + ? /*#__PURE__*/Nullify(constructor) + : /*#__PURE__*/throwApplying(); + } + //@ts-ignore + Null.prototype = null; + Object_defineProperty(Null, 'name', assign$1(create$1(NULL), { value: '', configurable: false })); + //delete Null.length; + freeze(Null); + return Null; +}() ; + +/*¡ j-orderify */ + +const map_has = WeakMap.prototype.has; + +const map_del = WeakMap.prototype['delete']; + +const INLINES = new WeakMap$1 (); +const SECTIONS = new WeakSet$1 (); + +const deInline = /*#__PURE__*/map_del.bind(INLINES) ; +const deSection = /*#__PURE__*/del.bind(SECTIONS) ; + +const isInline = /*#__PURE__*/map_has.bind(INLINES) ; +const ofInline = /*#__PURE__*/get.bind(INLINES) + + + + ; +const beInline = /*#__PURE__*/set.bind(INLINES) + + + ; +const inline = (value , mode , looping ) => { + if ( isArray$1(value) ) { + if ( looping ) { mode = 3; } + else { + if ( mode===undefined$1 ) { mode = 3; } + else if ( mode!==0 && mode!==1 && mode!==2 && mode!==3 ) { + throw typeof mode==='number' + ? RangeError$1(`array inline mode must be 0 | 1 | 2 | 3, not including ${mode}`) + : TypeError$1(`array inline mode must be "number" type, not including ${mode===null ? '"null"' : typeof mode}`); + } + } + beInline(value, mode); + } + else { + beInline(value, true); + deSection(value); + } + return value; +}; +const multilineTable = (value ) => { + beInline(value, false); + deSection(value); + return value; +}; +const multilineArray = (value ) => { + deInline(value); + return value; +}; + +const isSection = /*#__PURE__*/has.bind(SECTIONS) ; +const beSection = /*#__PURE__*/add.bind(SECTIONS) ; +const Section = (table ) => { + if ( isArray$1(table) ) { throw TypeError$1(`array can not be section, maybe you want to use it on the tables in it`); } + beSection(table); + deInline(table); + return table; +}; + +const INLINE = true; + +const tables = new WeakSet$1 (); +const tables_add = /*#__PURE__*/add.bind(tables); +const isTable = /*#__PURE__*/has.bind(tables) ; + +const implicitTables = new WeakSet$1 (); +const implicitTables_add = /*#__PURE__*/add.bind(implicitTables); +const implicitTables_del = /*#__PURE__*/del.bind(implicitTables) ; +const directlyIfNot = (table ) => { + if ( implicitTables_del(table) ) { + beSection(table); + return true; + } + return false; +}; +const DIRECTLY = true; +const IMPLICITLY = false; + +const pairs = new WeakSet$1 (); +const pairs_add = /*#__PURE__*/add.bind(pairs); +const fromPair = /*#__PURE__*/has.bind(pairs) ; +const PAIR = true; + +const PlainTable = /*#__PURE__*/Null$1(class Table extends Null$1 { + + constructor (isDirect , isInline$fromPair ) { + super(); + tables_add(this); + isDirect + ? isInline$fromPair ? beInline(this, true) : beSection(this) + : ( isInline$fromPair ? pairs_add : implicitTables_add )(this); + return this; + } +}); + +const OrderedTable = /*#__PURE__*/Null$1(class Table extends Null { + + constructor (isDirect , isInline$fromPair ) { + super(); + tables_add(this); + isDirect + ? isInline$fromPair ? beInline(this, true) : beSection(this) + : ( isInline$fromPair ? pairs_add : implicitTables_add )(this); + return this; + } +}); + +//import * as options from './options'; + +const NONE = []; +let sourcePath = ''; +let sourceLines = NONE; +let lastLineIndex = -1; +let lineIndex = -1; + +const throws = (error ) => { + //if ( sourceLines!==NONE ) { done(); options.clear(); } + throw error; +}; + +const EOL = /\r?\n/; +const todo = (source , path ) => { + if ( typeof path!=='string' ) { throw TypeError$1(`TOML.parse({ path })`); } + sourcePath = path; + sourceLines = source.split(EOL); + lastLineIndex = sourceLines.length - 1; + lineIndex = -1; +}; + +const next = () => sourceLines[++lineIndex] ; + +const rest = () => lineIndex!==lastLineIndex; + +class mark { + lineIndex = lineIndex; + type ; + restColumn ; + constructor (type , restColumn ) { + this.type = type; + this.restColumn = restColumn; + return this; + } + must ( ) { + lineIndex===lastLineIndex && throws(SyntaxError$1(`${this.type} is not close until the end of the file` + where(', which started from ', this.lineIndex, sourceLines[this.lineIndex] .length - this.restColumn + 1))); + return sourceLines[++lineIndex] ; + } + nowrap ( argsMode ) { + throw throws(Error$1(`TOML.parse(${argsMode ? `${argsMode}multilineStringJoiner` : `,{ joiner }`}) must be passed, while the source including multi-line string` + where(', which started from ', this.lineIndex, sourceLines[this.lineIndex] .length - this.restColumn + 1))); + } +} +const where = (pre , rowIndex = lineIndex, columnNumber = 0) => sourceLines===NONE ? '' : + sourcePath + ? `\n at (${sourcePath}:${rowIndex + 1}:${columnNumber})` + : `${pre}line ${rowIndex + 1}: ${sourceLines[rowIndex]}`; + +const done = () => { + sourcePath = ''; + sourceLines = NONE; +}; + +/* nested (readable) */ + +const Whitespace = /[ \t]/; + +const PRE_WHITESPACE = /*#__PURE__*/newRegExp` + ^${Whitespace}+`.valueOf(); + +const { exec: VALUE_REST_exec } = /*#__PURE__*/newRegExp.s ` + ^ + ( + (?:\d\d\d\d-\d\d-\d\d \d)? + [\w\-+.:]+ + ) + ${Whitespace}* + (.*) + $`.valueOf(); + +const { exec: LITERAL_STRING_exec } = /*#__PURE__*/newRegExp.s ` + ^ + '([^']*)' + ${Whitespace}* + (.*)`.valueOf(); + +const { exec: MULTI_LINE_LITERAL_STRING_0_1_2 } = /*#__PURE__*/newRegExp.s ` + ^ + (.*?) + '''('{0,2}) + ${Whitespace}* + (.*)`.valueOf(); +const { exec: MULTI_LINE_LITERAL_STRING_0 } = /*#__PURE__*/newRegExp.s ` + ^ + (.*?) + '''() + ${Whitespace}* + (.*)`.valueOf(); +let __MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0; + +const SYM_WHITESPACE = /*#__PURE__*/newRegExp.s` + ^ + . + ${Whitespace}*`.valueOf(); + + +const Tag = /[^\x00-\x1F"#'()<>[\\\]`{}\x7F]+/; + +const { exec: KEY_VALUE_PAIR_exec } = /*#__PURE__*/newRegExp.s ` + ^ + ${Whitespace}* + = + ${Whitespace}* + (?: + <(${Tag})> + ${Whitespace}* + )? + (.*) + $`.valueOf(); + +const { exec: _VALUE_PAIR_exec } = /*#__PURE__*/newRegExp.s ` + ^ + <(${Tag})> + ${Whitespace}* + (.*) + $`.valueOf(); + +const { exec: TAG_REST_exec } = /*#__PURE__*/newRegExp.s ` + ^ + <(${Tag})> + ${Whitespace}* + (.*) + $`.valueOf(); + +/* optimized (avoid overflow or lost) */ + +const MULTI_LINE_BASIC_STRING = theRegExp(/[^\\"]+|\\.?|"(?!"")"?/sy); +const MULTI_LINE_BASIC_STRING_exec_0_length = (_ ) => { + let lastIndex = /*MULTI_LINE_BASIC_STRING.lastIndex = */0; + while ( MULTI_LINE_BASIC_STRING.test(_) ) { lastIndex = MULTI_LINE_BASIC_STRING.lastIndex; } + return lastIndex; +}; + +const ESCAPED_EXCLUDE_CONTROL_CHARACTER_TAB______ = /[^\\\x00-\x08\x0B-\x1F\x7F]+|\\(?:[btnfr"\\]|[\t ]*\n[\t\n ]*|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/g; +const ESCAPED_EXCLUDE_CONTROL_CHARACTER__________ = /[^\\\x00-\x09\x0B-\x1F\x7F]+|\\(?:[btnfr"\\]|[\t ]*\n[\t\n ]*|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/g;/// Tab +const ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL______ = /[^\\\x00-\x09\x0B-\x1F]+|\\(?:[btnfr"\\]|[\t ]*\n[\t\n ]*|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/g;/// Tab \newline +const ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL_SLASH = /[^\\\x00-\x09\x0B-\x1F]+|\\(?:[btnfr"\\/]|[\t ]*\n[\t\n ]*|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/g;/// not \newline +let __ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER_TAB______; +const ESCAPED_EXCLUDE_CONTROL_CHARACTER_test = (_ ) => !_.replace(__ESCAPED_EXCLUDE_CONTROL_CHARACTER, '');/// op? + +const BASIC_STRING_TAB______ = theRegExp(/[^\\"\x00-\x08\x0B-\x1F\x7F]+|\\(?:[btnfr"\\]|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/y); +const BASIC_STRING__________ = theRegExp(/[^\\"\x00-\x08\x0B-\x1F\x7F]+|\\(?:[btnfr"\\]|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/y);/// Tab +const BASIC_STRING_DEL______ = theRegExp(/[^\\"\x00-\x08\x0B-\x1F]+|\\(?:[btnfr"\\]|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/y);/// Tab +const BASIC_STRING_DEL_SLASH = theRegExp(/[^\\"\x00-\x08\x0B-\x1F]+|\\(?:[btnfr"\\/]|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/y);/// Tab +let __BASIC_STRING = BASIC_STRING_DEL_SLASH; +const BASIC_STRING_exec_1_endIndex = (line ) => { + let lastIndex = __BASIC_STRING.lastIndex = 1; + while ( __BASIC_STRING.test(line) ) { lastIndex = __BASIC_STRING.lastIndex; } + lastIndex!==line.length && line[lastIndex]==='"' || throws(SyntaxError$1(`Bad basic string` + where(' at '))); + return lastIndex; +}; + +const { test: IS_DOT_KEY } = theRegExp(/^[ \t]*\./); +const DOT_KEY = /^[ \t]*\.[ \t]*/; +const { exec: BARE_KEY_STRICT } = theRegExp(/^[\w-]+/); +const { exec: BARE_KEY_FREE } = theRegExp(/^[^ \t#=[\]'".]+(?:[ \t]+[^ \t#=[\]'".]+)*/); +let __BARE_KEY_exec = BARE_KEY_FREE; +const { exec: LITERAL_KEY____ } = theRegExp(/^'[^'\x00-\x08\x0B-\x1F\x7F]*'/); +const { exec: LITERAL_KEY_DEL } = theRegExp(/^'[^'\x00-\x08\x0B-\x1F]*'/); +let __LITERAL_KEY_exec = LITERAL_KEY_DEL; +let supportArrayOfTables = true; + +const TABLE_DEFINITION_exec_groups = (lineRest , parseKeys ) => { + const asArrayItem = lineRest[1]==='['; + if ( asArrayItem ) { + supportArrayOfTables || throws(SyntaxError$1(`Array of Tables is not allowed before TOML v0.2` + where(', which at '))); + lineRest = lineRest.slice(2); + } + else { lineRest = lineRest.slice(1); } + lineRest = lineRest.replace(PRE_WHITESPACE, ''); + const { leadingKeys, finalKey } = { lineRest } = parseKeys(lineRest); + lineRest = lineRest.replace(PRE_WHITESPACE, ''); + lineRest && lineRest[0]===']' || throws(SyntaxError$1(`Table header is not closed` + where(', which is found at '))); + ( lineRest.length>1 ? lineRest[1]===']'===asArrayItem : !asArrayItem ) || throws(SyntaxError$1(`Square brackets of Table definition statement not match` + where(' at '))); + lineRest = lineRest.slice(asArrayItem ? 2 : 1).replace(PRE_WHITESPACE, ''); + let tag ; + if ( lineRest && lineRest[0]==='<' ) { ( { 1: tag, 2: lineRest } = TAG_REST_exec(lineRest) || throws(SyntaxError$1(`Bad tag` + where(' at '))) ); } + else { tag = ''; } + return { leadingKeys, finalKey, asArrayItem, tag, lineRest }; +}; + +const KEY_VALUE_PAIR_exec_groups = ({ leadingKeys, finalKey, lineRest } ) => { + const { 1: tag = '' } = { 2: lineRest } = KEY_VALUE_PAIR_exec(lineRest) || throws(SyntaxError$1(`Keys must equal something` + where(', but missing at '))); + tag || lineRest && lineRest[0]!=='#' || throws(SyntaxError$1(`Value can not be missing after euqal sign` + where(', which is found at '))); + return { leadingKeys, finalKey, tag, lineRest }; +}; + +const { test: CONTROL_CHARACTER_EXCLUDE_TAB____ } = theRegExp(/[\x00-\x08\x0B-\x1F\x7F]/); +const { test: CONTROL_CHARACTER_EXCLUDE_TAB_DEL } = theRegExp(/[\x00-\x08\x0B-\x1F]/); +let __CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB____; + +const switchRegExp = (specificationVersion ) => { + switch ( specificationVersion ) { + case 1.0: + __MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0_1_2; + __LITERAL_KEY_exec = LITERAL_KEY____; + __CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB____; + __ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER_TAB______; + __BASIC_STRING = BASIC_STRING_TAB______; + __BARE_KEY_exec = BARE_KEY_STRICT; + supportArrayOfTables = true; + break; + case 0.5: + __MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0; + __LITERAL_KEY_exec = LITERAL_KEY____; + __CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB____; + __ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER__________; + __BASIC_STRING = BASIC_STRING__________; + __BARE_KEY_exec = BARE_KEY_STRICT; + supportArrayOfTables = true; + break; + case 0.4: + __MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0; + __LITERAL_KEY_exec = LITERAL_KEY_DEL; + __CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB_DEL; + __ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL______; + __BASIC_STRING = BASIC_STRING_DEL______; + __BARE_KEY_exec = BARE_KEY_STRICT; + supportArrayOfTables = true; + break; + default: + __MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0; + __LITERAL_KEY_exec = LITERAL_KEY_DEL; + __CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB_DEL; + __ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL_SLASH; + __BASIC_STRING = BASIC_STRING_DEL_SLASH; + __BARE_KEY_exec = BARE_KEY_FREE; + supportArrayOfTables = false; + } +}; + +const NUM = /*#__PURE__*/newRegExp` + (?: + 0 + (?: + b[01][_01]* + | + o[0-7][_0-7]* + | + x[\dA-Fa-f][_\dA-Fa-f]* + | + (?:\.\d[_\d]*)?(?:[Ee]-?\d[_\d]*)? + ) + | + [1-9][_\d]* + (?:\.\d[_\d]*)?(?:[Ee]-?\d[_\d]*)? + | + inf + | + nan + ) +`.valueOf(); +const { test: IS_AMAZING } = /*#__PURE__*/newRegExp` + ^(?: + -?${NUM} + (?:-${NUM})* + | + true + | + false + )$ +`.valueOf(); +const { test: BAD_DXOB } = /*#__PURE__*/newRegExp`_(?![\dA-Fa-f])`.valueOf(); +const isAmazing = (keys ) => IS_AMAZING(keys) && !BAD_DXOB(keys); + +let mustScalar = true; + +let ARGS_MODE = ''; + +/* options */ + +let useWhatToJoinMultilineString = null; +let usingBigInt = true; +let IntegerMinNumber = 0; +let IntegerMaxNumber = 0; + + + + + + + + + + + + + + + +const ANY = { + test: () => true, +}; + + + +const Keys = class KeysRegExp extends RegExp$1 { + + constructor (keys ) { + super(`^${groupify(keys)}$`); + let maxLength = -1; + for ( let index = keys.length; index; ) { + const { length } = keys[--index] ; + if ( length>maxLength ) { maxLength = length; } + } + this.lastIndex = maxLength+1; + return this; + } + test ( key ) { + return key.length { + const as = (array ) => { + const got = arrayTypes_get(array); + got + ? got===as || throws(TypeError$1(`Types in Array must be same` + where('. Check '))) + : arrayTypes_set(array, as); + return array; + }; + return as; +}; +const AS_TYPED = { + asNulls: As(), + asStrings: As(), + asTables: As(), + asArrays: As(), + asBooleans: As(), + asFloats: As(), + asIntegers: As(), + asOffsetDateTimes: As(), + asLocalDateTimes: As(), + asLocalDates: As(), + asLocalTimes: As(), +}; +const asMixed = (array ) => array; +let + asNulls , + asStrings , + asTables , + asArrays , + asBooleans , + asFloats , + asIntegers , + asOffsetDateTimes , + asLocalDateTimes , + asLocalDates , + asLocalTimes ; + + + + +let processor = null; +let each = null; + + + + + +const collect_on = (tag , array , table , key ) => { + const _each = create$1(NULL) ; + _each._linked = each; + _each.tag = tag; + if ( table ) { + _each.table = table; + _each.key = key ; + } + if ( array ) { + _each.array = array; + _each.index = array.length; + } + each = _each; +}; +const collect_off = () => { throw throws(SyntaxError$1(`xOptions.tag is not enabled, but found tag syntax` + where(' at '))); }; +let collect = collect_off; + +const Process = () => { + if ( each ) { + const _processor = processor ; + let _each = each; + each = null; + return () => { + const processor = _processor; + let each = _each ; + _each = null; + do { processor(each); } + while ( each = each._linked ); + }; + } + return null; +}; + +/* use & clear */ + +const clear = () => { + KEYS$1 = ANY; + useWhatToJoinMultilineString = processor = each = null; + zeroDatetime = false; +}; + +const use = (specificationVersion , multilineStringJoiner , useBigInt , keys , xOptions , argsMode ) => { + + ARGS_MODE = argsMode; + + let mixed ; + switch ( specificationVersion ) { + case 1.0: + mustScalar = mixed = moreDatetime = sFloat = inlineTable = true; + zeroDatetime = disallowEmptyKey = false; + break; + case 0.5: + mustScalar = moreDatetime = sFloat = inlineTable = true; + mixed = zeroDatetime = disallowEmptyKey = false; + break; + case 0.4: + mustScalar = disallowEmptyKey = inlineTable = true; + mixed = zeroDatetime = moreDatetime = sFloat = false; + break; + case 0.3: + mustScalar = disallowEmptyKey = true; + mixed = zeroDatetime = moreDatetime = sFloat = inlineTable = false; + break; + case 0.2: + zeroDatetime = disallowEmptyKey = true; + mustScalar = mixed = moreDatetime = sFloat = inlineTable = false; + break; + case 0.1: + zeroDatetime = disallowEmptyKey = true; + mustScalar = mixed = moreDatetime = sFloat = inlineTable = false; + break; + default: + throw RangeError$1(`TOML.parse(,specificationVersion)`); + } + switchRegExp(specificationVersion); + + if ( typeof multilineStringJoiner==='string' ) { useWhatToJoinMultilineString = multilineStringJoiner; } + else if ( multilineStringJoiner===undefined$1 ) { useWhatToJoinMultilineString = null; } + else { throw TypeError$1(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE}multilineStringJoiner` : `,{ joiner }`})`); } + + if ( useBigInt===undefined$1 || useBigInt===true ) { usingBigInt = true; } + else if ( useBigInt===false ) { usingBigInt = false; } + else { + if ( typeof useBigInt!=='number' ) { throw TypeError$1(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},useBigInt` : `,{ bigint }`})`); } + if ( !isSafeInteger(useBigInt) ) { throw RangeError$1(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},useBigInt` : `,{ bigint }`})`); } + usingBigInt = null; + useBigInt>=0 + ? IntegerMinNumber = -( IntegerMaxNumber = useBigInt ) + : IntegerMaxNumber = -( IntegerMinNumber = useBigInt ) - 1; + } + if ( !BigInt$1 && usingBigInt!==false ) { throw Error$1(`Can't work without TOML.parse(${ARGS_MODE ? `${ARGS_MODE},useBigInt` : `,{ bigint }`}) being set to false, because the host doesn't have BigInt support`); } + + if ( keys==null ) { KEYS$1 = ANY; } + else { + if ( !isKeys(keys) ) { throw TypeError$1(`TOML.parse(,{ keys })`); } + KEYS$1 = keys; + } + + if ( xOptions==null ) { + Table = PlainTable; + sError = allowLonger = enableNull = allowInlineTableMultilineAndTrailingCommaEvenNoComma = false; + collect = collect_off; + } + else if ( typeof xOptions!=='object' ) { + throw TypeError$1(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},,xOptions` : `,{ x }`})`); + } + else { + const { order, longer, exact, null: _null, multi, comment, string, literal, tag, ...unknown } = xOptions; + const unknownNames = getOwnPropertyNames(unknown); + if ( unknownNames.length ) { throw TypeError$1(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},,{ ${unknownNames.join(', ')} }` : `,{ x: { ${unknownNames.join(', ')} } }`})`); } + Table = order ? OrderedTable : PlainTable; + allowLonger = !longer; + sError = !!exact; + enableNull = !!_null; + allowInlineTableMultilineAndTrailingCommaEvenNoComma = !!multi; + preserveComment = !!comment; + disableDigit = !!string; + preserveLiteral = !!literal; + if ( tag ) { + if ( typeof tag!=='function' ) { throw TypeError$1(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},,{ tag }` : `,{ x: { tag } }`})`); } + if ( !mixed ) { throw TypeError$1(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},,xOptions` : `,{ x }`}) xOptions.tag needs at least TOML 1.0 to support mixed type array`); } + processor = tag; + collect = collect_on; + } + else { collect = collect_off; } + } + + mixed + ? asNulls = asStrings = asTables = asArrays = asBooleans = asFloats = asIntegers = asOffsetDateTimes = asLocalDateTimes = asLocalDates = asLocalTimes = asMixed + : ( { asNulls, asStrings, asTables, asArrays, asBooleans, asFloats, asIntegers, asOffsetDateTimes, asLocalDateTimes, asLocalDates, asLocalTimes } = AS_TYPED ); + +}; + +const isView = ArrayBuffer.isView; + +const isArrayBuffer = ( + /* j-globals: class.isArrayBuffer (internal) */ + /*#__PURE__*/ function () { + if ( typeof ArrayBuffer==='function' ) { + var byteLength_apply = apply.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength').get); + return function isArrayBuffer (value) { + try { byteLength_apply(value); } + catch (error) { return false; } + return true; + }; + } + return function isArrayBuffer () { return false; }; + }() + /* j-globals: class.isArrayBuffer (internal) */ +); + +const TextDecoder$1 = TextDecoder; + +const Symbol$1 = Symbol; + +const previous = Symbol$1('previous') ; + + + + + + + + +const x = (rootStack ) => { + let stack = rootStack; + let result = stack.next(); + if ( !result.done ) { + result.value[previous] = stack; + result = ( stack = result.value ).next(); + for ( ; ; ) { + if ( result.done ) { + if ( stack===rootStack ) { break; } + stack = stack[previous] ; + result = stack.next(result.value); + } + else { + result.value[previous] = stack; + result = ( stack = result.value ).next(); + } + } + } + return result.value; +}; + +const _literal = Symbol$1('_literal') ; + +const LiteralObject = (literal , value ) => { + const object = Object$1(value) ; + object[_literal] = literal; + return object; +}; + +const arrays = new WeakSet$1 (); +const arrays_add = /*#__PURE__*/add.bind(arrays); +const isArray = /*#__PURE__*/has.bind(arrays) ; + +const OF_TABLES = false; +const STATICALLY = true; +const staticalArrays = new WeakSet$1 (); +const staticalArrays_add = /*#__PURE__*/add.bind(staticalArrays); +const isStatic = /*#__PURE__*/has.bind(staticalArrays) ; + +const newArray = (isStatic ) => { + const array = []; + arrays_add(array); + isStatic && staticalArrays_add(array); + return array; +}; + +const NativeDate = Date; + +const parse$2 = Date.parse; + +const preventExtensions = Object.preventExtensions; + +const getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors; + +const defineProperties = ( + /* j-globals: null.defineProperties (internal) */ + function defineProperties (object, descriptorMap) { + var created = create$1(NULL); + var names = keys(descriptorMap); + for ( var length = names.length, index = 0; index { + freeze(freeze(c).prototype); + return c; +}; + +const _29_ = /(?:0[1-9]|1\d|2\d)/; +const _30_ = /(?:0[1-9]|[12]\d|30)/; +const _31_ = /(?:0[1-9]|[12]\d|3[01])/; +const _23_ = /(?:[01]\d|2[0-3])/; +const _59_ = /[0-5]\d/; + +const YMD = /*#__PURE__*/newRegExp` + \d\d\d\d- + (?: + 0 + (?: + [13578]-${_31_} + | + [469]-${_30_} + | + 2-${_29_} + ) + | + 1 + (?: + [02]-${_31_} + | + 1-${_30_} + ) + ) +`.valueOf(); + +const HMS = /*#__PURE__*/newRegExp` + ${_23_}:${_59_}:${_59_} +`.valueOf(); + +const OFFSET$ = /(?:[Zz]|[+-]\d\d:\d\d)$/; + +const { exec: Z_exec } = theRegExp (/(([+-])\d\d):(\d\d)$/); + +const { exec: OFFSET_DATETIME_exec } = /*#__PURE__*/newRegExp` + ^ + ${YMD} + [Tt ] + ${HMS} + (?:\.\d{1,3}(\d*?)0*)? + (?:[Zz]|[+-]${_23_}:${_59_}) + $`.valueOf(); + +const { exec: OFFSET_DATETIME_ZERO_exec } = /*#__PURE__*/newRegExp` + ^ + ${YMD} + [Tt ] + ${HMS} + () + [Zz] + $`.valueOf(); + +const { test: IS_LOCAL_DATETIME } = /*#__PURE__*/newRegExp` + ^ + ${YMD} + [Tt ] + ${HMS} + (?:\.\d+)? + $`.valueOf(); + +const { test: IS_LOCAL_DATE } = /*#__PURE__*/newRegExp` + ^ + ${YMD} + $`.valueOf(); + +const { test: IS_LOCAL_TIME } = /*#__PURE__*/newRegExp` + ^ + ${HMS} + (?:\.\d+)? + $`.valueOf(); + +const T = /[ t]/; +const DELIMITER_DOT = /[-T:.]/g; +const DOT_ZERO = /\.?0+$/; +const ZERO = /\.(\d*?)0+$/; +const zeroReplacer = (match , p1 ) => p1; + +const Datetime = /*#__PURE__*/( () => { + const Datetime = function ( ) { + return this; + } ;//expression? :undefined, literal? :undefined, dotValue? :undefined + // > .setTime() + // > .getTime() : Date.parse('T') + // [Symbol.toPrimitive]('number') > .valueOf() + // > .toISOString() + const descriptors = Null$1(null) ; + { + const descriptor = Null$1(null); + for ( const key of ownKeys(NativeDate.prototype ) ) { + key==='constructor' || + key==='toJSON' || + ( descriptors[key] = descriptor ); + } + } + Datetime.prototype = preventExtensions(create$1(NativeDate.prototype, descriptors)); + return freeze(Datetime); +} )(); + + + + + + + + + + + + + +const Value = (ISOString ) => ISOString.replace(ZERO, zeroReplacer).replace(DELIMITER_DOT, ''); + +const d = /./gs; +const d2u = (d ) => '\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009'[d ] ; +const ValueOFFSET = (time , more ) => time<0 + ? ( '' + ( time + 62167305540000 ) ).replace(d, d2u).padStart(14, '\u2000') + more.replace(d, d2u) + time + : more + ? ( time + '.' ).padStart(16, '0') + more + : ( '' + time ).padStart(15, '0'); + +const validateLeap = (literal ) => { + if ( literal.startsWith('02-29', 5) ) { + const year = +literal.slice(0, 4); + return ( + year & 0b11 ? false : + year%100 ? true : + year%400 ? false : + year%3200 ? true : + false + ); + } + return true; +}; +const { test: VALIDATE_LEAP } = /*#__PURE__*/newRegExp.s`^.....(?:06.30|12.31).23:59:59`.valueOf(); + +const DATE$1 = /*#__PURE__*/defineProperties(new NativeDate(0), /*#__PURE__*/getOwnPropertyDescriptors(NativeDate.prototype)); + +const OffsetDateTime_ISOString = Symbol$1('OffsetDateTime_ISOString') ; +const OffsetDateTime_value = Symbol$1('OffsetDateTime_value') ; +const OffsetDateTime_use = (that , $ = 0) => { + DATE$1.setTime(+that[OffsetDateTime_value] + $); + return DATE$1; +}; +/*const OffsetDateTime_get = (that :InstanceType, start :number, end :number) => +that[OffsetDateTime_ISOString].slice(start, end); +const OffsetDateTime_set = (that :InstanceType, start :number, end :number, value :number, reserveMore :boolean) => { + if ( end ) { + const string = '' + value; + const size = end - start; + if ( string.length>size ) { throw RangeError(); }/// + that[OffsetDateTime_ISOString] = that[OffsetDateTime_ISOString].slice(0, start) + string.padStart(size, '0') + that[OffsetDateTime_ISOString].slice(end); + } + const time = parse(that[OffsetDateTime_ISOString]); + return that[OffsetDateTime_value] = ValueOFFSET(time, that[OffsetDateTime_value].includes('-') + ? that[OffsetDateTime_value].slice(14, that[OffsetDateTime_value].indexOf('-', 14)) + : that[OffsetDateTime_value].slice(15) + );///time +};*/// +const OffsetDateTime = /*#__PURE__*/fpc(class OffsetDateTime extends Datetime { + + [OffsetDateTime_ISOString] ; + [OffsetDateTime_value] ; + + get [Symbol$1.toStringTag] () { return 'OffsetDateTime' ; } + + valueOf ( ) { return this[OffsetDateTime_value]; } + toISOString ( ) { return this[OffsetDateTime_ISOString]; } + + constructor (literal ) { + validateLeap(literal) || throws(SyntaxError$1(`Invalid Offset Date-Time ${literal}` + where(' at '))); + const with60 = literal.startsWith('60', 17); + let without60 = with60 ? literal.slice(0, 17) + '59' + literal.slice(19) : literal; + const { 1: more = '' } = ( zeroDatetime ? OFFSET_DATETIME_ZERO_exec(without60) : OFFSET_DATETIME_exec(without60) ) || throws(SyntaxError$1(`Invalid Offset Date-Time ${literal}` + where(' at '))); + const time = parse$2(without60 = without60.replace(T, 'T').replace('z', 'Z')); + if ( with60 ) { + DATE$1.setTime(time); + VALIDATE_LEAP(DATE$1.toISOString()) || throws(SyntaxError$1(`Invalid Offset Date-Time ${literal}` + where(' at '))); + } + super(); + this[OffsetDateTime_ISOString] = without60; + this[OffsetDateTime_value] = ValueOFFSET(time, more); + return this; + } + + getUTCFullYear ( ) { return OffsetDateTime_use(this).getUTCFullYear(); } + ///get year () :FullYear { return OffsetDateTime_get(this, 0, 4); } + ///set year (value :FullYear) { OffsetDateTime_set(this, 0, 4, value, true); } + getUTCMonth ( ) { return OffsetDateTime_use(this).getUTCMonth(); } + ///get month () { return OffsetDateTime_get(this, 5, 7); } + ///set month (value) { OffsetDateTime_set(this, 5, 7, value, true); } + getUTCDate ( ) { return OffsetDateTime_use(this).getUTCDate(); } + ///get day () :Date { return OffsetDateTime_get(this, 8, 10); } + ///set day (value :Date) { OffsetDateTime_set(this, 8, 10, value, true); } + + getUTCHours ( ) { return OffsetDateTime_use(this).getUTCHours(); } + ///get hour () :Hours { return OffsetDateTime_get(this, 11, 13); } + ///set hour (value :Hours) { OffsetDateTime_set(this, 11, 13, value, true); } + getUTCMinutes ( ) { return OffsetDateTime_use(this).getUTCMinutes(); } + ///get minute () :Minutes { return OffsetDateTime_get(this, 14, 16); } + ///set minute (value :Minutes) { OffsetDateTime_set(this, 14, 16, value, true); } + getUTCSeconds ( ) { return OffsetDateTime_use(this).getUTCSeconds(); } + ///get second () :Seconds { return OffsetDateTime_get(this, 17, 19); } + ///set second (value :Seconds) { OffsetDateTime_set(this, 17, 19, value, true); } + getUTCMilliseconds ( ) { return OffsetDateTime_use(this).getUTCMilliseconds(); }/// + ///get millisecond () :Milliseconds { return this[OffsetDateTime_value]%1000; }/// + /*set millisecond (value :Milliseconds) { + this[OffsetDateTime_ISOString] = this[OffsetDateTime_ISOString].slice(0, 19) + ( value ? ( '.' + ( '' + value ).padStart(3, '0') ).replace(DOT_ZERO, '') : '' ) + this[OffsetDateTime_ISOString].slice(this[OffsetDateTime_ISOString].search(OFFSET$)); + OffsetDateTime_set(this, 0, 0, 0, false); + }*/// + ///get microsecond () :Milliseconds + ///set microsecond (value :Milliseconds) + ///get nanosecond () :Milliseconds + ///set nanosecond (value :Milliseconds) + + getUTCDay ( ) { return OffsetDateTime_use(this).getUTCDay(); } + ///get dayOfWeek () { return OffsetDateTime_use(this, this.getTimezoneOffset()*60000).getUTCDay() || 7; } + getTimezoneOffset ( ) { + const z = Z_exec(this[OffsetDateTime_ISOString]); + return z ? +z[1]*60 + +( z[2] + z[3] ) : 0; + } + ///get offset () { return this[OffsetDateTime_ISOString].endsWith('Z') ? 'Z' : this[OffsetDateTime_ISOString].slice(-6); } + /*set offset (value) { + this[OffsetDateTime_ISOString] = this[OffsetDateTime_ISOString].slice(0, this[OffsetDateTime_ISOString].endsWith('Z') ? -1 : -6) + value; + OffsetDateTime_set(this, 0, 0, 0, true); + }*/// + getTime ( ) { return floor(+this[OffsetDateTime_value]); }/// + /*setTime (this :OffsetDateTime, value :Time) :void { + value = DATE.setTime(value); + const z = Z_exec(this[OffsetDateTime_ISOString]); + DATE.setTime(value + ( z ? +z[1]*60 + +( z[2] + z[3] ) : 0 )*60000); + this[OffsetDateTime_ISOString] = z ? DATE.toISOString().slice(0, -1) + z[0] : DATE.toISOString(); + this[OffsetDateTime_value] = ValueOFFSET(value, ''); + ///return value; + }*/ + +}); + +const LocalDateTime_ISOString = Symbol$1('LocalDateTime_ISOString') ; +const LocalDateTime_value = Symbol$1('LocalDateTime_value') ; +const LocalDateTime_get = (that , start , end ) => +that[LocalDateTime_ISOString].slice(start, end); +const LocalDateTime_set = (that , start , end , value ) => { + const string = '' + value; + const size = end - start; + if ( string.length>size ) { throw RangeError$1(); }/// + that[LocalDateTime_value] = Value( + that[LocalDateTime_ISOString] = that[LocalDateTime_ISOString].slice(0, start) + string.padStart(size, '0') + that[LocalDateTime_ISOString].slice(end) + ); +}; +const LocalDateTime = /*#__PURE__*/fpc(class LocalDateTime extends Datetime { + + [LocalDateTime_ISOString] ; + [LocalDateTime_value] ; + + get [Symbol$1.toStringTag] () { return 'LocalDateTime' ; } + + valueOf ( ) { return this[LocalDateTime_value]; } + toISOString ( ) { return this[LocalDateTime_ISOString]; } + + constructor (literal ) { + IS_LOCAL_DATETIME(literal) && validateLeap(literal) || throws(SyntaxError$1(`Invalid Local Date-Time ${literal}` + where(' at '))); + super(); + this[LocalDateTime_value] = Value( + this[LocalDateTime_ISOString] = literal.replace(T, 'T') + ); + return this; + } + + getFullYear ( ) { return LocalDateTime_get(this, 0, 4); } + setFullYear ( value ) { LocalDateTime_set(this, 0, 4, value); } + getMonth ( ) { return LocalDateTime_get(this, 5, 7) - 1; } + setMonth ( value ) { LocalDateTime_set(this, 5, 7, value + 1); } + getDate ( ) { return LocalDateTime_get(this, 8, 10); } + setDate ( value ) { LocalDateTime_set(this, 8, 10, value); } + + getHours ( ) { return LocalDateTime_get(this, 11, 13); } + setHours ( value ) { LocalDateTime_set(this, 11, 13, value); } + getMinutes ( ) { return LocalDateTime_get(this, 14, 16); } + setMinutes ( value ) { LocalDateTime_set(this, 14, 16, value); } + getSeconds ( ) { return LocalDateTime_get(this, 17, 19); } + setSeconds ( value ) { LocalDateTime_set(this, 17, 19, value); } + getMilliseconds ( ) { return +this[LocalDateTime_value].slice(14, 17).padEnd(3, '0'); }/// + setMilliseconds ( value ) { + this[LocalDateTime_value] = Value( + this[LocalDateTime_ISOString] = this[LocalDateTime_ISOString].slice(0, 19) + ( value ? ( '.' + ( '' + value ).padStart(3, '0') ).replace(DOT_ZERO, '') : '' ) + ); + } + +}); + +const LocalDate_ISOString = Symbol$1('LocalDate_ISOString') ; +const LocalDate_value = Symbol$1('LocalDate_value') ; +const LocalDate_get = (that , start , end ) => +that[LocalDate_ISOString].slice(start, end); +const LocalDate_set = (that , start , end , value ) => { + const string = '' + value; + const size = end - start; + if ( string.length>size ) { throw RangeError$1(); }/// + that[LocalDate_value] = Value( + that[LocalDate_ISOString] = that[LocalDate_ISOString].slice(0, start) + string.padStart(size, '0') + that[LocalDate_ISOString].slice(end) + ); +}; +const LocalDate = /*#__PURE__*/fpc(class LocalDate extends Datetime { + + [LocalDate_ISOString] ; + [LocalDate_value] ; + + get [Symbol$1.toStringTag] () { return 'LocalDate' ; } + + valueOf ( ) { return this[LocalDate_value]; } + toISOString ( ) { return this[LocalDate_ISOString]; } + + constructor (literal ) { + IS_LOCAL_DATE(literal) && validateLeap(literal) || throws(SyntaxError$1(`Invalid Local Date ${literal}` + where(' at '))); + super(); + this[LocalDate_value] = Value( + this[LocalDate_ISOString] = literal + ); + return this; + } + + getFullYear ( ) { return LocalDate_get(this, 0, 4); } + setFullYear ( value ) { LocalDate_set(this, 0, 4, value); } + getMonth ( ) { return LocalDate_get(this, 5, 7) - 1; } + setMonth ( value ) { LocalDate_set(this, 5, 7, value + 1); } + getDate ( ) { return LocalDate_get(this, 8, 10); } + setDate ( value ) { LocalDate_set(this, 8, 10, value); } + +}); + +const LocalTime_ISOString = Symbol$1('LocalTime_ISOString') ; +const LocalTime_value = Symbol$1('LocalTime_value') ; +const LocalTime_get = (that , start , end ) => +that[LocalTime_ISOString].slice(start, end); +const LocalTime_set = (that , start , end , value ) => { + const string = '' + value; + const size = end - start; + if ( string.length>size ) { throw RangeError$1(); }/// + that[LocalTime_value] = Value( + that[LocalTime_ISOString] = that[LocalTime_ISOString].slice(0, start) + string.padStart(2, '0') + that[LocalTime_ISOString].slice(end) + ); +}; +const LocalTime = /*#__PURE__*/fpc(class LocalTime extends Datetime { + + [LocalTime_ISOString] ; + [LocalTime_value] ; + + get [Symbol$1.toStringTag] () { return 'LocalTime' ; } + + valueOf ( ) { return this[LocalTime_value]; } + toISOString ( ) { return this[LocalTime_ISOString]; } + + constructor (literal ) { + IS_LOCAL_TIME(literal) || throws(SyntaxError$1(`Invalid Local Time ${literal}` + where(' at '))); + super(); + this[LocalTime_value] = Value( + this[LocalTime_ISOString] = literal + ); + return this; + } + + getHours ( ) { return LocalTime_get(this, 0, 2); } + setHours ( value ) { LocalTime_set(this, 0, 2, value); } + getMinutes ( ) { return LocalTime_get(this, 3, 5); } + setMinutes ( value ) { LocalTime_set(this, 3, 5, value); } + getSeconds ( ) { return LocalTime_get(this, 6, 8); } + setSeconds ( value ) { LocalTime_set(this, 6, 8, value); } + getMilliseconds ( ) { return +this[LocalTime_value].slice(6, 9).padEnd(3, '0'); }/// + setMilliseconds ( value ) { + this[LocalTime_value] = Value( + this[LocalTime_ISOString] = this[LocalTime_ISOString].slice(0, 8) + ( value ? ( '.' + ( '' + value ).padStart(3, '0') ).replace(DOT_ZERO, '') : '' ) + ); + } + +}); + +const parseInt$1 = parseInt; + +const fromCodePoint = String.fromCodePoint; + +const ESCAPED_IN_SINGLE_LINE = /[^\\]+|\\(?:[\\"btnfr/]|u.{4}|U.{8})/gs; +const ESCAPED_IN_MULTI_LINE = /[^\n\\]+|\n|\\(?:[\t ]*\n[\t\n ]*|[\\"btnfr/]|u.{4}|U.{8})/gs; + +const BasicString = (literal ) => { + if ( !literal ) { return ''; } + const parts = literal.match(ESCAPED_IN_SINGLE_LINE) ; + const { length } = parts; + let index = 0; + do { + const part = parts[index] ; + if ( part[0]==='\\' ) { + switch ( part[1] ) { + case '\\': parts[index] = '\\'; break; + case '"': parts[index] = '"'; break; + case 'b': parts[index] = '\b'; break; + case 't': parts[index] = '\t'; break; + case 'n': parts[index] = '\n'; break; + case 'f': parts[index] = '\f'; break; + case 'r': parts[index] = '\r'; break; + case 'u': + const charCode = parseInt$1(part.slice(2), 16); + mustScalar && 0xD7FF { + if ( !literal ) { return ''; } + const parts = literal.match(ESCAPED_IN_MULTI_LINE) ; + const { length } = parts; + let index = 0; + do { + const part = parts[index] ; + if ( part==='\n' ) { + ++n; + parts[index] = useWhatToJoinMultilineString; + } + else if ( part[0]==='\\' ) { + switch ( part[1] ) { + case '\n': + case ' ': + case '\t': + for ( let i = 0; i = part.indexOf('\n', i) + 1; ) { ++n; } + parts[index] = ''; + break; + case '\\': parts[index] = '\\'; break; + case '"': parts[index] = '"'; break; + case 'b': parts[index] = '\b'; break; + case 't': parts[index] = '\t'; break; + case 'n': parts[index] = '\n'; break; + case 'f': parts[index] = '\f'; break; + case 'r': parts[index] = '\r'; break; + case 'u': + const charCode = parseInt$1(part.slice(2), 16); + mustScalar && 0xD7FF ( IS_D_INTEGER(literal) || /*options.xob && */IS_XOB_INTEGER(literal) ) && !BAD_XOB(literal); + +const MIN = BigInt$1 && -/*#__PURE__*/BigInt$1('0x8000000000000000');// -(2n**(64n-1n)) || -MAX-1n +const MAX = BigInt$1 && /*#__PURE__*/BigInt$1('0x7FFFFFFFFFFFFFFF');// 2n**(64n-1n)-1n || -MIN-1n + +const BigIntInteger = (literal ) => { + IS_INTEGER(literal) || throws(SyntaxError$1(`Invalid Integer ${literal}` + where(' at '))); + const bigInt = literal[0]==='-' + ? -BigInt$1(literal.replace(UNDERSCORES_SIGN, '')) + : BigInt$1(literal.replace(UNDERSCORES_SIGN, '')); + allowLonger || MIN<=bigInt && bigInt<=MAX || throws(RangeError$1(`Integer expect 64 bit range (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807), not includes ${literal}` + where(' meet at '))); + return bigInt; +}; + +const NumberInteger = (literal ) => { + IS_INTEGER(literal) || throws(SyntaxError$1(`Invalid Integer ${literal}` + where(' at '))); + const number = parseInt$1(literal.replace(UNDERSCORES$1, '')); + isSafeInteger(number) || throws(RangeError$1(`Integer did not use BitInt must fit Number.isSafeInteger, not includes ${literal}` + where(' meet at '))); + return number; +}; + +const Integer = (literal ) => { + if ( usingBigInt===true ) { return BigIntInteger(literal); } + if ( usingBigInt===false ) { return NumberInteger(literal); } + IS_INTEGER(literal) || throws(SyntaxError$1(`Invalid Integer ${literal}` + where(' at '))); + const number = parseInt$1(literal.replace(UNDERSCORES$1, '')); + if ( IntegerMinNumber<=number && number<=IntegerMaxNumber ) { return number; } + const bigInt = literal[0]==='-' + ? -BigInt$1(literal.replace(UNDERSCORES_SIGN, '')) + : BigInt$1(literal.replace(UNDERSCORES_SIGN, '')); + allowLonger || MIN<=bigInt && bigInt<=MAX || throws(RangeError$1(`Integer expect 64 bit range (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807), not includes ${literal}` + where(' meet at '))); + return bigInt; +}; + +const isFinite$1 = isFinite; + +const NaN$1 = 0/0; + +const _NaN = -NaN$1; +const _Infinity$1 = -Infinity; +const { test: IS_FLOAT } = /*#__PURE__*/newRegExp` + ^ + ${INTEGER_D} + (?: + \.\d[_\d]* + (?:[eE][-+]?\d[_\d]*)? + | + [eE][-+]?\d[_\d]* + ) + $`.valueOf(); +const UNDERSCORES = /_/g; +const { test: IS_ZERO } = theRegExp(/^[-+]?0(?:\.0+)?(?:[eE][-+]?0+)?$/); +const { exec: NORMALIZED } = theRegExp (/^[-0]?(\d*)(?:\.(\d+))?(?:e\+?(-?\d+))?$/); +const { exec: ORIGINAL } = theRegExp (/^[-+]?0?(\d*)(?:\.(\d*?)0*)?(?:[eE]\+?(-?\d+))?$/); + +const Float = (literal ) => { + if ( !IS_FLOAT(literal) || BAD_D(literal) ) { + if ( sFloat ) { + if ( literal==='inf' || literal==='+inf' ) { return Infinity; } + if ( literal==='-inf' ) { return _Infinity$1; } + if ( literal==='nan' || literal==='+nan' ) { return NaN$1; } + if ( literal==='-nan' ) { return _NaN; } + } + else if ( !sError ) { + if ( literal==='inf' || literal==='+inf' ) { return Infinity; } + if ( literal==='-inf' ) { return _Infinity$1; } + } + throw throws(SyntaxError$1(`Invalid Float ${literal}` + where(' at '))); + } + const withoutUnderscores = literal.replace(UNDERSCORES, ''); + const number = +withoutUnderscores; + if ( sError ) { + isFinite$1(number) || throws(RangeError$1(`Float ${literal} has been as big as inf` + where(' at '))); + number || IS_ZERO(withoutUnderscores) || throws(RangeError$1(`Float ${literal} has been as little as ${literal[0]==='-' ? '-' : ''}0` + where(' at '))); + const { 1: normalized_integer, 2: normalized_fractional = '', 3: normalized_exponent = '' } = NORMALIZED(number ) ; + const { 1: original_integer, 2: original_fractional = '', 3: original_exponent = '' } = ORIGINAL(withoutUnderscores) ; + original_integer + original_fractional===normalized_integer + normalized_fractional + && + original_exponent - original_fractional.length===normalized_exponent - normalized_fractional.length + || + throws(RangeError$1(`Float ${literal} has lost its exact and been ${number}` + where(' at '))); + } + return number; +}; + +const prepareTable = (table , keys ) => { + const { length } = keys; + let index = 0; + while ( index { + let lastTable ; + if ( asArrayItem ) { + let arrayOfTables ; + if ( finalKey in table ) { isArray(arrayOfTables = table[finalKey]) && !isStatic(arrayOfTables) || throws(Error$1(`Trying to push Table to non-ArrayOfTables value` + where(' at '))); } + else { arrayOfTables = table[finalKey] = newArray(OF_TABLES); } + tag && collect(tag, arrayOfTables, table, finalKey); + arrayOfTables[arrayOfTables.length] = lastTable = new Table(DIRECTLY); + } + else { + if ( finalKey in table ) { + lastTable = table[finalKey]; + fromPair(lastTable) && throws(Error$1(`A table defined implicitly via key/value pair can not be accessed to via []` + where(', which at '))); + directlyIfNot(lastTable) || throws(Error$1(`Duplicate Table definition` + where(' at '))); + } + else { table[finalKey] = lastTable = new Table(DIRECTLY); } + tag && collect(tag, null, table, finalKey); + } + return lastTable; +}; + +const prepareInlineTable = (table , keys ) => { + const { length } = keys; + let index = 0; + while ( index { + __CONTROL_CHARACTER_EXCLUDE_test(literal) && throws(SyntaxError$1(`Control characters other than Tab are not permitted in a Literal String` + where(', which was found at '))); + return literal; +}; + +const assignLiteralString = ( (table , finalKey , literal ) => { + if ( !literal.startsWith(`'''`) ) { + const $ = LITERAL_STRING_exec(literal) || throws(SyntaxError$1(`Bad literal string` + where(' at '))); + const value = checkLiteralString($[1]); + table[finalKey] = preserveLiteral ? LiteralObject(literal.slice(0, value.length + 2), value) : value; + return $[2]; + } + const $ = __MULTI_LINE_LITERAL_STRING_exec(literal.slice(3)); + if ( $ ) { + const value = checkLiteralString($[1]) + $[2]; + table[finalKey] = preserveLiteral ? LiteralObject(literal.slice(0, value.length + 6), value) : value; + return $[3]; + } + const start = new mark('Multi-line Literal String', literal.length); + const leadingNewline = !( literal = literal.slice(3) ); + if ( leadingNewline ) { + literal = start.must(); + const $ = __MULTI_LINE_LITERAL_STRING_exec(literal); + if ( $ ) { + const value = checkLiteralString($[1]) + $[2]; + table[finalKey] = preserveLiteral ? LiteralObject([ `'''`, literal.slice(0, value.length + 3) ], value) : value; + return $[3]; + } + } + useWhatToJoinMultilineString===null && start.nowrap(ARGS_MODE); + for ( const lines = [ checkLiteralString(literal) ]; ; ) { + const line = start.must(); + const $ = __MULTI_LINE_LITERAL_STRING_exec(line); + if ( $ ) { + lines[lines.length] = checkLiteralString($[1]) + $[2]; + const value = lines.join(useWhatToJoinMultilineString ); + if ( preserveLiteral ) { + lines[lines.length - 1] += `'''`; + leadingNewline ? lines.unshift(`'''`) : lines[0] = `'''${literal}`; + table[finalKey] = LiteralObject(lines, value); + } + else { table[finalKey] = value; } + return $[3]; + } + lines[lines.length] = checkLiteralString(line); + } +} ) + + + ; + +const assignBasicString = ( (table , finalKey , literal ) => { + if ( !literal.startsWith('"""') ) { + const index = BASIC_STRING_exec_1_endIndex(literal); + const value = BasicString(literal.slice(1, index)); + table[finalKey] = preserveLiteral ? LiteralObject(literal.slice(0, index + 1), value) : value; + return literal.slice(index + 1).replace(PRE_WHITESPACE, ''); + } + let length = 3 + MULTI_LINE_BASIC_STRING_exec_0_length(literal.slice(3)); + if ( literal.length!==length ) { + const $ = literal.slice(3, length); + ESCAPED_EXCLUDE_CONTROL_CHARACTER_test($) || throws(SyntaxError$1(`Bad multi-line basic string` + where(' at '))); + const value = BasicString($) + ( literal.startsWith('"', length += 3) ? literal.startsWith('"', ++length) ? ( ++length, '""' ) : '"' : '' ); + table[finalKey] = preserveLiteral ? LiteralObject(literal.slice(0, length), value) : value; + return literal.slice(length).replace(PRE_WHITESPACE, ''); + } + const start = new mark('Multi-line Basic String', length); + const skipped = ( literal = literal.slice(3) ) ? 0 : 1; + if ( skipped ) { + literal = start.must(); + let length = MULTI_LINE_BASIC_STRING_exec_0_length(literal); + if ( literal.length!==length ) { + const $ = literal.slice(0, length); + ESCAPED_EXCLUDE_CONTROL_CHARACTER_test($) || throws(SyntaxError$1(`Bad multi-line basic string` + where(' at '))); + const value = MultilineBasicString($, useWhatToJoinMultilineString , skipped) + ( literal.startsWith('"', length += 3) ? literal.startsWith('"', ++length) ? ( ++length, '""' ) : '"' : '' ); + table[finalKey] = preserveLiteral ? LiteralObject([ '"""', literal.slice(0, length) ], value) : value; + return literal.slice(length).replace(PRE_WHITESPACE, ''); + } + } + useWhatToJoinMultilineString===null && start.nowrap(ARGS_MODE); + ESCAPED_EXCLUDE_CONTROL_CHARACTER_test(literal + '\n') || throws(SyntaxError$1(`Bad multi-line basic string` + where(' at '))); + for ( const lines = [ literal ]; ; ) { + const line = start.must(); + let length = MULTI_LINE_BASIC_STRING_exec_0_length(line); + if ( line.length!==length ) { + const $ = line.slice(0, length); + ESCAPED_EXCLUDE_CONTROL_CHARACTER_test($) || throws(SyntaxError$1(`Bad multi-line basic string` + where(' at '))); + const value = MultilineBasicString(lines.join('\n') + '\n' + $, useWhatToJoinMultilineString , skipped) + ( line.startsWith('"', length += 3) ? line.startsWith('"', ++length) ? ( ++length, '""' ) : '"' : '' ); + if ( preserveLiteral ) { + skipped ? lines.unshift('"""') : lines[0] = `"""${literal}`; + lines[lines.length] = `${$}"""`; + table[finalKey] = LiteralObject(lines, value); + } + else { table[finalKey] = value; } + return line.slice(length).replace(PRE_WHITESPACE, ''); + } + ESCAPED_EXCLUDE_CONTROL_CHARACTER_test(line + '\n') || throws(SyntaxError$1(`Bad multi-line basic string` + where(' at '))); + lines[lines.length] = line; + } +} ) + + + ; + +const KEYS = /*#__PURE__*/Null$1 (null); +const commentFor = (key ) => KEYS[key] || ( KEYS[key] = Symbol$1(key) ); +const commentForThis = Symbol$1('this') ; + +const { test: includesNewline } = theRegExp(/\r?\n/g); +const getCOMMENT = (table , keyComment ) => { + if ( keyComment in table ) { + const comment = table[keyComment]; + if ( typeof comment!=='string' ) { throw TypeError$1(`the value of comment must be a string, while "${comment===null ? 'null' : typeof comment}" type is found`); } + if ( includesNewline(comment) ) { throw SyntaxError$1(`the value of comment must be a string and can not include newline`); } + return ` #${comment}`;/// + } + return ''; +}; +const getComment = (table , key ) => key in KEYS ? getCOMMENT(table, KEYS[key] ) : ''; + +const { test: IS_OFFSET$ } = theRegExp(OFFSET$); +const { test: IS_EMPTY } = theRegExp(/^\[[\t ]*]/); + +const parseKeys = (rest ) => { + let lineRest = rest; + const leadingKeys = []; + let lastIndex = -1; + for ( ; ; ) { + lineRest || throws(SyntaxError$1(`Empty bare key` + where(' at '))); + if ( lineRest[0]==='"' ) { + const index = BASIC_STRING_exec_1_endIndex(lineRest); + KEYS$1.test(leadingKeys[++lastIndex] = BasicString(lineRest.slice(1, index))) || throws(Error$1(`Key not allowed` + where(' at '))); + lineRest = lineRest.slice(index + 1); + } + else { + const isQuoted = lineRest[0]==='\''; + const key = ( ( isQuoted ? __LITERAL_KEY_exec : __BARE_KEY_exec )(lineRest) || throws(SyntaxError$1(`Bad ${isQuoted ? 'literal string' : 'bare'} key` + where(' at '))) )[0]; + lineRest = lineRest.slice(key.length); + KEYS$1.test(leadingKeys[++lastIndex] = isQuoted ? key.slice(1, -1) : key) || throws(Error$1(`Key not allowed` + where(' at '))); + } + if ( IS_DOT_KEY(lineRest) ) { lineRest = lineRest.replace(DOT_KEY, ''); } + else { break; } + } + if ( disableDigit ) { + const keys = rest.slice(0, -lineRest.length); + ( isAmazing(keys) || enableNull && keys==='null' ) && throws(SyntaxError$1(`Bad bare key disabled by xOptions.string` + where(' at '))); + } + if ( disallowEmptyKey ) { + let index = lastIndex; + do { leadingKeys[index] || throws(SyntaxError$1(`Empty key is not allowed before TOML v0.5` + where(', which at '))); } + while ( index-- ); + } + const finalKey = leadingKeys[lastIndex] ; + leadingKeys.length = lastIndex; + return { leadingKeys, finalKey, lineRest }; +}; + +const push = (lastArray , lineRest ) => { + if ( lineRest[0]==='<' ) { + const { 1: tag } = { 2: lineRest } = _VALUE_PAIR_exec(lineRest) || throws(SyntaxError$1(`Bad tag ` + where(' at '))); + collect(tag, lastArray, null); + switch ( lineRest && lineRest[0] ) { + case ',': + case ']': + case '': + case '#': + lastArray[lastArray.length] = undefined$1; + return lineRest; + } + } + switch ( lineRest[0] ) { + case '\'': + return assignLiteralString(asStrings(lastArray), lastArray.length, lineRest); + case '"': + return assignBasicString(asStrings(lastArray), lastArray.length, lineRest); + case '{': + inlineTable || throws(SyntaxError$1(`Inline Table is not allowed before TOML v0.4` + where(', which at '))); + return equalInlineTable(asTables(lastArray), lastArray.length, lineRest); + case '[': + return equalStaticArray(asArrays(lastArray), lastArray.length, lineRest); + } + const { 1: literal } = { 2: lineRest } = VALUE_REST_exec(lineRest) || throws(SyntaxError$1(`Bad atom value` + where(' at '))); + if ( literal==='true' ) { asBooleans(lastArray)[lastArray.length] = true; } + else if ( literal==='false' ) { asBooleans(lastArray)[lastArray.length] = false; } + else if ( enableNull && literal==='null' ) { asNulls(lastArray)[lastArray.length] = null; } + else if ( literal.includes(':') ) { + if ( literal.includes('-') ) { + if ( IS_OFFSET$(literal) ) { + asOffsetDateTimes(lastArray)[lastArray.length] = new OffsetDateTime(literal); + } + else { + moreDatetime || throws(SyntaxError$1(`Local Date-Time is not allowed before TOML v0.5` + where(', which at '))); + asLocalDateTimes(lastArray)[lastArray.length] = new LocalDateTime(literal); + } + } + else { + moreDatetime || throws(SyntaxError$1(`Local Time is not allowed before TOML v0.5` + where(', which at '))); + asLocalTimes(lastArray)[lastArray.length] = new LocalTime(literal); + } + } + else if ( literal.indexOf('-')!==literal.lastIndexOf('-') && literal[0]!=='-' ) { + moreDatetime || throws(SyntaxError$1(`Local Date is not allowed before TOML v0.5` + where(', which at '))); + asLocalDates(lastArray)[lastArray.length] = new LocalDate(literal); + } + else { + literal.includes('.') || literal.includes('n') || ( literal.includes('e') || literal.includes('E') ) && !literal.startsWith('0x') + ? asFloats(lastArray)[lastArray.length] = preserveLiteral ? LiteralObject(literal, Float(literal)) : Float(literal) + : asIntegers(lastArray)[lastArray.length] = preserveLiteral ? LiteralObject(literal, Integer(literal)) : Integer(literal) + ; + } + return lineRest; +}; + +const equalStaticArray = function * ( table , finalKey , lineRest ) { + const staticArray = table[finalKey] = newArray(STATICALLY); + if ( IS_EMPTY(lineRest) ) { + beInline(staticArray, lineRest[1]===']' ? 0 : 3); + return lineRest.slice(lineRest.indexOf(']')).replace(SYM_WHITESPACE, ''); + } + const start = new mark('Static Array', lineRest.length); + let inline = lineRest.startsWith('[ ') || lineRest.startsWith('[\t') ? 3 : 0; + lineRest = lineRest.replace(SYM_WHITESPACE, ''); + while ( !lineRest || lineRest[0]==='#' ) { + inline = null; + lineRest = start.must().replace(PRE_WHITESPACE, ''); + } + if ( lineRest[0]===']' ) { + inline===null || beInline(staticArray, inline); + return lineRest.replace(SYM_WHITESPACE, ''); + } + for ( ; ; ) { + const rest = push(staticArray, lineRest); + lineRest = typeof rest==='string' ? rest : yield rest; + while ( !lineRest || lineRest[0]==='#' ) { + inline = null; + lineRest = start.must().replace(PRE_WHITESPACE, ''); + } + if ( lineRest[0]===',' ) { + lineRest = lineRest.replace(SYM_WHITESPACE, ''); + while ( !lineRest || lineRest[0]==='#' ) { + inline = null; + lineRest = start.must().replace(PRE_WHITESPACE, ''); + } + if ( lineRest[0]===']' ) { break; } + } + else { + if ( lineRest[0]===']' ) { break; } + throw throws(SyntaxError$1(`Unexpect character in static array item value` + where(', which is found at '))); + } + } + inline===null || beInline(staticArray, inline); + return lineRest.replace(SYM_WHITESPACE, ''); +} + + + ; + +const equalInlineTable = function * ( table , finalKey , lineRest ) { + const inlineTable = table[finalKey] = new Table(DIRECTLY, INLINE); + if ( allowInlineTableMultilineAndTrailingCommaEvenNoComma ) { + const start = new mark('Inline Table', lineRest.length); + lineRest = lineRest.replace(SYM_WHITESPACE, ''); + let inline = true; + for ( ; ; ) { + while ( !lineRest || lineRest[0]==='#' ) { + inline = false; + lineRest = start.must().replace(PRE_WHITESPACE, ''); + } + if ( lineRest[0]==='}' ) { break; } + const forComment = ForComment(inlineTable, lineRest); + const rest = assign(forComment); + lineRest = typeof rest==='string' ? rest : yield rest; + if ( lineRest ) { + if ( lineRest[0]==='#' ) { + if ( preserveComment ) { forComment.table[commentFor(forComment.finalKey)] = lineRest.slice(1); } + inline = false; + do { lineRest = start.must().replace(PRE_WHITESPACE, ''); } + while ( !lineRest || lineRest[0]==='#' ); + } + } + else { + inline = false; + do { lineRest = start.must().replace(PRE_WHITESPACE, ''); } + while ( !lineRest || lineRest[0]==='#' ); + } + if ( lineRest[0]===',' ) { lineRest = lineRest.replace(SYM_WHITESPACE, ''); } + } + inline || beInline(inlineTable, false); + } + else { + lineRest = lineRest.replace(SYM_WHITESPACE, '') || throws(SyntaxError$1(`Inline Table is intended to appear on a single line` + where(', which broken at '))); + if ( lineRest[0]!=='}' ) { + for ( ; ; ) { + lineRest[0]==='#' && throws(SyntaxError$1(`Inline Table is intended to appear on a single line` + where(', which broken at '))); + const rest = assign(ForComment(inlineTable, lineRest)); + lineRest = ( typeof rest==='string' ? rest : yield rest ) || throws(SyntaxError$1(`Inline Table is intended to appear on a single line` + where(', which broken at '))); + if ( lineRest[0]==='}' ) { break; } + if ( lineRest[0]===',' ) { + lineRest = lineRest.replace(SYM_WHITESPACE, '') || throws(SyntaxError$1(`Inline Table is intended to appear on a single line` + where(', which broken at '))); + lineRest[0]==='}' && throws(SyntaxError$1(`The last property of an Inline Table can not have a trailing comma` + where(', which was found at '))); + } + } + } + } + return lineRest.replace(SYM_WHITESPACE, ''); +} + + + ; + + +const ForComment = (lastInlineTable , lineRest ) => { + const { leadingKeys, finalKey, tag } = { lineRest } = KEY_VALUE_PAIR_exec_groups(parseKeys(lineRest)); + return { table: prepareInlineTable(lastInlineTable, leadingKeys), finalKey, tag, lineRest }; +}; +const assign = ({ finalKey, tag, lineRest, table } ) => { + finalKey in table && throws(Error$1(`Duplicate property definition` + where(' at '))); + if ( tag ) { + collect(tag, null, table, finalKey); + switch ( lineRest && lineRest[0] ) { + case ',': + case '}': + case '': + case '#': + table[finalKey] = undefined$1; + return lineRest; + } + } + switch ( lineRest && lineRest[0] ) { + case '\'': + return assignLiteralString(table, finalKey, lineRest); + case '"': + return assignBasicString(table, finalKey, lineRest); + case '{': + inlineTable || throws(SyntaxError$1(`Inline Table is not allowed before TOML v0.4` + where(', which at '))); + return equalInlineTable(table, finalKey, lineRest); + case '[': + return equalStaticArray(table, finalKey, lineRest); + } + const { 1: literal } = { 2: lineRest } = VALUE_REST_exec(lineRest) || throws(SyntaxError$1(`Bad atom value` + where(' at '))); + if ( literal==='true' ) { table[finalKey] = true; } + else if ( literal==='false' ) { table[finalKey] = false; } + else if ( enableNull && literal==='null' ) { table[finalKey] = null; } + else if ( literal.includes(':') ) { + if ( literal.includes('-') ) { + if ( IS_OFFSET$(literal) ) { + table[finalKey] = new OffsetDateTime(literal); + } + else { + moreDatetime || throws(SyntaxError$1(`Local Date-Time is not allowed before TOML v0.5` + where(', which at '))); + table[finalKey] = new LocalDateTime(literal); + } + } + else { + moreDatetime || throws(SyntaxError$1(`Local Time is not allowed before TOML v0.5` + where(', which at '))); + table[finalKey] = new LocalTime(literal); + } + } + else if ( literal.indexOf('-')!==literal.lastIndexOf('-') && literal[0]!=='-' ) { + moreDatetime || throws(SyntaxError$1(`Local Date is not allowed before TOML v0.5` + where(', which at '))); + table[finalKey] = new LocalDate(literal); + } + else { + table[finalKey] = literal.includes('.') || literal.includes('n') || ( literal.includes('e') || literal.includes('E') ) && !literal.startsWith('0x') + ? preserveLiteral ? LiteralObject(literal, Float(literal)) : Float(literal) + : preserveLiteral ? LiteralObject(literal, Integer(literal)) : Integer(literal) + ; + } + return lineRest; +}; + +const Root = () => { + const rootTable = new Table; + let lastSectionTable = rootTable; + while ( rest() ) { + const line = next().replace(PRE_WHITESPACE, ''); + if ( line ) { + if ( line[0]==='[' ) { + const { leadingKeys, finalKey, asArrayItem, tag, lineRest } = TABLE_DEFINITION_exec_groups(line, parseKeys); + const table = prepareTable(rootTable, leadingKeys); + if ( lineRest ) { + lineRest[0]==='#' || throws(SyntaxError$1(`Unexpect charachtor after table header` + where(' at '))); + } + lastSectionTable = appendTable(table, finalKey, asArrayItem, tag); + preserveComment && lineRest && ( lastSectionTable[commentForThis] = asArrayItem ? lineRest.slice(1) : table[commentFor(finalKey)] = lineRest.slice(1) ); + } + else if ( line[0]==='#' ) { + __CONTROL_CHARACTER_EXCLUDE_test(line) && throws(SyntaxError$1(`Control characters other than Tab are not permitted in comments` + where(', which was found at '))); + } + else { + const forComment = ForComment(lastSectionTable, line); + let rest = assign(forComment); + typeof rest==='string' || ( rest = x (rest) ); + if ( rest ) { + rest[0]==='#' || throws(SyntaxError$1(`Unexpect charachtor after key/value pair` + where(' at '))); + if ( preserveComment ) { forComment.table[commentFor(forComment.finalKey)] = rest.slice(1); } + } + } + } + } + return rootTable; +}; + +const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER; + +const DATE = Date.prototype; + +const valueOf$2 = String.prototype.valueOf; + +const isString = ( + /* j-globals: class.isString (internal) */ + /*#__PURE__*/ function () { + if ( apply.bind ) { + var valueOf_apply = apply.bind(valueOf$2); + return function isString (value) { + try { valueOf_apply(value); } + catch (error) { return false; } + return true; + }; + } + return function isString (value) { + try { valueOf$2.apply(value); } + catch (error) { return false; } + return true; + }; + }() + /* j-globals: class.isString (internal) */ +); + +const valueOf$1 = Number.prototype.valueOf; + +const isNumber = ( + /* j-globals: class.isNumber (internal) */ + /*#__PURE__*/ function () { + if ( apply.bind ) { + var valueOf_apply = apply.bind(valueOf$1); + return function isNumber (value) { + try { valueOf_apply(value); } + catch (error) { return false; } + return true; + }; + } + return function isNumber (value) { + try { valueOf$1.apply(value); } + catch (error) { return false; } + return true; + }; + }() + /* j-globals: class.isNumber (internal) */ +); + +const isBigInt = ( + /* j-globals: class.isBigInt (internal) */ + /*#__PURE__*/ function () { + if ( typeof BigInt==='function' ) { + var valueOf_apply = apply.bind(BigInt.prototype.valueOf); + return function isBigInt (value) { + try { valueOf_apply(value); } + catch (error) { return false; } + return true; + }; + } + return function isBigInt () { return false; }; + }() + /* j-globals: class.isBigInt (internal) */ +); + +const valueOf = BigInt.prototype.valueOf; + +const isBoolean = ( + /* j-globals: class.isBoolean (internal) */ + /*#__PURE__*/ function () { + if ( apply.bind ) { + var valueOf_apply = apply.bind(valueOf); + return function isBoolean (value) { + try { valueOf_apply(value); } + catch (error) { return false; } + return true; + }; + } + return function isBoolean (value) { + try { valueOf.apply(value); } + catch (error) { return false; } + return true; + }; + }() + /* j-globals: class.isBoolean (internal) */ +); + +const ESCAPED = /*#__PURE__*/Null$1 ({ + .../*#__PURE__*/fromEntries(/*#__PURE__*/[ ...Array$1(0x20) ].map((_, charCode) => [ fromCharCode(charCode), '\\u' + charCode.toString(16).toUpperCase().padStart(4, '0') ])), + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"': '\\"', + '"""': '""\\"', + '\\': '\\\\', + '\x7F': '\\u007F', +}); + +const { test: NEED_BASIC } = theRegExp(/[\x00-\x08\x0A-\x1F'\x7F]/); +const BY_ESCAPE = /[^\x00-\x08\x0A-\x1F"\\\x7F]+|./gs; +const { test: NEED_ESCAPE } = theRegExp(/^[\x00-\x08\x0A-\x1F"\\\x7F]/); +const singlelineString = (value ) => { + if ( NEED_BASIC(value) ) { + const parts = value.match(BY_ESCAPE) ; + let index = parts.length; + do { if ( NEED_ESCAPE(parts[--index] ) ) { parts[index] = ESCAPED[parts[index] ] ; } } + while ( index ); + return `"${parts.join('')}"`; + } + return `'${value}'`; +}; +const singlelineBasicString = (value ) => { + if ( value ) { + const parts = value.match(BY_ESCAPE) ; + let index = parts.length; + do { if ( NEED_ESCAPE(parts[--index] ) ) { parts[index] = ESCAPED[parts[index] ] ; } } + while ( index ); + return `"${parts.join('')}"`; + } + return `""`; +}; + +const { test: NEED_MULTILINE_BASIC } = theRegExp(/[\x00-\x08\x0A-\x1F\x7F]|'''/); +const { test: multilineNeedBasic } = theRegExp(/[\x00-\x08\x0B-\x1F\x7F]|'''/); +const { test: REAL_MULTILINE_ESCAPE } = theRegExp(/[\x00-\x08\x0A-\x1F\\\x7F]|"""/); +const BY_MULTILINE_ESCAPE = /[^\x00-\x08\x0A-\x1F"\\\x7F]+|"""|./gs; +const { test: NEED_MULTILINE_ESCAPE } = theRegExp(/^(?:[\x00-\x08\x0A-\x1F\\\x7F]|""")/); +const escape_multiline = (lines , lineIndex ) => { + const line = lines[lineIndex] ; + if ( REAL_MULTILINE_ESCAPE(line) ) { + const parts = line.match(BY_MULTILINE_ESCAPE) ; + let index = parts.length; + do { if ( NEED_MULTILINE_ESCAPE(parts[--index] ) ) { parts[index] = ESCAPED[parts[index] ] ; } } + while ( index ); + lines[lineIndex] = parts.join(''); + } +}; + + +const Lines = (lines ) => ( lines = [ '', ...lines ] ).length===1 ? [ '', '' ] : lines ; + +const multilineString = (lines ) => { + const lastIndex = lines.length - 1; + let index = lastIndex; + do { if ( NEED_MULTILINE_BASIC(lines[index] ) ) { break; } } + while ( --index ); + if ( index ) { + index = lastIndex; + escape_multiline(lines, index); + lines[index] += lines[0] = '"""'; + while ( --index ) { escape_multiline(lines, index); } + } + else { lines[lastIndex] += lines[0] = '\'\'\''; } + return lines ; +}; + +const multilineBasicString = (lines ) => { + let index = lines.length - 1; + escape_multiline(lines, index); + lines[index] += lines[0] = '"""'; + while ( --index ) { escape_multiline(lines, index); } + return lines ; +}; + +const multilineLiteralString = (lines ) => { + lines[lines.length - 1] += lines[0] = '\'\'\''; + return lines ; +}; + +const Float64Array$1 = Float64Array; + +const Uint8Array$1 = Uint8Array; + +const _Infinity = -Infinity; + +const { test: INTEGER_LIKE } = theRegExp(/^-?\d+$/); +const ensureFloat = (literal ) => INTEGER_LIKE(literal) ? literal + '.0' : literal; + +const float64Array = new Float64Array$1([ NaN$1 ]); +const uint8Array = new Uint8Array$1(float64Array.buffer); +const NaN_7 = uint8Array[7] ; + +const float = NaN_7===new Uint8Array$1(new Float64Array$1([ -NaN$1 ]).buffer)[7] + ? (value ) => value + ? value===Infinity ? 'inf' : value===_Infinity ? '-inf' : ensureFloat('' + value) + : value===value ? is(value, 0) ? '0.0' : '-0.0' : 'nan' + : (value ) => value + ? value===Infinity ? 'inf' : value===_Infinity ? '-inf' : ensureFloat('' + value) + : value===value ? is(value, 0) ? '0.0' : '-0.0' : ( float64Array[0] = value, uint8Array[7] )===NaN_7 ? 'nan' : '-nan'; + +const isDate = /*#__PURE__*/isPrototypeOf.bind(DATE) ; + +const { test: BARE } = theRegExp(/^[\w-]+$/); +const $Key$ = (key ) => BARE(key) ? key : singlelineString(key); + +const FIRST = /[^.]+/; +const literalString = (value ) => `'${value}'`; +const $Keys = (keys ) => isAmazing(keys) ? keys.replace(FIRST, literalString) : keys==='null' ? `'null'` : keys; + +class TOMLSection extends Array$1 { + + document ; + + constructor (document ) { + super(); + this.document = document; + return this; + } + + [Symbol$1.toPrimitive] () { return this.join(this.document.newline); } + + appendNewline () { this[this.length] = ''; } + set appendLine (source ) { this[this.length] = source; } + set appendInline (source ) { this[this.length - 1] += source; } + set appendInlineIf (source ) { source && ( this[this.length - 1] += source ); }/// + + * assignBlock (documentKeys_ , sectionKeys_ , table , tableKeys ) { + const { document } = this; + const { newlineUnderHeader, newlineUnderSectionButPair } = document; + const newlineAfterDotted = sectionKeys_ ? document.newlineUnderPairButDotted : false; + const newlineAfterPair = sectionKeys_ ? document.newlineUnderDotted : document.newlineUnderPair; + for ( const tableKey of tableKeys ) { + const value = table[tableKey] ; + const $key$ = $Key$(tableKey); + const documentKeys = documentKeys_ + $key$; + if ( isArray$1(value) ) { + const { length } = value; + if ( length ) { + let firstItem = value[0]; + if ( isSection(firstItem) ) { + const tableHeader = `[[${documentKeys}]]` ; + const documentKeys_ = documentKeys + '.' ; + let index = 0; + let table = firstItem; + for ( ; ; ) { + const section = document.appendSection(); + section[0] = tableHeader + getCOMMENT(table, commentForThis); + if ( newlineUnderHeader ) { + section[1] = ''; + yield section.assignBlock(documentKeys_, ``, table, getOwnPropertyNames(table)); + newlineUnderSectionButPair && section.length!==2 && section.appendNewline(); + } + else { + yield section.assignBlock(documentKeys_, ``, table, getOwnPropertyNames(table)); + newlineUnderSectionButPair && section.appendNewline(); + } + if ( ++index===length ) { break; } + table = ( value )[index] ; + if ( !isSection(table) ) { throw TypeError$1(`the first table item marked by Section() means the parent array is an array of tables, which can not include other types or table not marked by Section() any more in the rest items`); } + } + continue; + } + else { let index = 1; while ( index!==length ) { if ( isSection(value[index++] ) ) { throw TypeError$1(`if an array is not array of tables, it can not include any table that marked by Section()`); } } } + } + } + else { + if ( isSection(value) ) { + const section = document.appendSection(); + section[0] = `[${documentKeys}]${ + document.preferCommentForThis + ? getCOMMENT(value, commentForThis) || getComment(table, tableKey) + : getComment(table, tableKey) || getCOMMENT(value, commentForThis) + }`; + if ( newlineUnderHeader ) { + section[1] = ''; + yield section.assignBlock(documentKeys + '.' , ``, value, getOwnPropertyNames(value)); + newlineUnderSectionButPair && section.length!==2 && section.appendNewline(); + } + else { + yield section.assignBlock(documentKeys + '.' , ``, value, getOwnPropertyNames(value)); + newlineUnderSectionButPair && section.appendNewline(); + } + continue; + } + } + const sectionKeys = sectionKeys_ + $key$; + this.appendLine = $Keys(sectionKeys) + ' = '; + const valueKeysIfValueIsDottedTable = this.value('', value, true); + if ( valueKeysIfValueIsDottedTable ) { + --this.length; + yield this.assignBlock(documentKeys + '.' , sectionKeys + '.' , value , valueKeysIfValueIsDottedTable); + newlineAfterDotted && this.appendNewline(); + } + else { + this.appendInlineIf = getComment(table, tableKey); + newlineAfterPair && this.appendNewline(); + } + } + } + + value (indent , value , returnValueKeysIfValueIsDottedTable ) { + switch ( typeof value ) { + case 'object': + if ( value===null ) { + if ( this.document.nullDisabled ) { throw TypeError$1(`toml can not stringify "null" type value without truthy options.xNull`); } + this.appendInline = 'null'; + break; + } + const inlineMode = ofInline(value); + if ( isArray$1(value) ) { + if ( inlineMode===undefined$1 ) { this.staticArray(indent, value); } + else { + const { $singlelineArray = inlineMode } = this.document; + this.singlelineArray(indent, value, $singlelineArray); + } + break; + } + if ( inlineMode!==undefined$1 ) { + inlineMode || this.document.multilineTableDisabled + ? this.inlineTable(indent, value ) + : this.multilineTable(indent, value , this.document.multilineTableComma); + break; + } + if ( isDate(value) ) { + this.appendInline = value.toISOString().replace('T', this.document.T).replace('Z', this.document.Z); + break; + } + if ( _literal in value ) { + const literal = ( value )[_literal]; + if ( typeof literal==='string' ) { this.appendInline = literal; } + else if ( isArray$1(literal) ) { + const { length } = literal; + if ( length ) { + this.appendInline = literal[0]; + let index = 1; + while ( index!==length ) { this.appendLine = literal[index++] ; } + } + else { throw TypeError$1(`literal value is broken`); } + } + else { throw TypeError$1(`literal value is broken`); } + break; + } + if ( isString(value) ) { throw TypeError$1(`TOML.stringify refuse to handle [object String]`); } + if ( isNumber(value) ) { throw TypeError$1(`TOML.stringify refuse to handle [object Number]`); } + if ( isBigInt(value) ) { throw TypeError$1(`TOML.stringify refuse to handle [object BigInt]`); } + if ( isBoolean(value) ) { throw TypeError$1(`TOML.stringify refuse to handle [object Boolean]`); } + if ( returnValueKeysIfValueIsDottedTable ) { + const keys = getOwnPropertyNames(value ); + if ( keys.length ) { return keys; } + this.appendInline = '{ }'; + } + else { + this.inlineTable(indent, value ); + } + break; + case 'bigint': + this.appendInline = '' + value; + break; + case 'number': + this.appendInline = this.document.asInteger(value) ? is(value, -0) ? '-0' : '' + value : float(value); + break; + case 'string': + this.appendInline = singlelineString(value); + break; + case 'boolean': + this.appendInline = value ? 'true' : 'false'; + break; + default: + throw TypeError$1(`toml can not stringify "${typeof value}" type value`); + } + return null; + } + + singlelineArray (indent , staticArray , inlineMode ) { + const { length } = staticArray; + if ( length ) { + this.appendInline = inlineMode&0b10 ? '[ ' : '['; + this.value(indent, staticArray[0] , false); + let index = 1; + while ( index!==length ) { + this.appendInline = ', '; + this.value(indent, staticArray[index++] , false); + } + this.appendInline = inlineMode&0b10 ? ' ]' : ']'; + } + else { this.appendInline = inlineMode&0b01 ? '[ ]' : '[]'; } + } + staticArray (indent , staticArray ) { + this.appendInline = '['; + const indent_ = indent + this.document.indent; + const { length } = staticArray; + let index = 0; + while ( index!==length ) { + this.appendLine = indent_; + this.value(indent_, staticArray[index++] , false); + this.appendInline = ','; + } + this.appendLine = indent + ']'; + } + + inlineTable (indent , inlineTable ) { + const keys = getOwnPropertyNames(inlineTable); + if ( keys.length ) { + this.appendInline = '{ '; + this.assignInline(indent, inlineTable, ``, keys); + this[this.length - 1] = this[this.length - 1] .slice(0, -2) + ' }'; + } + else { this.appendInline = '{ }'; } + } + multilineTable (indent , inlineTable , comma ) { + this.appendInline = '{'; + this.assignMultiline(indent, inlineTable, ``, getOwnPropertyNames(inlineTable), comma); + this.appendLine = indent + '}'; + } + assignInline (indent , inlineTable , keys_ , keys ) { + for ( const key of keys ) { + const value = inlineTable[key] ; + const keys = keys_ + $Key$(key); + const before_value = this.appendInline = $Keys(keys) + ' = '; + const valueKeysIfValueIsDottedTable = this.value(indent, value, true); + if ( valueKeysIfValueIsDottedTable ) { + this[this.length - 1] = this[this.length - 1] .slice(0, -before_value.length); + this.assignInline(indent, value , keys + '.' , valueKeysIfValueIsDottedTable); + } + else { this.appendInline = ', '; } + } + } + assignMultiline (indent , inlineTable , keys_ , keys , comma ) { + const indent_ = indent + this.document.indent; + for ( const key of keys ) { + const value = inlineTable[key] ; + const keys = keys_ + $Key$(key); + this.appendLine = indent_ + $Keys(keys) + ' = '; + const valueKeysIfValueIsDottedTable = this.value(indent_, value, true); + if ( valueKeysIfValueIsDottedTable ) { + --this.length; + this.assignMultiline(indent, value , keys + '.' , valueKeysIfValueIsDottedTable, comma); + } + else { + comma + ? this.appendInline = ',' + getComment(inlineTable, key) + : this.appendInlineIf = getComment(inlineTable, key); + } + } + } + +} + +const name2code = /*#__PURE__*/Null$1({ + document: 0, + section: 1, + header: 2, + pairs: 3, + pair: 4, +} ); + +const { test: IS_INDENT } = theRegExp(/^[\t ]*$/); + +const return_false = () => false; + +class TOMLDocument extends Array$1 { + + get ['constructor'] () { return Array$1; } + + 0 = new TOMLSection(this); + + asInteger = return_false; + newline = ''; + newlineUnderSection = true; + newlineUnderSectionButPair = true; + newlineUnderHeader = true; + newlineUnderPair = false; + newlineUnderPairButDotted = false; + newlineUnderDotted = false; + indent = '\t'; + T = 'T'; + Z = 'Z'; + nullDisabled = true; + multilineTableDisabled = true; + multilineTableComma ; + preferCommentForThis = false; + $singlelineArray ; + + constructor (options ) { + + super(); + + if ( options==null ) { return this; } + + const { integer } = options; + if ( integer===undefined ) ; + else if ( integer===MAX_SAFE_INTEGER ) { this.asInteger = isSafeInteger; } + else if ( typeof integer==='number' ) { + if ( !isSafeInteger(integer) ) { throw RangeError$1(`TOML.stringify(,{integer}) can only be a safe integer`); } + const max = integer>=0 ? integer : -integer - 1; + const min = integer>=0 ? -integer : integer; + this.asInteger = (number ) => isSafeInteger(number) && min<=number && number<=max; + } + else { throw TypeError$1(`TOML.stringify(,{integer}) can only be number`); } + + const { newline } = options; + if ( newline===undefined ) ; + else if ( newline==='\n' || newline==='\r\n' ) { this.newline = newline; } + else { + throw typeof newline==='string' + ? SyntaxError$1(`TOML.stringify(,{newline}) can only be valid TOML newline`) + : TypeError$1(`TOML.stringify(,{newline}) can only be string`); + } + + const { preferCommentFor } = options; + if ( preferCommentFor===undefined ) ; + else if ( preferCommentFor==='this' || preferCommentFor==='key' ) { this.preferCommentForThis = preferCommentFor==='this'; } + else { throw TypeError$1(`TOML.stringify(,{preferCommentFor) can only be 'key' or 'this'`); } + + const { [options.newlineAround || 'header']: around = name2code.header } = name2code; + this.newlineUnderSection = around>0; + this.newlineUnderSectionButPair = around===1 || around===2; + this.newlineUnderHeader = around>1; + this.newlineUnderPair = around>2; + this.newlineUnderPairButDotted = around===3; + this.newlineUnderDotted = around>3; + + const { indent } = options; + if ( indent===undefined ) ; + else if ( typeof indent==='string' ) { + if ( !IS_INDENT(indent) ) { throw SyntaxError$1(`TOML.stringify(,{indent}) can only include Tab or Space`); } + this.indent = indent; + } + else if ( typeof indent==='number' ) { + if ( !isSafeInteger(indent) ) { throw RangeError$1(`TOML.stringify(,{indent:${indent}}) is out of range`); } + this.indent = ' '.repeat(indent); + } + else { throw TypeError$1(`TOML.stringify(,{indent}) can not be "${typeof indent}" type`); } + + const { T } = options; + if ( T===undefined ) ; + else if ( T===' ' || T==='t' || T==='T' ) { this.T = T; } + else { throw TypeError$1(`TOML.stringify(,{T}) can only be "T" or " " or "t"`); } + + const { Z } = options; + if ( Z===undefined ) ; + else if ( Z==='z' || Z==='Z' ) { this.Z = Z; } + else { throw TypeError$1(`TOML.stringify(,{Z}) can only be "Z" or "z"`); } + + if ( options.xNull ) { this.nullDisabled = false; } + + const { xBeforeNewlineInMultilineTable } = options; + if ( xBeforeNewlineInMultilineTable===undefined ) ; + else if ( xBeforeNewlineInMultilineTable==='' || xBeforeNewlineInMultilineTable===',' ) { + this.multilineTableDisabled = false; + this.multilineTableComma = !!xBeforeNewlineInMultilineTable; + } + else { throw TypeError$1(`TOML.stringify(,{xBeforeNewlineInMultilineTable}) can only be "" or ","`); } + + const $singlelineArray = options.forceInlineArraySpacing; + switch ( $singlelineArray ) { + case undefined: + break; + case 0: + case 1: + case 2: + case 3: + this.$singlelineArray = $singlelineArray; + break; + default: + throw typeof $singlelineArray==='number' + ? RangeError$1(`array inline mode must be 0 | 1 | 2 | 3, not including ${$singlelineArray}`) + : TypeError$1(`array inline mode must be "number" type, not including ${$singlelineArray===null ? '"null"' : typeof $singlelineArray}`); + } + + return this; + + } + + appendSection () { return this[this.length] = new TOMLSection(this); } + +} + +const linesFromStringify = new WeakSet$1 (); +const beLinesFromStringify = /*#__PURE__*/add.bind(linesFromStringify); +const isLinesFromStringify = /*#__PURE__*/has.bind(linesFromStringify); +const stringify = (rootTable , options ) => { + const document = new TOMLDocument(options); + const section = document[0]; + section[0] = ''; + x (section.assignBlock(``, ``, rootTable, getOwnPropertyNames(rootTable))); + document.newlineUnderSectionButPair && section.length!==1 && section.appendNewline(); + document.newlineUnderSection || document[document.length - 1] .appendNewline(); + if ( document.newline ) { return document.join(document.newline); } + const lines = document.flat(); + beLinesFromStringify(lines); + return lines; +}; +const multiline = /*#__PURE__*/( () => { + const multiline = (value , string ) => + typeof value==='string' ? LiteralObject(( multilineNeedBasic(value) ? multilineBasicString : multilineLiteralString )(( '\n' + value ).split('\n') ), value) : + isArray$1(value) ? LiteralObject(multilineString(Lines(value)), typeof string==='string' ? string : Null$1(null)) : + multilineTable(value); + multiline.basic = (lines , string ) => + typeof lines==='string' + ? LiteralObject(multilineBasicString(( '\n' + lines ).split('\n') ), lines) + : LiteralObject(multilineBasicString(Lines(lines)), typeof string==='string' ? string : Null$1(null)) + ; + multiline.array = multilineArray; + freeze(multiline); + return multiline; +} )(); +const basic = (value ) => LiteralObject(singlelineBasicString(value), value); +const literal = (literal , ...chars ) => { + if ( typeof literal==='string' ) { + if ( chars.length===1 ) { + return LiteralObject(literal.includes('\n') ? literal.split('\n') : literal, chars[0] ); + } + } + else { + let index = chars.length; + if ( index ) { + const { raw } = literal; + literal = raw[index] ; + while ( index ) { chars[--index] += raw[index] ; } + literal = chars.join('') + literal; + } + else { literal = literal.raw[0] ; } + } + return LiteralObject(literal.includes('\n') ? literal.split('\n') : literal, Null$1(null)); +}; + +const textDecoder = /*#__PURE__*/new TextDecoder$1('utf-8', Null$1({ fatal: true, ignoreBOM: false })); +const binary2string = (arrayBufferLike ) => { + if ( isView(arrayBufferLike) ? arrayBufferLike.length!==arrayBufferLike.byteLength : !isArrayBuffer(arrayBufferLike) ) { throw TypeError$1(`only Uint8Array or ArrayBuffer is acceptable`); } + try { return textDecoder.decode(arrayBufferLike); } + catch { throw Error$1(`A TOML doc must be a (ful-scalar) valid UTF-8 file, without any unknown code point.`); } +}; +const isBinaryLike = (value ) => 'byteLength' in value;/// + +const { test: includesNonScalar } = theRegExp(/[\uD800-\uDFFF]/u); +const assertFulScalar = (string ) => { + if ( clearRegExp$1(includesNonScalar(string)) ) { throw Error$1(`A TOML doc must be a (ful-scalar) valid UTF-8 file, without any uncoupled UCS-4 character code.`); } +}; + +let holding = false; + +const parse = (source , specificationVersion , multilineStringJoiner , bigint , x , argsMode ) => { + let sourcePath = ''; + if ( typeof source==='object' && source ) { + if ( isArray$1(source) ) { throw TypeError$1(isLinesFromStringify(source) ? `TOML.parse(array from TOML.stringify(,{newline?}))` : `TOML.parse(array)`); } + else if ( isBinaryLike(source) ) { source = binary2string(source); } + else { + sourcePath = source.path; + if ( typeof sourcePath!=='string' ) { throw TypeError$1(`TOML.parse(source.path)`); } + const { data, require: req = typeof require==='function' ? require : undefined$1 } = source; + if ( req ) { + const { resolve } = req; + if ( resolve!=null ) { + const { paths } = resolve; + if ( paths!=null ) { + const ret = apply$1(paths, resolve, [ '' ]); + if ( ret!=null ) { + const val = ret[0]; + if ( val!=null ) { + const dirname_ = val.replace(/node_modules$/, ''); + if ( dirname_ ) { + sourcePath = ( req )('path').resolve(dirname_, sourcePath); + if ( typeof sourcePath!=='string' ) { throw TypeError$1(`TOML.parse(source.require('path').resolve)`); } + } + } + } + } + } + if ( data===undefined$1 ) { + const data = ( req )('fs').readFileSync(sourcePath); + if ( typeof data==='object' && data && isBinaryLike(data) ) { source = binary2string(data); } + else { throw TypeError$1(`TOML.parse(source.require('fs').readFileSync)`); } + } + else if ( typeof data==='string' ) { assertFulScalar(source = data); } + else if ( typeof data==='object' && data && isBinaryLike(data) ) { source = binary2string(data); } + else { throw TypeError$1(`TOML.parse(source.data)`); } + } + else { + if ( data===undefined$1 ) { throw TypeError$1(`TOML.parse(source.data|source.require)`); } + else if ( typeof data==='string' ) { assertFulScalar(source = data); } + else if ( typeof data==='object' && data && isBinaryLike(data) ) { source = binary2string(data); } + else { throw TypeError$1(`TOML.parse(source.data)`); } + } + } + } + else if ( typeof source==='string' ) { assertFulScalar(source); } + else { throw TypeError$1(`TOML.parse(source)`); } + let joiner ; + let keys ; + if ( typeof multilineStringJoiner==='object' && multilineStringJoiner ) { + if ( bigint!==undefined$1 || x!==undefined$1 ) { throw TypeError$1(`options mode ? args mode`); } + joiner = multilineStringJoiner.joiner; + bigint = multilineStringJoiner.bigint; + keys = multilineStringJoiner.keys; + x = multilineStringJoiner.x; + argsMode = ''; + } + else { joiner = multilineStringJoiner; } + let rootTable ; + let process ; + if ( holding ) { throw Error$1(`parsing during parsing.`); } + holding = true; + try { + use(specificationVersion, joiner, bigint, keys, x, argsMode); + todo(source, sourcePath); + source && source[0]==='\uFEFF' && throws(TypeError$1(`TOML content (string) should not start with BOM (U+FEFF)` + where(' at '))); + rootTable = Root(); + process = Process(); + } + finally { + done();//clearWeakSets(); + clear(); + holding = false; + clearRegExp$1(); + } + process && process(); + return rootTable; +}; + +const parse$1 = /*#__PURE__*/assign$1( + (source , specificationVersion , multilineStringJoiner , useBigInt , xOptions ) => + typeof specificationVersion==='number' + ? parse(source, specificationVersion, multilineStringJoiner, useBigInt, xOptions, ',,') + : parse(source, 1.0, specificationVersion , multilineStringJoiner , useBigInt , ',') + , + { + '1.0': (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.1, multilineStringJoiner, useBigInt, xOptions, ','), + 1.0: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 1.0, multilineStringJoiner, useBigInt, xOptions, ','), + 0.5: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.5, multilineStringJoiner, useBigInt, xOptions, ','), + 0.4: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.4, multilineStringJoiner, useBigInt, xOptions, ','), + 0.3: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.3, multilineStringJoiner, useBigInt, xOptions, ','), + 0.2: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.2, multilineStringJoiner, useBigInt, xOptions, ','), + 0.1: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.1, multilineStringJoiner, useBigInt, xOptions, ','), + } +); + +const _export = /*#__PURE__*/Default({ + version, + parse: parse$1, + stringify, + Section, inline, multiline, basic, literal, commentFor, commentForThis, + OffsetDateTime, LocalDateTime, LocalDate, LocalTime, + isInline, isSection, + Keys, +}); + +return _export; + +})); + +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInZlcnNpb24/dGV4dCIsIi4uLy4uL2otcmVnZXhwL3NyYy90aGVSZWdFeHAudHMiLCIuLi8uLi9qLXJlZ2V4cC9zcmMvbmV3UmVnRXhwLnRzIiwiLi4vLi4vai1yZWdleHAvc3JjL2NsZWFyUmVnRXhwLnRzIiwiLi4vLi4vai1yZWdleHAvc3JjL2dyb3VwaWZ5LnRzIiwiLi4vLi4vai1vcmRlcmlmeS9zcmMvZXhwb3J0LnRzIiwidHlwZXMvbm9uLWF0b20udHMiLCJ0eXBlcy9UYWJsZS50cyIsIml0ZXJhdG9yLnRzIiwicmVnZXhwcy50cyIsIm9wdGlvbnMudHMiLCJqLWxleGVyLnRzIiwidHlwZXMvYXRvbS50cyIsInR5cGVzL0FycmF5LnRzIiwidHlwZXMvRGF0ZXRpbWUudHMiLCJ0eXBlcy9TdHJpbmcudHMiLCJ0eXBlcy9JbnRlZ2VyLnRzIiwidHlwZXMvRmxvYXQudHMiLCJwYXJzZS9vbi10aGUtc3BvdC50cyIsInR5cGVzL2NvbW1lbnQudHMiLCJwYXJzZS9sZXZlbC1sb29wLnRzIiwic3RyaW5naWZ5L3N0cmluZy50cyIsInN0cmluZ2lmeS9mbG9hdC50cyIsInN0cmluZ2lmeS9zZWN0aW9uLnRzIiwic3RyaW5naWZ5L2RvY3VtZW50LnRzIiwic3RyaW5naWZ5Ly50cyIsInBhcnNlLy50cyIsImV4cG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCcxLjM4LjAnOyIsImltcG9ydCBiaW5kIGZyb20gJy5GdW5jdGlvbi5wcm90b3R5cGUuYmluZD8nO1xuaW1wb3J0IHRlc3QgZnJvbSAnLlJlZ0V4cC5wcm90b3R5cGUudGVzdCc7XG5pbXBvcnQgZXhlYyBmcm9tICcuUmVnRXhwLnByb3RvdHlwZS5leGVjJztcblxuZXhwb3J0IHZhciBUZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYmluZFxuXHQ/IC8qI19fUFVSRV9fKi9iaW5kLmJpbmQodGVzdCAgICAgICApICAgICAgIFxuXHQ6IGZ1bmN0aW9uIChyZSkge1xuXHRcdHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gdGVzdC5jYWxsKHJlLCBzdHJpbmcpO1xuXHRcdH07XG5cdH07XG5cbmV4cG9ydCB2YXIgRXhlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGJpbmRcblx0PyAvKiNfX1BVUkVfXyovYmluZC5iaW5kKGV4ZWMgICAgICAgKSAgICAgICBcblx0OiBmdW5jdGlvbiAocmUpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIGV4ZWMuY2FsbChyZSwgc3RyaW5nKTtcblx0XHR9O1xuXHR9O1xuXG5mdW5jdGlvbiBfX1BVUkVfXyAocmUgICAgICAgICkgICAgICAgICB7XG5cdHZhciB0ZXN0ID0gcmUudGVzdCA9IFRlc3QocmUpO1xuXHR2YXIgZXhlYyA9IHJlLmV4ZWMgPSBFeGVjKHJlKTtcblx0dmFyIHNvdXJjZSA9IHRlc3Quc291cmNlID0gZXhlYy5zb3VyY2UgPSByZS5zb3VyY2U7XG5cdHRlc3QudW5pY29kZSA9IGV4ZWMudW5pY29kZSA9IHJlLnVuaWNvZGU7XG5cdHRlc3QuaWdub3JlQ2FzZSA9IGV4ZWMuaWdub3JlQ2FzZSA9IHJlLmlnbm9yZUNhc2U7XG5cdHRlc3QubXVsdGlsaW5lID0gZXhlYy5tdWx0aWxpbmUgPSBzb3VyY2UuaW5kZXhPZignXicpPDAgJiYgc291cmNlLmluZGV4T2YoJyQnKTwwID8gbnVsbCA6IHJlLm11bHRpbGluZTtcblx0dGVzdC5kb3RBbGwgPSBleGVjLmRvdEFsbCA9IHNvdXJjZS5pbmRleE9mKCcuJyk8MCA/IG51bGwgOiByZS5kb3RBbGw7XG5cdHJldHVybiByZTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRoZVJlZ0V4cCAocmUgICAgICAgICkgICAgICAgICB7IHJldHVybiAvKiNfX1BVUkVfXyovX19QVVJFX18ocmUpOyB9O1xuXG4gICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICBcbiAgIiwiaW1wb3J0IFR5cGVFcnJvciBmcm9tICcuVHlwZUVycm9yJztcbmltcG9ydCBTeW50YXhFcnJvciBmcm9tICcuU3ludGF4RXJyb3InO1xuaW1wb3J0IFJlZ0V4cCBmcm9tICcuUmVnRXhwJztcbmltcG9ydCBmcmVlemUgZnJvbSAnLk9iamVjdC5mcmVlemU/JztcbmltcG9ydCBiaW5kIGZyb20gJy5GdW5jdGlvbi5wcm90b3R5cGUuYmluZD8nO1xuaW1wb3J0IGFwcGx5IGZyb20gJy5SZWZsZWN0LmFwcGx5Pyc7XG5pbXBvcnQgUHJveHkgZnJvbSAnLlByb3h5Pyc7XG5cbmltcG9ydCB7IFRlc3QsIEV4ZWMgfSBmcm9tICcuL3RoZVJlZ0V4cCc7XG5cbnZhciBOVCA9IC9bXFxuXFx0XSsvZztcbnZhciBFU0NBUEUgPSAvXFxcXC4vZztcbmZ1bmN0aW9uIGdyYXZlQWNjZW50UmVwbGFjZXIgKCQkICAgICAgICApIHsgcmV0dXJuICQkPT09J1xcXFxgJyA/ICdgJyA6ICQkOyB9XG5cbnZhciBpbmNsdWRlcyA9ICcnLmluY2x1ZGVzICAgICAgIFxuXHQ/IGZ1bmN0aW9uICh0aGF0ICAgICAgICAsIHNlYXJjaFN0cmluZyAgICAgICAgKSB7IHJldHVybiB0aGF0LmluY2x1ZGVzKHNlYXJjaFN0cmluZyk7IH1cblx0OiBmdW5jdGlvbiAodGhhdCAgICAgICAgLCBzZWFyY2hTdHJpbmcgICAgICAgICkgeyByZXR1cm4gdGhhdC5pbmRleE9mKHNlYXJjaFN0cmluZyk+LTE7IH07XG5cbmZ1bmN0aW9uIFJFICggICAgICAgICAgICAgICB0ZW1wbGF0ZSAgICAgICAgICAgICAgICAgICAgICApIHtcblx0dmFyIFUgPSB0aGlzLlU7XG5cdHZhciBJID0gdGhpcy5JO1xuXHR2YXIgTSA9IHRoaXMuTTtcblx0dmFyIFMgPSB0aGlzLlM7XG5cdHZhciByYXcgPSB0ZW1wbGF0ZS5yYXc7XG5cdHZhciBzb3VyY2UgPSByYXdbMF0gLnJlcGxhY2UoTlQsICcnKTtcblx0dmFyIGluZGV4ID0gMTtcblx0dmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdHdoaWxlICggaW5kZXghPT1sZW5ndGggKSB7XG5cdFx0dmFyIHZhbHVlICAgICAgICAgICAgXG5cdFx0XHQgICAgICAgICAgICAgICAgICAgICAgIFxuXHRcdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0XHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdFx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdFx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdFx0ICA9IGFyZ3VtZW50c1tpbmRleF07XG5cdFx0aWYgKCB0eXBlb2YgdmFsdWU9PT0nc3RyaW5nJyApIHsgc291cmNlICs9IHZhbHVlOyB9XG5cdFx0ZWxzZSB7XG5cdFx0XHR2YXIgdmFsdWVfc291cmNlID0gdmFsdWUuc291cmNlO1xuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWVfc291cmNlIT09J3N0cmluZycgKSB7IHRocm93IFR5cGVFcnJvcignc291cmNlJyk7IH1cblx0XHRcdGlmICggdmFsdWUudW5pY29kZT09PVUgKSB7IHRocm93IFN5bnRheEVycm9yKCd1bmljb2RlJyk7IH1cblx0XHRcdGlmICggdmFsdWUuaWdub3JlQ2FzZT09PUkgKSB7IHRocm93IFN5bnRheEVycm9yKCdpZ25vcmVDYXNlJyk7IH1cblx0XHRcdGlmICggdmFsdWUubXVsdGlsaW5lPT09TSAmJiAoIGluY2x1ZGVzKHZhbHVlX3NvdXJjZSwgJ14nKSB8fCBpbmNsdWRlcyh2YWx1ZV9zb3VyY2UsICckJykgKSApIHsgdGhyb3cgU3ludGF4RXJyb3IoJ211bHRpbGluZScpOyB9XG5cdFx0XHRpZiAoIHZhbHVlLmRvdEFsbD09PVMgJiYgaW5jbHVkZXModmFsdWVfc291cmNlLCAnLicpICkgeyB0aHJvdyBTeW50YXhFcnJvcignZG90QWxsJyk7IH1cblx0XHRcdHNvdXJjZSArPSB2YWx1ZV9zb3VyY2U7XG5cdFx0fVxuXHRcdHNvdXJjZSArPSByYXdbaW5kZXgrK10gLnJlcGxhY2UoTlQsICcnKTtcblx0fVxuXHR2YXIgcmUgICAgICAgICA9IFJlZ0V4cChVID8gc291cmNlID0gc291cmNlLnJlcGxhY2UoRVNDQVBFLCBncmF2ZUFjY2VudFJlcGxhY2VyKSA6IHNvdXJjZSwgdGhpcy5mbGFncyk7XG5cdHZhciB0ZXN0ID0gcmUudGVzdCA9IFRlc3QocmUpO1xuXHR2YXIgZXhlYyA9IHJlLmV4ZWMgPSBFeGVjKHJlKTtcblx0dGVzdC5zb3VyY2UgPSBleGVjLnNvdXJjZSA9IHNvdXJjZTtcblx0dGVzdC51bmljb2RlID0gZXhlYy51bmljb2RlID0gIVU7XG5cdHRlc3QuaWdub3JlQ2FzZSA9IGV4ZWMuaWdub3JlQ2FzZSA9ICFJO1xuXHR0ZXN0Lm11bHRpbGluZSA9IGV4ZWMubXVsdGlsaW5lID0gaW5jbHVkZXMoc291cmNlLCAnXicpIHx8IGluY2x1ZGVzKHNvdXJjZSwgJyQnKSA/ICFNIDogbnVsbDtcblx0dGVzdC5kb3RBbGwgPSBleGVjLmRvdEFsbCA9IGluY2x1ZGVzKHNvdXJjZSwgJy4nKSA/ICFTIDogbnVsbDtcblx0cmV0dXJuIHJlO1xufVxuXG52YXIgUkVfYmluZCA9IGJpbmQgJiYgLyojX19QVVJFX18qL2JpbmQuYmluZChSRSAgICAgICApO1xuXG5mdW5jdGlvbiBDb250ZXh0IChmbGFncyAgICAgICAgKSAgICAgICAgICB7XG5cdHJldHVybiB7XG5cdFx0VTogIWluY2x1ZGVzKGZsYWdzLCAndScpLFxuXHRcdEk6ICFpbmNsdWRlcyhmbGFncywgJ2knKSxcblx0XHRNOiAhaW5jbHVkZXMoZmxhZ3MsICdtJyksXG5cdFx0UzogIWluY2x1ZGVzKGZsYWdzLCAncycpLFxuXHRcdGZsYWdzOiBmbGFnc1xuXHR9O1xufVxuXG52YXIgQ09OVEVYVCAgICAgICAgICA9IC8qI19fUFVSRV9fKi9Db250ZXh0KCcnKTtcblxuZXhwb3J0IGRlZmF1bHQgUHJveHlcblx0PyAvKiNfX1BVUkVfXyovbmV3IFByb3h5KFJFLCB7XG5cdFx0YXBwbHk6IGZ1bmN0aW9uIChSRSwgdGhpc0FyZywgYXJncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7IHJldHVybiBhcHBseShSRSwgQ09OVEVYVCwgYXJncyk7IH1cblx0XHQsXG5cdFx0Z2V0OiBmdW5jdGlvbiAoUkUsIGZsYWdzICAgICAgICApIHsgcmV0dXJuIFJFX2JpbmQoQ29udGV4dChmbGFncykpOyB9XG5cdFx0LFxuXHRcdGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdCxcblx0XHRwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH1cblx0fSlcblx0OiAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuXHRcdFJFLmFwcGx5ID0gUkUuYXBwbHk7XG5cdFx0dmFyIG5ld1JlZ0V4cCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFJFLmFwcGx5KENPTlRFWFQsIGFyZ3VtZW50cyAgICAgICApOyB9ICAgICAgIDtcblx0XHR2YXIgZCA9IDE7XG5cdFx0dmFyIGcgPSBkKjI7XG5cdFx0dmFyIGkgPSBnKjI7XG5cdFx0dmFyIG0gPSBpKjI7XG5cdFx0dmFyIHMgPSBpKjI7XG5cdFx0dmFyIHUgPSBzKjI7XG5cdFx0dmFyIHkgPSB1KjI7XG5cdFx0dmFyIGZsYWdzID0geSoyIC0gMTtcblx0XHR3aGlsZSAoIGZsYWdzLS0gKSB7XG5cdFx0XHQoIGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cdFx0XHRcdG5ld1JlZ0V4cFtjb250ZXh0LmZsYWdzXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFJFLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyAgICAgICApOyB9O1xuXHRcdFx0fSApKENvbnRleHQoXG5cdFx0XHRcdCggZmxhZ3MgJiBkID8gJycgOiAnZCcgKVxuXHRcdFx0XHQrXG5cdFx0XHRcdCggZmxhZ3MgJiBnID8gJycgOiAnZycgKVxuXHRcdFx0XHQrXG5cdFx0XHRcdCggZmxhZ3MgJiBpID8gJycgOiAnaScgKVxuXHRcdFx0XHQrXG5cdFx0XHRcdCggZmxhZ3MgJiBtID8gJycgOiAnbScgKVxuXHRcdFx0XHQrXG5cdFx0XHRcdCggZmxhZ3MgJiBzID8gJycgOiAncycgKVxuXHRcdFx0XHQrXG5cdFx0XHRcdCggZmxhZ3MgJiB1ID8gJycgOiAndScgKVxuXHRcdFx0XHQrXG5cdFx0XHRcdCggZmxhZ3MgJiB5ID8gJycgOiAneScgKVxuXHRcdFx0KSk7XG5cdFx0fVxuXHRcdHJldHVybiBmcmVlemUgPyBmcmVlemUobmV3UmVnRXhwKSA6IG5ld1JlZ0V4cDtcblx0fSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICBcblx0ICAgICAgICAgIFxuXHQgICAgICAgICAgXG5cdCAgICAgICAgICBcblx0ICAgICAgICAgICAgIFxuICAgIiwiaW1wb3J0IFJlZ0V4cCBmcm9tICcuUmVnRXhwJztcblxudmFyIGNsZWFyUmVnRXhwID0gJyRfJyBpbiBSZWdFeHBcblx0PyAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuXHRcdHZhciBSRUdFWFAgPSAvXi87XG5cdFx0UkVHRVhQLnRlc3QgPSBSRUdFWFAudGVzdDtcblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xlYXJSZWdFeHAgICAgICAgICAgICAgICAgKHZhbHVlICAgICkgICAgICAgICAgICAgICAge1xuXHRcdFx0UkVHRVhQLnRlc3QoJycpO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH07XG5cdH0oKVxuXHQ6IGZ1bmN0aW9uIGNsZWFyUmVnRXhwICAgICAgICAgICAgICAgICh2YWx1ZSAgICApICAgICAgICAgICAgICAgIHtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH07XG5cbmV4cG9ydCBkZWZhdWx0IGNsZWFyUmVnRXhwOyIsImltcG9ydCBjcmVhdGUgZnJvbSAnLk9iamVjdC5jcmVhdGU/PSc7XG5pbXBvcnQgTlVMTCBmcm9tICcubnVsbC5wcm90b3R5cGUnO1xuXG52YXIgTkVFRF9UT19FU0NBUEVfSU5fUkVHRVhQID0gL15bJCgpKitcXC0uP1tcXFxcXFxdXnt8XS87XG52YXIgU1VSUk9HQVRFX1BBSVIgPSAvXltcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vO1xudmFyIEdST1VQID0gLyojX19QVVJFX18qL2NyZWF0ZShOVUxMKSAgICAgICAgIDtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3JvdXBpZnkgKGJyYW5jaGVzICAgICAgICAgICAgICAgICAgICwgdUZsYWcgICAgICAgICAgLCBub0VzY2FwZSAgICAgICAgICApICAgICAgICAge1xuXHR2YXIgZ3JvdXAgPSBjcmVhdGUoTlVMTCkgICAgICAgICA7XG5cdHZhciBhcHBlbmRCcmFuY2ggPSB1RmxhZyA/IGFwcGVuZFBvaW50QnJhbmNoIDogYXBwZW5kQ29kZUJyYW5jaDtcblx0Zm9yICggdmFyIGxlbmd0aCAgICAgICAgID0gYnJhbmNoZXMubGVuZ3RoLCBpbmRleCAgICAgICAgID0gMDsgaW5kZXg8bGVuZ3RoOyArK2luZGV4ICkgeyBhcHBlbmRCcmFuY2goZ3JvdXAsIGJyYW5jaGVzW2luZGV4XSApOyB9XG5cdHJldHVybiBzb3VyY2lmeShncm91cCwgIW5vRXNjYXBlKTtcbn07XG5cbmZ1bmN0aW9uIGFwcGVuZFBvaW50QnJhbmNoIChncm91cCAgICAgICAsIGJyYW5jaCAgICAgICAgKSAgICAgICB7XG5cdGlmICggYnJhbmNoICkge1xuXHRcdHZhciBjaGFyYWN0ZXIgICAgICAgICA9IFNVUlJPR0FURV9QQUlSLnRlc3QoYnJhbmNoKSA/IGJyYW5jaC5zbGljZSgwLCAyKSA6IGJyYW5jaC5jaGFyQXQoMCk7XG5cdFx0YXBwZW5kUG9pbnRCcmFuY2goZ3JvdXBbY2hhcmFjdGVyXSB8fCAoIGdyb3VwW2NoYXJhY3Rlcl0gPSBjcmVhdGUoTlVMTCkgICAgICAgICAgKSwgYnJhbmNoLnNsaWNlKGNoYXJhY3Rlci5sZW5ndGgpKTtcblx0fVxuXHRlbHNlIHsgZ3JvdXBbJyddID0gR1JPVVA7IH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kQ29kZUJyYW5jaCAoZ3JvdXAgICAgICAgLCBicmFuY2ggICAgICAgICkgICAgICAge1xuXHRpZiAoIGJyYW5jaCApIHtcblx0XHR2YXIgY2hhcmFjdGVyICAgICAgICAgPSBicmFuY2guY2hhckF0KDApO1xuXHRcdGFwcGVuZENvZGVCcmFuY2goZ3JvdXBbY2hhcmFjdGVyXSB8fCAoIGdyb3VwW2NoYXJhY3Rlcl0gPSBjcmVhdGUoTlVMTCkgICAgICAgICAgKSwgYnJhbmNoLnNsaWNlKDEpKTtcblx0fVxuXHRlbHNlIHsgZ3JvdXBbJyddID0gR1JPVVA7IH1cbn1cblxuZnVuY3Rpb24gc291cmNpZnkgKGdyb3VwICAgICAgICwgbmVlZEVzY2FwZSAgICAgICAgICkgICAgICAgICB7XG5cdHZhciBicmFuY2hlcyAgICAgICAgICAgPSBbXTtcblx0dmFyIHNpbmdsZUNoYXJhY3RlcnNCcmFuY2ggICAgICAgICAgID0gW107XG5cdHZhciBub0VtcHR5QnJhbmNoICAgICAgICAgID0gdHJ1ZTtcblx0Zm9yICggdmFyIGNoYXJhY3RlciBpbiBncm91cCApIHtcblx0XHRpZiAoIGNoYXJhY3RlciApIHtcblx0XHRcdHZhciBzdWJfYnJhbmNoZXMgICAgICAgICA9IHNvdXJjaWZ5KGdyb3VwW2NoYXJhY3Rlcl0gLCBuZWVkRXNjYXBlKTtcblx0XHRcdGlmICggbmVlZEVzY2FwZSAmJiBORUVEX1RPX0VTQ0FQRV9JTl9SRUdFWFAudGVzdChjaGFyYWN0ZXIpICkgeyBjaGFyYWN0ZXIgPSAnXFxcXCcgKyBjaGFyYWN0ZXI7IH1cblx0XHRcdHN1Yl9icmFuY2hlcyA/IGJyYW5jaGVzLnB1c2goY2hhcmFjdGVyICsgc3ViX2JyYW5jaGVzKSA6IHNpbmdsZUNoYXJhY3RlcnNCcmFuY2gucHVzaChjaGFyYWN0ZXIpO1xuXHRcdH1cblx0XHRlbHNlIHsgbm9FbXB0eUJyYW5jaCA9IGZhbHNlOyB9XG5cdH1cblx0c2luZ2xlQ2hhcmFjdGVyc0JyYW5jaC5sZW5ndGggJiYgYnJhbmNoZXMudW5zaGlmdChzaW5nbGVDaGFyYWN0ZXJzQnJhbmNoLmxlbmd0aD09PTEgPyBzaW5nbGVDaGFyYWN0ZXJzQnJhbmNoWzBdICA6ICdbJyArIHNpbmdsZUNoYXJhY3RlcnNCcmFuY2guam9pbignJykgKyAnXScpO1xuXHRyZXR1cm4gYnJhbmNoZXMubGVuZ3RoPT09MFxuXHRcdD8gJydcblx0XHQ6ICggYnJhbmNoZXMubGVuZ3RoPT09MSAmJiAoIHNpbmdsZUNoYXJhY3RlcnNCcmFuY2gubGVuZ3RoIHx8IG5vRW1wdHlCcmFuY2ggKVxuXHRcdFx0PyBicmFuY2hlc1swXVxuXHRcdFx0OiAnKD86JyArIGJyYW5jaGVzLmpvaW4oJ3wnKSArICcpJ1xuXHRcdClcblx0XHQrICggbm9FbXB0eUJyYW5jaCA/ICcnIDogJz8nICk7XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCJpbXBvcnQgVHlwZUVycm9yIGZyb20gJy5UeXBlRXJyb3InO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnLldlYWtNYXAnO1xuaW1wb3J0IFByb3h5IGZyb20gJy5Qcm94eSc7XG5pbXBvcnQgT2JqZWN0X2Fzc2lnbiBmcm9tICcuT2JqZWN0LmFzc2lnbic7XG5pbXBvcnQgT2JqZWN0X2NyZWF0ZSBmcm9tICcuT2JqZWN0LmNyZWF0ZSc7XG5pbXBvcnQgT2JqZWN0X2lzIGZyb20gJy5PYmplY3QuaXMnO1xuaW1wb3J0IE9iamVjdF9kZWZpbmVQcm9wZXJ0eSBmcm9tICcuT2JqZWN0LmRlZmluZVByb3BlcnR5JztcbmltcG9ydCBPYmplY3RfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGZyb20gJy5PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJztcbmltcG9ydCBPYmplY3RfZGVmaW5lUHJvcGVydGllcyBmcm9tICcuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMnO1xuaW1wb3J0IE9iamVjdF9mcm9tRW50cmllcyBmcm9tICcuT2JqZWN0LmZyb21FbnRyaWVzJztcbmltcG9ydCBPYmplY3RfZnJlZXplIGZyb20gJy5PYmplY3QuZnJlZXplJztcbmltcG9ydCBoYXNPd24gZnJvbSAnLk9iamVjdC5oYXNPd24/PSc7XG5pbXBvcnQgUmVmbGVjdF9hcHBseSBmcm9tICcuUmVmbGVjdC5hcHBseSc7XG5pbXBvcnQgUmVmbGVjdF9jb25zdHJ1Y3QgZnJvbSAnLlJlZmxlY3QuY29uc3RydWN0JztcbmltcG9ydCBSZWZsZWN0X2RlZmluZVByb3BlcnR5IGZyb20gJy5SZWZsZWN0LmRlZmluZVByb3BlcnR5JztcbmltcG9ydCBSZWZsZWN0X2RlbGV0ZVByb3BlcnR5IGZyb20gJy5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5JztcbmltcG9ydCBSZWZsZWN0X293bktleXMgZnJvbSAnLlJlZmxlY3Qub3duS2V5cyc7XG5pbXBvcnQgdW5kZWZpbmVkIGZyb20gJy51bmRlZmluZWQnO1xuaW1wb3J0IE5VTEwgZnJvbSAnLm51bGwucHJvdG90eXBlJztcblxuaW1wb3J0IHZlcnNpb24gZnJvbSAnLi92ZXJzaW9uP3RleHQnO1xuZXhwb3J0IHsgdmVyc2lvbiB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbmNvbnN0IEtlZXBlciA9ICAgICAoKSAgICAgID0+IFtdO1xuXG5jb25zdCBuZXdXZWFrTWFwID0gKCkgPT4ge1xuXHRjb25zdCB3ZWFrTWFwID0gbmV3IFdlYWtNYXA7XG5cdHdlYWtNYXAuaGFzID0gd2Vha01hcC5oYXM7XG5cdHdlYWtNYXAuZ2V0ID0gd2Vha01hcC5nZXQ7XG5cdHdlYWtNYXAuc2V0ID0gd2Vha01hcC5zZXQ7XG5cdHJldHVybiB3ZWFrTWFwO1xufTtcbmNvbnN0IHRhcmdldDJrZWVwZXIgPSAvKiNfX1BVUkVfXyovbmV3V2Vha01hcCgpICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gO1xuY29uc3QgcHJveHkydGFyZ2V0ID0gLyojX19QVVJFX18qL25ld1dlYWtNYXAoKSAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gO1xuY29uc3QgdGFyZ2V0MnByb3h5ID0gLyojX19QVVJFX18qL25ld1dlYWtNYXAoKSAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIDtcblxuY29uc3QgRXh0ZXJuYWxEZXNjcmlwdG9yID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2UgICApICAgID0+IHtcblx0Y29uc3QgdGFyZ2V0ID0gT2JqZWN0X2NyZWF0ZShOVUxMKSAgICAgO1xuXHRpZiAoIGhhc093bihzb3VyY2UsICdlbnVtZXJhYmxlJykgKSB7IHRhcmdldC5lbnVtZXJhYmxlID0gc291cmNlLmVudW1lcmFibGU7IH1cblx0aWYgKCBoYXNPd24oc291cmNlLCAnY29uZmlndXJhYmxlJykgKSB7IHRhcmdldC5jb25maWd1cmFibGUgPSBzb3VyY2UuY29uZmlndXJhYmxlOyB9XG5cdGlmICggaGFzT3duKHNvdXJjZSwgJ3ZhbHVlJykgKSB7IHRhcmdldC52YWx1ZSA9IHNvdXJjZS52YWx1ZTsgfVxuXHRpZiAoIGhhc093bihzb3VyY2UsICd3cml0YWJsZScpICkgeyB0YXJnZXQud3JpdGFibGUgPSBzb3VyY2Uud3JpdGFibGU7IH1cblx0aWYgKCBoYXNPd24oc291cmNlLCAnZ2V0JykgKSB7IHRhcmdldC5nZXQgPSBzb3VyY2UuZ2V0OyB9XG5cdGlmICggaGFzT3duKHNvdXJjZSwgJ3NldCcpICkgeyB0YXJnZXQuc2V0ID0gc291cmNlLnNldDsgfVxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxuY29uc3QgaGFuZGxlcnMgICAgICAgICAgICAgICAgICAgICAgID0gLyojX19QVVJFX18qL09iamVjdF9hc3NpZ24oT2JqZWN0X2NyZWF0ZShOVUxMKSwge1xuXHRkZWZpbmVQcm9wZXJ0eTogICAgICAgICAgICAgICAgICh0YXJnZXQgICAgICAgICAgICAgICAgICAgLCBrZXkgICAsIGRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgPT4ge1xuXHRcdGlmICggaGFzT3duKHRhcmdldCwga2V5KSApIHtcblx0XHRcdHJldHVybiBSZWZsZWN0X2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3RfYXNzaWduKE9iamVjdF9jcmVhdGUoTlVMTCksIGRlc2NyaXB0b3IpKTtcblx0XHR9XG5cdFx0aWYgKCBSZWZsZWN0X2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3RfYXNzaWduKE9iamVjdF9jcmVhdGUoTlVMTCksIGRlc2NyaXB0b3IpKSApIHtcblx0XHRcdGNvbnN0IGtlZXBlciA9IHRhcmdldDJrZWVwZXIuZ2V0KHRhcmdldCkgO1xuXHRcdFx0a2VlcGVyW2tlZXBlci5sZW5ndGhdID0ga2V5O1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0ZGVsZXRlUHJvcGVydHk6ICAgICAgICAgICAgICAgICAodGFyZ2V0ICAgICAgICAgICAgICAgICAgICwga2V5ICAgKSAgICAgICAgICA9PiB7XG5cdFx0aWYgKCBSZWZsZWN0X2RlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSApIHtcblx0XHRcdGNvbnN0IGtlZXBlciA9IHRhcmdldDJrZWVwZXIuZ2V0KHRhcmdldCkgO1xuXHRcdFx0Y29uc3QgaW5kZXggPSBrZWVwZXIuaW5kZXhPZihrZXkpO1xuXHRcdFx0aW5kZXg8MCB8fCAtLWtlZXBlci5jb3B5V2l0aGluKGluZGV4LCBpbmRleCArIDEpLmxlbmd0aDtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdG93bktleXM6ICAgICAgICAgICAgICAgICAgICAodGFyZ2V0ICAgKSA9PiB0YXJnZXQya2VlcGVyLmdldCh0YXJnZXQpICAgICAgICAgICAgICAgICAgICAgICAgICxcblx0Y29uc3RydWN0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICwgYXJncyAgICwgbmV3VGFyZ2V0ICAgICApICAgID0+IG9yZGVyaWZ5KFJlZmxlY3RfY29uc3RydWN0KHRhcmdldCwgYXJncywgbmV3VGFyZ2V0KSksXG5cdGFwcGx5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0aGlzQXJnICAgLCBhcmdzICAgKSAgICA9PiBvcmRlcmlmeShSZWZsZWN0X2FwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJncykpLFxufSk7XG5cbmNvbnN0IG5ld1Byb3h5ID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhcmdldCAgICwga2VlcGVyICAgICAgICAgICApICAgID0+IHtcblx0dGFyZ2V0MmtlZXBlci5zZXQodGFyZ2V0LCBrZWVwZXIpO1xuXHRjb25zdCBwcm94eSA9IG5ldyBQcm94eSAgICh0YXJnZXQsIGhhbmRsZXJzKTtcblx0cHJveHkydGFyZ2V0LnNldChwcm94eSwgdGFyZ2V0KTtcblx0cmV0dXJuIHByb3h5O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT3JkZXJlZCA9IChvYmplY3QgICAgICAgICkgICAgICAgICAgPT4gcHJveHkydGFyZ2V0LmhhcyhvYmplY3QpO1xuZXhwb3J0IGNvbnN0IGlzID0gKG9iamVjdDEgICAgICAgICwgb2JqZWN0MiAgICAgICAgKSAgICAgICAgICA9PiBPYmplY3RfaXMoXG5cdHByb3h5MnRhcmdldC5nZXQob2JqZWN0MSkgfHwgb2JqZWN0MSxcblx0cHJveHkydGFyZ2V0LmdldChvYmplY3QyKSB8fCBvYmplY3QyLFxuKTtcblxuZXhwb3J0IGNvbnN0IG9yZGVyaWZ5ID0gICAgICAgICAgICAgICAgICAgIChvYmplY3QgICApICAgID0+IHtcblx0aWYgKCBwcm94eTJ0YXJnZXQuaGFzKG9iamVjdCkgKSB7IHJldHVybiBvYmplY3Q7IH1cblx0bGV0IHByb3h5ID0gdGFyZ2V0MnByb3h5LmdldChvYmplY3QpICAgICAgICAgICAgICAgICA7XG5cdGlmICggcHJveHkgKSB7IHJldHVybiBwcm94eTsgfVxuXHRwcm94eSA9IG5ld1Byb3h5KG9iamVjdCwgT2JqZWN0X2Fzc2lnbihLZWVwZXIgICAgICAgICAgKCksIFJlZmxlY3Rfb3duS2V5cyhvYmplY3QpKSk7XG5cdHRhcmdldDJwcm94eS5zZXQob2JqZWN0LCBwcm94eSk7XG5cdHJldHVybiBwcm94eTtcbn07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBjb25zdCB7IGNyZWF0ZSB9ID0ge1xuXHRjcmVhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RvICAgICAgICAgICwgLi4uZGVzY3JpcHRvck1hcHMgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuXHRcdGNvbnN0IGtlZXBlciA9IEtlZXBlciAgICAgICAgICAgKCk7XG5cdFx0aWYgKCBkZXNjcmlwdG9yTWFwcy5sZW5ndGggKSB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yTWFwICAgICA9IE9iamVjdF9hc3NpZ24obmV3UHJveHkoT2JqZWN0X2NyZWF0ZShOVUxMKSAgICAgICwga2VlcGVyKSwgLi4uZGVzY3JpcHRvck1hcHMpO1xuXHRcdFx0Y29uc3QgeyBsZW5ndGggfSA9IGtlZXBlcjtcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHR3aGlsZSAoIGluZGV4IT09bGVuZ3RoICkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBrZWVwZXJbaW5kZXgrK10gO1xuXHRcdFx0XHRkZXNjcmlwdG9yTWFwW2tleV0gPSBFeHRlcm5hbERlc2NyaXB0b3IoZGVzY3JpcHRvck1hcFtrZXldKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXdQcm94eShPYmplY3RfY3JlYXRlKHByb3RvLCBkZXNjcmlwdG9yTWFwKSAgICAgICAsIGtlZXBlciAgICAgICApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3UHJveHkoT2JqZWN0X2NyZWF0ZShwcm90bykgICAgICAgLCBrZWVwZXIgICAgICAgKTtcblx0fVxufTtcbmV4cG9ydCBjb25zdCB7IGRlZmluZVByb3BlcnRpZXMgfSA9IHtcblx0ZGVmaW5lUHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdCAgICwgZGVzY3JpcHRvck1hcCAgICAsIC4uLmRlc2NyaXB0b3JNYXBzICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcblx0XHRjb25zdCBrZWVwZXIgPSBLZWVwZXIgICAgICAgICAgICgpO1xuXHRcdGRlc2NyaXB0b3JNYXAgPSBPYmplY3RfYXNzaWduKG5ld1Byb3h5KE9iamVjdF9jcmVhdGUoTlVMTCkgICAgICAsIGtlZXBlciksIGRlc2NyaXB0b3JNYXAsIC4uLmRlc2NyaXB0b3JNYXBzKTtcblx0XHRjb25zdCB7IGxlbmd0aCB9ID0ga2VlcGVyO1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0d2hpbGUgKCBpbmRleCE9PWxlbmd0aCApIHtcblx0XHRcdGNvbnN0IGtleSA9IGtlZXBlcltpbmRleCsrXSA7XG5cdFx0XHRkZXNjcmlwdG9yTWFwW2tleV0gPSBFeHRlcm5hbERlc2NyaXB0b3IoZGVzY3JpcHRvck1hcFtrZXldKTtcblx0XHR9XG5cdFx0cmV0dXJuIE9iamVjdF9kZWZpbmVQcm9wZXJ0aWVzKG9yZGVyaWZ5KG9iamVjdCksIGRlc2NyaXB0b3JNYXApO1xuXHR9XG59O1xuZXhwb3J0IGNvbnN0IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSAgICAgICAgICAgICAgICAgICAgKG9iamVjdCAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IHtcblx0Y29uc3QgZGVzY3JpcHRvck1hcCA9IE9iamVjdF9jcmVhdGUoTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG5cdGNvbnN0IGtlZXBlciA9IE9iamVjdF9hc3NpZ24oS2VlcGVyICAgICAgICAgICgpLCBSZWZsZWN0X293bktleXMob2JqZWN0KSk7XG5cdGNvbnN0IHsgbGVuZ3RoIH0gPSBrZWVwZXI7XG5cdGxldCBpbmRleCA9IDA7XG5cdHdoaWxlICggaW5kZXghPT1sZW5ndGggKSB7XG5cdFx0Y29uc3Qga2V5ID0ga2VlcGVyW2luZGV4KytdIDtcblx0XHRkZXNjcmlwdG9yTWFwW2tleV0gPSBPYmplY3RfYXNzaWduKE9iamVjdF9jcmVhdGUoTlVMTCksIE9iamVjdF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpICk7XG5cdH1cblx0cmV0dXJuIG5ld1Byb3h5KGRlc2NyaXB0b3JNYXAsIGtlZXBlcik7XG59O1xuXG5leHBvcnQgY29uc3QgTnVsbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG5cdGZ1bmN0aW9uIHRocm93Q29uc3RydWN0aW5nICgpICAgICAgICB7IHRocm93IFR5cGVFcnJvcihgU3VwZXIgY29uc3RydWN0b3IgTnVsbCBjYW5ub3QgYmUgaW52b2tlZCB3aXRoICduZXcnYCk7IH1cblx0ZnVuY3Rpb24gdGhyb3dBcHBseWluZyAoKSAgICAgICAgeyB0aHJvdyBUeXBlRXJyb3IoYFN1cGVyIGNvbnN0cnVjdG9yIE51bGwgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J2ApOyB9XG5cdGNvbnN0IE51bGxpZnkgPSAoY29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuXHRcdGRlbGV0ZSBjb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cdFx0T2JqZWN0X2ZyZWV6ZShjb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuXHRcdHJldHVybiBjb25zdHJ1Y3Rvcjtcblx0fTtcblx0ZnVuY3Rpb24gTnVsbCAoICAgICAgICAgICBjb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuXHRcdHJldHVybiBuZXcudGFyZ2V0XG5cdFx0XHQ/IG5ldy50YXJnZXQ9PT1OdWxsXG5cdFx0XHRcdD8gLyojX19QVVJFX18qL3Rocm93Q29uc3RydWN0aW5nKClcblx0XHRcdFx0OiAvKiNfX1BVUkVfXyovbmV3UHJveHkodGhpcywgS2VlcGVyICAgICAoKSlcblx0XHRcdDogdHlwZW9mIGNvbnN0cnVjdG9yPT09J2Z1bmN0aW9uJ1xuXHRcdFx0XHQ/IC8qI19fUFVSRV9fKi9OdWxsaWZ5KGNvbnN0cnVjdG9yKVxuXHRcdFx0XHQ6IC8qI19fUFVSRV9fKi90aHJvd0FwcGx5aW5nKCk7XG5cdH1cblx0Ly9AdHMtaWdub3JlXG5cdE51bGwucHJvdG90eXBlID0gbnVsbDtcblx0T2JqZWN0X2RlZmluZVByb3BlcnR5KE51bGwsICduYW1lJywgT2JqZWN0X2Fzc2lnbihPYmplY3RfY3JlYXRlKE5VTEwpLCB7IHZhbHVlOiAnJywgY29uZmlndXJhYmxlOiBmYWxzZSB9KSk7XG5cdC8vZGVsZXRlIE51bGwubGVuZ3RoO1xuXHRPYmplY3RfZnJlZXplKE51bGwpO1xuXHRyZXR1cm4gTnVsbDtcbn0oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IERFRkFVTFQgPSAvKiNfX1BVUkVfXyovT2JqZWN0X2Fzc2lnbihjbGFzcyBleHRlbmRzIG51bGwgeyB3cml0YWJsZSAoKSB7fSBlbnVtZXJhYmxlICgpIHt9IGNvbmZpZ3VyYWJsZSAoKSB7fSB9LnByb3RvdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB7XG5cdGNvbnN0cnVjdG9yOiB1bmRlZmluZWQsXG5cdHdyaXRhYmxlOiB0cnVlLFxuXHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRjb25maWd1cmFibGU6IHRydWUsXG59KTtcbmV4cG9ydCBjb25zdCBmcm9tRW50cmllcyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW50cmllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwcm90byAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICA9PiB7XG5cdGNvbnN0IHRhcmdldCA9IE9iamVjdF9mcm9tRW50cmllcyhlbnRyaWVzKTtcblx0Y29uc3Qga2VlcGVyICAgICAgICAgICAgPSBPYmplY3RfYXNzaWduKEtlZXBlciAgICgpLCBSZWZsZWN0X293bktleXModGFyZ2V0KSk7XG5cdGlmICggcHJvdG89PT11bmRlZmluZWQgKSB7IHJldHVybiBuZXdQcm94eSh0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICwga2VlcGVyKTsgfVxuXHRpZiAoIHByb3RvPT09bnVsbCApIHsgcmV0dXJuIG5ld1Byb3h5KE9iamVjdF9hc3NpZ24oT2JqZWN0X2NyZWF0ZShwcm90byksIHRhcmdldCkgICAgICAgICAgICAgICAgICAgICAgICwga2VlcGVyKTsgfVxuXHRjb25zdCBkZXNjcmlwdG9yTWFwID0gT2JqZWN0X2NyZWF0ZShOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuXHRjb25zdCB7IGxlbmd0aCB9ID0ga2VlcGVyO1xuXHRsZXQgaW5kZXggPSAwO1xuXHR3aGlsZSAoIGluZGV4IT09bGVuZ3RoICkge1xuXHRcdGNvbnN0IGtleSAgICA9IGtlZXBlcltpbmRleCsrXSA7XG5cdFx0KCBkZXNjcmlwdG9yTWFwW2tleV0gPSBPYmplY3RfY3JlYXRlKERFRkFVTFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudmFsdWUgPSB0YXJnZXRba2V5XTtcblx0fVxuXHRyZXR1cm4gbmV3UHJveHkoT2JqZWN0X2NyZWF0ZShwcm90bywgZGVzY3JpcHRvck1hcCkgICAgICAgICAgICAgICAgICAgICAgICwga2VlcGVyKTtcbn07XG5cbmltcG9ydCBEZWZhdWx0IGZyb20gJy5kZWZhdWx0JztcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9EZWZhdWx0KHtcblx0dmVyc2lvbixcblx0aXNPcmRlcmVkLFxuXHRpcyxcblx0b3JkZXJpZnksXG5cdGNyZWF0ZSxcblx0ZGVmaW5lUHJvcGVydGllcyxcblx0TnVsbCxcblx0ZnJvbUVudHJpZXMsXG5cdGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG59KTtcbiIsImltcG9ydCBUeXBlRXJyb3IgZnJvbSAnLlR5cGVFcnJvcic7XG5pbXBvcnQgUmFuZ2VFcnJvciBmcm9tICcuUmFuZ2VFcnJvcic7XG5pbXBvcnQgV2Vha1NldCBmcm9tICcuV2Vha1NldCc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICcuV2Vha01hcCc7XG5pbXBvcnQgc2V0X2hhcyBmcm9tICcuV2Vha1NldC5wcm90b3R5cGUuaGFzJztcbmltcG9ydCBzZXRfYWRkIGZyb20gJy5XZWFrU2V0LnByb3RvdHlwZS5hZGQnO1xuaW1wb3J0IHNldF9kZWwgZnJvbSAnLldlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSc7XG5pbXBvcnQgbWFwX2hhcyBmcm9tICcuV2Vha01hcC5wcm90b3R5cGUuaGFzJztcbmltcG9ydCBtYXBfZ2V0IGZyb20gJy5XZWFrTWFwLnByb3RvdHlwZS5nZXQnO1xuaW1wb3J0IG1hcF9zZXQgZnJvbSAnLldlYWtNYXAucHJvdG90eXBlLnNldCc7XG5pbXBvcnQgbWFwX2RlbCBmcm9tICcuV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy5BcnJheS5pc0FycmF5JztcbmltcG9ydCB1bmRlZmluZWQgZnJvbSAnLnVuZGVmaW5lZCc7XG5cbmNvbnN0IElOTElORVMgPSBuZXcgV2Vha01hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpO1xuY29uc3QgU0VDVElPTlMgPSBuZXcgV2Vha1NldCAgICAgICAgICAgICAgICAoKTtcblxuY29uc3QgZGVJbmxpbmUgPSAvKiNfX1BVUkVfXyovbWFwX2RlbC5iaW5kKElOTElORVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuY29uc3QgZGVTZWN0aW9uID0gLyojX19QVVJFX18qL3NldF9kZWwuYmluZChTRUNUSU9OUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcblxuZXhwb3J0IGNvbnN0IGlzSW5saW5lID0gLyojX19QVVJFX18qL21hcF9oYXMuYmluZChJTkxJTkVTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuZXhwb3J0IGNvbnN0IG9mSW5saW5lID0gLyojX19QVVJFX18qL21hcF9nZXQuYmluZChJTkxJTkVTKSAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiA7XG5leHBvcnQgY29uc3QgYmVJbmxpbmUgPSAvKiNfX1BVUkVfXyovbWFwX3NldC5iaW5kKElOTElORVMpICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIDtcbmV4cG9ydCBjb25zdCBpbmxpbmUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAgICwgbW9kZSAgICAgICAgICAgICAgICAsIGxvb3BpbmcgICAgICAgICApICAgID0+IHtcblx0aWYgKCBpc0FycmF5KHZhbHVlKSApIHtcblx0XHRpZiAoIGxvb3BpbmcgKSB7IG1vZGUgPSAzOyB9XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZiAoIG1vZGU9PT11bmRlZmluZWQgKSB7IG1vZGUgPSAzOyB9XG5cdFx0XHRlbHNlIGlmICggbW9kZSE9PTAgJiYgbW9kZSE9PTEgJiYgbW9kZSE9PTIgJiYgbW9kZSE9PTMgKSB7XG5cdFx0XHRcdHRocm93IHR5cGVvZiBtb2RlPT09J251bWJlcidcblx0XHRcdFx0XHQ/IFJhbmdlRXJyb3IoYGFycmF5IGlubGluZSBtb2RlIG11c3QgYmUgMCB8IDEgfCAyIHwgMywgbm90IGluY2x1ZGluZyAke21vZGV9YClcblx0XHRcdFx0XHQ6IFR5cGVFcnJvcihgYXJyYXkgaW5saW5lIG1vZGUgbXVzdCBiZSBcIm51bWJlclwiIHR5cGUsIG5vdCBpbmNsdWRpbmcgJHttb2RlPT09bnVsbCA/ICdcIm51bGxcIicgOiB0eXBlb2YgbW9kZX1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0YmVJbmxpbmUodmFsdWUsIG1vZGUpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGJlSW5saW5lKHZhbHVlLCB0cnVlKTtcblx0XHRkZVNlY3Rpb24odmFsdWUpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgY29uc3QgbXVsdGlsaW5lVGFibGUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgICApICAgID0+IHtcblx0YmVJbmxpbmUodmFsdWUsIGZhbHNlKTtcblx0ZGVTZWN0aW9uKHZhbHVlKTtcblx0cmV0dXJuIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCBtdWx0aWxpbmVBcnJheSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICAgKSAgICA9PiB7XG5cdGRlSW5saW5lKHZhbHVlKTtcblx0cmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzU2VjdGlvbiA9IC8qI19fUFVSRV9fKi9zZXRfaGFzLmJpbmQoU0VDVElPTlMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuZXhwb3J0IGNvbnN0IGJlU2VjdGlvbiA9IC8qI19fUFVSRV9fKi9zZXRfYWRkLmJpbmQoU0VDVElPTlMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcbmV4cG9ydCBjb25zdCBTZWN0aW9uID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhYmxlICAgKSAgICA9PiB7XG5cdGlmICggaXNBcnJheSh0YWJsZSkgKSB7IHRocm93IFR5cGVFcnJvcihgYXJyYXkgY2FuIG5vdCBiZSBzZWN0aW9uLCBtYXliZSB5b3Ugd2FudCB0byB1c2UgaXQgb24gdGhlIHRhYmxlcyBpbiBpdGApOyB9XG5cdGJlU2VjdGlvbih0YWJsZSk7XG5cdGRlSW5saW5lKHRhYmxlKTtcblx0cmV0dXJuIHRhYmxlO1xufTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsImltcG9ydCBXZWFrU2V0IGZyb20gJy5XZWFrU2V0JztcbmltcG9ydCBoYXMgZnJvbSAnLldlYWtTZXQucHJvdG90eXBlLmhhcyc7XG5pbXBvcnQgYWRkIGZyb20gJy5XZWFrU2V0LnByb3RvdHlwZS5hZGQnO1xuaW1wb3J0IGRlbCBmcm9tICcuV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlJztcbmltcG9ydCBOdWxsIGZyb20gJy5udWxsJztcblxuaW1wb3J0IHsgTnVsbCBhcyBvcmRlcmlmeV9OdWxsIH0gZnJvbSAnQGx0ZC9qLW9yZGVyaWZ5JztcblxuaW1wb3J0IHsgYmVJbmxpbmUsIGJlU2VjdGlvbiB9IGZyb20gJy4vbm9uLWF0b20nO1xuXG5leHBvcnQgeyBpc0lubGluZSB9IGZyb20gJy4vbm9uLWF0b20nO1xuZXhwb3J0IGNvbnN0IElOTElORSA9IHRydWU7XG5cbmNvbnN0IHRhYmxlcyA9IG5ldyBXZWFrU2V0ICAgICAgICgpO1xuY29uc3QgdGFibGVzX2FkZCA9IC8qI19fUFVSRV9fKi9hZGQuYmluZCh0YWJsZXMpO1xuZXhwb3J0IGNvbnN0IGlzVGFibGUgPSAvKiNfX1BVUkVfXyovaGFzLmJpbmQodGFibGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG5cbmNvbnN0IGltcGxpY2l0VGFibGVzID0gbmV3IFdlYWtTZXQgICAgICAgKCk7XG5jb25zdCBpbXBsaWNpdFRhYmxlc19hZGQgPSAvKiNfX1BVUkVfXyovYWRkLmJpbmQoaW1wbGljaXRUYWJsZXMpO1xuY29uc3QgaW1wbGljaXRUYWJsZXNfZGVsID0gLyojX19QVVJFX18qL2RlbC5iaW5kKGltcGxpY2l0VGFibGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuZXhwb3J0IGNvbnN0IGRpcmVjdGx5SWZOb3QgPSAodGFibGUgICAgICAgKSAgICAgICAgICA9PiB7XG5cdGlmICggaW1wbGljaXRUYWJsZXNfZGVsKHRhYmxlKSApIHtcblx0XHRiZVNlY3Rpb24odGFibGUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgY29uc3QgRElSRUNUTFkgPSB0cnVlO1xuZXhwb3J0IGNvbnN0IElNUExJQ0lUTFkgPSBmYWxzZTtcblxuY29uc3QgcGFpcnMgPSBuZXcgV2Vha1NldCAgICAgICAoKTtcbmNvbnN0IHBhaXJzX2FkZCA9IC8qI19fUFVSRV9fKi9hZGQuYmluZChwYWlycyk7XG5leHBvcnQgY29uc3QgZnJvbVBhaXIgPSAvKiNfX1BVUkVfXyovaGFzLmJpbmQocGFpcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG5leHBvcnQgY29uc3QgUEFJUiA9IHRydWU7XG5cbmV4cG9ydCBjb25zdCBQbGFpblRhYmxlID0gLyojX19QVVJFX18qL051bGwoY2xhc3MgVGFibGUgZXh0ZW5kcyBOdWxsICAgICAge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHRjb25zdHJ1Y3RvciAoaXNEaXJlY3QgICAgICAgICAgLCBpc0lubGluZSRmcm9tUGFpciAgICAgICAgICApIHtcblx0XHRzdXBlcigpO1xuXHRcdHRhYmxlc19hZGQodGhpcyk7XG5cdFx0aXNEaXJlY3Rcblx0XHRcdD8gaXNJbmxpbmUkZnJvbVBhaXIgPyBiZUlubGluZSh0aGlzLCB0cnVlKSA6IGJlU2VjdGlvbih0aGlzKVxuXHRcdFx0OiAoIGlzSW5saW5lJGZyb21QYWlyID8gcGFpcnNfYWRkIDogaW1wbGljaXRUYWJsZXNfYWRkICkodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgT3JkZXJlZFRhYmxlID0gLyojX19QVVJFX18qL051bGwoY2xhc3MgVGFibGUgZXh0ZW5kcyBvcmRlcmlmeV9OdWxsICAgICAge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHRjb25zdHJ1Y3RvciAoaXNEaXJlY3QgICAgICAgICAgLCBpc0lubGluZSRmcm9tUGFpciAgICAgICAgICApIHtcblx0XHRzdXBlcigpO1xuXHRcdHRhYmxlc19hZGQodGhpcyk7XG5cdFx0aXNEaXJlY3Rcblx0XHRcdD8gaXNJbmxpbmUkZnJvbVBhaXIgPyBiZUlubGluZSh0aGlzLCB0cnVlKSA6IGJlU2VjdGlvbih0aGlzKVxuXHRcdFx0OiAoIGlzSW5saW5lJGZyb21QYWlyID8gcGFpcnNfYWRkIDogaW1wbGljaXRUYWJsZXNfYWRkICkodGhpcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcbiIsImltcG9ydCBFcnJvciBmcm9tICcuRXJyb3InO1xuaW1wb3J0IFR5cGVFcnJvciBmcm9tICcuVHlwZUVycm9yJztcbmltcG9ydCBTeW50YXhFcnJvciBmcm9tICcuU3ludGF4RXJyb3InO1xuXG4vL2ltcG9ydCAqIGFzIG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcblxuY29uc3QgTk9ORSAgICAgICAgICAgICAgICAgICAgPSBbXTtcbmxldCBzb3VyY2VQYXRoICAgICAgICAgPSAnJztcbmxldCBzb3VyY2VMaW5lcyAgICAgICAgICAgICAgICAgICAgPSBOT05FO1xubGV0IGxhc3RMaW5lSW5kZXggICAgICAgICA9IC0xO1xuZXhwb3J0IGxldCBsaW5lSW5kZXggICAgICAgICA9IC0xO1xuXG5leHBvcnQgY29uc3QgdGhyb3dzID0gKGVycm9yICAgICAgICkgICAgICAgID0+IHtcblx0Ly9pZiAoIHNvdXJjZUxpbmVzIT09Tk9ORSApIHsgZG9uZSgpOyBvcHRpb25zLmNsZWFyKCk7IH1cblx0dGhyb3cgZXJyb3I7XG59O1xuXG5jb25zdCBFT0wgPSAvXFxyP1xcbi87XG5leHBvcnQgY29uc3QgdG9kbyA9IChzb3VyY2UgICAgICAgICwgcGF0aCAgICAgICAgKSAgICAgICA9PiB7XG5cdGlmICggdHlwZW9mIHBhdGghPT0nc3RyaW5nJyApIHsgdGhyb3cgVHlwZUVycm9yKGBUT01MLnBhcnNlKHsgcGF0aCB9KWApOyB9XG5cdHNvdXJjZVBhdGggPSBwYXRoO1xuXHRzb3VyY2VMaW5lcyA9IHNvdXJjZS5zcGxpdChFT0wpO1xuXHRsYXN0TGluZUluZGV4ID0gc291cmNlTGluZXMubGVuZ3RoIC0gMTtcblx0bGluZUluZGV4ID0gLTE7XG59O1xuXG5leHBvcnQgY29uc3QgbmV4dCA9ICgpICAgICAgICAgPT4gc291cmNlTGluZXNbKytsaW5lSW5kZXhdIDtcblxuZXhwb3J0IGNvbnN0IHJlc3QgPSAoKSAgICAgICAgICA9PiBsaW5lSW5kZXghPT1sYXN0TGluZUluZGV4O1xuXG5leHBvcnQgY2xhc3MgbWFyayB7XG5cdCAgICAgICAgICAgICAgICAgbGluZUluZGV4ID0gbGluZUluZGV4O1xuXHQgICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuXHQgICAgICAgICAgICAgICAgIHJlc3RDb2x1bW4gICAgICAgIDtcblx0Y29uc3RydWN0b3IgKHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCByZXN0Q29sdW1uICAgICAgICApIHtcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHRcdHRoaXMucmVzdENvbHVtbiA9IHJlc3RDb2x1bW47XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0bXVzdCAoICAgICAgICAgICkgICAgICAgICB7XG5cdFx0bGluZUluZGV4PT09bGFzdExpbmVJbmRleCAmJiB0aHJvd3MoU3ludGF4RXJyb3IoYCR7dGhpcy50eXBlfSBpcyBub3QgY2xvc2UgdW50aWwgdGhlIGVuZCBvZiB0aGUgZmlsZWAgKyB3aGVyZSgnLCB3aGljaCBzdGFydGVkIGZyb20gJywgdGhpcy5saW5lSW5kZXgsIHNvdXJjZUxpbmVzW3RoaXMubGluZUluZGV4XSAubGVuZ3RoIC0gdGhpcy5yZXN0Q29sdW1uICsgMSkpKTtcblx0XHRyZXR1cm4gc291cmNlTGluZXNbKytsaW5lSW5kZXhdIDtcblx0fVxuXHRub3dyYXAgKCAgICAgICAgICAgIGFyZ3NNb2RlICAgICAgICAgICAgICAgICApICAgICAgICB7XG5cdFx0dGhyb3cgdGhyb3dzKEVycm9yKGBUT01MLnBhcnNlKCR7YXJnc01vZGUgPyBgJHthcmdzTW9kZX1tdWx0aWxpbmVTdHJpbmdKb2luZXJgIDogYCx7IGpvaW5lciB9YH0pIG11c3QgYmUgcGFzc2VkLCB3aGlsZSB0aGUgc291cmNlIGluY2x1ZGluZyBtdWx0aS1saW5lIHN0cmluZ2AgKyB3aGVyZSgnLCB3aGljaCBzdGFydGVkIGZyb20gJywgdGhpcy5saW5lSW5kZXgsIHNvdXJjZUxpbmVzW3RoaXMubGluZUluZGV4XSAubGVuZ3RoIC0gdGhpcy5yZXN0Q29sdW1uICsgMSkpKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IHdoZXJlID0gKHByZSAgICAgICAgLCByb3dJbmRleCAgICAgICAgID0gbGluZUluZGV4LCBjb2x1bW5OdW1iZXIgICAgICAgICA9IDApICAgICAgICAgPT4gc291cmNlTGluZXM9PT1OT05FID8gJycgOlxuXHRzb3VyY2VQYXRoXG5cdFx0PyBgXFxuICAgIGF0ICgke3NvdXJjZVBhdGh9OiR7cm93SW5kZXggKyAxfToke2NvbHVtbk51bWJlcn0pYFxuXHRcdDogYCR7cHJlfWxpbmUgJHtyb3dJbmRleCArIDF9OiAke3NvdXJjZUxpbmVzW3Jvd0luZGV4XX1gO1xuXG5leHBvcnQgY29uc3QgZG9uZSA9ICgpICAgICAgID0+IHtcblx0c291cmNlUGF0aCA9ICcnO1xuXHRzb3VyY2VMaW5lcyA9IE5PTkU7XG59O1xuIiwiaW1wb3J0IFN5bnRheEVycm9yIGZyb20gJy5TeW50YXhFcnJvcic7XG5cbmltcG9ydCB7IG5ld1JlZ0V4cCwgdGhlUmVnRXhwIH0gZnJvbSAnQGx0ZC9qLXJlZ2V4cCc7XG5cbmltcG9ydCAqIGFzIGl0ZXJhdG9yIGZyb20gJy4vaXRlcmF0b3InO1xuXG4vKiBuZXN0ZWQgKHJlYWRhYmxlKSAqL1xuXG5jb25zdCBXaGl0ZXNwYWNlID0gL1sgXFx0XS87XG5cbmV4cG9ydCBjb25zdCBQUkVfV0hJVEVTUEFDRSA9IC8qI19fUFVSRV9fKi9uZXdSZWdFeHBgXG5cdF4ke1doaXRlc3BhY2V9K2AudmFsdWVPZigpO1xuXG5leHBvcnQgY29uc3QgeyBleGVjOiBWQUxVRV9SRVNUX2V4ZWMgfSA9IC8qI19fUFVSRV9fKi9uZXdSZWdFeHAucyAgICAgICBgXG5cdF5cblx0KFxuXHRcdCg/OlxcZFxcZFxcZFxcZC1cXGRcXGQtXFxkXFxkIFxcZCk/XG5cdFx0W1xcd1xcLSsuOl0rXG5cdClcblx0JHtXaGl0ZXNwYWNlfSpcblx0KC4qKVxuXHQkYC52YWx1ZU9mKCk7XG5cbmV4cG9ydCBjb25zdCB7IGV4ZWM6IExJVEVSQUxfU1RSSU5HX2V4ZWMgfSA9IC8qI19fUFVSRV9fKi9uZXdSZWdFeHAucyAgICAgICBgXG5cdF5cblx0JyhbXiddKiknXG5cdCR7V2hpdGVzcGFjZX0qXG5cdCguKilgLnZhbHVlT2YoKTtcblxuY29uc3QgeyBleGVjOiBNVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HXzBfMV8yIH0gPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwLnMgICAgICAgICAgIGBcblx0XlxuXHQoLio/KVxuXHQnJycoJ3swLDJ9KVxuXHQke1doaXRlc3BhY2V9KlxuXHQoLiopYC52YWx1ZU9mKCk7XG5jb25zdCB7IGV4ZWM6IE1VTFRJX0xJTkVfTElURVJBTF9TVFJJTkdfMCB9ID0gLyojX19QVVJFX18qL25ld1JlZ0V4cC5zICAgICAgICAgICBgXG5cdF5cblx0KC4qPylcblx0JycnKClcblx0JHtXaGl0ZXNwYWNlfSpcblx0KC4qKWAudmFsdWVPZigpO1xuZXhwb3J0XG5sZXQgX19NVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HX2V4ZWMgPSBNVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HXzA7XG5cbmV4cG9ydCBjb25zdCBTWU1fV0hJVEVTUEFDRSA9IC8qI19fUFVSRV9fKi9uZXdSZWdFeHAuc2Bcblx0XlxuXHQuXG5cdCR7V2hpdGVzcGFjZX0qYC52YWx1ZU9mKCk7XG5cblxuZXhwb3J0IGNvbnN0IFRhZyA9IC9bXlxceDAwLVxceDFGXCIjJygpPD5bXFxcXFxcXWB7fVxceDdGXSsvO1xuXG5jb25zdCB7IGV4ZWM6IEtFWV9WQUxVRV9QQUlSX2V4ZWMgfSA9IC8qI19fUFVSRV9fKi9uZXdSZWdFeHAucyAgIGBcblx0XlxuXHQke1doaXRlc3BhY2V9KlxuXHQ9XG5cdCR7V2hpdGVzcGFjZX0qXG5cdCg/OlxuXHRcdDwoJHtUYWd9KT5cblx0XHQke1doaXRlc3BhY2V9KlxuXHQpP1xuXHQoLiopXG5cdCRgLnZhbHVlT2YoKTtcblxuZXhwb3J0IGNvbnN0IHsgZXhlYzogX1ZBTFVFX1BBSVJfZXhlYyB9ID0gLyojX19QVVJFX18qL25ld1JlZ0V4cC5zICAgICAgIGBcblx0XlxuXHQ8KCR7VGFnfSk+XG5cdCR7V2hpdGVzcGFjZX0qXG5cdCguKilcblx0JGAudmFsdWVPZigpO1xuXG5jb25zdCB7IGV4ZWM6IFRBR19SRVNUX2V4ZWMgfSA9IC8qI19fUFVSRV9fKi9uZXdSZWdFeHAucyAgICAgICBgXG5cdF5cblx0PCgke1RhZ30pPlxuXHQke1doaXRlc3BhY2V9KlxuXHQoLiopXG5cdCRgLnZhbHVlT2YoKTtcblxuLyogb3B0aW1pemVkIChhdm9pZCBvdmVyZmxvdyBvciBsb3N0KSAqL1xuXG5jb25zdCBNVUxUSV9MSU5FX0JBU0lDX1NUUklORyA9IHRoZVJlZ0V4cCgvW15cXFxcXCJdK3xcXFxcLj98XCIoPyFcIlwiKVwiPy9zeSk7XG5leHBvcnQgY29uc3QgTVVMVElfTElORV9CQVNJQ19TVFJJTkdfZXhlY18wX2xlbmd0aCA9IChfICAgICAgICApICAgICAgICAgPT4ge1xuXHRsZXQgbGFzdEluZGV4ICAgICAgICAgPSAvKk1VTFRJX0xJTkVfQkFTSUNfU1RSSU5HLmxhc3RJbmRleCA9ICovMDtcblx0d2hpbGUgKCBNVUxUSV9MSU5FX0JBU0lDX1NUUklORy50ZXN0KF8pICkgeyBsYXN0SW5kZXggPSBNVUxUSV9MSU5FX0JBU0lDX1NUUklORy5sYXN0SW5kZXg7IH1cblx0cmV0dXJuIGxhc3RJbmRleDtcbn07XG5cbmNvbnN0IEVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl9UQUJfX19fX18gPSAvW15cXFxcXFx4MDAtXFx4MDhcXHgwQi1cXHgxRlxceDdGXSt8XFxcXCg/OltidG5mclwiXFxcXF18W1xcdCBdKlxcbltcXHRcXG4gXSp8dVtcXGRBLUZhLWZdezR9fFVbXFxkQS1GYS1mXXs4fSkvZztcbmNvbnN0IEVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl9fX19fX19fX18gPSAvW15cXFxcXFx4MDAtXFx4MDlcXHgwQi1cXHgxRlxceDdGXSt8XFxcXCg/OltidG5mclwiXFxcXF18W1xcdCBdKlxcbltcXHRcXG4gXSp8dVtcXGRBLUZhLWZdezR9fFVbXFxkQS1GYS1mXXs4fSkvZzsvLy8gVGFiXG5jb25zdCBFU0NBUEVEX0VYQ0xVREVfQ09OVFJPTF9DSEFSQUNURVJfREVMX19fX19fID0gL1teXFxcXFxceDAwLVxceDA5XFx4MEItXFx4MUZdK3xcXFxcKD86W2J0bmZyXCJcXFxcXXxbXFx0IF0qXFxuW1xcdFxcbiBdKnx1W1xcZEEtRmEtZl17NH18VVtcXGRBLUZhLWZdezh9KS9nOy8vLyBUYWIgXFw8d3M+bmV3bGluZVxuY29uc3QgRVNDQVBFRF9FWENMVURFX0NPTlRST0xfQ0hBUkFDVEVSX0RFTF9TTEFTSCA9IC9bXlxcXFxcXHgwMC1cXHgwOVxceDBCLVxceDFGXSt8XFxcXCg/OltidG5mclwiXFxcXC9dfFtcXHQgXSpcXG5bXFx0XFxuIF0qfHVbXFxkQS1GYS1mXXs0fXxVW1xcZEEtRmEtZl17OH0pL2c7Ly8vIG5vdCBcXDx3cz5uZXdsaW5lXG5sZXQgX19FU0NBUEVEX0VYQ0xVREVfQ09OVFJPTF9DSEFSQUNURVIgPSBFU0NBUEVEX0VYQ0xVREVfQ09OVFJPTF9DSEFSQUNURVJfVEFCX19fX19fO1xuZXhwb3J0IGNvbnN0IEVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl90ZXN0ID0gKF8gICAgICAgICkgICAgICAgICAgPT4gIV8ucmVwbGFjZShfX0VTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUiwgJycpOy8vLyBvcD9cblxuY29uc3QgQkFTSUNfU1RSSU5HX1RBQl9fX19fXyA9IHRoZVJlZ0V4cCgvW15cXFxcXCJcXHgwMC1cXHgwOFxceDBCLVxceDFGXFx4N0ZdK3xcXFxcKD86W2J0bmZyXCJcXFxcXXx1W1xcZEEtRmEtZl17NH18VVtcXGRBLUZhLWZdezh9KS95KTtcbmNvbnN0IEJBU0lDX1NUUklOR19fX19fX19fX18gPSB0aGVSZWdFeHAoL1teXFxcXFwiXFx4MDAtXFx4MDhcXHgwQi1cXHgxRlxceDdGXSt8XFxcXCg/OltidG5mclwiXFxcXF18dVtcXGRBLUZhLWZdezR9fFVbXFxkQS1GYS1mXXs4fSkveSk7Ly8vIFRhYlxuY29uc3QgQkFTSUNfU1RSSU5HX0RFTF9fX19fXyA9IHRoZVJlZ0V4cCgvW15cXFxcXCJcXHgwMC1cXHgwOFxceDBCLVxceDFGXSt8XFxcXCg/OltidG5mclwiXFxcXF18dVtcXGRBLUZhLWZdezR9fFVbXFxkQS1GYS1mXXs4fSkveSk7Ly8vIFRhYlxuY29uc3QgQkFTSUNfU1RSSU5HX0RFTF9TTEFTSCA9IHRoZVJlZ0V4cCgvW15cXFxcXCJcXHgwMC1cXHgwOFxceDBCLVxceDFGXSt8XFxcXCg/OltidG5mclwiXFxcXC9dfHVbXFxkQS1GYS1mXXs0fXxVW1xcZEEtRmEtZl17OH0pL3kpOy8vLyBUYWJcbmxldCBfX0JBU0lDX1NUUklORyA9IEJBU0lDX1NUUklOR19ERUxfU0xBU0g7XG5leHBvcnQgY29uc3QgQkFTSUNfU1RSSU5HX2V4ZWNfMV9lbmRJbmRleCA9IChsaW5lICAgICAgICApICAgICAgICAgPT4ge1xuXHRsZXQgbGFzdEluZGV4ICAgICAgICAgPSBfX0JBU0lDX1NUUklORy5sYXN0SW5kZXggPSAxO1xuXHR3aGlsZSAoIF9fQkFTSUNfU1RSSU5HLnRlc3QobGluZSkgKSB7IGxhc3RJbmRleCA9IF9fQkFTSUNfU1RSSU5HLmxhc3RJbmRleDsgfVxuXHRsYXN0SW5kZXghPT1saW5lLmxlbmd0aCAmJiBsaW5lW2xhc3RJbmRleF09PT0nXCInIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgQmFkIGJhc2ljIHN0cmluZ2AgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7XG5cdHJldHVybiBsYXN0SW5kZXg7XG59O1xuXG5leHBvcnRcbmNvbnN0IHsgdGVzdDogSVNfRE9UX0tFWSB9ID0gdGhlUmVnRXhwKC9eWyBcXHRdKlxcLi8pO1xuZXhwb3J0XG5jb25zdCBET1RfS0VZID0gL15bIFxcdF0qXFwuWyBcXHRdKi87XG5jb25zdCB7IGV4ZWM6IEJBUkVfS0VZX1NUUklDVCB9ID0gdGhlUmVnRXhwKC9eW1xcdy1dKy8pO1xuY29uc3QgeyBleGVjOiBCQVJFX0tFWV9GUkVFIH0gPSB0aGVSZWdFeHAoL15bXiBcXHQjPVtcXF0nXCIuXSsoPzpbIFxcdF0rW14gXFx0Iz1bXFxdJ1wiLl0rKSovKTtcbmV4cG9ydFxubGV0IF9fQkFSRV9LRVlfZXhlYyA9IEJBUkVfS0VZX0ZSRUU7XG5jb25zdCB7IGV4ZWM6IExJVEVSQUxfS0VZX19fXyB9ID0gdGhlUmVnRXhwKC9eJ1teJ1xceDAwLVxceDA4XFx4MEItXFx4MUZcXHg3Rl0qJy8pO1xuY29uc3QgeyBleGVjOiBMSVRFUkFMX0tFWV9ERUwgfSA9IHRoZVJlZ0V4cCgvXidbXidcXHgwMC1cXHgwOFxceDBCLVxceDFGXSonLyk7XG5leHBvcnRcbmxldCBfX0xJVEVSQUxfS0VZX2V4ZWMgPSBMSVRFUkFMX0tFWV9ERUw7XG5sZXQgc3VwcG9ydEFycmF5T2ZUYWJsZXMgPSB0cnVlO1xuXG5leHBvcnQgY29uc3QgVEFCTEVfREVGSU5JVElPTl9leGVjX2dyb3VwcyA9IChsaW5lUmVzdCAgICAgICAgLCBwYXJzZUtleXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IHtcblx0Y29uc3QgYXNBcnJheUl0ZW0gICAgICAgICAgPSBsaW5lUmVzdFsxXT09PSdbJztcblx0aWYgKCBhc0FycmF5SXRlbSApIHtcblx0XHRzdXBwb3J0QXJyYXlPZlRhYmxlcyB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEFycmF5IG9mIFRhYmxlcyBpcyBub3QgYWxsb3dlZCBiZWZvcmUgVE9NTCB2MC4yYCArIGl0ZXJhdG9yLndoZXJlKCcsIHdoaWNoIGF0ICcpKSk7XG5cdFx0bGluZVJlc3QgPSBsaW5lUmVzdC5zbGljZSgyKTtcblx0fVxuXHRlbHNlIHsgbGluZVJlc3QgPSBsaW5lUmVzdC5zbGljZSgxKTsgfVxuXHRsaW5lUmVzdCA9IGxpbmVSZXN0LnJlcGxhY2UoUFJFX1dISVRFU1BBQ0UsICcnKTtcblx0Y29uc3QgeyBsZWFkaW5nS2V5cywgZmluYWxLZXkgfSA9IHsgbGluZVJlc3QgfSA9IHBhcnNlS2V5cyhsaW5lUmVzdCk7XG5cdGxpbmVSZXN0ID0gbGluZVJlc3QucmVwbGFjZShQUkVfV0hJVEVTUEFDRSwgJycpO1xuXHRsaW5lUmVzdCAmJiBsaW5lUmVzdFswXT09PSddJyB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYFRhYmxlIGhlYWRlciBpcyBub3QgY2xvc2VkYCArIGl0ZXJhdG9yLndoZXJlKCcsIHdoaWNoIGlzIGZvdW5kIGF0ICcpKSk7XG5cdCggbGluZVJlc3QubGVuZ3RoPjEgPyBsaW5lUmVzdFsxXT09PSddJz09PWFzQXJyYXlJdGVtIDogIWFzQXJyYXlJdGVtICkgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBTcXVhcmUgYnJhY2tldHMgb2YgVGFibGUgZGVmaW5pdGlvbiBzdGF0ZW1lbnQgbm90IG1hdGNoYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0bGluZVJlc3QgPSBsaW5lUmVzdC5zbGljZShhc0FycmF5SXRlbSA/IDIgOiAxKS5yZXBsYWNlKFBSRV9XSElURVNQQUNFLCAnJyk7XG5cdGxldCB0YWcgICAgICAgIDtcblx0aWYgKCBsaW5lUmVzdCAmJiBsaW5lUmVzdFswXT09PSc8JyApIHsgKCB7IDE6IHRhZywgMjogbGluZVJlc3QgfSA9IFRBR19SRVNUX2V4ZWMobGluZVJlc3QpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgQmFkIHRhZ2AgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSkgKTsgfVxuXHRlbHNlIHsgdGFnID0gJyc7IH1cblx0cmV0dXJuIHsgbGVhZGluZ0tleXMsIGZpbmFsS2V5LCBhc0FycmF5SXRlbSwgdGFnLCBsaW5lUmVzdCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IEtFWV9WQUxVRV9QQUlSX2V4ZWNfZ3JvdXBzID0gKHsgbGVhZGluZ0tleXMsIGZpbmFsS2V5LCBsaW5lUmVzdCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4ge1xuXHRjb25zdCB7IDE6IHRhZyA9ICcnIH0gPSB7IDI6IGxpbmVSZXN0IH0gPSBLRVlfVkFMVUVfUEFJUl9leGVjKGxpbmVSZXN0KSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEtleXMgbXVzdCBlcXVhbCBzb21ldGhpbmdgICsgaXRlcmF0b3Iud2hlcmUoJywgYnV0IG1pc3NpbmcgYXQgJykpKTtcblx0dGFnIHx8IGxpbmVSZXN0ICYmIGxpbmVSZXN0WzBdIT09JyMnIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgVmFsdWUgY2FuIG5vdCBiZSBtaXNzaW5nIGFmdGVyIGV1cWFsIHNpZ25gICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggaXMgZm91bmQgYXQgJykpKTtcblx0cmV0dXJuIHsgbGVhZGluZ0tleXMsIGZpbmFsS2V5LCB0YWcsIGxpbmVSZXN0IH07XG59O1xuXG5jb25zdCB7IHRlc3Q6IENPTlRST0xfQ0hBUkFDVEVSX0VYQ0xVREVfVEFCX19fXyB9ID0gdGhlUmVnRXhwKC9bXFx4MDAtXFx4MDhcXHgwQi1cXHgxRlxceDdGXS8pO1xuY29uc3QgeyB0ZXN0OiBDT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX1RBQl9ERUwgfSA9IHRoZVJlZ0V4cCgvW1xceDAwLVxceDA4XFx4MEItXFx4MUZdLyk7XG5leHBvcnRcbmxldCBfX0NPTlRST0xfQ0hBUkFDVEVSX0VYQ0xVREVfdGVzdCA9IENPTlRST0xfQ0hBUkFDVEVSX0VYQ0xVREVfVEFCX19fXztcblxuZXhwb3J0IGNvbnN0IHN3aXRjaFJlZ0V4cCA9IChzcGVjaWZpY2F0aW9uVmVyc2lvbiAgICAgICAgKSAgICAgICA9PiB7XG5cdHN3aXRjaCAoIHNwZWNpZmljYXRpb25WZXJzaW9uICkge1xuXHRcdGNhc2UgMS4wOlxuXHRcdFx0X19NVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HX2V4ZWMgPSBNVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HXzBfMV8yO1xuXHRcdFx0X19MSVRFUkFMX0tFWV9leGVjID0gTElURVJBTF9LRVlfX19fO1xuXHRcdFx0X19DT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX3Rlc3QgPSBDT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX1RBQl9fX187XG5cdFx0XHRfX0VTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUiA9IEVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl9UQUJfX19fX187XG5cdFx0XHRfX0JBU0lDX1NUUklORyA9IEJBU0lDX1NUUklOR19UQUJfX19fX187XG5cdFx0XHRfX0JBUkVfS0VZX2V4ZWMgPSBCQVJFX0tFWV9TVFJJQ1Q7XG5cdFx0XHRzdXBwb3J0QXJyYXlPZlRhYmxlcyA9IHRydWU7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDAuNTpcblx0XHRcdF9fTVVMVElfTElORV9MSVRFUkFMX1NUUklOR19leGVjID0gTVVMVElfTElORV9MSVRFUkFMX1NUUklOR18wO1xuXHRcdFx0X19MSVRFUkFMX0tFWV9leGVjID0gTElURVJBTF9LRVlfX19fO1xuXHRcdFx0X19DT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX3Rlc3QgPSBDT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX1RBQl9fX187XG5cdFx0XHRfX0VTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUiA9IEVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl9fX19fX19fX187XG5cdFx0XHRfX0JBU0lDX1NUUklORyA9IEJBU0lDX1NUUklOR19fX19fX19fX187XG5cdFx0XHRfX0JBUkVfS0VZX2V4ZWMgPSBCQVJFX0tFWV9TVFJJQ1Q7XG5cdFx0XHRzdXBwb3J0QXJyYXlPZlRhYmxlcyA9IHRydWU7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDAuNDpcblx0XHRcdF9fTVVMVElfTElORV9MSVRFUkFMX1NUUklOR19leGVjID0gTVVMVElfTElORV9MSVRFUkFMX1NUUklOR18wO1xuXHRcdFx0X19MSVRFUkFMX0tFWV9leGVjID0gTElURVJBTF9LRVlfREVMO1xuXHRcdFx0X19DT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX3Rlc3QgPSBDT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX1RBQl9ERUw7XG5cdFx0XHRfX0VTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUiA9IEVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl9ERUxfX19fX187XG5cdFx0XHRfX0JBU0lDX1NUUklORyA9IEJBU0lDX1NUUklOR19ERUxfX19fX187XG5cdFx0XHRfX0JBUkVfS0VZX2V4ZWMgPSBCQVJFX0tFWV9TVFJJQ1Q7XG5cdFx0XHRzdXBwb3J0QXJyYXlPZlRhYmxlcyA9IHRydWU7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0X19NVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HX2V4ZWMgPSBNVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HXzA7XG5cdFx0XHRfX0xJVEVSQUxfS0VZX2V4ZWMgPSBMSVRFUkFMX0tFWV9ERUw7XG5cdFx0XHRfX0NPTlRST0xfQ0hBUkFDVEVSX0VYQ0xVREVfdGVzdCA9IENPTlRST0xfQ0hBUkFDVEVSX0VYQ0xVREVfVEFCX0RFTDtcblx0XHRcdF9fRVNDQVBFRF9FWENMVURFX0NPTlRST0xfQ0hBUkFDVEVSID0gRVNDQVBFRF9FWENMVURFX0NPTlRST0xfQ0hBUkFDVEVSX0RFTF9TTEFTSDtcblx0XHRcdF9fQkFTSUNfU1RSSU5HID0gQkFTSUNfU1RSSU5HX0RFTF9TTEFTSDtcblx0XHRcdF9fQkFSRV9LRVlfZXhlYyA9IEJBUkVfS0VZX0ZSRUU7XG5cdFx0XHRzdXBwb3J0QXJyYXlPZlRhYmxlcyA9IGZhbHNlO1xuXHR9XG59O1xuXG5jb25zdCBOVU0gPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwYFxuXHQoPzpcblx0XHQwXG5cdFx0KD86XG5cdFx0XHRiWzAxXVtfMDFdKlxuXHRcdHxcblx0XHRcdG9bMC03XVtfMC03XSpcblx0XHR8XG5cdFx0XHR4W1xcZEEtRmEtZl1bX1xcZEEtRmEtZl0qXG5cdFx0fFxuXHRcdFx0KD86XFwuXFxkW19cXGRdKik/KD86W0VlXS0/XFxkW19cXGRdKik/XG5cdFx0KVxuXHR8XG5cdFx0WzEtOV1bX1xcZF0qXG5cdFx0KD86XFwuXFxkW19cXGRdKik/KD86W0VlXS0/XFxkW19cXGRdKik/XG5cdHxcblx0XHRpbmZcblx0fFxuXHRcdG5hblxuXHQpXG5gLnZhbHVlT2YoKTtcbmNvbnN0IHsgdGVzdDogSVNfQU1BWklORyB9ID0gLyojX19QVVJFX18qL25ld1JlZ0V4cGBcblx0Xig/OlxuXHRcdC0/JHtOVU19XG5cdFx0KD86LSR7TlVNfSkqXG5cdHxcblx0XHR0cnVlXG5cdHxcblx0XHRmYWxzZVxuXHQpJFxuYC52YWx1ZU9mKCk7XG5jb25zdCB7IHRlc3Q6IEJBRF9EWE9CIH0gPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwYF8oPyFbXFxkQS1GYS1mXSlgLnZhbHVlT2YoKTtcbmV4cG9ydCBjb25zdCBpc0FtYXppbmcgPSAoa2V5cyAgICAgICAgKSAgICAgICAgICA9PiBJU19BTUFaSU5HKGtleXMpICYmICFCQURfRFhPQihrZXlzKTtcbiIsImltcG9ydCBTeW50YXhFcnJvciBmcm9tICcuU3ludGF4RXJyb3InO1xuaW1wb3J0IFJhbmdlRXJyb3IgZnJvbSAnLlJhbmdlRXJyb3InO1xuaW1wb3J0IFR5cGVFcnJvciBmcm9tICcuVHlwZUVycm9yJztcbmltcG9ydCBFcnJvciBmcm9tICcuRXJyb3InO1xuaW1wb3J0IEJpZ0ludCBmcm9tICcuQmlnSW50Pyc7XG5pbXBvcnQgUmVnRXhwIGZyb20gJy5SZWdFeHAnO1xuaW1wb3J0IFdlYWtNYXAgZnJvbSAnLldlYWtNYXAnO1xuaW1wb3J0IGdldCBmcm9tICcuV2Vha01hcC5wcm90b3R5cGUuZ2V0JztcbmltcG9ydCBzZXQgZnJvbSAnLldlYWtNYXAucHJvdG90eXBlLnNldCc7XG5pbXBvcnQgY3JlYXRlIGZyb20gJy5PYmplY3QuY3JlYXRlJztcbmltcG9ydCBpc1NhZmVJbnRlZ2VyIGZyb20gJy5OdW1iZXIuaXNTYWZlSW50ZWdlcic7XG5pbXBvcnQgZ2V0T3duUHJvcGVydHlOYW1lcyBmcm9tICcuT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMnO1xuaW1wb3J0IGZyZWV6ZSBmcm9tICcuT2JqZWN0LmZyZWV6ZSc7XG5pbXBvcnQgaXNQcm90b3R5cGVPZiBmcm9tICcuT2JqZWN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mJztcbmltcG9ydCB1bmRlZmluZWQgZnJvbSAnLnVuZGVmaW5lZCc7XG5pbXBvcnQgTlVMTCBmcm9tICcubnVsbC5wcm90b3R5cGUnO1xuXG5pbXBvcnQgeyBncm91cGlmeSB9IGZyb20gJ0BsdGQvai1yZWdleHAnO1xuXG5pbXBvcnQgeyBQbGFpblRhYmxlLCBPcmRlcmVkVGFibGUgfSBmcm9tICcuL3R5cGVzL1RhYmxlJztcbmltcG9ydCAqIGFzIGl0ZXJhdG9yIGZyb20gJy4vaXRlcmF0b3InO1xuaW1wb3J0ICogYXMgcmVnZXhwcyBmcm9tICcuL3JlZ2V4cHMnO1xuXG5leHBvcnQgbGV0IG11c3RTY2FsYXIgICAgICAgICAgPSB0cnVlO1xuXG5leHBvcnQgbGV0IEFSR1NfTU9ERSAgICAgICAgICAgICAgICAgID0gJyc7XG5cbi8qIG9wdGlvbnMgKi9cblxuZXhwb3J0IGxldCB1c2VXaGF0VG9Kb2luTXVsdGlsaW5lU3RyaW5nICAgICAgICAgICAgICAgID0gbnVsbDtcbmV4cG9ydCBsZXQgdXNpbmdCaWdJbnQgICAgICAgICAgICAgICAgID0gdHJ1ZTtcbmV4cG9ydCBsZXQgSW50ZWdlck1pbk51bWJlciAgICAgICAgID0gMDtcbmV4cG9ydCBsZXQgSW50ZWdlck1heE51bWJlciAgICAgICAgID0gMDtcblxuICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgXG4gIFxuY29uc3QgQU5ZICAgICAgID0ge1xuXHR0ZXN0OiAoKSA9PiB0cnVlLFxufTtcbiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcbmV4cG9ydCBjb25zdCBLZXlzID0gY2xhc3MgS2V5c1JlZ0V4cCBleHRlbmRzIFJlZ0V4cCAgICAgICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHRjb25zdHJ1Y3RvciAoa2V5cyAgICAgICAgICAgICAgICAgICApIHtcblx0XHRzdXBlcihgXiR7Z3JvdXBpZnkoa2V5cyl9JGApO1xuXHRcdGxldCBtYXhMZW5ndGggPSAtMTtcblx0XHRmb3IgKCBsZXQgaW5kZXggPSBrZXlzLmxlbmd0aDsgaW5kZXg7ICkge1xuXHRcdFx0Y29uc3QgeyBsZW5ndGggfSA9IGtleXNbLS1pbmRleF0gO1xuXHRcdFx0aWYgKCBsZW5ndGg+bWF4TGVuZ3RoICkgeyBtYXhMZW5ndGggPSBsZW5ndGg7IH1cblx0XHR9XG5cdFx0dGhpcy5sYXN0SW5kZXggPSBtYXhMZW5ndGgrMTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQgICAgICAgICB0ZXN0ICggICAgICAgICAgICAgICAgICBrZXkgICAgICAgICkgICAgICAgICAge1xuXHRcdHJldHVybiBrZXkubGVuZ3RoPHRoaXMubGFzdEluZGV4ICYmIHN1cGVyLnRlc3Qoa2V5KTtcblx0fVxufTtcbmNvbnN0IGlzS2V5cyA9IC8qI19fUFVSRV9fKi9pc1Byb3RvdHlwZU9mLmJpbmQoLyojX19QVVJFX18qL2ZyZWV6ZShLZXlzLnByb3RvdHlwZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG5leHBvcnQgbGV0IEtFWVMgICAgICAgPSBBTlk7XG5leHBvcnQgbGV0IHByZXNlcnZlTGl0ZXJhbCAgICAgICAgIDtcbmV4cG9ydCBsZXQgemVyb0RhdGV0aW1lICAgICAgICAgO1xuZXhwb3J0IGxldCBpbmxpbmVUYWJsZSAgICAgICAgIDtcbmV4cG9ydCBsZXQgbW9yZURhdGV0aW1lICAgICAgICAgO1xuZXhwb3J0IGxldCBkaXNhbGxvd0VtcHR5S2V5ICAgICAgICAgO1xuLy9leHBvcnQgY29uc3QgeG9iIDpib29sZWFuID0gdHJ1ZTtcbmV4cG9ydCBsZXQgc0Vycm9yICAgICAgICAgO1xuZXhwb3J0IGxldCBzRmxvYXQgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgbGV0IFRhYmxlICAgICAgICAgICAgICAgICAgO1xuZXhwb3J0IGxldCBhbGxvd0xvbmdlciAgICAgICAgIDtcbmV4cG9ydCBsZXQgZW5hYmxlTnVsbCAgICAgICAgIDtcbmV4cG9ydCBsZXQgYWxsb3dJbmxpbmVUYWJsZU11bHRpbGluZUFuZFRyYWlsaW5nQ29tbWFFdmVuTm9Db21tYSAgICAgICAgIDtcbmV4cG9ydCBsZXQgcHJlc2VydmVDb21tZW50ICAgICAgICAgO1xuZXhwb3J0IGxldCBkaXNhYmxlRGlnaXQgICAgICAgICA7XG5jb25zdCBhcnJheVR5cGVzID0gbmV3IFdlYWtNYXAgICAgICAgICAgICgpO1xuY29uc3QgYXJyYXlUeXBlc19nZXQgPSAvKiNfX1BVUkVfXyovZ2V0LmJpbmQoYXJyYXlUeXBlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuY29uc3QgYXJyYXlUeXBlc19zZXQgPSAvKiNfX1BVUkVfXyovc2V0LmJpbmQoYXJyYXlUeXBlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuY29uc3QgQXMgPSAoKSAgICAgPT4ge1xuXHRjb25zdCBhcyA9IChhcnJheSAgICAgICApICAgICAgICA9PiB7XG5cdFx0Y29uc3QgZ290ID0gYXJyYXlUeXBlc19nZXQoYXJyYXkpO1xuXHRcdGdvdFxuXHRcdFx0PyBnb3Q9PT1hcyB8fCBpdGVyYXRvci50aHJvd3MoVHlwZUVycm9yKGBUeXBlcyBpbiBBcnJheSBtdXN0IGJlIHNhbWVgICsgaXRlcmF0b3Iud2hlcmUoJy4gQ2hlY2sgJykpKVxuXHRcdFx0OiBhcnJheVR5cGVzX3NldChhcnJheSwgYXMpO1xuXHRcdHJldHVybiBhcnJheTtcblx0fTtcblx0cmV0dXJuIGFzO1xufTtcbmNvbnN0IEFTX1RZUEVEID0ge1xuXHRhc051bGxzOiBBcygpLFxuXHRhc1N0cmluZ3M6IEFzKCksXG5cdGFzVGFibGVzOiBBcygpLFxuXHRhc0FycmF5czogQXMoKSxcblx0YXNCb29sZWFuczogQXMoKSxcblx0YXNGbG9hdHM6IEFzKCksXG5cdGFzSW50ZWdlcnM6IEFzKCksXG5cdGFzT2Zmc2V0RGF0ZVRpbWVzOiBBcygpLFxuXHRhc0xvY2FsRGF0ZVRpbWVzOiBBcygpLFxuXHRhc0xvY2FsRGF0ZXM6IEFzKCksXG5cdGFzTG9jYWxUaW1lczogQXMoKSxcbn07XG5jb25zdCBhc01peGVkICAgICA9IChhcnJheSAgICAgICApICAgICAgICA9PiBhcnJheTtcbmV4cG9ydCBsZXRcblx0YXNOdWxscyAgICAsXG5cdGFzU3RyaW5ncyAgICAsXG5cdGFzVGFibGVzICAgICxcblx0YXNBcnJheXMgICAgLFxuXHRhc0Jvb2xlYW5zICAgICxcblx0YXNGbG9hdHMgICAgLFxuXHRhc0ludGVnZXJzICAgICxcblx0YXNPZmZzZXREYXRlVGltZXMgICAgLFxuXHRhc0xvY2FsRGF0ZVRpbWVzICAgICxcblx0YXNMb2NhbERhdGVzICAgICxcblx0YXNMb2NhbFRpbWVzICAgIDtcblxuICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5sZXQgcHJvY2Vzc29yICAgICAgICAgICAgID0gbnVsbDtcbmxldCBlYWNoICAgICAgICAgICAgICA9IG51bGw7XG4gICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIFxuY29uc3QgY29sbGVjdF9vbiA9ICh0YWcgICAgICAgICwgYXJyYXkgICAgICAgICAgICAgICwgdGFibGUgICAgICAgICAgICAgICwga2V5ICAgICAgICAgKSAgICAgICA9PiB7XG5cdGNvbnN0IF9lYWNoID0gY3JlYXRlKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcblx0X2VhY2guX2xpbmtlZCA9IGVhY2g7XG5cdF9lYWNoLnRhZyA9IHRhZztcblx0aWYgKCB0YWJsZSApIHtcblx0XHRfZWFjaC50YWJsZSA9IHRhYmxlO1xuXHRcdF9lYWNoLmtleSA9IGtleSA7XG5cdH1cblx0aWYgKCBhcnJheSApIHtcblx0XHRfZWFjaC5hcnJheSA9IGFycmF5O1xuXHRcdF9lYWNoLmluZGV4ID0gYXJyYXkubGVuZ3RoO1xuXHR9XG5cdGVhY2ggPSBfZWFjaDtcbn07XG5jb25zdCBjb2xsZWN0X29mZiA9ICgpICAgICAgICA9PiB7IHRocm93IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgeE9wdGlvbnMudGFnIGlzIG5vdCBlbmFibGVkLCBidXQgZm91bmQgdGFnIHN5bnRheGAgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7IH07XG5leHBvcnQgbGV0IGNvbGxlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29sbGVjdF9vZmY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBjb25zdCBQcm9jZXNzID0gKCkgICAgICAgICAgPT4ge1xuXHRpZiAoIGVhY2ggKSB7XG5cdFx0Y29uc3QgX3Byb2Nlc3NvciA9IHByb2Nlc3NvciA7XG5cdFx0bGV0IF9lYWNoICAgICAgICAgICAgICA9IGVhY2g7XG5cdFx0ZWFjaCA9IG51bGw7XG5cdFx0cmV0dXJuICgpICAgICAgID0+IHtcblx0XHRcdGNvbnN0IHByb2Nlc3NvciA9IF9wcm9jZXNzb3I7XG5cdFx0XHRsZXQgZWFjaCAgICAgICAgICAgICAgPSBfZWFjaCA7XG5cdFx0XHRfZWFjaCA9IG51bGw7XG5cdFx0XHRkbyB7IHByb2Nlc3NvcihlYWNoKTsgfVxuXHRcdFx0d2hpbGUgKCBlYWNoID0gZWFjaC5fbGlua2VkICk7XG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbi8qIHVzZSAmIGNsZWFyICovXG5cbmV4cG9ydCBjb25zdCBjbGVhciA9ICgpICAgICAgID0+IHtcblx0S0VZUyA9IEFOWTtcblx0dXNlV2hhdFRvSm9pbk11bHRpbGluZVN0cmluZyA9IHByb2Nlc3NvciA9IGVhY2ggPSBudWxsO1xuXHR6ZXJvRGF0ZXRpbWUgPSBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2UgPSAoc3BlY2lmaWNhdGlvblZlcnNpb24gICAgICAgICAsIG11bHRpbGluZVN0cmluZ0pvaW5lciAgICAgICAgICwgdXNlQmlnSW50ICAgICAgICAgLCBrZXlzICAgICAgICAgLCB4T3B0aW9ucyAgICAgICAgICAsIGFyZ3NNb2RlICAgICAgICAgICAgICAgICApICAgICAgID0+IHtcblx0XG5cdEFSR1NfTU9ERSA9IGFyZ3NNb2RlO1xuXHRcblx0bGV0IG1peGVkICAgICAgICAgO1xuXHRzd2l0Y2ggKCBzcGVjaWZpY2F0aW9uVmVyc2lvbiApIHtcblx0XHRjYXNlIDEuMDpcblx0XHRcdG11c3RTY2FsYXIgPSBtaXhlZCA9IG1vcmVEYXRldGltZSA9IHNGbG9hdCA9IGlubGluZVRhYmxlID0gdHJ1ZTtcblx0XHRcdHplcm9EYXRldGltZSA9IGRpc2FsbG93RW1wdHlLZXkgPSBmYWxzZTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMC41OlxuXHRcdFx0bXVzdFNjYWxhciA9IG1vcmVEYXRldGltZSA9IHNGbG9hdCA9IGlubGluZVRhYmxlID0gdHJ1ZTtcblx0XHRcdG1peGVkID0gemVyb0RhdGV0aW1lID0gZGlzYWxsb3dFbXB0eUtleSA9IGZhbHNlO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAwLjQ6XG5cdFx0XHRtdXN0U2NhbGFyID0gZGlzYWxsb3dFbXB0eUtleSA9IGlubGluZVRhYmxlID0gdHJ1ZTtcblx0XHRcdG1peGVkID0gemVyb0RhdGV0aW1lID0gbW9yZURhdGV0aW1lID0gc0Zsb2F0ID0gZmFsc2U7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDAuMzpcblx0XHRcdG11c3RTY2FsYXIgPSBkaXNhbGxvd0VtcHR5S2V5ID0gdHJ1ZTtcblx0XHRcdG1peGVkID0gemVyb0RhdGV0aW1lID0gbW9yZURhdGV0aW1lID0gc0Zsb2F0ID0gaW5saW5lVGFibGUgPSBmYWxzZTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMC4yOlxuXHRcdFx0emVyb0RhdGV0aW1lID0gZGlzYWxsb3dFbXB0eUtleSA9IHRydWU7XG5cdFx0XHRtdXN0U2NhbGFyID0gbWl4ZWQgPSBtb3JlRGF0ZXRpbWUgPSBzRmxvYXQgPSBpbmxpbmVUYWJsZSA9IGZhbHNlO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAwLjE6XG5cdFx0XHR6ZXJvRGF0ZXRpbWUgPSBkaXNhbGxvd0VtcHR5S2V5ID0gdHJ1ZTtcblx0XHRcdG11c3RTY2FsYXIgPSBtaXhlZCA9IG1vcmVEYXRldGltZSA9IHNGbG9hdCA9IGlubGluZVRhYmxlID0gZmFsc2U7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgUmFuZ2VFcnJvcihgVE9NTC5wYXJzZSgsc3BlY2lmaWNhdGlvblZlcnNpb24pYCk7XG5cdH1cblx0cmVnZXhwcy5zd2l0Y2hSZWdFeHAoc3BlY2lmaWNhdGlvblZlcnNpb24pO1xuXHRcblx0aWYgKCB0eXBlb2YgbXVsdGlsaW5lU3RyaW5nSm9pbmVyPT09J3N0cmluZycgKSB7IHVzZVdoYXRUb0pvaW5NdWx0aWxpbmVTdHJpbmcgPSBtdWx0aWxpbmVTdHJpbmdKb2luZXI7IH1cblx0ZWxzZSBpZiAoIG11bHRpbGluZVN0cmluZ0pvaW5lcj09PXVuZGVmaW5lZCApIHsgdXNlV2hhdFRvSm9pbk11bHRpbGluZVN0cmluZyA9IG51bGw7IH1cblx0ZWxzZSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5wYXJzZSgke0FSR1NfTU9ERSA/IGAke0FSR1NfTU9ERX1tdWx0aWxpbmVTdHJpbmdKb2luZXJgIDogYCx7IGpvaW5lciB9YH0pYCk7IH1cblx0XG5cdGlmICggdXNlQmlnSW50PT09dW5kZWZpbmVkIHx8IHVzZUJpZ0ludD09PXRydWUgKSB7IHVzaW5nQmlnSW50ID0gdHJ1ZTsgfVxuXHRlbHNlIGlmICggdXNlQmlnSW50PT09ZmFsc2UgKSB7IHVzaW5nQmlnSW50ID0gZmFsc2U7IH1cblx0ZWxzZSB7XG5cdFx0aWYgKCB0eXBlb2YgdXNlQmlnSW50IT09J251bWJlcicgKSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5wYXJzZSgke0FSR1NfTU9ERSA/IGAke0FSR1NfTU9ERX0sdXNlQmlnSW50YCA6IGAseyBiaWdpbnQgfWB9KWApOyB9XG5cdFx0aWYgKCAhaXNTYWZlSW50ZWdlcih1c2VCaWdJbnQpICkgeyB0aHJvdyBSYW5nZUVycm9yKGBUT01MLnBhcnNlKCR7QVJHU19NT0RFID8gYCR7QVJHU19NT0RFfSx1c2VCaWdJbnRgIDogYCx7IGJpZ2ludCB9YH0pYCk7IH1cblx0XHR1c2luZ0JpZ0ludCA9IG51bGw7XG5cdFx0dXNlQmlnSW50Pj0wXG5cdFx0XHQ/IEludGVnZXJNaW5OdW1iZXIgPSAtKCBJbnRlZ2VyTWF4TnVtYmVyID0gdXNlQmlnSW50IClcblx0XHRcdDogSW50ZWdlck1heE51bWJlciA9IC0oIEludGVnZXJNaW5OdW1iZXIgPSB1c2VCaWdJbnQgKSAtIDE7XG5cdH1cblx0aWYgKCAhQmlnSW50ICYmIHVzaW5nQmlnSW50IT09ZmFsc2UgKSB7IHRocm93IEVycm9yKGBDYW4ndCB3b3JrIHdpdGhvdXQgVE9NTC5wYXJzZSgke0FSR1NfTU9ERSA/IGAke0FSR1NfTU9ERX0sdXNlQmlnSW50YCA6IGAseyBiaWdpbnQgfWB9KSBiZWluZyBzZXQgdG8gZmFsc2UsIGJlY2F1c2UgdGhlIGhvc3QgZG9lc24ndCBoYXZlIEJpZ0ludCBzdXBwb3J0YCk7IH1cblx0XG5cdGlmICgga2V5cz09bnVsbCApIHsgS0VZUyA9IEFOWTsgfVxuXHRlbHNlIHtcblx0XHRpZiAoICFpc0tleXMoa2V5cykgKSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5wYXJzZSgseyBrZXlzIH0pYCk7IH1cblx0XHRLRVlTID0ga2V5cztcblx0fVxuXHRcblx0aWYgKCB4T3B0aW9ucz09bnVsbCApIHtcblx0XHRUYWJsZSA9IFBsYWluVGFibGU7XG5cdFx0c0Vycm9yID0gYWxsb3dMb25nZXIgPSBlbmFibGVOdWxsID0gYWxsb3dJbmxpbmVUYWJsZU11bHRpbGluZUFuZFRyYWlsaW5nQ29tbWFFdmVuTm9Db21tYSA9IGZhbHNlO1xuXHRcdGNvbGxlY3QgPSBjb2xsZWN0X29mZjtcblx0fVxuXHRlbHNlIGlmICggdHlwZW9mIHhPcHRpb25zIT09J29iamVjdCcgKSB7XG5cdFx0dGhyb3cgVHlwZUVycm9yKGBUT01MLnBhcnNlKCR7QVJHU19NT0RFID8gYCR7QVJHU19NT0RFfSwseE9wdGlvbnNgIDogYCx7IHggfWB9KWApO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGNvbnN0IHsgb3JkZXIsIGxvbmdlciwgZXhhY3QsIG51bGw6IF9udWxsLCBtdWx0aSwgY29tbWVudCwgc3RyaW5nLCBsaXRlcmFsLCB0YWcsIC4uLnVua25vd24gfSA9IHhPcHRpb25zO1xuXHRcdGNvbnN0IHVua25vd25OYW1lcyA9IGdldE93blByb3BlcnR5TmFtZXModW5rbm93bik7XG5cdFx0aWYgKCB1bmtub3duTmFtZXMubGVuZ3RoICkgeyB0aHJvdyBUeXBlRXJyb3IoYFRPTUwucGFyc2UoJHtBUkdTX01PREUgPyBgJHtBUkdTX01PREV9LCx7ICR7dW5rbm93bk5hbWVzLmpvaW4oJywgJyl9IH1gIDogYCx7IHg6IHsgJHt1bmtub3duTmFtZXMuam9pbignLCAnKX0gfSB9YH0pYCk7IH1cblx0XHRUYWJsZSA9IG9yZGVyID8gT3JkZXJlZFRhYmxlIDogUGxhaW5UYWJsZTtcblx0XHRhbGxvd0xvbmdlciA9ICFsb25nZXI7XG5cdFx0c0Vycm9yID0gISFleGFjdDtcblx0XHRlbmFibGVOdWxsID0gISFfbnVsbDtcblx0XHRhbGxvd0lubGluZVRhYmxlTXVsdGlsaW5lQW5kVHJhaWxpbmdDb21tYUV2ZW5Ob0NvbW1hID0gISFtdWx0aTtcblx0XHRwcmVzZXJ2ZUNvbW1lbnQgPSAhIWNvbW1lbnQ7XG5cdFx0ZGlzYWJsZURpZ2l0ID0gISFzdHJpbmc7XG5cdFx0cHJlc2VydmVMaXRlcmFsID0gISFsaXRlcmFsO1xuXHRcdGlmICggdGFnICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgdGFnIT09J2Z1bmN0aW9uJyApIHsgdGhyb3cgVHlwZUVycm9yKGBUT01MLnBhcnNlKCR7QVJHU19NT0RFID8gYCR7QVJHU19NT0RFfSwseyB0YWcgfWAgOiBgLHsgeDogeyB0YWcgfSB9YH0pYCk7IH1cblx0XHRcdGlmICggIW1peGVkICkgeyB0aHJvdyBUeXBlRXJyb3IoYFRPTUwucGFyc2UoJHtBUkdTX01PREUgPyBgJHtBUkdTX01PREV9LCx4T3B0aW9uc2AgOiBgLHsgeCB9YH0pIHhPcHRpb25zLnRhZyBuZWVkcyBhdCBsZWFzdCBUT01MIDEuMCB0byBzdXBwb3J0IG1peGVkIHR5cGUgYXJyYXlgKTsgfVxuXHRcdFx0cHJvY2Vzc29yID0gdGFnO1xuXHRcdFx0Y29sbGVjdCA9IGNvbGxlY3Rfb247XG5cdFx0fVxuXHRcdGVsc2UgeyBjb2xsZWN0ID0gY29sbGVjdF9vZmY7IH1cblx0fVxuXHRcblx0bWl4ZWRcblx0XHQ/IGFzTnVsbHMgPSBhc1N0cmluZ3MgPSBhc1RhYmxlcyA9IGFzQXJyYXlzID0gYXNCb29sZWFucyA9IGFzRmxvYXRzID0gYXNJbnRlZ2VycyA9IGFzT2Zmc2V0RGF0ZVRpbWVzID0gYXNMb2NhbERhdGVUaW1lcyA9IGFzTG9jYWxEYXRlcyA9IGFzTG9jYWxUaW1lcyA9IGFzTWl4ZWRcblx0XHQ6ICggeyBhc051bGxzLCBhc1N0cmluZ3MsIGFzVGFibGVzLCBhc0FycmF5cywgYXNCb29sZWFucywgYXNGbG9hdHMsIGFzSW50ZWdlcnMsIGFzT2Zmc2V0RGF0ZVRpbWVzLCBhc0xvY2FsRGF0ZVRpbWVzLCBhc0xvY2FsRGF0ZXMsIGFzTG9jYWxUaW1lcyB9ID0gQVNfVFlQRUQgKTtcblx0XG59O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLlN5bWJvbCc7XG5cbmNvbnN0IHByZXZpb3VzICAgICAgICAgICAgICAgID0gU3ltYm9sKCdwcmV2aW91cycpICAgICAgIDtcblxuICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgIFxuICBcblxuZXhwb3J0IGNvbnN0IHggPSAgICAgKHJvb3RTdGFjayAgICAgICkgICAgPT4ge1xuXHRsZXQgc3RhY2sgICAgICAgID0gcm9vdFN0YWNrO1xuXHRsZXQgcmVzdWx0ID0gc3RhY2submV4dCgpO1xuXHRpZiAoICFyZXN1bHQuZG9uZSApIHtcblx0XHRyZXN1bHQudmFsdWVbcHJldmlvdXNdID0gc3RhY2s7XG5cdFx0cmVzdWx0ID0gKCBzdGFjayA9IHJlc3VsdC52YWx1ZSApLm5leHQoKTtcblx0XHRmb3IgKCA7IDsgKSB7XG5cdFx0XHRpZiAoIHJlc3VsdC5kb25lICkge1xuXHRcdFx0XHRpZiAoIHN0YWNrPT09cm9vdFN0YWNrICkgeyBicmVhazsgfVxuXHRcdFx0XHRzdGFjayA9IHN0YWNrW3ByZXZpb3VzXSA7XG5cdFx0XHRcdHJlc3VsdCA9IHN0YWNrLm5leHQocmVzdWx0LnZhbHVlKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRyZXN1bHQudmFsdWVbcHJldmlvdXNdID0gc3RhY2s7XG5cdFx0XHRcdHJlc3VsdCA9ICggc3RhY2sgPSByZXN1bHQudmFsdWUgKS5uZXh0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQudmFsdWU7XG59O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgXG5cdFx0ICAgICAgICAgICAgICAgICAgICBcblx0XHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0XHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IFxuXHQgICBcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHRcdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHRcdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgIFxuIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuU3ltYm9sJztcbmltcG9ydCBPYmplY3QgZnJvbSAnLk9iamVjdCc7XG5cbmV4cG9ydCBjb25zdCBfbGl0ZXJhbCAgICAgICAgICAgICAgICA9IFN5bWJvbCgnX2xpdGVyYWwnKSAgICAgICA7XG5cbmV4cG9ydCBjb25zdCBMaXRlcmFsT2JqZWN0ID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpdGVyYWwgICAgICAgICAsIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcblx0Y29uc3Qgb2JqZWN0ID0gT2JqZWN0KHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcblx0b2JqZWN0W19saXRlcmFsXSA9IGxpdGVyYWw7XG5cdHJldHVybiBvYmplY3Q7XG59O1xuIiwiaW1wb3J0IFdlYWtTZXQgZnJvbSAnLldlYWtTZXQnO1xuaW1wb3J0IGhhcyBmcm9tICcuV2Vha1NldC5wcm90b3R5cGUuaGFzJztcbmltcG9ydCBhZGQgZnJvbSAnLldlYWtTZXQucHJvdG90eXBlLmFkZCc7XG5cbmNvbnN0IGFycmF5cyA9IG5ldyBXZWFrU2V0ICAgICAgICgpO1xuY29uc3QgYXJyYXlzX2FkZCA9IC8qI19fUFVSRV9fKi9hZGQuYmluZChhcnJheXMpO1xuZXhwb3J0IGNvbnN0IGlzQXJyYXkgPSAvKiNfX1BVUkVfXyovaGFzLmJpbmQoYXJyYXlzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG5cbmV4cG9ydCBjb25zdCBPRl9UQUJMRVMgPSBmYWxzZTtcbmV4cG9ydCBjb25zdCBTVEFUSUNBTExZID0gdHJ1ZTtcbmNvbnN0IHN0YXRpY2FsQXJyYXlzID0gbmV3IFdlYWtTZXQgICAgICAgKCk7XG5jb25zdCBzdGF0aWNhbEFycmF5c19hZGQgPSAvKiNfX1BVUkVfXyovYWRkLmJpbmQoc3RhdGljYWxBcnJheXMpO1xuZXhwb3J0IGNvbnN0IGlzU3RhdGljID0gLyojX19QVVJFX18qL2hhcy5iaW5kKHN0YXRpY2FsQXJyYXlzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuXG5leHBvcnQgY29uc3QgbmV3QXJyYXkgPSAoaXNTdGF0aWMgICAgICAgICApICAgICAgICA9PiB7XG5cdGNvbnN0IGFycmF5ICAgICAgICA9IFtdO1xuXHRhcnJheXNfYWRkKGFycmF5KTtcblx0aXNTdGF0aWMgJiYgc3RhdGljYWxBcnJheXNfYWRkKGFycmF5KTtcblx0cmV0dXJuIGFycmF5O1xufTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgIFxuIFxuIiwiaW1wb3J0IFN5bnRheEVycm9yIGZyb20gJy5TeW50YXhFcnJvcic7XG5pbXBvcnQgUmFuZ2VFcnJvciBmcm9tICcuUmFuZ2VFcnJvcic7XG5pbXBvcnQgTmF0aXZlRGF0ZSBmcm9tICcuRGF0ZSc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLkRhdGUucGFyc2UnO1xuaW1wb3J0IGZsb29yIGZyb20gJy5NYXRoLmZsb29yJztcbmltcG9ydCBvd25LZXlzIGZyb20gJy5SZWZsZWN0Lm93bktleXMnO1xuLy8vaW1wb3J0IGlzIGZyb20gJy5PYmplY3QuaXMnO1xuaW1wb3J0IGNyZWF0ZSBmcm9tICcuT2JqZWN0LmNyZWF0ZSc7XG5pbXBvcnQgcHJldmVudEV4dGVuc2lvbnMgZnJvbSAnLk9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyc7XG5pbXBvcnQgZnJlZXplIGZyb20gJy5PYmplY3QuZnJlZXplJztcbmltcG9ydCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIGZyb20gJy5PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyc7XG5pbXBvcnQgU3ltYm9sIGZyb20gJy5TeW1ib2wnO1xuaW1wb3J0IGRlZmluZVByb3BlcnRpZXMgZnJvbSAnLm51bGwuZGVmaW5lUHJvcGVydGllcyc7XG5pbXBvcnQgTnVsbCBmcm9tICcubnVsbCc7XG5cbmltcG9ydCB7IG5ld1JlZ0V4cCwgdGhlUmVnRXhwIH0gZnJvbSAnQGx0ZC9qLXJlZ2V4cCc7XG5cbmltcG9ydCAqIGFzIG9wdGlvbnMgZnJvbSAnLi4vb3B0aW9ucyc7XG5pbXBvcnQgKiBhcyBpdGVyYXRvciBmcm9tICcuLi9pdGVyYXRvcic7XG5cbmNvbnN0IGZwYyA9ICAgICAgICAgICAgICAgICAgICAgIChjICAgKSAgICA9PiB7XG5cdGZyZWV6ZShmcmVlemUoYykucHJvdG90eXBlKTtcblx0cmV0dXJuIGM7XG59O1xuXG5jb25zdCBfMjlfID0gLyg/OjBbMS05XXwxXFxkfDJcXGQpLztcbmNvbnN0IF8zMF8gPSAvKD86MFsxLTldfFsxMl1cXGR8MzApLztcbmNvbnN0IF8zMV8gPSAvKD86MFsxLTldfFsxMl1cXGR8M1swMV0pLztcbmNvbnN0IF8yM18gPSAvKD86WzAxXVxcZHwyWzAtM10pLztcbmNvbnN0IF81OV8gPSAvWzAtNV1cXGQvO1xuXG5jb25zdCBZTUQgPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwYFxuXHRcXGRcXGRcXGRcXGQtXG5cdCg/OlxuXHRcdDBcblx0XHQoPzpcblx0XHRcdFsxMzU3OF0tJHtfMzFffVxuXHRcdFx0fFxuXHRcdFx0WzQ2OV0tJHtfMzBffVxuXHRcdFx0fFxuXHRcdFx0Mi0ke18yOV99XG5cdFx0KVxuXHRcdHxcblx0XHQxXG5cdFx0KD86XG5cdFx0XHRbMDJdLSR7XzMxX31cblx0XHRcdHxcblx0XHRcdDEtJHtfMzBffVxuXHRcdClcblx0KVxuYC52YWx1ZU9mKCk7XG5cbmNvbnN0IEhNUyA9IC8qI19fUFVSRV9fKi9uZXdSZWdFeHBgXG5cdCR7XzIzX306JHtfNTlffToke181OV99XG5gLnZhbHVlT2YoKTtcblxuZXhwb3J0IGNvbnN0IE9GRlNFVCQgPSAvKD86W1p6XXxbKy1dXFxkXFxkOlxcZFxcZCkkLztcblxuY29uc3QgeyBleGVjOiBaX2V4ZWMgfSA9IHRoZVJlZ0V4cCAgICAgICAgICAgKC8oKFsrLV0pXFxkXFxkKTooXFxkXFxkKSQvKTtcblxuY29uc3QgeyBleGVjOiBPRkZTRVRfREFURVRJTUVfZXhlYyB9ID0gLyojX19QVVJFX18qL25ld1JlZ0V4cGBcblx0XlxuXHQke1lNRH1cblx0W1R0IF1cblx0JHtITVN9XG5cdCg/OlxcLlxcZHsxLDN9KFxcZCo/KTAqKT9cblx0KD86W1p6XXxbKy1dJHtfMjNffToke181OV99KVxuXHQkYC52YWx1ZU9mKCk7XG5cbmNvbnN0IHsgZXhlYzogT0ZGU0VUX0RBVEVUSU1FX1pFUk9fZXhlYyB9ID0gLyojX19QVVJFX18qL25ld1JlZ0V4cGBcblx0XlxuXHQke1lNRH1cblx0W1R0IF1cblx0JHtITVN9XG5cdCgpXG5cdFtael1cblx0JGAudmFsdWVPZigpO1xuXG5jb25zdCB7IHRlc3Q6IElTX0xPQ0FMX0RBVEVUSU1FIH0gPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwYFxuXHReXG5cdCR7WU1EfVxuXHRbVHQgXVxuXHQke0hNU31cblx0KD86XFwuXFxkKyk/XG5cdCRgLnZhbHVlT2YoKTtcblxuY29uc3QgeyB0ZXN0OiBJU19MT0NBTF9EQVRFIH0gPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwYFxuXHReXG5cdCR7WU1EfVxuXHQkYC52YWx1ZU9mKCk7XG5cbmNvbnN0IHsgdGVzdDogSVNfTE9DQUxfVElNRSB9ID0gLyojX19QVVJFX18qL25ld1JlZ0V4cGBcblx0XlxuXHQke0hNU31cblx0KD86XFwuXFxkKyk/XG5cdCRgLnZhbHVlT2YoKTtcblxuY29uc3QgVCA9IC9bIHRdLztcbmNvbnN0IERFTElNSVRFUl9ET1QgPSAvWy1UOi5dL2c7XG5jb25zdCBET1RfWkVSTyA9IC9cXC4/MCskLztcbmNvbnN0IFpFUk8gPSAvXFwuKFxcZCo/KTArJC87XG5jb25zdCB6ZXJvUmVwbGFjZXIgPSAobWF0Y2ggICAgICAgICwgcDEgICAgICAgICkgPT4gcDE7XG5cbmNvbnN0IERhdGV0aW1lID0gLyojX19QVVJFX18qLyggKCkgPT4ge1xuXHRjb25zdCBEYXRldGltZSA9IGZ1bmN0aW9uICggICAgICAgICAgICApIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL2V4cHJlc3Npb24/IDp1bmRlZmluZWQsIGxpdGVyYWw/IDp1bmRlZmluZWQsIGRvdFZhbHVlPyA6dW5kZWZpbmVkXG5cdC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IC5zZXRUaW1lKClcblx0Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gLmdldFRpbWUoKSA6IERhdGUucGFyc2UoJ1QnKVxuXHQvLyBbU3ltYm9sLnRvUHJpbWl0aXZlXSgnbnVtYmVyJykgPiAudmFsdWVPZigpXG5cdC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IC50b0lTT1N0cmluZygpXG5cdGNvbnN0IGRlc2NyaXB0b3JzID0gTnVsbChudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xuXHR7XG5cdFx0Y29uc3QgZGVzY3JpcHRvciA9IE51bGwobnVsbCk7XG5cdFx0Zm9yICggY29uc3Qga2V5IG9mIG93bktleXMoTmF0aXZlRGF0ZS5wcm90b3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKSB7XG5cdFx0XHRrZXk9PT0nY29uc3RydWN0b3InIHx8XG5cdFx0XHRrZXk9PT0ndG9KU09OJyB8fFxuXHRcdFx0KCBkZXNjcmlwdG9yc1trZXldID0gZGVzY3JpcHRvciApO1xuXHRcdH1cblx0fVxuXHREYXRldGltZS5wcm90b3R5cGUgPSBwcmV2ZW50RXh0ZW5zaW9ucyhjcmVhdGUoTmF0aXZlRGF0ZS5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKSk7XG5cdHJldHVybiBmcmVlemUoRGF0ZXRpbWUpO1xufSApKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IFZhbHVlID0gKElTT1N0cmluZyAgICAgICAgKSAgICAgICAgPT4gSVNPU3RyaW5nLnJlcGxhY2UoWkVSTywgemVyb1JlcGxhY2VyKS5yZXBsYWNlKERFTElNSVRFUl9ET1QsICcnKTtcblxuY29uc3QgZCA9IC8uL2dzO1xuY29uc3QgZDJ1ID0gKGQgICAgICAgICkgPT4gJ1xcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDknW2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA7XG5jb25zdCBWYWx1ZU9GRlNFVCA9ICh0aW1lICAgICAgICAsIG1vcmUgICAgICAgICkgICAgICAgID0+IHRpbWU8MFxuXHQ/ICggJycgKyAoIHRpbWUgKyA2MjE2NzMwNTU0MDAwMCApICkucmVwbGFjZShkLCBkMnUpLnBhZFN0YXJ0KDE0LCAnXFx1MjAwMCcpICsgbW9yZS5yZXBsYWNlKGQsIGQydSkgKyB0aW1lXG5cdDogbW9yZVxuXHRcdD8gKCB0aW1lICsgJy4nICkucGFkU3RhcnQoMTYsICcwJykgKyBtb3JlXG5cdFx0OiAoICcnICsgdGltZSApLnBhZFN0YXJ0KDE1LCAnMCcpO1xuXG5jb25zdCB2YWxpZGF0ZUxlYXAgPSAobGl0ZXJhbCAgICAgICAgKSAgICAgICAgICA9PiB7XG5cdGlmICggbGl0ZXJhbC5zdGFydHNXaXRoKCcwMi0yOScsIDUpICkge1xuXHRcdGNvbnN0IHllYXIgICAgICAgICA9ICtsaXRlcmFsLnNsaWNlKDAsIDQpO1xuXHRcdHJldHVybiAoXG5cdFx0XHR5ZWFyICYgMGIxMSA/IGZhbHNlIDpcblx0XHRcdFx0eWVhciUxMDAgPyB0cnVlIDpcblx0XHRcdFx0XHR5ZWFyJTQwMCA/IGZhbHNlIDpcblx0XHRcdFx0XHRcdHllYXIlMzIwMCA/IHRydWUgOlxuXHRcdFx0XHRcdFx0XHRmYWxzZVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHRydWU7XG59O1xuY29uc3QgeyB0ZXN0OiBWQUxJREFURV9MRUFQIH0gPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwLnNgXi4uLi4uKD86MDYuMzB8MTIuMzEpLjIzOjU5OjU5YC52YWx1ZU9mKCk7XG5cbmNvbnN0IERBVEUgICAgICAgICAgICAgPSAvKiNfX1BVUkVfXyovZGVmaW5lUHJvcGVydGllcyhuZXcgTmF0aXZlRGF0ZSgwKSwgLyojX19QVVJFX18qL2dldE93blByb3BlcnR5RGVzY3JpcHRvcnMoTmF0aXZlRGF0ZS5wcm90b3R5cGUpKTtcblxuY29uc3QgT2Zmc2V0RGF0ZVRpbWVfSVNPU3RyaW5nICAgICAgICAgICAgICAgID0gU3ltYm9sKCdPZmZzZXREYXRlVGltZV9JU09TdHJpbmcnKSAgICAgICA7XG5jb25zdCBPZmZzZXREYXRlVGltZV92YWx1ZSAgICAgICAgICAgICAgICA9IFN5bWJvbCgnT2Zmc2V0RGF0ZVRpbWVfdmFsdWUnKSAgICAgICA7XG5jb25zdCBPZmZzZXREYXRlVGltZV91c2UgPSAodGhhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICQgICAgICAgICA9IDApID0+IHtcblx0REFURS5zZXRUaW1lKCt0aGF0W09mZnNldERhdGVUaW1lX3ZhbHVlXSArICQpO1xuXHRyZXR1cm4gREFURTtcbn07XG4vKmNvbnN0IE9mZnNldERhdGVUaW1lX2dldCA9ICh0aGF0IDpJbnN0YW5jZVR5cGU8dHlwZW9mIE9mZnNldERhdGVUaW1lPiwgc3RhcnQgOm51bWJlciwgZW5kIDpudW1iZXIpID0+ICt0aGF0W09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10uc2xpY2Uoc3RhcnQsIGVuZCk7XG5jb25zdCBPZmZzZXREYXRlVGltZV9zZXQgPSAodGhhdCA6SW5zdGFuY2VUeXBlPHR5cGVvZiBPZmZzZXREYXRlVGltZT4sIHN0YXJ0IDpudW1iZXIsIGVuZCA6bnVtYmVyLCB2YWx1ZSA6bnVtYmVyLCByZXNlcnZlTW9yZSA6Ym9vbGVhbikgPT4ge1xuXHRpZiAoIGVuZCApIHtcblx0XHRjb25zdCBzdHJpbmcgPSAnJyArIHZhbHVlO1xuXHRcdGNvbnN0IHNpemUgPSBlbmQgLSBzdGFydDtcblx0XHRpZiAoIHN0cmluZy5sZW5ndGg+c2l6ZSApIHsgdGhyb3cgUmFuZ2VFcnJvcigpOyB9Ly8vXG5cdFx0dGhhdFtPZmZzZXREYXRlVGltZV9JU09TdHJpbmddID0gdGhhdFtPZmZzZXREYXRlVGltZV9JU09TdHJpbmddLnNsaWNlKDAsIHN0YXJ0KSArIHN0cmluZy5wYWRTdGFydChzaXplLCAnMCcpICsgdGhhdFtPZmZzZXREYXRlVGltZV9JU09TdHJpbmddLnNsaWNlKGVuZCk7XG5cdH1cblx0Y29uc3QgdGltZSA9IHBhcnNlKHRoYXRbT2Zmc2V0RGF0ZVRpbWVfSVNPU3RyaW5nXSk7XG5cdHJldHVybiB0aGF0W09mZnNldERhdGVUaW1lX3ZhbHVlXSA9IFZhbHVlT0ZGU0VUKHRpbWUsIHRoYXRbT2Zmc2V0RGF0ZVRpbWVfdmFsdWVdLmluY2x1ZGVzKCctJylcblx0XHQ/IHRoYXRbT2Zmc2V0RGF0ZVRpbWVfdmFsdWVdLnNsaWNlKDE0LCB0aGF0W09mZnNldERhdGVUaW1lX3ZhbHVlXS5pbmRleE9mKCctJywgMTQpKVxuXHRcdDogdGhhdFtPZmZzZXREYXRlVGltZV92YWx1ZV0uc2xpY2UoMTUpXG5cdCk7Ly8vdGltZVxufTsqLy8vXG5leHBvcnQgY29uc3QgT2Zmc2V0RGF0ZVRpbWUgPSAvKiNfX1BVUkVfXyovZnBjKGNsYXNzIE9mZnNldERhdGVUaW1lIGV4dGVuZHMgRGF0ZXRpbWUge1xuXHRcblx0W09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10gICAgICAgIDtcblx0W09mZnNldERhdGVUaW1lX3ZhbHVlXSAgICAgICA7XG5cdFxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10gKCkgeyByZXR1cm4gJ09mZnNldERhdGVUaW1lJyAgICAgICAgIDsgfVxuXHRcblx0ICAgICAgICAgdmFsdWVPZiAoICAgICAgICAgICAgICAgICAgICApICAgICAgICB7IHJldHVybiB0aGlzW09mZnNldERhdGVUaW1lX3ZhbHVlXTsgfVxuXHR0b0lTT1N0cmluZyAoICAgICAgICAgICAgICAgICAgICApICAgICAgICAgeyByZXR1cm4gdGhpc1tPZmZzZXREYXRlVGltZV9JU09TdHJpbmddOyB9XG5cdFxuXHRjb25zdHJ1Y3RvciAobGl0ZXJhbCAgICAgICAgKSB7XG5cdFx0dmFsaWRhdGVMZWFwKGxpdGVyYWwpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgSW52YWxpZCBPZmZzZXQgRGF0ZS1UaW1lICR7bGl0ZXJhbH1gICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdGNvbnN0IHdpdGg2MCA9IGxpdGVyYWwuc3RhcnRzV2l0aCgnNjAnLCAxNyk7XG5cdFx0bGV0IHdpdGhvdXQ2MCA9IHdpdGg2MCA/IGxpdGVyYWwuc2xpY2UoMCwgMTcpICsgJzU5JyArIGxpdGVyYWwuc2xpY2UoMTkpIDogbGl0ZXJhbDtcblx0XHRjb25zdCB7IDE6IG1vcmUgPSAnJyB9ID0gKCBvcHRpb25zLnplcm9EYXRldGltZSA/IE9GRlNFVF9EQVRFVElNRV9aRVJPX2V4ZWMod2l0aG91dDYwKSA6IE9GRlNFVF9EQVRFVElNRV9leGVjKHdpdGhvdXQ2MCkgKSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEludmFsaWQgT2Zmc2V0IERhdGUtVGltZSAke2xpdGVyYWx9YCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRjb25zdCB0aW1lID0gcGFyc2Uod2l0aG91dDYwID0gd2l0aG91dDYwLnJlcGxhY2UoVCwgJ1QnKS5yZXBsYWNlKCd6JywgJ1onKSk7XG5cdFx0aWYgKCB3aXRoNjAgKSB7XG5cdFx0XHREQVRFLnNldFRpbWUodGltZSk7XG5cdFx0XHRWQUxJREFURV9MRUFQKERBVEUudG9JU09TdHJpbmcoKSkgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBJbnZhbGlkIE9mZnNldCBEYXRlLVRpbWUgJHtsaXRlcmFsfWAgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7XG5cdFx0fVxuXHRcdHN1cGVyKCk7XG5cdFx0dGhpc1tPZmZzZXREYXRlVGltZV9JU09TdHJpbmddID0gd2l0aG91dDYwO1xuXHRcdHRoaXNbT2Zmc2V0RGF0ZVRpbWVfdmFsdWVdID0gVmFsdWVPRkZTRVQodGltZSwgbW9yZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0XG5cdGdldFVUQ0Z1bGxZZWFyICggICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgIHsgcmV0dXJuIE9mZnNldERhdGVUaW1lX3VzZSh0aGlzKS5nZXRVVENGdWxsWWVhcigpOyB9XG5cdC8vL2dldCB5ZWFyICgpIDpGdWxsWWVhciB7IHJldHVybiBPZmZzZXREYXRlVGltZV9nZXQodGhpcywgMCwgNCk7IH1cblx0Ly8vc2V0IHllYXIgKHZhbHVlIDpGdWxsWWVhcikgeyBPZmZzZXREYXRlVGltZV9zZXQodGhpcywgMCwgNCwgdmFsdWUsIHRydWUpOyB9XG5cdGdldFVUQ01vbnRoICggICAgICAgICAgICAgICAgICAgICkgICAgICAgIHsgcmV0dXJuIE9mZnNldERhdGVUaW1lX3VzZSh0aGlzKS5nZXRVVENNb250aCgpOyB9XG5cdC8vL2dldCBtb250aCAoKSB7IHJldHVybiBPZmZzZXREYXRlVGltZV9nZXQodGhpcywgNSwgNyk7IH1cblx0Ly8vc2V0IG1vbnRoICh2YWx1ZSkgeyBPZmZzZXREYXRlVGltZV9zZXQodGhpcywgNSwgNywgdmFsdWUsIHRydWUpOyB9XG5cdGdldFVUQ0RhdGUgKCAgICAgICAgICAgICAgICAgICAgKSAgICAgICB7IHJldHVybiBPZmZzZXREYXRlVGltZV91c2UodGhpcykuZ2V0VVRDRGF0ZSgpOyB9XG5cdC8vL2dldCBkYXkgKCkgOkRhdGUgeyByZXR1cm4gT2Zmc2V0RGF0ZVRpbWVfZ2V0KHRoaXMsIDgsIDEwKTsgfVxuXHQvLy9zZXQgZGF5ICh2YWx1ZSA6RGF0ZSkgeyBPZmZzZXREYXRlVGltZV9zZXQodGhpcywgOCwgMTAsIHZhbHVlLCB0cnVlKTsgfVxuXHRcblx0Z2V0VVRDSG91cnMgKCAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgeyByZXR1cm4gT2Zmc2V0RGF0ZVRpbWVfdXNlKHRoaXMpLmdldFVUQ0hvdXJzKCk7IH1cblx0Ly8vZ2V0IGhvdXIgKCkgOkhvdXJzIHsgcmV0dXJuIE9mZnNldERhdGVUaW1lX2dldCh0aGlzLCAxMSwgMTMpOyB9XG5cdC8vL3NldCBob3VyICh2YWx1ZSA6SG91cnMpIHsgT2Zmc2V0RGF0ZVRpbWVfc2V0KHRoaXMsIDExLCAxMywgdmFsdWUsIHRydWUpOyB9XG5cdGdldFVUQ01pbnV0ZXMgKCAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICB7IHJldHVybiBPZmZzZXREYXRlVGltZV91c2UodGhpcykuZ2V0VVRDTWludXRlcygpOyB9XG5cdC8vL2dldCBtaW51dGUgKCkgOk1pbnV0ZXMgeyByZXR1cm4gT2Zmc2V0RGF0ZVRpbWVfZ2V0KHRoaXMsIDE0LCAxNik7IH1cblx0Ly8vc2V0IG1pbnV0ZSAodmFsdWUgOk1pbnV0ZXMpIHsgT2Zmc2V0RGF0ZVRpbWVfc2V0KHRoaXMsIDE0LCAxNiwgdmFsdWUsIHRydWUpOyB9XG5cdGdldFVUQ1NlY29uZHMgKCAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICB7IHJldHVybiBPZmZzZXREYXRlVGltZV91c2UodGhpcykuZ2V0VVRDU2Vjb25kcygpOyB9XG5cdC8vL2dldCBzZWNvbmQgKCkgOlNlY29uZHMgeyByZXR1cm4gT2Zmc2V0RGF0ZVRpbWVfZ2V0KHRoaXMsIDE3LCAxOSk7IH1cblx0Ly8vc2V0IHNlY29uZCAodmFsdWUgOlNlY29uZHMpIHsgT2Zmc2V0RGF0ZVRpbWVfc2V0KHRoaXMsIDE3LCAxOSwgdmFsdWUsIHRydWUpOyB9XG5cdGdldFVUQ01pbGxpc2Vjb25kcyAoICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgeyByZXR1cm4gT2Zmc2V0RGF0ZVRpbWVfdXNlKHRoaXMpLmdldFVUQ01pbGxpc2Vjb25kcygpOyB9Ly8vXG5cdC8vL2dldCBtaWxsaXNlY29uZCAoKSA6TWlsbGlzZWNvbmRzIHsgcmV0dXJuIHRoaXNbT2Zmc2V0RGF0ZVRpbWVfdmFsdWVdJTEwMDA7IH0vLy9cblx0LypzZXQgbWlsbGlzZWNvbmQgKHZhbHVlIDpNaWxsaXNlY29uZHMpIHtcblx0XHR0aGlzW09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10gPSB0aGlzW09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10uc2xpY2UoMCwgMTkpICsgKCB2YWx1ZSA/ICggJy4nICsgKCAnJyArIHZhbHVlICkucGFkU3RhcnQoMywgJzAnKSApLnJlcGxhY2UoRE9UX1pFUk8sICcnKSA6ICcnICkgKyB0aGlzW09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10uc2xpY2UodGhpc1tPZmZzZXREYXRlVGltZV9JU09TdHJpbmddLnNlYXJjaChPRkZTRVQkKSk7XG5cdFx0T2Zmc2V0RGF0ZVRpbWVfc2V0KHRoaXMsIDAsIDAsIDAsIGZhbHNlKTtcblx0fSovLy9cblx0Ly8vZ2V0IG1pY3Jvc2Vjb25kICgpIDpNaWxsaXNlY29uZHNcblx0Ly8vc2V0IG1pY3Jvc2Vjb25kICh2YWx1ZSA6TWlsbGlzZWNvbmRzKVxuXHQvLy9nZXQgbmFub3NlY29uZCAoKSA6TWlsbGlzZWNvbmRzXG5cdC8vL3NldCBuYW5vc2Vjb25kICh2YWx1ZSA6TWlsbGlzZWNvbmRzKVxuXHRcblx0Z2V0VVRDRGF5ICggICAgICAgICAgICAgICAgICAgICkgICAgICB7IHJldHVybiBPZmZzZXREYXRlVGltZV91c2UodGhpcykuZ2V0VVRDRGF5KCk7IH1cblx0Ly8vZ2V0IGRheU9mV2VlayAoKSB7IHJldHVybiBPZmZzZXREYXRlVGltZV91c2UodGhpcywgdGhpcy5nZXRUaW1lem9uZU9mZnNldCgpKjYwMDAwKS5nZXRVVENEYXkoKSB8fCA3OyB9XG5cdGdldFRpbWV6b25lT2Zmc2V0ICggICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgIHtcblx0XHRjb25zdCB6ID0gWl9leGVjKHRoaXNbT2Zmc2V0RGF0ZVRpbWVfSVNPU3RyaW5nXSk7XG5cdFx0cmV0dXJuIHogPyArelsxXSo2MCArICsoIHpbMl0gKyB6WzNdICkgOiAwO1xuXHR9XG5cdC8vL2dldCBvZmZzZXQgKCkgeyByZXR1cm4gdGhpc1tPZmZzZXREYXRlVGltZV9JU09TdHJpbmddLmVuZHNXaXRoKCdaJykgPyAnWicgOiB0aGlzW09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10uc2xpY2UoLTYpOyB9XG5cdC8qc2V0IG9mZnNldCAodmFsdWUpIHtcblx0XHR0aGlzW09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10gPSB0aGlzW09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10uc2xpY2UoMCwgdGhpc1tPZmZzZXREYXRlVGltZV9JU09TdHJpbmddLmVuZHNXaXRoKCdaJykgPyAtMSA6IC02KSArIHZhbHVlO1xuXHRcdE9mZnNldERhdGVUaW1lX3NldCh0aGlzLCAwLCAwLCAwLCB0cnVlKTtcblx0fSovLy9cblx0Z2V0VGltZSAoICAgICAgICAgICAgICAgICAgICApICAgICAgIHsgcmV0dXJuIGZsb29yKCt0aGlzW09mZnNldERhdGVUaW1lX3ZhbHVlXSk7IH0vLy9cblx0LypzZXRUaW1lICh0aGlzIDpPZmZzZXREYXRlVGltZSwgdmFsdWUgOlRpbWUpIDp2b2lkIHtcblx0XHR2YWx1ZSA9IERBVEUuc2V0VGltZSh2YWx1ZSk7XG5cdFx0Y29uc3QgeiA9IFpfZXhlYyh0aGlzW09mZnNldERhdGVUaW1lX0lTT1N0cmluZ10pO1xuXHRcdERBVEUuc2V0VGltZSh2YWx1ZSArICggeiA/ICt6WzFdKjYwICsgKyggelsyXSArIHpbM10gKSA6IDAgKSo2MDAwMCk7XG5cdFx0dGhpc1tPZmZzZXREYXRlVGltZV9JU09TdHJpbmddID0geiA/IERBVEUudG9JU09TdHJpbmcoKS5zbGljZSgwLCAtMSkgKyB6WzBdIDogREFURS50b0lTT1N0cmluZygpO1xuXHRcdHRoaXNbT2Zmc2V0RGF0ZVRpbWVfdmFsdWVdID0gVmFsdWVPRkZTRVQodmFsdWUsICcnKTtcblx0XHQvLy9yZXR1cm4gdmFsdWU7XG5cdH0qL1xuXHRcbn0pO1xuXG5jb25zdCBMb2NhbERhdGVUaW1lX0lTT1N0cmluZyAgICAgICAgICAgICAgICA9IFN5bWJvbCgnTG9jYWxEYXRlVGltZV9JU09TdHJpbmcnKSAgICAgICA7XG5jb25zdCBMb2NhbERhdGVUaW1lX3ZhbHVlICAgICAgICAgICAgICAgID0gU3ltYm9sKCdMb2NhbERhdGVUaW1lX3ZhbHVlJykgICAgICAgO1xuY29uc3QgTG9jYWxEYXRlVGltZV9nZXQgPSAodGhhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc3RhcnQgICAgICAgICwgZW5kICAgICAgICApID0+ICt0aGF0W0xvY2FsRGF0ZVRpbWVfSVNPU3RyaW5nXS5zbGljZShzdGFydCwgZW5kKTtcbmNvbnN0IExvY2FsRGF0ZVRpbWVfc2V0ID0gKHRoYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0YXJ0ICAgICAgICAsIGVuZCAgICAgICAgLCB2YWx1ZSAgICAgICAgKSAgICAgICA9PiB7XG5cdGNvbnN0IHN0cmluZyA9ICcnICsgdmFsdWU7XG5cdGNvbnN0IHNpemUgPSBlbmQgLSBzdGFydDtcblx0aWYgKCBzdHJpbmcubGVuZ3RoPnNpemUgKSB7IHRocm93IFJhbmdlRXJyb3IoKTsgfS8vL1xuXHR0aGF0W0xvY2FsRGF0ZVRpbWVfdmFsdWVdID0gVmFsdWUoXG5cdFx0dGhhdFtMb2NhbERhdGVUaW1lX0lTT1N0cmluZ10gPSB0aGF0W0xvY2FsRGF0ZVRpbWVfSVNPU3RyaW5nXS5zbGljZSgwLCBzdGFydCkgKyBzdHJpbmcucGFkU3RhcnQoc2l6ZSwgJzAnKSArIHRoYXRbTG9jYWxEYXRlVGltZV9JU09TdHJpbmddLnNsaWNlKGVuZClcblx0KTtcbn07XG5leHBvcnQgY29uc3QgTG9jYWxEYXRlVGltZSA9IC8qI19fUFVSRV9fKi9mcGMoY2xhc3MgTG9jYWxEYXRlVGltZSBleHRlbmRzIERhdGV0aW1lIHtcblx0XG5cdFtMb2NhbERhdGVUaW1lX0lTT1N0cmluZ10gICAgICAgIDtcblx0W0xvY2FsRGF0ZVRpbWVfdmFsdWVdICAgICAgIDtcblx0XG5cdGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSAoKSB7IHJldHVybiAnTG9jYWxEYXRlVGltZScgICAgICAgICA7IH1cblx0XG5cdCAgICAgICAgIHZhbHVlT2YgKCAgICAgICAgICAgICAgICAgICApICAgICAgICB7IHJldHVybiB0aGlzW0xvY2FsRGF0ZVRpbWVfdmFsdWVdOyB9XG5cdHRvSVNPU3RyaW5nICggICAgICAgICAgICAgICAgICAgKSAgICAgICAgIHsgcmV0dXJuIHRoaXNbTG9jYWxEYXRlVGltZV9JU09TdHJpbmddOyB9XG5cdFxuXHRjb25zdHJ1Y3RvciAobGl0ZXJhbCAgICAgICAgKSB7XG5cdFx0SVNfTE9DQUxfREFURVRJTUUobGl0ZXJhbCkgJiYgdmFsaWRhdGVMZWFwKGxpdGVyYWwpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgSW52YWxpZCBMb2NhbCBEYXRlLVRpbWUgJHtsaXRlcmFsfWAgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzW0xvY2FsRGF0ZVRpbWVfdmFsdWVdID0gVmFsdWUoXG5cdFx0XHR0aGlzW0xvY2FsRGF0ZVRpbWVfSVNPU3RyaW5nXSA9IGxpdGVyYWwucmVwbGFjZShULCAnVCcpXG5cdFx0KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRcblx0Z2V0RnVsbFllYXIgKCAgICAgICAgICAgICAgICAgICApICAgICAgICAgICB7IHJldHVybiBMb2NhbERhdGVUaW1lX2dldCh0aGlzLCAwLCA0KTsgfVxuXHRzZXRGdWxsWWVhciAoICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgICAgKSAgICAgICB7IExvY2FsRGF0ZVRpbWVfc2V0KHRoaXMsIDAsIDQsIHZhbHVlKTsgfVxuXHRnZXRNb250aCAoICAgICAgICAgICAgICAgICAgICkgICAgICAgIHsgcmV0dXJuIExvY2FsRGF0ZVRpbWVfZ2V0KHRoaXMsIDUsIDcpIC0gMTsgfVxuXHRzZXRNb250aCAoICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgKSAgICAgICB7IExvY2FsRGF0ZVRpbWVfc2V0KHRoaXMsIDUsIDcsIHZhbHVlICsgMSk7IH1cblx0Z2V0RGF0ZSAoICAgICAgICAgICAgICAgICAgICkgICAgICAgeyByZXR1cm4gTG9jYWxEYXRlVGltZV9nZXQodGhpcywgOCwgMTApOyB9XG5cdHNldERhdGUgKCAgICAgICAgICAgICAgICAgICAgIHZhbHVlICAgICAgKSAgICAgICB7IExvY2FsRGF0ZVRpbWVfc2V0KHRoaXMsIDgsIDEwLCB2YWx1ZSk7IH1cblx0XG5cdGdldEhvdXJzICggICAgICAgICAgICAgICAgICAgKSAgICAgICAgeyByZXR1cm4gTG9jYWxEYXRlVGltZV9nZXQodGhpcywgMTEsIDEzKTsgfVxuXHRzZXRIb3VycyAoICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgKSAgICAgICB7IExvY2FsRGF0ZVRpbWVfc2V0KHRoaXMsIDExLCAxMywgdmFsdWUpOyB9XG5cdGdldE1pbnV0ZXMgKCAgICAgICAgICAgICAgICAgICApICAgICAgICAgIHsgcmV0dXJuIExvY2FsRGF0ZVRpbWVfZ2V0KHRoaXMsIDE0LCAxNik7IH1cblx0c2V0TWludXRlcyAoICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgICApICAgICAgIHsgTG9jYWxEYXRlVGltZV9zZXQodGhpcywgMTQsIDE2LCB2YWx1ZSk7IH1cblx0Z2V0U2Vjb25kcyAoICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgeyByZXR1cm4gTG9jYWxEYXRlVGltZV9nZXQodGhpcywgMTcsIDE5KTsgfVxuXHRzZXRTZWNvbmRzICggICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICAgICkgICAgICAgeyBMb2NhbERhdGVUaW1lX3NldCh0aGlzLCAxNywgMTksIHZhbHVlKTsgfVxuXHRnZXRNaWxsaXNlY29uZHMgKCAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgeyByZXR1cm4gK3RoaXNbTG9jYWxEYXRlVGltZV92YWx1ZV0uc2xpY2UoMTQsIDE3KS5wYWRFbmQoMywgJzAnKTsgfS8vL1xuXHRzZXRNaWxsaXNlY29uZHMgKCAgICAgICAgICAgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICApICAgICAgIHtcblx0XHR0aGlzW0xvY2FsRGF0ZVRpbWVfdmFsdWVdID0gVmFsdWUoXG5cdFx0XHR0aGlzW0xvY2FsRGF0ZVRpbWVfSVNPU3RyaW5nXSA9IHRoaXNbTG9jYWxEYXRlVGltZV9JU09TdHJpbmddLnNsaWNlKDAsIDE5KSArICggdmFsdWUgPyAoICcuJyArICggJycgKyB2YWx1ZSApLnBhZFN0YXJ0KDMsICcwJykgKS5yZXBsYWNlKERPVF9aRVJPLCAnJykgOiAnJyApXG5cdFx0KTtcblx0fVxuXHRcbn0pO1xuXG5jb25zdCBMb2NhbERhdGVfSVNPU3RyaW5nICAgICAgICAgICAgICAgID0gU3ltYm9sKCdMb2NhbERhdGVfSVNPU3RyaW5nJykgICAgICAgO1xuY29uc3QgTG9jYWxEYXRlX3ZhbHVlICAgICAgICAgICAgICAgID0gU3ltYm9sKCdMb2NhbERhdGVfdmFsdWUnKSAgICAgICA7XG5jb25zdCBMb2NhbERhdGVfZ2V0ID0gKHRoYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc3RhcnQgICAgICAgICwgZW5kICAgICAgICApID0+ICt0aGF0W0xvY2FsRGF0ZV9JU09TdHJpbmddLnNsaWNlKHN0YXJ0LCBlbmQpO1xuY29uc3QgTG9jYWxEYXRlX3NldCA9ICh0aGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0YXJ0ICAgICAgICAsIGVuZCAgICAgICAgLCB2YWx1ZSAgICAgICAgKSAgICAgICA9PiB7XG5cdGNvbnN0IHN0cmluZyA9ICcnICsgdmFsdWU7XG5cdGNvbnN0IHNpemUgPSBlbmQgLSBzdGFydDtcblx0aWYgKCBzdHJpbmcubGVuZ3RoPnNpemUgKSB7IHRocm93IFJhbmdlRXJyb3IoKTsgfS8vL1xuXHR0aGF0W0xvY2FsRGF0ZV92YWx1ZV0gPSBWYWx1ZShcblx0XHR0aGF0W0xvY2FsRGF0ZV9JU09TdHJpbmddID0gdGhhdFtMb2NhbERhdGVfSVNPU3RyaW5nXS5zbGljZSgwLCBzdGFydCkgKyBzdHJpbmcucGFkU3RhcnQoc2l6ZSwgJzAnKSArIHRoYXRbTG9jYWxEYXRlX0lTT1N0cmluZ10uc2xpY2UoZW5kKVxuXHQpO1xufTtcbmV4cG9ydCBjb25zdCBMb2NhbERhdGUgPSAvKiNfX1BVUkVfXyovZnBjKGNsYXNzIExvY2FsRGF0ZSBleHRlbmRzIERhdGV0aW1lIHtcblx0XG5cdFtMb2NhbERhdGVfSVNPU3RyaW5nXSAgICAgICAgO1xuXHRbTG9jYWxEYXRlX3ZhbHVlXSAgICAgICA7XG5cdFxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10gKCkgeyByZXR1cm4gJ0xvY2FsRGF0ZScgICAgICAgICA7IH1cblx0XG5cdCAgICAgICAgIHZhbHVlT2YgKCAgICAgICAgICAgICAgICkgICAgICAgIHsgcmV0dXJuIHRoaXNbTG9jYWxEYXRlX3ZhbHVlXTsgfVxuXHR0b0lTT1N0cmluZyAoICAgICAgICAgICAgICAgKSAgICAgICAgIHsgcmV0dXJuIHRoaXNbTG9jYWxEYXRlX0lTT1N0cmluZ107IH1cblx0XG5cdGNvbnN0cnVjdG9yIChsaXRlcmFsICAgICAgICApIHtcblx0XHRJU19MT0NBTF9EQVRFKGxpdGVyYWwpICYmIHZhbGlkYXRlTGVhcChsaXRlcmFsKSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEludmFsaWQgTG9jYWwgRGF0ZSAke2xpdGVyYWx9YCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXNbTG9jYWxEYXRlX3ZhbHVlXSA9IFZhbHVlKFxuXHRcdFx0dGhpc1tMb2NhbERhdGVfSVNPU3RyaW5nXSA9IGxpdGVyYWxcblx0XHQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdFxuXHRnZXRGdWxsWWVhciAoICAgICAgICAgICAgICAgKSAgICAgICAgICAgeyByZXR1cm4gTG9jYWxEYXRlX2dldCh0aGlzLCAwLCA0KTsgfVxuXHRzZXRGdWxsWWVhciAoICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICAgICApICAgICAgIHsgTG9jYWxEYXRlX3NldCh0aGlzLCAwLCA0LCB2YWx1ZSk7IH1cblx0Z2V0TW9udGggKCAgICAgICAgICAgICAgICkgICAgICAgIHsgcmV0dXJuIExvY2FsRGF0ZV9nZXQodGhpcywgNSwgNykgLSAxOyB9XG5cdHNldE1vbnRoICggICAgICAgICAgICAgICAgIHZhbHVlICAgICAgICkgICAgICAgeyBMb2NhbERhdGVfc2V0KHRoaXMsIDUsIDcsIHZhbHVlICsgMSk7IH1cblx0Z2V0RGF0ZSAoICAgICAgICAgICAgICAgKSAgICAgICB7IHJldHVybiBMb2NhbERhdGVfZ2V0KHRoaXMsIDgsIDEwKTsgfVxuXHRzZXREYXRlICggICAgICAgICAgICAgICAgIHZhbHVlICAgICAgKSAgICAgICB7IExvY2FsRGF0ZV9zZXQodGhpcywgOCwgMTAsIHZhbHVlKTsgfVxuXHRcbn0pO1xuXG5jb25zdCBMb2NhbFRpbWVfSVNPU3RyaW5nICAgICAgICAgICAgICAgID0gU3ltYm9sKCdMb2NhbFRpbWVfSVNPU3RyaW5nJykgICAgICAgO1xuY29uc3QgTG9jYWxUaW1lX3ZhbHVlICAgICAgICAgICAgICAgID0gU3ltYm9sKCdMb2NhbFRpbWVfdmFsdWUnKSAgICAgICA7XG5jb25zdCBMb2NhbFRpbWVfZ2V0ID0gKHRoYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgc3RhcnQgICAgICAgICwgZW5kICAgICAgICApID0+ICt0aGF0W0xvY2FsVGltZV9JU09TdHJpbmddLnNsaWNlKHN0YXJ0LCBlbmQpO1xuY29uc3QgTG9jYWxUaW1lX3NldCA9ICh0aGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0YXJ0ICAgICAgICAsIGVuZCAgICAgICAgLCB2YWx1ZSAgICAgICAgKSAgICAgICA9PiB7XG5cdGNvbnN0IHN0cmluZyA9ICcnICsgdmFsdWU7XG5cdGNvbnN0IHNpemUgPSBlbmQgLSBzdGFydDtcblx0aWYgKCBzdHJpbmcubGVuZ3RoPnNpemUgKSB7IHRocm93IFJhbmdlRXJyb3IoKTsgfS8vL1xuXHR0aGF0W0xvY2FsVGltZV92YWx1ZV0gPSBWYWx1ZShcblx0XHR0aGF0W0xvY2FsVGltZV9JU09TdHJpbmddID0gdGhhdFtMb2NhbFRpbWVfSVNPU3RyaW5nXS5zbGljZSgwLCBzdGFydCkgKyBzdHJpbmcucGFkU3RhcnQoMiwgJzAnKSArIHRoYXRbTG9jYWxUaW1lX0lTT1N0cmluZ10uc2xpY2UoZW5kKVxuXHQpO1xufTtcbmV4cG9ydCBjb25zdCBMb2NhbFRpbWUgPSAvKiNfX1BVUkVfXyovZnBjKGNsYXNzIExvY2FsVGltZSBleHRlbmRzIERhdGV0aW1lIHtcblx0XG5cdFtMb2NhbFRpbWVfSVNPU3RyaW5nXSAgICAgICAgO1xuXHRbTG9jYWxUaW1lX3ZhbHVlXSAgICAgICA7XG5cdFxuXHRnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10gKCkgeyByZXR1cm4gJ0xvY2FsVGltZScgICAgICAgICA7IH1cblx0XG5cdCAgICAgICAgIHZhbHVlT2YgKCAgICAgICAgICAgICAgICkgICAgICAgIHsgcmV0dXJuIHRoaXNbTG9jYWxUaW1lX3ZhbHVlXTsgfVxuXHR0b0lTT1N0cmluZyAoICAgICAgICAgICAgICAgKSAgICAgICAgIHsgcmV0dXJuIHRoaXNbTG9jYWxUaW1lX0lTT1N0cmluZ107IH1cblx0XG5cdGNvbnN0cnVjdG9yIChsaXRlcmFsICAgICAgICApIHtcblx0XHRJU19MT0NBTF9USU1FKGxpdGVyYWwpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgSW52YWxpZCBMb2NhbCBUaW1lICR7bGl0ZXJhbH1gICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpc1tMb2NhbFRpbWVfdmFsdWVdID0gVmFsdWUoXG5cdFx0XHR0aGlzW0xvY2FsVGltZV9JU09TdHJpbmddID0gbGl0ZXJhbFxuXHRcdCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0XG5cdGdldEhvdXJzICggICAgICAgICAgICAgICApICAgICAgICB7IHJldHVybiBMb2NhbFRpbWVfZ2V0KHRoaXMsIDAsIDIpOyB9XG5cdHNldEhvdXJzICggICAgICAgICAgICAgICAgIHZhbHVlICAgICAgICkgICAgICAgeyBMb2NhbFRpbWVfc2V0KHRoaXMsIDAsIDIsIHZhbHVlKTsgfVxuXHRnZXRNaW51dGVzICggICAgICAgICAgICAgICApICAgICAgICAgIHsgcmV0dXJuIExvY2FsVGltZV9nZXQodGhpcywgMywgNSk7IH1cblx0c2V0TWludXRlcyAoICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICAgICkgICAgICAgeyBMb2NhbFRpbWVfc2V0KHRoaXMsIDMsIDUsIHZhbHVlKTsgfVxuXHRnZXRTZWNvbmRzICggICAgICAgICAgICAgICApICAgICAgICAgIHsgcmV0dXJuIExvY2FsVGltZV9nZXQodGhpcywgNiwgOCk7IH1cblx0c2V0U2Vjb25kcyAoICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICAgICkgICAgICAgeyBMb2NhbFRpbWVfc2V0KHRoaXMsIDYsIDgsIHZhbHVlKTsgfVxuXHRnZXRNaWxsaXNlY29uZHMgKCAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICB7IHJldHVybiArdGhpc1tMb2NhbFRpbWVfdmFsdWVdLnNsaWNlKDYsIDkpLnBhZEVuZCgzLCAnMCcpOyB9Ly8vXG5cdHNldE1pbGxpc2Vjb25kcyAoICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgICAgKSAgICAgICB7XG5cdFx0dGhpc1tMb2NhbFRpbWVfdmFsdWVdID0gVmFsdWUoXG5cdFx0XHR0aGlzW0xvY2FsVGltZV9JU09TdHJpbmddID0gdGhpc1tMb2NhbFRpbWVfSVNPU3RyaW5nXS5zbGljZSgwLCA4KSArICggdmFsdWUgPyAoICcuJyArICggJycgKyB2YWx1ZSApLnBhZFN0YXJ0KDMsICcwJykgKS5yZXBsYWNlKERPVF9aRVJPLCAnJykgOiAnJyApXG5cdFx0KTtcblx0fVxuXHRcbn0pO1xuIiwiaW1wb3J0IFJhbmdlRXJyb3IgZnJvbSAnLlJhbmdlRXJyb3InO1xuaW1wb3J0IHBhcnNlSW50IGZyb20gJy5wYXJzZUludCc7XG5pbXBvcnQgZnJvbUNoYXJDb2RlIGZyb20gJy5TdHJpbmcuZnJvbUNoYXJDb2RlJztcbmltcG9ydCBmcm9tQ29kZVBvaW50IGZyb20gJy5TdHJpbmcuZnJvbUNvZGVQb2ludCc7XG5cbmltcG9ydCAqIGFzIGl0ZXJhdG9yIGZyb20gJy4uL2l0ZXJhdG9yJztcbmltcG9ydCAqIGFzIG9wdGlvbnMgZnJvbSAnLi4vb3B0aW9ucyc7XG5cbmNvbnN0IEVTQ0FQRURfSU5fU0lOR0xFX0xJTkUgPSAvW15cXFxcXSt8XFxcXCg/OltcXFxcXCJidG5mci9dfHUuezR9fFUuezh9KS9ncztcbmNvbnN0IEVTQ0FQRURfSU5fTVVMVElfTElORSA9IC9bXlxcblxcXFxdK3xcXG58XFxcXCg/OltcXHQgXSpcXG5bXFx0XFxuIF0qfFtcXFxcXCJidG5mci9dfHUuezR9fFUuezh9KS9ncztcblxuZXhwb3J0IGNvbnN0IEJhc2ljU3RyaW5nID0gKGxpdGVyYWwgICAgICAgICkgICAgICAgICA9PiB7XG5cdGlmICggIWxpdGVyYWwgKSB7IHJldHVybiAnJzsgfVxuXHRjb25zdCBwYXJ0cyA9IGxpdGVyYWwubWF0Y2goRVNDQVBFRF9JTl9TSU5HTEVfTElORSkgO1xuXHRjb25zdCB7IGxlbmd0aCB9ID0gcGFydHM7XG5cdGxldCBpbmRleCA9IDA7XG5cdGRvIHtcblx0XHRjb25zdCBwYXJ0ID0gcGFydHNbaW5kZXhdIDtcblx0XHRpZiAoIHBhcnRbMF09PT0nXFxcXCcgKSB7XG5cdFx0XHRzd2l0Y2ggKCBwYXJ0WzFdICkge1xuXHRcdFx0XHRjYXNlICdcXFxcJzogcGFydHNbaW5kZXhdID0gJ1xcXFwnOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnXCInOiBwYXJ0c1tpbmRleF0gPSAnXCInOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnYic6IHBhcnRzW2luZGV4XSA9ICdcXGInOyBicmVhaztcblx0XHRcdFx0Y2FzZSAndCc6IHBhcnRzW2luZGV4XSA9ICdcXHQnOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnbic6IHBhcnRzW2luZGV4XSA9ICdcXG4nOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnZic6IHBhcnRzW2luZGV4XSA9ICdcXGYnOyBicmVhaztcblx0XHRcdFx0Y2FzZSAncic6IHBhcnRzW2luZGV4XSA9ICdcXHInOyBicmVhaztcblx0XHRcdFx0Y2FzZSAndSc6XG5cdFx0XHRcdFx0Y29uc3QgY2hhckNvZGUgICAgICAgICA9IHBhcnNlSW50KHBhcnQuc2xpY2UoMiksIDE2KTtcblx0XHRcdFx0XHRvcHRpb25zLm11c3RTY2FsYXIgJiYgMHhEN0ZGPGNoYXJDb2RlICYmIGNoYXJDb2RlPDB4RTAwMFxuXHRcdFx0XHRcdCYmIGl0ZXJhdG9yLnRocm93cyhSYW5nZUVycm9yKGBJbnZhbGlkIFVuaWNvZGUgU2NhbGFyICR7cGFydH1gICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdFx0XHRcdHBhcnRzW2luZGV4XSA9IGZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1UnOlxuXHRcdFx0XHRcdGNvbnN0IGNvZGVQb2ludCAgICAgICAgID0gcGFyc2VJbnQocGFydC5zbGljZSgyKSwgMTYpO1xuXHRcdFx0XHRcdCggb3B0aW9ucy5tdXN0U2NhbGFyICYmIDB4RDdGRjxjb2RlUG9pbnQgJiYgY29kZVBvaW50PDB4RTAwMCB8fCAweDEwRkZGRjxjb2RlUG9pbnQgKVxuXHRcdFx0XHRcdCYmIGl0ZXJhdG9yLnRocm93cyhSYW5nZUVycm9yKGBJbnZhbGlkIFVuaWNvZGUgU2NhbGFyICR7cGFydH1gICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdFx0XHRcdHBhcnRzW2luZGV4XSA9IGZyb21Db2RlUG9pbnQoY29kZVBvaW50KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnLyc6IHBhcnRzW2luZGV4XSA9ICcvJzsgYnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHdoaWxlICggKytpbmRleCE9PWxlbmd0aCApO1xuXHRyZXR1cm4gcGFydHMuam9pbignJyk7XG59O1xuXG5leHBvcnQgY29uc3QgTXVsdGlsaW5lQmFzaWNTdHJpbmcgPSAobGl0ZXJhbCAgICAgICAgLCB1c2VXaGF0VG9Kb2luTXVsdGlsaW5lU3RyaW5nICAgICAgICAsIG4gICAgICAgICkgICAgICAgICA9PiB7XG5cdGlmICggIWxpdGVyYWwgKSB7IHJldHVybiAnJzsgfVxuXHRjb25zdCBwYXJ0cyA9IGxpdGVyYWwubWF0Y2goRVNDQVBFRF9JTl9NVUxUSV9MSU5FKSA7XG5cdGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXJ0cztcblx0bGV0IGluZGV4ID0gMDtcblx0ZG8ge1xuXHRcdGNvbnN0IHBhcnQgPSBwYXJ0c1tpbmRleF0gO1xuXHRcdGlmICggcGFydD09PSdcXG4nICkge1xuXHRcdFx0KytuO1xuXHRcdFx0cGFydHNbaW5kZXhdID0gdXNlV2hhdFRvSm9pbk11bHRpbGluZVN0cmluZztcblx0XHR9XG5cdFx0ZWxzZSBpZiAoIHBhcnRbMF09PT0nXFxcXCcgKSB7XG5cdFx0XHRzd2l0Y2ggKCBwYXJ0WzFdICkge1xuXHRcdFx0XHRjYXNlICdcXG4nOlxuXHRcdFx0XHRjYXNlICcgJzpcblx0XHRcdFx0Y2FzZSAnXFx0Jzpcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPSBwYXJ0LmluZGV4T2YoJ1xcbicsIGkpICsgMTsgKSB7ICsrbjsgfVxuXHRcdFx0XHRcdHBhcnRzW2luZGV4XSA9ICcnO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdcXFxcJzogcGFydHNbaW5kZXhdID0gJ1xcXFwnOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnXCInOiBwYXJ0c1tpbmRleF0gPSAnXCInOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnYic6IHBhcnRzW2luZGV4XSA9ICdcXGInOyBicmVhaztcblx0XHRcdFx0Y2FzZSAndCc6IHBhcnRzW2luZGV4XSA9ICdcXHQnOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnbic6IHBhcnRzW2luZGV4XSA9ICdcXG4nOyBicmVhaztcblx0XHRcdFx0Y2FzZSAnZic6IHBhcnRzW2luZGV4XSA9ICdcXGYnOyBicmVhaztcblx0XHRcdFx0Y2FzZSAncic6IHBhcnRzW2luZGV4XSA9ICdcXHInOyBicmVhaztcblx0XHRcdFx0Y2FzZSAndSc6XG5cdFx0XHRcdFx0Y29uc3QgY2hhckNvZGUgICAgICAgICA9IHBhcnNlSW50KHBhcnQuc2xpY2UoMiksIDE2KTtcblx0XHRcdFx0XHRvcHRpb25zLm11c3RTY2FsYXIgJiYgMHhEN0ZGPGNoYXJDb2RlICYmIGNoYXJDb2RlPDB4RTAwMFxuXHRcdFx0XHRcdCYmIGl0ZXJhdG9yLnRocm93cyhSYW5nZUVycm9yKGBJbnZhbGlkIFVuaWNvZGUgU2NhbGFyICR7cGFydH1gICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnLCBpdGVyYXRvci5saW5lSW5kZXggKyBuKSkpO1xuXHRcdFx0XHRcdHBhcnRzW2luZGV4XSA9IGZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ1UnOlxuXHRcdFx0XHRcdGNvbnN0IGNvZGVQb2ludCAgICAgICAgID0gcGFyc2VJbnQocGFydC5zbGljZSgyKSwgMTYpO1xuXHRcdFx0XHRcdCggb3B0aW9ucy5tdXN0U2NhbGFyICYmIDB4RDdGRjxjb2RlUG9pbnQgJiYgY29kZVBvaW50PDB4RTAwMCB8fCAweDEwRkZGRjxjb2RlUG9pbnQgKVxuXHRcdFx0XHRcdCYmIGl0ZXJhdG9yLnRocm93cyhSYW5nZUVycm9yKGBJbnZhbGlkIFVuaWNvZGUgU2NhbGFyICR7cGFydH1gICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnLCBpdGVyYXRvci5saW5lSW5kZXggKyBuKSkpO1xuXHRcdFx0XHRcdHBhcnRzW2luZGV4XSA9IGZyb21Db2RlUG9pbnQoY29kZVBvaW50KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnLyc6IHBhcnRzW2luZGV4XSA9ICcvJzsgYnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHdoaWxlICggKytpbmRleCE9PWxlbmd0aCApO1xuXHRyZXR1cm4gcGFydHMuam9pbignJyk7XG59O1xuIiwiaW1wb3J0IFN5bnRheEVycm9yIGZyb20gJy5TeW50YXhFcnJvcic7XG5pbXBvcnQgUmFuZ2VFcnJvciBmcm9tICcuUmFuZ2VFcnJvcic7XG5pbXBvcnQgQmlnSW50IGZyb20gJy5CaWdJbnQ/JztcbmltcG9ydCBwYXJzZUludCBmcm9tICcucGFyc2VJbnQnO1xuaW1wb3J0IGlzU2FmZUludGVnZXIgZnJvbSAnLk51bWJlci5pc1NhZmVJbnRlZ2VyJztcblxuaW1wb3J0IHsgbmV3UmVnRXhwLCB0aGVSZWdFeHAgfSBmcm9tICdAbHRkL2otcmVnZXhwJztcblxuaW1wb3J0ICogYXMgaXRlcmF0b3IgZnJvbSAnLi4vaXRlcmF0b3InO1xuaW1wb3J0ICogYXMgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuZXhwb3J0IGNvbnN0IElOVEVHRVJfRCA9IC9bLStdPyg/OjB8WzEtOV1bX1xcZF0qKS87XG5leHBvcnQgY29uc3QgeyB0ZXN0OiBCQURfRCB9ID0gLyojX19QVVJFX18qL25ld1JlZ0V4cGBfKD8hXFxkKWAudmFsdWVPZigpO1xuY29uc3QgeyB0ZXN0OiBJU19EX0lOVEVHRVIgfSA9IC8qI19fUFVSRV9fKi9uZXdSZWdFeHBgXiR7SU5URUdFUl9EfSRgLnZhbHVlT2YoKTtcbmNvbnN0IHsgdGVzdDogSVNfWE9CX0lOVEVHRVIgfSA9IHRoZVJlZ0V4cCgvXjAoPzp4W1xcZEEtRmEtZl1bX1xcZEEtRmEtZl0qfG9bMC03XVtfMC03XSp8YlswMV1bXzAxXSopJC8pO1xuY29uc3QgeyB0ZXN0OiBCQURfWE9CIH0gPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwYF8oPyFbXFxkQS1GYS1mXSlgLnZhbHVlT2YoKTtcbmNvbnN0IFVOREVSU0NPUkVTID0gL18vZztcbmNvbnN0IFVOREVSU0NPUkVTX1NJR04gPSAvX3xeWy0rXS9nO1xuXG5jb25zdCBJU19JTlRFR0VSID0gKGxpdGVyYWwgICAgICAgICkgICAgICAgICAgPT4gKCBJU19EX0lOVEVHRVIobGl0ZXJhbCkgfHwgLypvcHRpb25zLnhvYiAmJiAqL0lTX1hPQl9JTlRFR0VSKGxpdGVyYWwpICkgJiYgIUJBRF9YT0IobGl0ZXJhbCk7XG5cbmNvbnN0IE1JTiAgICAgICAgID0gQmlnSW50ICYmIC0vKiNfX1BVUkVfXyovQmlnSW50KCcweDgwMDAwMDAwMDAwMDAwMDAnKTsvLyAtKDJuKiooNjRuLTFuKSkgfHwgLU1BWC0xblxuY29uc3QgTUFYICAgICAgICAgPSBCaWdJbnQgJiYgLyojX19QVVJFX18qL0JpZ0ludCgnMHg3RkZGRkZGRkZGRkZGRkZGJyk7Ly8gMm4qKig2NG4tMW4pLTFuIHx8IC1NSU4tMW5cblxuY29uc3QgQmlnSW50SW50ZWdlciA9IChsaXRlcmFsICAgICAgICApICAgICAgICAgPT4ge1xuXHRJU19JTlRFR0VSKGxpdGVyYWwpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgSW52YWxpZCBJbnRlZ2VyICR7bGl0ZXJhbH1gICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRjb25zdCBiaWdJbnQgICAgICAgICA9IGxpdGVyYWxbMF09PT0nLSdcblx0XHQ/IC1CaWdJbnQobGl0ZXJhbC5yZXBsYWNlKFVOREVSU0NPUkVTX1NJR04sICcnKSlcblx0XHQ6IEJpZ0ludChsaXRlcmFsLnJlcGxhY2UoVU5ERVJTQ09SRVNfU0lHTiwgJycpKTtcblx0b3B0aW9ucy5hbGxvd0xvbmdlciB8fCBNSU48PWJpZ0ludCAmJiBiaWdJbnQ8PU1BWCB8fCBpdGVyYXRvci50aHJvd3MoUmFuZ2VFcnJvcihgSW50ZWdlciBleHBlY3QgNjQgYml0IHJhbmdlICgtOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwOCB0byA5LDIyMywzNzIsMDM2LDg1NCw3NzUsODA3KSwgbm90IGluY2x1ZGVzICR7bGl0ZXJhbH1gICsgaXRlcmF0b3Iud2hlcmUoJyBtZWV0IGF0ICcpKSk7XG5cdHJldHVybiBiaWdJbnQ7XG59O1xuXG5jb25zdCBOdW1iZXJJbnRlZ2VyID0gKGxpdGVyYWwgICAgICAgICkgICAgICAgICA9PiB7XG5cdElTX0lOVEVHRVIobGl0ZXJhbCkgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBJbnZhbGlkIEludGVnZXIgJHtsaXRlcmFsfWAgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7XG5cdGNvbnN0IG51bWJlciA9IHBhcnNlSW50KGxpdGVyYWwucmVwbGFjZShVTkRFUlNDT1JFUywgJycpKTtcblx0aXNTYWZlSW50ZWdlcihudW1iZXIpIHx8IGl0ZXJhdG9yLnRocm93cyhSYW5nZUVycm9yKGBJbnRlZ2VyIGRpZCBub3QgdXNlIEJpdEludCBtdXN0IGZpdCBOdW1iZXIuaXNTYWZlSW50ZWdlciwgbm90IGluY2x1ZGVzICR7bGl0ZXJhbH1gICsgaXRlcmF0b3Iud2hlcmUoJyBtZWV0IGF0ICcpKSk7XG5cdHJldHVybiBudW1iZXI7XG59O1xuXG5leHBvcnQgY29uc3QgSW50ZWdlciA9IChsaXRlcmFsICAgICAgICApICAgICAgICAgICAgICAgICAgPT4ge1xuXHRpZiAoIG9wdGlvbnMudXNpbmdCaWdJbnQ9PT10cnVlICkgeyByZXR1cm4gQmlnSW50SW50ZWdlcihsaXRlcmFsKTsgfVxuXHRpZiAoIG9wdGlvbnMudXNpbmdCaWdJbnQ9PT1mYWxzZSApIHsgcmV0dXJuIE51bWJlckludGVnZXIobGl0ZXJhbCk7IH1cblx0SVNfSU5URUdFUihsaXRlcmFsKSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEludmFsaWQgSW50ZWdlciAke2xpdGVyYWx9YCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0Y29uc3QgbnVtYmVyICAgICAgICAgPSBwYXJzZUludChsaXRlcmFsLnJlcGxhY2UoVU5ERVJTQ09SRVMsICcnKSk7XG5cdGlmICggb3B0aW9ucy5JbnRlZ2VyTWluTnVtYmVyPD1udW1iZXIgJiYgbnVtYmVyPD1vcHRpb25zLkludGVnZXJNYXhOdW1iZXIgKSB7IHJldHVybiBudW1iZXI7IH1cblx0Y29uc3QgYmlnSW50ICAgICAgICAgPSBsaXRlcmFsWzBdPT09Jy0nXG5cdFx0PyAtQmlnSW50KGxpdGVyYWwucmVwbGFjZShVTkRFUlNDT1JFU19TSUdOLCAnJykpXG5cdFx0OiBCaWdJbnQobGl0ZXJhbC5yZXBsYWNlKFVOREVSU0NPUkVTX1NJR04sICcnKSk7XG5cdG9wdGlvbnMuYWxsb3dMb25nZXIgfHwgTUlOPD1iaWdJbnQgJiYgYmlnSW50PD1NQVggfHwgaXRlcmF0b3IudGhyb3dzKFJhbmdlRXJyb3IoYEludGVnZXIgZXhwZWN0IDY0IGJpdCByYW5nZSAoLTksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDggdG8gOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwNyksIG5vdCBpbmNsdWRlcyAke2xpdGVyYWx9YCArIGl0ZXJhdG9yLndoZXJlKCcgbWVldCBhdCAnKSkpO1xuXHRyZXR1cm4gYmlnSW50O1xufTtcbiIsImltcG9ydCBTeW50YXhFcnJvciBmcm9tICcuU3ludGF4RXJyb3InO1xuaW1wb3J0IFJhbmdlRXJyb3IgZnJvbSAnLlJhbmdlRXJyb3InO1xuaW1wb3J0IGlzRmluaXRlIGZyb20gJy5pc0Zpbml0ZSc7XG5pbXBvcnQgSW5maW5pdHkgZnJvbSAnLkluZmluaXR5JztcbmltcG9ydCBOYU4gZnJvbSAnLk5hTic7XG5cbmltcG9ydCB7IG5ld1JlZ0V4cCwgdGhlUmVnRXhwIH0gZnJvbSAnQGx0ZC9qLXJlZ2V4cCc7XG5pbXBvcnQgeyBJTlRFR0VSX0QsIEJBRF9EIH0gZnJvbSAnLi9JbnRlZ2VyJztcblxuaW1wb3J0ICogYXMgaXRlcmF0b3IgZnJvbSAnLi4vaXRlcmF0b3InO1xuaW1wb3J0ICogYXMgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuY29uc3QgX05hTiA9IC1OYU47XG5jb25zdCBfSW5maW5pdHkgPSAtSW5maW5pdHk7XG5jb25zdCB7IHRlc3Q6IElTX0ZMT0FUIH0gPSAvKiNfX1BVUkVfXyovbmV3UmVnRXhwYFxuXHReXG5cdCR7SU5URUdFUl9EfVxuXHQoPzpcblx0XHRcXC5cXGRbX1xcZF0qXG5cdFx0KD86W2VFXVstK10/XFxkW19cXGRdKik/XG5cdHxcblx0XHRbZUVdWy0rXT9cXGRbX1xcZF0qXG5cdClcblx0JGAudmFsdWVPZigpO1xuY29uc3QgVU5ERVJTQ09SRVMgPSAvXy9nO1xuY29uc3QgeyB0ZXN0OiBJU19aRVJPIH0gPSB0aGVSZWdFeHAoL15bLStdPzAoPzpcXC4wKyk/KD86W2VFXVstK10/MCspPyQvKTtcbmNvbnN0IHsgZXhlYzogTk9STUFMSVpFRCB9ID0gdGhlUmVnRXhwICAgKC9eWy0wXT8oXFxkKikoPzpcXC4oXFxkKykpPyg/OmVcXCs/KC0/XFxkKykpPyQvKTtcbmNvbnN0IHsgZXhlYzogT1JJR0lOQUwgfSA9IHRoZVJlZ0V4cCAgICgvXlstK10/MD8oXFxkKikoPzpcXC4oXFxkKj8pMCopPyg/OltlRV1cXCs/KC0/XFxkKykpPyQvKTtcblxuZXhwb3J0IGNvbnN0IEZsb2F0ID0gKGxpdGVyYWwgICAgICAgICkgICAgICAgICA9PiB7XG5cdGlmICggIUlTX0ZMT0FUKGxpdGVyYWwpIHx8IEJBRF9EKGxpdGVyYWwpICkge1xuXHRcdGlmICggb3B0aW9ucy5zRmxvYXQgKSB7XG5cdFx0XHRpZiAoIGxpdGVyYWw9PT0naW5mJyB8fCBsaXRlcmFsPT09JytpbmYnICkgeyByZXR1cm4gSW5maW5pdHk7IH1cblx0XHRcdGlmICggbGl0ZXJhbD09PSctaW5mJyApIHsgcmV0dXJuIF9JbmZpbml0eTsgfVxuXHRcdFx0aWYgKCBsaXRlcmFsPT09J25hbicgfHwgbGl0ZXJhbD09PScrbmFuJyApIHsgcmV0dXJuIE5hTjsgfVxuXHRcdFx0aWYgKCBsaXRlcmFsPT09Jy1uYW4nICkgeyByZXR1cm4gX05hTjsgfVxuXHRcdH1cblx0XHRlbHNlIGlmICggIW9wdGlvbnMuc0Vycm9yICkge1xuXHRcdFx0aWYgKCBsaXRlcmFsPT09J2luZicgfHwgbGl0ZXJhbD09PScraW5mJyApIHsgcmV0dXJuIEluZmluaXR5OyB9XG5cdFx0XHRpZiAoIGxpdGVyYWw9PT0nLWluZicgKSB7IHJldHVybiBfSW5maW5pdHk7IH1cblx0XHR9XG5cdFx0dGhyb3cgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBJbnZhbGlkIEZsb2F0ICR7bGl0ZXJhbH1gICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHR9XG5cdGNvbnN0IHdpdGhvdXRVbmRlcnNjb3JlcyAgICAgICAgID0gbGl0ZXJhbC5yZXBsYWNlKFVOREVSU0NPUkVTLCAnJyk7XG5cdGNvbnN0IG51bWJlciAgICAgICAgID0gK3dpdGhvdXRVbmRlcnNjb3Jlcztcblx0aWYgKCBvcHRpb25zLnNFcnJvciApIHtcblx0XHRpc0Zpbml0ZShudW1iZXIpIHx8IGl0ZXJhdG9yLnRocm93cyhSYW5nZUVycm9yKGBGbG9hdCAke2xpdGVyYWx9IGhhcyBiZWVuIGFzIGJpZyBhcyBpbmZgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdG51bWJlciB8fCBJU19aRVJPKHdpdGhvdXRVbmRlcnNjb3JlcykgfHwgaXRlcmF0b3IudGhyb3dzKFJhbmdlRXJyb3IoYEZsb2F0ICR7bGl0ZXJhbH0gaGFzIGJlZW4gYXMgbGl0dGxlIGFzICR7bGl0ZXJhbFswXT09PSctJyA/ICctJyA6ICcnfTBgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdGNvbnN0IHsgMTogbm9ybWFsaXplZF9pbnRlZ2VyLCAyOiBub3JtYWxpemVkX2ZyYWN0aW9uYWwgPSAnJywgMzogbm9ybWFsaXplZF9leHBvbmVudCA9ICcnIH0gPSBOT1JNQUxJWkVEKG51bWJlciAgICAgICApIDtcblx0XHRjb25zdCB7IDE6IG9yaWdpbmFsX2ludGVnZXIsIDI6IG9yaWdpbmFsX2ZyYWN0aW9uYWwgPSAnJywgMzogb3JpZ2luYWxfZXhwb25lbnQgPSAnJyB9ID0gT1JJR0lOQUwod2l0aG91dFVuZGVyc2NvcmVzKSA7XG5cdFx0b3JpZ2luYWxfaW50ZWdlciArIG9yaWdpbmFsX2ZyYWN0aW9uYWw9PT1ub3JtYWxpemVkX2ludGVnZXIgKyBub3JtYWxpemVkX2ZyYWN0aW9uYWxcblx0XHQmJlxuXHRcdG9yaWdpbmFsX2V4cG9uZW50ICAgICAgICAtIG9yaWdpbmFsX2ZyYWN0aW9uYWwubGVuZ3RoPT09bm9ybWFsaXplZF9leHBvbmVudCAgICAgICAgLSBub3JtYWxpemVkX2ZyYWN0aW9uYWwubGVuZ3RoXG5cdFx0fHxcblx0XHRpdGVyYXRvci50aHJvd3MoUmFuZ2VFcnJvcihgRmxvYXQgJHtsaXRlcmFsfSBoYXMgbG9zdCBpdHMgZXhhY3QgYW5kIGJlZW4gJHtudW1iZXJ9YCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0fVxuXHRyZXR1cm4gbnVtYmVyO1xufTtcbiIsImltcG9ydCBFcnJvciBmcm9tICcuRXJyb3InO1xuaW1wb3J0IFN5bnRheEVycm9yIGZyb20gJy5TeW50YXhFcnJvcic7XG5cbmltcG9ydCAqIGFzIGl0ZXJhdG9yIGZyb20gJy4uL2l0ZXJhdG9yJztcbmltcG9ydCAqIGFzIHJlZ2V4cHMgZnJvbSAnLi4vcmVnZXhwcyc7XG5pbXBvcnQgeyBMaXRlcmFsT2JqZWN0IH0gZnJvbSAnLi4vdHlwZXMvYXRvbSc7XG5pbXBvcnQgeyBuZXdBcnJheSwgT0ZfVEFCTEVTLCBpc0FycmF5LCBpc1N0YXRpYyB9IGZyb20gJy4uL3R5cGVzL0FycmF5JztcbmltcG9ydCB7IERJUkVDVExZLCBJTVBMSUNJVExZLCBQQUlSLCBpc1RhYmxlLCBpc0lubGluZSwgZGlyZWN0bHlJZk5vdCwgZnJvbVBhaXIgfSBmcm9tICcuLi90eXBlcy9UYWJsZSc7XG5pbXBvcnQgKiBhcyBvcHRpb25zIGZyb20gJy4uL29wdGlvbnMnO1xuaW1wb3J0IHsgQmFzaWNTdHJpbmcsIE11bHRpbGluZUJhc2ljU3RyaW5nIH0gZnJvbSAnLi4vdHlwZXMvU3RyaW5nJztcblxuZXhwb3J0IGNvbnN0IHByZXBhcmVUYWJsZSA9ICh0YWJsZSAgICAgICAsIGtleXMgICAgICAgICAgICAgICApICAgICAgICA9PiB7XG5cdGNvbnN0IHsgbGVuZ3RoIH0gPSBrZXlzO1xuXHRsZXQgaW5kZXggICAgICAgICA9IDA7XG5cdHdoaWxlICggaW5kZXg8bGVuZ3RoICkge1xuXHRcdGNvbnN0IGtleSAgICAgICAgID0ga2V5c1tpbmRleCsrXSA7XG5cdFx0aWYgKCBrZXkgaW4gdGFibGUgKSB7XG5cdFx0XHR0YWJsZSA9IHRhYmxlW2tleV07XG5cdFx0XHRpZiAoIGlzVGFibGUodGFibGUpICkge1xuXHRcdFx0XHRpc0lubGluZSh0YWJsZSkgJiYgaXRlcmF0b3IudGhyb3dzKEVycm9yKGBUcnlpbmcgdG8gZGVmaW5lIFRhYmxlIHVuZGVyIElubGluZSBUYWJsZWAgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICggaXNBcnJheSh0YWJsZSkgKSB7XG5cdFx0XHRcdGlzU3RhdGljKHRhYmxlKSAmJiBpdGVyYXRvci50aHJvd3MoRXJyb3IoYFRyeWluZyB0byBhcHBlbmQgdmFsdWUgdG8gU3RhdGljIEFycmF5YCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRcdFx0dGFibGUgPSB0YWJsZVsoIHRhYmxlICAgICAgICAgICkubGVuZ3RoIC0gMV07XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHsgdGhyb3cgaXRlcmF0b3IudGhyb3dzKEVycm9yKGBUcnlpbmcgdG8gZGVmaW5lIFRhYmxlIHVuZGVyIG5vbi1UYWJsZSB2YWx1ZWAgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7IH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0YWJsZSA9IHRhYmxlW2tleV0gPSBuZXcgb3B0aW9ucy5UYWJsZShJTVBMSUNJVExZKTtcblx0XHRcdHdoaWxlICggaW5kZXg8bGVuZ3RoICkgeyB0YWJsZSA9IHRhYmxlW2tleXNbaW5kZXgrK10gXSA9IG5ldyBvcHRpb25zLlRhYmxlKElNUExJQ0lUTFkpOyB9XG5cdFx0XHRyZXR1cm4gdGFibGU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0YWJsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBhcHBlbmRUYWJsZSA9ICh0YWJsZSAgICAgICAsIGZpbmFsS2V5ICAgICAgICAsIGFzQXJyYXlJdGVtICAgICAgICAgLCB0YWcgICAgICAgICkgICAgICAgID0+IHtcblx0bGV0IGxhc3RUYWJsZSAgICAgICA7XG5cdGlmICggYXNBcnJheUl0ZW0gKSB7XG5cdFx0bGV0IGFycmF5T2ZUYWJsZXMgICAgICAgICAgICAgIDtcblx0XHRpZiAoIGZpbmFsS2V5IGluIHRhYmxlICkgeyBpc0FycmF5KGFycmF5T2ZUYWJsZXMgPSB0YWJsZVtmaW5hbEtleV0pICYmICFpc1N0YXRpYyhhcnJheU9mVGFibGVzKSB8fCBpdGVyYXRvci50aHJvd3MoRXJyb3IoYFRyeWluZyB0byBwdXNoIFRhYmxlIHRvIG5vbi1BcnJheU9mVGFibGVzIHZhbHVlYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTsgfVxuXHRcdGVsc2UgeyBhcnJheU9mVGFibGVzID0gdGFibGVbZmluYWxLZXldID0gbmV3QXJyYXkoT0ZfVEFCTEVTKTsgfVxuXHRcdHRhZyAmJiBvcHRpb25zLmNvbGxlY3QodGFnLCBhcnJheU9mVGFibGVzLCB0YWJsZSwgZmluYWxLZXkpO1xuXHRcdGFycmF5T2ZUYWJsZXNbYXJyYXlPZlRhYmxlcy5sZW5ndGhdID0gbGFzdFRhYmxlID0gbmV3IG9wdGlvbnMuVGFibGUoRElSRUNUTFkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmICggZmluYWxLZXkgaW4gdGFibGUgKSB7XG5cdFx0XHRsYXN0VGFibGUgPSB0YWJsZVtmaW5hbEtleV07XG5cdFx0XHRmcm9tUGFpcihsYXN0VGFibGUpICYmIGl0ZXJhdG9yLnRocm93cyhFcnJvcihgQSB0YWJsZSBkZWZpbmVkIGltcGxpY2l0bHkgdmlhIGtleS92YWx1ZSBwYWlyIGNhbiBub3QgYmUgYWNjZXNzZWQgdG8gdmlhIFtdYCArIGl0ZXJhdG9yLndoZXJlKCcsIHdoaWNoIGF0ICcpKSk7XG5cdFx0XHRkaXJlY3RseUlmTm90KGxhc3RUYWJsZSkgfHwgaXRlcmF0b3IudGhyb3dzKEVycm9yKGBEdXBsaWNhdGUgVGFibGUgZGVmaW5pdGlvbmAgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7XG5cdFx0fVxuXHRcdGVsc2UgeyB0YWJsZVtmaW5hbEtleV0gPSBsYXN0VGFibGUgPSBuZXcgb3B0aW9ucy5UYWJsZShESVJFQ1RMWSk7IH1cblx0XHR0YWcgJiYgb3B0aW9ucy5jb2xsZWN0KHRhZywgbnVsbCwgdGFibGUsIGZpbmFsS2V5KTtcblx0fVxuXHRyZXR1cm4gbGFzdFRhYmxlO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZXBhcmVJbmxpbmVUYWJsZSA9ICh0YWJsZSAgICAgICAsIGtleXMgICAgICAgICAgKSAgICAgICAgPT4ge1xuXHRjb25zdCB7IGxlbmd0aCB9ID0ga2V5cztcblx0bGV0IGluZGV4ICAgICAgICAgPSAwO1xuXHR3aGlsZSAoIGluZGV4PGxlbmd0aCApIHtcblx0XHRjb25zdCBrZXkgICAgICAgICA9IGtleXNbaW5kZXgrK10gO1xuXHRcdGlmICgga2V5IGluIHRhYmxlICkge1xuXHRcdFx0dGFibGUgPSB0YWJsZVtrZXldO1xuXHRcdFx0aXNUYWJsZSh0YWJsZSkgfHwgaXRlcmF0b3IudGhyb3dzKEVycm9yKGBUcnlpbmcgdG8gYXNzaWduIHByb3BlcnR5IHRocm91Z2ggbm9uLVRhYmxlIHZhbHVlYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRcdGlzSW5saW5lKHRhYmxlKSAmJiBpdGVyYXRvci50aHJvd3MoRXJyb3IoYFRyeWluZyB0byBhc3NpZ24gcHJvcGVydHkgdGhyb3VnaCBzdGF0aWMgSW5saW5lIFRhYmxlYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRcdGZyb21QYWlyKHRhYmxlKSB8fCBpdGVyYXRvci50aHJvd3MoRXJyb3IoYEEgdGFibGUgZGVmaW5lZCBpbXBsaWNpdGx5IHZpYSBbXSBjYW4gbm90IGJlIGFjY2Vzc2VkIHRvIHZpYSBrZXkvdmFsdWUgcGFpcmAgKyBpdGVyYXRvci53aGVyZSgnLCB3aGljaCBhdCAnKSkpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRhYmxlID0gdGFibGVba2V5XSA9IG5ldyBvcHRpb25zLlRhYmxlKElNUExJQ0lUTFksIFBBSVIpO1xuXHRcdFx0d2hpbGUgKCBpbmRleDxsZW5ndGggKSB7IHRhYmxlID0gdGFibGVba2V5c1tpbmRleCsrXSBdID0gbmV3IG9wdGlvbnMuVGFibGUoSU1QTElDSVRMWSwgUEFJUik7IH1cblx0XHRcdHJldHVybiB0YWJsZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhYmxlO1xufTtcblxuY29uc3QgY2hlY2tMaXRlcmFsU3RyaW5nID0gKGxpdGVyYWwgICAgICAgICkgICAgICAgICA9PiB7XG5cdHJlZ2V4cHMuX19DT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX3Rlc3QobGl0ZXJhbCkgJiYgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBDb250cm9sIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBUYWIgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gYSBMaXRlcmFsIFN0cmluZ2AgKyBpdGVyYXRvci53aGVyZSgnLCB3aGljaCB3YXMgZm91bmQgYXQgJykpKTtcblx0cmV0dXJuIGxpdGVyYWw7XG59O1xuXG5leHBvcnQgY29uc3QgYXNzaWduTGl0ZXJhbFN0cmluZyA9ICggKHRhYmxlICAgICAgICwgZmluYWxLZXkgICAgICAgICwgbGl0ZXJhbCAgICAgICAgKSAgICAgICAgID0+IHtcblx0aWYgKCAhbGl0ZXJhbC5zdGFydHNXaXRoKGAnJydgKSApIHtcblx0XHRjb25zdCAkID0gcmVnZXhwcy5MSVRFUkFMX1NUUklOR19leGVjKGxpdGVyYWwpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgQmFkIGxpdGVyYWwgc3RyaW5nYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRjb25zdCB2YWx1ZSA9IGNoZWNrTGl0ZXJhbFN0cmluZygkWzFdKTtcblx0XHR0YWJsZVtmaW5hbEtleV0gPSBvcHRpb25zLnByZXNlcnZlTGl0ZXJhbCA/IExpdGVyYWxPYmplY3QobGl0ZXJhbC5zbGljZSgwLCB2YWx1ZS5sZW5ndGggKyAyKSwgdmFsdWUpIDogdmFsdWU7XG5cdFx0cmV0dXJuICRbMl07XG5cdH1cblx0Y29uc3QgJCA9IHJlZ2V4cHMuX19NVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HX2V4ZWMobGl0ZXJhbC5zbGljZSgzKSk7XG5cdGlmICggJCApIHtcblx0XHRjb25zdCB2YWx1ZSA9IGNoZWNrTGl0ZXJhbFN0cmluZygkWzFdKSArICRbMl07XG5cdFx0dGFibGVbZmluYWxLZXldID0gb3B0aW9ucy5wcmVzZXJ2ZUxpdGVyYWwgPyBMaXRlcmFsT2JqZWN0KGxpdGVyYWwuc2xpY2UoMCwgdmFsdWUubGVuZ3RoICsgNiksIHZhbHVlKSA6IHZhbHVlO1xuXHRcdHJldHVybiAkWzNdO1xuXHR9XG5cdGNvbnN0IHN0YXJ0ID0gbmV3IGl0ZXJhdG9yLm1hcmsoJ011bHRpLWxpbmUgTGl0ZXJhbCBTdHJpbmcnLCBsaXRlcmFsLmxlbmd0aCk7XG5cdGNvbnN0IGxlYWRpbmdOZXdsaW5lID0gISggbGl0ZXJhbCA9IGxpdGVyYWwuc2xpY2UoMykgKTtcblx0aWYgKCBsZWFkaW5nTmV3bGluZSApIHtcblx0XHRsaXRlcmFsID0gc3RhcnQubXVzdCgpO1xuXHRcdGNvbnN0ICQgPSByZWdleHBzLl9fTVVMVElfTElORV9MSVRFUkFMX1NUUklOR19leGVjKGxpdGVyYWwpO1xuXHRcdGlmICggJCApIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gY2hlY2tMaXRlcmFsU3RyaW5nKCRbMV0pICsgJFsyXTtcblx0XHRcdHRhYmxlW2ZpbmFsS2V5XSA9IG9wdGlvbnMucHJlc2VydmVMaXRlcmFsID8gTGl0ZXJhbE9iamVjdChbIGAnJydgLCBsaXRlcmFsLnNsaWNlKDAsIHZhbHVlLmxlbmd0aCArIDMpIF0sIHZhbHVlKSA6IHZhbHVlO1xuXHRcdFx0cmV0dXJuICRbM107XG5cdFx0fVxuXHR9XG5cdG9wdGlvbnMudXNlV2hhdFRvSm9pbk11bHRpbGluZVN0cmluZz09PW51bGwgJiYgc3RhcnQubm93cmFwKG9wdGlvbnMuQVJHU19NT0RFKTtcblx0Zm9yICggY29uc3QgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgID0gWyBjaGVja0xpdGVyYWxTdHJpbmcobGl0ZXJhbCkgXTsgOyApIHtcblx0XHRjb25zdCBsaW5lICAgICAgICAgPSBzdGFydC5tdXN0KCk7XG5cdFx0Y29uc3QgJCA9IHJlZ2V4cHMuX19NVUxUSV9MSU5FX0xJVEVSQUxfU1RSSU5HX2V4ZWMobGluZSk7XG5cdFx0aWYgKCAkICkge1xuXHRcdFx0bGluZXNbbGluZXMubGVuZ3RoXSA9IGNoZWNrTGl0ZXJhbFN0cmluZygkWzFdKSArICRbMl07XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGxpbmVzLmpvaW4ob3B0aW9ucy51c2VXaGF0VG9Kb2luTXVsdGlsaW5lU3RyaW5nICk7XG5cdFx0XHRpZiAoIG9wdGlvbnMucHJlc2VydmVMaXRlcmFsICkge1xuXHRcdFx0XHRsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArPSBgJycnYDtcblx0XHRcdFx0bGVhZGluZ05ld2xpbmUgPyBsaW5lcy51bnNoaWZ0KGAnJydgKSA6IGxpbmVzWzBdID0gYCcnJyR7bGl0ZXJhbH1gO1xuXHRcdFx0XHR0YWJsZVtmaW5hbEtleV0gPSBMaXRlcmFsT2JqZWN0KGxpbmVzLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHsgdGFibGVbZmluYWxLZXldID0gdmFsdWU7IH1cblx0XHRcdHJldHVybiAkWzNdO1xuXHRcdH1cblx0XHRsaW5lc1tsaW5lcy5sZW5ndGhdID0gY2hlY2tMaXRlcmFsU3RyaW5nKGxpbmUpO1xuXHR9XG59ICkgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gO1xuXG5leHBvcnQgY29uc3QgYXNzaWduQmFzaWNTdHJpbmcgPSAoICh0YWJsZSAgICAgICAsIGZpbmFsS2V5ICAgICAgICAsIGxpdGVyYWwgICAgICAgICkgICAgICAgICA9PiB7XG5cdGlmICggIWxpdGVyYWwuc3RhcnRzV2l0aCgnXCJcIlwiJykgKSB7XG5cdFx0Y29uc3QgaW5kZXggPSByZWdleHBzLkJBU0lDX1NUUklOR19leGVjXzFfZW5kSW5kZXgobGl0ZXJhbCk7XG5cdFx0Y29uc3QgdmFsdWUgPSBCYXNpY1N0cmluZyhsaXRlcmFsLnNsaWNlKDEsIGluZGV4KSk7XG5cdFx0dGFibGVbZmluYWxLZXldID0gb3B0aW9ucy5wcmVzZXJ2ZUxpdGVyYWwgPyBMaXRlcmFsT2JqZWN0KGxpdGVyYWwuc2xpY2UoMCwgaW5kZXggKyAxKSwgdmFsdWUpIDogdmFsdWU7XG5cdFx0cmV0dXJuIGxpdGVyYWwuc2xpY2UoaW5kZXggKyAxKS5yZXBsYWNlKHJlZ2V4cHMuUFJFX1dISVRFU1BBQ0UsICcnKTtcblx0fVxuXHRsZXQgbGVuZ3RoID0gMyArIHJlZ2V4cHMuTVVMVElfTElORV9CQVNJQ19TVFJJTkdfZXhlY18wX2xlbmd0aChsaXRlcmFsLnNsaWNlKDMpKTtcblx0aWYgKCBsaXRlcmFsLmxlbmd0aCE9PWxlbmd0aCApIHtcblx0XHRjb25zdCAkID0gbGl0ZXJhbC5zbGljZSgzLCBsZW5ndGgpO1xuXHRcdHJlZ2V4cHMuRVNDQVBFRF9FWENMVURFX0NPTlRST0xfQ0hBUkFDVEVSX3Rlc3QoJCkgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBCYWQgbXVsdGktbGluZSBiYXNpYyBzdHJpbmdgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdGNvbnN0IHZhbHVlID0gQmFzaWNTdHJpbmcoJCkgKyAoIGxpdGVyYWwuc3RhcnRzV2l0aCgnXCInLCBsZW5ndGggKz0gMykgPyBsaXRlcmFsLnN0YXJ0c1dpdGgoJ1wiJywgKytsZW5ndGgpID8gKCArK2xlbmd0aCwgJ1wiXCInICkgOiAnXCInIDogJycgKTtcblx0XHR0YWJsZVtmaW5hbEtleV0gPSBvcHRpb25zLnByZXNlcnZlTGl0ZXJhbCA/IExpdGVyYWxPYmplY3QobGl0ZXJhbC5zbGljZSgwLCBsZW5ndGgpLCB2YWx1ZSkgOiB2YWx1ZTtcblx0XHRyZXR1cm4gbGl0ZXJhbC5zbGljZShsZW5ndGgpLnJlcGxhY2UocmVnZXhwcy5QUkVfV0hJVEVTUEFDRSwgJycpO1xuXHR9XG5cdGNvbnN0IHN0YXJ0ID0gbmV3IGl0ZXJhdG9yLm1hcmsoJ011bHRpLWxpbmUgQmFzaWMgU3RyaW5nJywgbGVuZ3RoKTtcblx0Y29uc3Qgc2tpcHBlZCAgICAgICAgPSAoIGxpdGVyYWwgPSBsaXRlcmFsLnNsaWNlKDMpICkgPyAwIDogMTtcblx0aWYgKCBza2lwcGVkICkge1xuXHRcdGxpdGVyYWwgPSBzdGFydC5tdXN0KCk7XG5cdFx0bGV0IGxlbmd0aCA9IHJlZ2V4cHMuTVVMVElfTElORV9CQVNJQ19TVFJJTkdfZXhlY18wX2xlbmd0aChsaXRlcmFsKTtcblx0XHRpZiAoIGxpdGVyYWwubGVuZ3RoIT09bGVuZ3RoICkge1xuXHRcdFx0Y29uc3QgJCA9IGxpdGVyYWwuc2xpY2UoMCwgbGVuZ3RoKTtcblx0XHRcdHJlZ2V4cHMuRVNDQVBFRF9FWENMVURFX0NPTlRST0xfQ0hBUkFDVEVSX3Rlc3QoJCkgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBCYWQgbXVsdGktbGluZSBiYXNpYyBzdHJpbmdgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBNdWx0aWxpbmVCYXNpY1N0cmluZygkLCBvcHRpb25zLnVzZVdoYXRUb0pvaW5NdWx0aWxpbmVTdHJpbmcgLCBza2lwcGVkKSArICggbGl0ZXJhbC5zdGFydHNXaXRoKCdcIicsIGxlbmd0aCArPSAzKSA/IGxpdGVyYWwuc3RhcnRzV2l0aCgnXCInLCArK2xlbmd0aCkgPyAoICsrbGVuZ3RoLCAnXCJcIicgKSA6ICdcIicgOiAnJyApO1xuXHRcdFx0dGFibGVbZmluYWxLZXldID0gb3B0aW9ucy5wcmVzZXJ2ZUxpdGVyYWwgPyBMaXRlcmFsT2JqZWN0KFsgJ1wiXCJcIicsIGxpdGVyYWwuc2xpY2UoMCwgbGVuZ3RoKSBdLCB2YWx1ZSkgOiB2YWx1ZTtcblx0XHRcdHJldHVybiBsaXRlcmFsLnNsaWNlKGxlbmd0aCkucmVwbGFjZShyZWdleHBzLlBSRV9XSElURVNQQUNFLCAnJyk7XG5cdFx0fVxuXHR9XG5cdG9wdGlvbnMudXNlV2hhdFRvSm9pbk11bHRpbGluZVN0cmluZz09PW51bGwgJiYgc3RhcnQubm93cmFwKG9wdGlvbnMuQVJHU19NT0RFKTtcblx0cmVnZXhwcy5FU0NBUEVEX0VYQ0xVREVfQ09OVFJPTF9DSEFSQUNURVJfdGVzdChsaXRlcmFsICsgJ1xcbicpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgQmFkIG11bHRpLWxpbmUgYmFzaWMgc3RyaW5nYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0Zm9yICggY29uc3QgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgID0gWyBsaXRlcmFsIF07IDsgKSB7XG5cdFx0Y29uc3QgbGluZSAgICAgICAgID0gc3RhcnQubXVzdCgpO1xuXHRcdGxldCBsZW5ndGggPSByZWdleHBzLk1VTFRJX0xJTkVfQkFTSUNfU1RSSU5HX2V4ZWNfMF9sZW5ndGgobGluZSk7XG5cdFx0aWYgKCBsaW5lLmxlbmd0aCE9PWxlbmd0aCApIHtcblx0XHRcdGNvbnN0ICQgPSBsaW5lLnNsaWNlKDAsIGxlbmd0aCk7XG5cdFx0XHRyZWdleHBzLkVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl90ZXN0KCQpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgQmFkIG11bHRpLWxpbmUgYmFzaWMgc3RyaW5nYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRcdGNvbnN0IHZhbHVlID0gTXVsdGlsaW5lQmFzaWNTdHJpbmcobGluZXMuam9pbignXFxuJykgKyAnXFxuJyArICQsIG9wdGlvbnMudXNlV2hhdFRvSm9pbk11bHRpbGluZVN0cmluZyAsIHNraXBwZWQpICsgKCBsaW5lLnN0YXJ0c1dpdGgoJ1wiJywgbGVuZ3RoICs9IDMpID8gbGluZS5zdGFydHNXaXRoKCdcIicsICsrbGVuZ3RoKSA/ICggKytsZW5ndGgsICdcIlwiJyApIDogJ1wiJyA6ICcnICk7XG5cdFx0XHRpZiAoIG9wdGlvbnMucHJlc2VydmVMaXRlcmFsICkge1xuXHRcdFx0XHRza2lwcGVkID8gbGluZXMudW5zaGlmdCgnXCJcIlwiJykgOiBsaW5lc1swXSA9IGBcIlwiXCIke2xpdGVyYWx9YDtcblx0XHRcdFx0bGluZXNbbGluZXMubGVuZ3RoXSA9IGAkeyR9XCJcIlwiYDtcblx0XHRcdFx0dGFibGVbZmluYWxLZXldID0gTGl0ZXJhbE9iamVjdChsaW5lcywgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7IHRhYmxlW2ZpbmFsS2V5XSA9IHZhbHVlOyB9XG5cdFx0XHRyZXR1cm4gbGluZS5zbGljZShsZW5ndGgpLnJlcGxhY2UocmVnZXhwcy5QUkVfV0hJVEVTUEFDRSwgJycpO1xuXHRcdH1cblx0XHRyZWdleHBzLkVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl90ZXN0KGxpbmUgKyAnXFxuJykgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBCYWQgbXVsdGktbGluZSBiYXNpYyBzdHJpbmdgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdGxpbmVzW2xpbmVzLmxlbmd0aF0gPSBsaW5lO1xuXHR9XG59ICkgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsImltcG9ydCBUeXBlRXJyb3IgZnJvbSAnLlR5cGVFcnJvcic7XG5pbXBvcnQgU3ludGF4RXJyb3IgZnJvbSAnLlN5bnRheEVycm9yJztcbmltcG9ydCBTeW1ib2wgZnJvbSAnLlN5bWJvbCc7XG5pbXBvcnQgTnVsbCBmcm9tICcubnVsbCc7XG5cbmltcG9ydCB7IHRoZVJlZ0V4cCB9IGZyb20gJ0BsdGQvai1yZWdleHAnO1xuXG5jb25zdCBLRVlTID0gLyojX19QVVJFX18qL051bGwgICAgICAgIChudWxsKTtcbmV4cG9ydCBjb25zdCBjb21tZW50Rm9yID0gKGtleSAgICAgICAgKSAgICAgICAgID0+IEtFWVNba2V5XSB8fCAoIEtFWVNba2V5XSA9IFN5bWJvbChrZXkpICk7XG5leHBvcnQgY29uc3QgY29tbWVudEZvclRoaXMgICAgICAgICAgICAgICAgPSBTeW1ib2woJ3RoaXMnKSAgICAgICA7XG5cbmNvbnN0IHsgdGVzdDogaW5jbHVkZXNOZXdsaW5lIH0gPSB0aGVSZWdFeHAoL1xccj9cXG4vZyk7XG5leHBvcnQgY29uc3QgZ2V0Q09NTUVOVCA9ICh0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBrZXlDb21tZW50ICAgICAgICApICAgICAgICAgICAgICAgICAgICAgPT4ge1xuXHRpZiAoIGtleUNvbW1lbnQgaW4gdGFibGUgKSB7XG5cdFx0Y29uc3QgY29tbWVudCA9IHRhYmxlW2tleUNvbW1lbnRdO1xuXHRcdGlmICggdHlwZW9mIGNvbW1lbnQhPT0nc3RyaW5nJyApIHsgdGhyb3cgVHlwZUVycm9yKGB0aGUgdmFsdWUgb2YgY29tbWVudCBtdXN0IGJlIGEgc3RyaW5nLCB3aGlsZSBcIiR7Y29tbWVudD09PW51bGwgPyAnbnVsbCcgOiB0eXBlb2YgY29tbWVudH1cIiB0eXBlIGlzIGZvdW5kYCk7IH1cblx0XHRpZiAoIGluY2x1ZGVzTmV3bGluZShjb21tZW50KSApIHsgdGhyb3cgU3ludGF4RXJyb3IoYHRoZSB2YWx1ZSBvZiBjb21tZW50IG11c3QgYmUgYSBzdHJpbmcgYW5kIGNhbiBub3QgaW5jbHVkZSBuZXdsaW5lYCk7IH1cblx0XHRyZXR1cm4gYCAjJHtjb21tZW50fWA7Ly8vXG5cdH1cblx0cmV0dXJuICcnO1xufTtcbmV4cG9ydCBjb25zdCBnZXRDb21tZW50ID0gICAgICAgICAgICAgICAgICAgICh0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGtleSAgICkgICAgICAgICAgICAgICAgICAgICA9PiBrZXkgaW4gS0VZUyA/IGdldENPTU1FTlQodGFibGUsIEtFWVNba2V5XSApIDogJyc7XG4iLCJpbXBvcnQgRXJyb3IgZnJvbSAnLkVycm9yJztcbmltcG9ydCBTeW50YXhFcnJvciBmcm9tICcuU3ludGF4RXJyb3InO1xuaW1wb3J0IHVuZGVmaW5lZCBmcm9tICcudW5kZWZpbmVkJztcblxuaW1wb3J0IHsgdGhlUmVnRXhwIH0gZnJvbSAnQGx0ZC9qLXJlZ2V4cCc7XG5cbmltcG9ydCB7IHggfSBmcm9tICcuLi9qLWxleGVyJzsvLy8gZXh0ZXJuYWxcblxuaW1wb3J0ICogYXMgaXRlcmF0b3IgZnJvbSAnLi4vaXRlcmF0b3InO1xuaW1wb3J0IHsgTGl0ZXJhbE9iamVjdCB9IGZyb20gJy4uL3R5cGVzL2F0b20nO1xuaW1wb3J0IHsgSU5MSU5FLCBESVJFQ1RMWSB9IGZyb20gJy4uL3R5cGVzL1RhYmxlJztcbmltcG9ydCB7IG5ld0FycmF5LCBTVEFUSUNBTExZIH0gZnJvbSAnLi4vdHlwZXMvQXJyYXknO1xuaW1wb3J0IHsgT2Zmc2V0RGF0ZVRpbWUsIExvY2FsRGF0ZVRpbWUsIExvY2FsRGF0ZSwgTG9jYWxUaW1lLCBPRkZTRVQkIH0gZnJvbSAnLi4vdHlwZXMvRGF0ZXRpbWUnO1xuaW1wb3J0IHsgQmFzaWNTdHJpbmcgfSBmcm9tICcuLi90eXBlcy9TdHJpbmcnO1xuaW1wb3J0IHsgSW50ZWdlciB9IGZyb20gJy4uL3R5cGVzL0ludGVnZXInO1xuaW1wb3J0IHsgRmxvYXQgfSBmcm9tICcuLi90eXBlcy9GbG9hdCc7XG5pbXBvcnQgKiBhcyBvcHRpb25zIGZyb20gJy4uL29wdGlvbnMnO1xuaW1wb3J0ICogYXMgcmVnZXhwcyBmcm9tICcuLi9yZWdleHBzJztcbmltcG9ydCB7IGFwcGVuZFRhYmxlLCBwcmVwYXJlVGFibGUsIHByZXBhcmVJbmxpbmVUYWJsZSwgYXNzaWduTGl0ZXJhbFN0cmluZywgYXNzaWduQmFzaWNTdHJpbmcgfSBmcm9tICcuL29uLXRoZS1zcG90JztcblxuaW1wb3J0IHsgY29tbWVudEZvciwgY29tbWVudEZvclRoaXMgfSBmcm9tICcuLi90eXBlcy9jb21tZW50JztcbmltcG9ydCB7IGJlSW5saW5lIH0gZnJvbSAnLi4vdHlwZXMvbm9uLWF0b20nO1xuXG5jb25zdCB7IHRlc3Q6IElTX09GRlNFVCQgfSA9IHRoZVJlZ0V4cChPRkZTRVQkKTtcbmNvbnN0IHsgdGVzdDogSVNfRU1QVFkgfSA9IHRoZVJlZ0V4cCgvXlxcW1tcXHQgXSpdLyk7XG5cbmNvbnN0IHBhcnNlS2V5cyA9IChyZXN0ICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IHtcblx0bGV0IGxpbmVSZXN0ICAgICAgICAgPSByZXN0O1xuXHRjb25zdCBsZWFkaW5nS2V5cyAgICAgICAgICAgPSBbXTtcblx0bGV0IGxhc3RJbmRleCAgICAgICAgID0gLTE7XG5cdGZvciAoIDsgOyApIHtcblx0XHRsaW5lUmVzdCB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEVtcHR5IGJhcmUga2V5YCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRpZiAoIGxpbmVSZXN0WzBdPT09J1wiJyApIHtcblx0XHRcdGNvbnN0IGluZGV4ICAgICAgICAgPSByZWdleHBzLkJBU0lDX1NUUklOR19leGVjXzFfZW5kSW5kZXgobGluZVJlc3QpO1xuXHRcdFx0b3B0aW9ucy5LRVlTLnRlc3QobGVhZGluZ0tleXNbKytsYXN0SW5kZXhdID0gQmFzaWNTdHJpbmcobGluZVJlc3Quc2xpY2UoMSwgaW5kZXgpKSkgfHwgaXRlcmF0b3IudGhyb3dzKEVycm9yKGBLZXkgbm90IGFsbG93ZWRgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdFx0bGluZVJlc3QgPSBsaW5lUmVzdC5zbGljZShpbmRleCArIDEpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IGlzUXVvdGVkID0gbGluZVJlc3RbMF09PT0nXFwnJztcblx0XHRcdGNvbnN0IGtleSAgICAgICAgID0gKCAoIGlzUXVvdGVkID8gcmVnZXhwcy5fX0xJVEVSQUxfS0VZX2V4ZWMgOiByZWdleHBzLl9fQkFSRV9LRVlfZXhlYyApKGxpbmVSZXN0KSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEJhZCAke2lzUXVvdGVkID8gJ2xpdGVyYWwgc3RyaW5nJyA6ICdiYXJlJ30ga2V5YCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKSApWzBdO1xuXHRcdFx0bGluZVJlc3QgPSBsaW5lUmVzdC5zbGljZShrZXkubGVuZ3RoKTtcblx0XHRcdG9wdGlvbnMuS0VZUy50ZXN0KGxlYWRpbmdLZXlzWysrbGFzdEluZGV4XSA9IGlzUXVvdGVkID8ga2V5LnNsaWNlKDEsIC0xKSA6IGtleSkgfHwgaXRlcmF0b3IudGhyb3dzKEVycm9yKGBLZXkgbm90IGFsbG93ZWRgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdH1cblx0XHRpZiAoIHJlZ2V4cHMuSVNfRE9UX0tFWShsaW5lUmVzdCkgKSB7IGxpbmVSZXN0ID0gbGluZVJlc3QucmVwbGFjZShyZWdleHBzLkRPVF9LRVksICcnKTsgfVxuXHRcdGVsc2UgeyBicmVhazsgfVxuXHR9XG5cdGlmICggb3B0aW9ucy5kaXNhYmxlRGlnaXQgKSB7XG5cdFx0Y29uc3Qga2V5cyA9IHJlc3Quc2xpY2UoMCwgLWxpbmVSZXN0Lmxlbmd0aCk7XG5cdFx0KCByZWdleHBzLmlzQW1hemluZyhrZXlzKSB8fCBvcHRpb25zLmVuYWJsZU51bGwgJiYga2V5cz09PSdudWxsJyApICYmIGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgQmFkIGJhcmUga2V5IGRpc2FibGVkIGJ5IHhPcHRpb25zLnN0cmluZ2AgKyBpdGVyYXRvci53aGVyZSgnIGF0ICcpKSk7XG5cdH1cblx0aWYgKCBvcHRpb25zLmRpc2FsbG93RW1wdHlLZXkgKSB7XG5cdFx0bGV0IGluZGV4ICAgICAgICAgPSBsYXN0SW5kZXg7XG5cdFx0ZG8geyBsZWFkaW5nS2V5c1tpbmRleF0gIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgRW1wdHkga2V5IGlzIG5vdCBhbGxvd2VkIGJlZm9yZSBUT01MIHYwLjVgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggYXQgJykpKTsgfVxuXHRcdHdoaWxlICggaW5kZXgtLSApO1xuXHR9XG5cdGNvbnN0IGZpbmFsS2V5ICAgICAgICAgPSBsZWFkaW5nS2V5c1tsYXN0SW5kZXhdIDtcblx0bGVhZGluZ0tleXMubGVuZ3RoID0gbGFzdEluZGV4O1xuXHRyZXR1cm4geyBsZWFkaW5nS2V5cywgZmluYWxLZXksIGxpbmVSZXN0IH07XG59O1xuXG5jb25zdCBwdXNoID0gKGxhc3RBcnJheSAgICAgICAsIGxpbmVSZXN0ICAgICAgICApICAgICAgICAgICAgID0+IHtcblx0aWYgKCBsaW5lUmVzdFswXT09PSc8JyApIHtcblx0XHRjb25zdCB7IDE6IHRhZyB9ID0geyAyOiBsaW5lUmVzdCB9ID0gcmVnZXhwcy5fVkFMVUVfUEFJUl9leGVjKGxpbmVSZXN0KSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEJhZCB0YWcgYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRvcHRpb25zLmNvbGxlY3QodGFnLCBsYXN0QXJyYXksIG51bGwpO1xuXHRcdHN3aXRjaCAoIGxpbmVSZXN0ICYmIGxpbmVSZXN0WzBdICkge1xuXHRcdFx0Y2FzZSAnLCc6XG5cdFx0XHRjYXNlICddJzpcblx0XHRcdGNhc2UgJyc6XG5cdFx0XHRjYXNlICcjJzpcblx0XHRcdFx0bGFzdEFycmF5W2xhc3RBcnJheS5sZW5ndGhdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRyZXR1cm4gbGluZVJlc3Q7XG5cdFx0fVxuXHR9XG5cdHN3aXRjaCAoIGxpbmVSZXN0WzBdICkge1xuXHRcdGNhc2UgJ1xcJyc6XG5cdFx0XHRyZXR1cm4gYXNzaWduTGl0ZXJhbFN0cmluZyhvcHRpb25zLmFzU3RyaW5ncyhsYXN0QXJyYXkpLCBsYXN0QXJyYXkubGVuZ3RoLCBsaW5lUmVzdCk7XG5cdFx0Y2FzZSAnXCInOlxuXHRcdFx0cmV0dXJuIGFzc2lnbkJhc2ljU3RyaW5nKG9wdGlvbnMuYXNTdHJpbmdzKGxhc3RBcnJheSksIGxhc3RBcnJheS5sZW5ndGgsIGxpbmVSZXN0KTtcblx0XHRjYXNlICd7Jzpcblx0XHRcdG9wdGlvbnMuaW5saW5lVGFibGUgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBJbmxpbmUgVGFibGUgaXMgbm90IGFsbG93ZWQgYmVmb3JlIFRPTUwgdjAuNGAgKyBpdGVyYXRvci53aGVyZSgnLCB3aGljaCBhdCAnKSkpO1xuXHRcdFx0cmV0dXJuIGVxdWFsSW5saW5lVGFibGUob3B0aW9ucy5hc1RhYmxlcyhsYXN0QXJyYXkpLCBsYXN0QXJyYXkubGVuZ3RoLCBsaW5lUmVzdCk7XG5cdFx0Y2FzZSAnWyc6XG5cdFx0XHRyZXR1cm4gZXF1YWxTdGF0aWNBcnJheShvcHRpb25zLmFzQXJyYXlzKGxhc3RBcnJheSksIGxhc3RBcnJheS5sZW5ndGgsIGxpbmVSZXN0KTtcblx0fVxuXHRjb25zdCB7IDE6IGxpdGVyYWwgfSA9IHsgMjogbGluZVJlc3QgfSA9IHJlZ2V4cHMuVkFMVUVfUkVTVF9leGVjKGxpbmVSZXN0KSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYEJhZCBhdG9tIHZhbHVlYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0aWYgKCBsaXRlcmFsPT09J3RydWUnICkgeyBvcHRpb25zLmFzQm9vbGVhbnMobGFzdEFycmF5KVtsYXN0QXJyYXkubGVuZ3RoXSA9IHRydWU7IH1cblx0ZWxzZSBpZiAoIGxpdGVyYWw9PT0nZmFsc2UnICkgeyBvcHRpb25zLmFzQm9vbGVhbnMobGFzdEFycmF5KVtsYXN0QXJyYXkubGVuZ3RoXSA9IGZhbHNlOyB9XG5cdGVsc2UgaWYgKCBvcHRpb25zLmVuYWJsZU51bGwgJiYgbGl0ZXJhbD09PSdudWxsJyApIHsgb3B0aW9ucy5hc051bGxzKGxhc3RBcnJheSlbbGFzdEFycmF5Lmxlbmd0aF0gPSBudWxsOyB9XG5cdGVsc2UgaWYgKCBsaXRlcmFsLmluY2x1ZGVzKCc6JykgKSB7XG5cdFx0aWYgKCBsaXRlcmFsLmluY2x1ZGVzKCctJykgKSB7XG5cdFx0XHRpZiAoIElTX09GRlNFVCQobGl0ZXJhbCkgKSB7XG5cdFx0XHRcdG9wdGlvbnMuYXNPZmZzZXREYXRlVGltZXMobGFzdEFycmF5KVtsYXN0QXJyYXkubGVuZ3RoXSA9IG5ldyBPZmZzZXREYXRlVGltZShsaXRlcmFsKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRvcHRpb25zLm1vcmVEYXRldGltZSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYExvY2FsIERhdGUtVGltZSBpcyBub3QgYWxsb3dlZCBiZWZvcmUgVE9NTCB2MC41YCArIGl0ZXJhdG9yLndoZXJlKCcsIHdoaWNoIGF0ICcpKSk7XG5cdFx0XHRcdG9wdGlvbnMuYXNMb2NhbERhdGVUaW1lcyhsYXN0QXJyYXkpW2xhc3RBcnJheS5sZW5ndGhdID0gbmV3IExvY2FsRGF0ZVRpbWUobGl0ZXJhbCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0b3B0aW9ucy5tb3JlRGF0ZXRpbWUgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBMb2NhbCBUaW1lIGlzIG5vdCBhbGxvd2VkIGJlZm9yZSBUT01MIHYwLjVgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggYXQgJykpKTtcblx0XHRcdG9wdGlvbnMuYXNMb2NhbFRpbWVzKGxhc3RBcnJheSlbbGFzdEFycmF5Lmxlbmd0aF0gPSBuZXcgTG9jYWxUaW1lKGxpdGVyYWwpO1xuXHRcdH1cblx0fVxuXHRlbHNlIGlmICggbGl0ZXJhbC5pbmRleE9mKCctJykhPT1saXRlcmFsLmxhc3RJbmRleE9mKCctJykgJiYgbGl0ZXJhbFswXSE9PSctJyApIHtcblx0XHRvcHRpb25zLm1vcmVEYXRldGltZSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYExvY2FsIERhdGUgaXMgbm90IGFsbG93ZWQgYmVmb3JlIFRPTUwgdjAuNWAgKyBpdGVyYXRvci53aGVyZSgnLCB3aGljaCBhdCAnKSkpO1xuXHRcdG9wdGlvbnMuYXNMb2NhbERhdGVzKGxhc3RBcnJheSlbbGFzdEFycmF5Lmxlbmd0aF0gPSBuZXcgTG9jYWxEYXRlKGxpdGVyYWwpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGxpdGVyYWwuaW5jbHVkZXMoJy4nKSB8fCBsaXRlcmFsLmluY2x1ZGVzKCduJykgfHwgKCBsaXRlcmFsLmluY2x1ZGVzKCdlJykgfHwgbGl0ZXJhbC5pbmNsdWRlcygnRScpICkgJiYgIWxpdGVyYWwuc3RhcnRzV2l0aCgnMHgnKVxuXHRcdFx0PyBvcHRpb25zLmFzRmxvYXRzKGxhc3RBcnJheSlbbGFzdEFycmF5Lmxlbmd0aF0gPSBvcHRpb25zLnByZXNlcnZlTGl0ZXJhbCA/IExpdGVyYWxPYmplY3QobGl0ZXJhbCwgRmxvYXQobGl0ZXJhbCkpIDogRmxvYXQobGl0ZXJhbClcblx0XHRcdDogb3B0aW9ucy5hc0ludGVnZXJzKGxhc3RBcnJheSlbbGFzdEFycmF5Lmxlbmd0aF0gPSBvcHRpb25zLnByZXNlcnZlTGl0ZXJhbCA/IExpdGVyYWxPYmplY3QobGl0ZXJhbCwgSW50ZWdlcihsaXRlcmFsKSkgOiBJbnRlZ2VyKGxpdGVyYWwpXG5cdFx0O1xuXHR9XG5cdHJldHVybiBsaW5lUmVzdDtcbn07XG5cbmNvbnN0IGVxdWFsU3RhdGljQXJyYXkgPSBmdW5jdGlvbiAqICggICAgICAgICAgICB0YWJsZSAgICAgICAsIGZpbmFsS2V5ICAgICAgICAsIGxpbmVSZXN0ICAgICAgICApICAgIHtcblx0Y29uc3Qgc3RhdGljQXJyYXkgICAgICAgID0gdGFibGVbZmluYWxLZXldID0gbmV3QXJyYXkoU1RBVElDQUxMWSk7XG5cdGlmICggSVNfRU1QVFkobGluZVJlc3QpICkge1xuXHRcdGJlSW5saW5lKHN0YXRpY0FycmF5LCBsaW5lUmVzdFsxXT09PSddJyA/IDAgOiAzKTtcblx0XHRyZXR1cm4gbGluZVJlc3Quc2xpY2UobGluZVJlc3QuaW5kZXhPZignXScpKS5yZXBsYWNlKHJlZ2V4cHMuU1lNX1dISVRFU1BBQ0UsICcnKTtcblx0fVxuXHRjb25zdCBzdGFydCA9IG5ldyBpdGVyYXRvci5tYXJrKCdTdGF0aWMgQXJyYXknLCBsaW5lUmVzdC5sZW5ndGgpO1xuXHRsZXQgaW5saW5lICAgICAgICAgICAgICAgPSBsaW5lUmVzdC5zdGFydHNXaXRoKCdbICcpIHx8IGxpbmVSZXN0LnN0YXJ0c1dpdGgoJ1tcXHQnKSA/IDMgOiAwO1xuXHRsaW5lUmVzdCA9IGxpbmVSZXN0LnJlcGxhY2UocmVnZXhwcy5TWU1fV0hJVEVTUEFDRSwgJycpO1xuXHR3aGlsZSAoICFsaW5lUmVzdCB8fCBsaW5lUmVzdFswXT09PScjJyApIHtcblx0XHRpbmxpbmUgPSBudWxsO1xuXHRcdGxpbmVSZXN0ID0gc3RhcnQubXVzdCgpLnJlcGxhY2UocmVnZXhwcy5QUkVfV0hJVEVTUEFDRSwgJycpO1xuXHR9XG5cdGlmICggbGluZVJlc3RbMF09PT0nXScgKSB7XG5cdFx0aW5saW5lPT09bnVsbCB8fCBiZUlubGluZShzdGF0aWNBcnJheSwgaW5saW5lKTtcblx0XHRyZXR1cm4gbGluZVJlc3QucmVwbGFjZShyZWdleHBzLlNZTV9XSElURVNQQUNFLCAnJyk7XG5cdH1cblx0Zm9yICggOyA7ICkge1xuXHRcdGNvbnN0IHJlc3QgICAgICAgICAgICAgPSBwdXNoKHN0YXRpY0FycmF5LCBsaW5lUmVzdCk7XG5cdFx0bGluZVJlc3QgPSB0eXBlb2YgcmVzdD09PSdzdHJpbmcnID8gcmVzdCA6IHlpZWxkIHJlc3Q7XG5cdFx0d2hpbGUgKCAhbGluZVJlc3QgfHwgbGluZVJlc3RbMF09PT0nIycgKSB7XG5cdFx0XHRpbmxpbmUgPSBudWxsO1xuXHRcdFx0bGluZVJlc3QgPSBzdGFydC5tdXN0KCkucmVwbGFjZShyZWdleHBzLlBSRV9XSElURVNQQUNFLCAnJyk7XG5cdFx0fVxuXHRcdGlmICggbGluZVJlc3RbMF09PT0nLCcgKSB7XG5cdFx0XHRsaW5lUmVzdCA9IGxpbmVSZXN0LnJlcGxhY2UocmVnZXhwcy5TWU1fV0hJVEVTUEFDRSwgJycpO1xuXHRcdFx0d2hpbGUgKCAhbGluZVJlc3QgfHwgbGluZVJlc3RbMF09PT0nIycgKSB7XG5cdFx0XHRcdGlubGluZSA9IG51bGw7XG5cdFx0XHRcdGxpbmVSZXN0ID0gc3RhcnQubXVzdCgpLnJlcGxhY2UocmVnZXhwcy5QUkVfV0hJVEVTUEFDRSwgJycpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBsaW5lUmVzdFswXT09PSddJyApIHsgYnJlYWs7IH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZiAoIGxpbmVSZXN0WzBdPT09J10nICkgeyBicmVhazsgfVxuXHRcdFx0dGhyb3cgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBVbmV4cGVjdCBjaGFyYWN0ZXIgaW4gc3RhdGljIGFycmF5IGl0ZW0gdmFsdWVgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggaXMgZm91bmQgYXQgJykpKTtcblx0XHR9XG5cdH1cblx0aW5saW5lPT09bnVsbCB8fCBiZUlubGluZShzdGF0aWNBcnJheSwgaW5saW5lKTtcblx0cmV0dXJuIGxpbmVSZXN0LnJlcGxhY2UocmVnZXhwcy5TWU1fV0hJVEVTUEFDRSwgJycpO1xufSAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gO1xuXG5jb25zdCBlcXVhbElubGluZVRhYmxlID0gZnVuY3Rpb24gKiAoICAgICAgICAgICAgdGFibGUgICAgICAgLCBmaW5hbEtleSAgICAgICAgLCBsaW5lUmVzdCAgICAgICAgKSAgICB7XG5cdGNvbnN0IGlubGluZVRhYmxlICAgICAgICA9IHRhYmxlW2ZpbmFsS2V5XSA9IG5ldyBvcHRpb25zLlRhYmxlKERJUkVDVExZLCBJTkxJTkUpO1xuXHRpZiAoIG9wdGlvbnMuYWxsb3dJbmxpbmVUYWJsZU11bHRpbGluZUFuZFRyYWlsaW5nQ29tbWFFdmVuTm9Db21tYSApIHtcblx0XHRjb25zdCBzdGFydCA9IG5ldyBpdGVyYXRvci5tYXJrKCdJbmxpbmUgVGFibGUnLCBsaW5lUmVzdC5sZW5ndGgpO1xuXHRcdGxpbmVSZXN0ID0gbGluZVJlc3QucmVwbGFjZShyZWdleHBzLlNZTV9XSElURVNQQUNFLCAnJyk7XG5cdFx0bGV0IGlubGluZSA9IHRydWU7XG5cdFx0Zm9yICggOyA7ICkge1xuXHRcdFx0d2hpbGUgKCAhbGluZVJlc3QgfHwgbGluZVJlc3RbMF09PT0nIycgKSB7XG5cdFx0XHRcdGlubGluZSA9IGZhbHNlO1xuXHRcdFx0XHRsaW5lUmVzdCA9IHN0YXJ0Lm11c3QoKS5yZXBsYWNlKHJlZ2V4cHMuUFJFX1dISVRFU1BBQ0UsICcnKTtcblx0XHRcdH1cblx0XHRcdGlmICggbGluZVJlc3RbMF09PT0nfScgKSB7IGJyZWFrOyB9XG5cdFx0XHRjb25zdCBmb3JDb21tZW50ICAgICAgICAgICAgID0gRm9yQ29tbWVudChpbmxpbmVUYWJsZSwgbGluZVJlc3QpO1xuXHRcdFx0Y29uc3QgcmVzdCAgICAgICAgICAgICA9IGFzc2lnbihmb3JDb21tZW50KTtcblx0XHRcdGxpbmVSZXN0ID0gdHlwZW9mIHJlc3Q9PT0nc3RyaW5nJyA/IHJlc3QgOiB5aWVsZCByZXN0O1xuXHRcdFx0aWYgKCBsaW5lUmVzdCApIHtcblx0XHRcdFx0aWYgKCBsaW5lUmVzdFswXT09PScjJyApIHtcblx0XHRcdFx0XHRpZiAoIG9wdGlvbnMucHJlc2VydmVDb21tZW50ICkgeyBmb3JDb21tZW50LnRhYmxlW2NvbW1lbnRGb3IoZm9yQ29tbWVudC5maW5hbEtleSldID0gbGluZVJlc3Quc2xpY2UoMSk7IH1cblx0XHRcdFx0XHRpbmxpbmUgPSBmYWxzZTtcblx0XHRcdFx0XHRkbyB7IGxpbmVSZXN0ID0gc3RhcnQubXVzdCgpLnJlcGxhY2UocmVnZXhwcy5QUkVfV0hJVEVTUEFDRSwgJycpOyB9XG5cdFx0XHRcdFx0d2hpbGUgKCAhbGluZVJlc3QgfHwgbGluZVJlc3RbMF09PT0nIycgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGlubGluZSA9IGZhbHNlO1xuXHRcdFx0XHRkbyB7IGxpbmVSZXN0ID0gc3RhcnQubXVzdCgpLnJlcGxhY2UocmVnZXhwcy5QUkVfV0hJVEVTUEFDRSwgJycpOyB9XG5cdFx0XHRcdHdoaWxlICggIWxpbmVSZXN0IHx8IGxpbmVSZXN0WzBdPT09JyMnICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGxpbmVSZXN0WzBdPT09JywnICkgeyBsaW5lUmVzdCA9IGxpbmVSZXN0LnJlcGxhY2UocmVnZXhwcy5TWU1fV0hJVEVTUEFDRSwgJycpOyB9XG5cdFx0fVxuXHRcdGlubGluZSB8fCBiZUlubGluZShpbmxpbmVUYWJsZSwgZmFsc2UpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGxpbmVSZXN0ID0gbGluZVJlc3QucmVwbGFjZShyZWdleHBzLlNZTV9XSElURVNQQUNFLCAnJykgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBJbmxpbmUgVGFibGUgaXMgaW50ZW5kZWQgdG8gYXBwZWFyIG9uIGEgc2luZ2xlIGxpbmVgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggYnJva2VuIGF0ICcpKSk7XG5cdFx0aWYgKCBsaW5lUmVzdFswXSE9PSd9JyApIHtcblx0XHRcdGZvciAoIDsgOyApIHtcblx0XHRcdFx0bGluZVJlc3RbMF09PT0nIycgJiYgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBJbmxpbmUgVGFibGUgaXMgaW50ZW5kZWQgdG8gYXBwZWFyIG9uIGEgc2luZ2xlIGxpbmVgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggYnJva2VuIGF0ICcpKSk7XG5cdFx0XHRcdGNvbnN0IHJlc3QgICAgICAgICAgICAgPSBhc3NpZ24oRm9yQ29tbWVudChpbmxpbmVUYWJsZSwgbGluZVJlc3QpKTtcblx0XHRcdFx0bGluZVJlc3QgPSAoIHR5cGVvZiByZXN0PT09J3N0cmluZycgPyByZXN0IDogeWllbGQgcmVzdCApIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgSW5saW5lIFRhYmxlIGlzIGludGVuZGVkIHRvIGFwcGVhciBvbiBhIHNpbmdsZSBsaW5lYCArIGl0ZXJhdG9yLndoZXJlKCcsIHdoaWNoIGJyb2tlbiBhdCAnKSkpO1xuXHRcdFx0XHRpZiAoIGxpbmVSZXN0WzBdPT09J30nICkgeyBicmVhazsgfVxuXHRcdFx0XHRpZiAoIGxpbmVSZXN0WzBdPT09JywnICkge1xuXHRcdFx0XHRcdGxpbmVSZXN0ID0gbGluZVJlc3QucmVwbGFjZShyZWdleHBzLlNZTV9XSElURVNQQUNFLCAnJykgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBJbmxpbmUgVGFibGUgaXMgaW50ZW5kZWQgdG8gYXBwZWFyIG9uIGEgc2luZ2xlIGxpbmVgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggYnJva2VuIGF0ICcpKSk7XG5cdFx0XHRcdFx0bGluZVJlc3RbMF09PT0nfScgJiYgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBUaGUgbGFzdCBwcm9wZXJ0eSBvZiBhbiBJbmxpbmUgVGFibGUgY2FuIG5vdCBoYXZlIGEgdHJhaWxpbmcgY29tbWFgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggd2FzIGZvdW5kIGF0ICcpKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGxpbmVSZXN0LnJlcGxhY2UocmVnZXhwcy5TWU1fV0hJVEVTUEFDRSwgJycpO1xufSAgICAgXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5jb25zdCBGb3JDb21tZW50ID0gKGxhc3RJbmxpbmVUYWJsZSAgICAgICAsIGxpbmVSZXN0ICAgICAgICApICAgICAgICAgICAgID0+IHtcblx0Y29uc3QgeyBsZWFkaW5nS2V5cywgZmluYWxLZXksIHRhZyB9ID0geyBsaW5lUmVzdCB9ID0gcmVnZXhwcy5LRVlfVkFMVUVfUEFJUl9leGVjX2dyb3VwcyhwYXJzZUtleXMobGluZVJlc3QpKTtcblx0cmV0dXJuIHsgdGFibGU6IHByZXBhcmVJbmxpbmVUYWJsZShsYXN0SW5saW5lVGFibGUsIGxlYWRpbmdLZXlzKSwgZmluYWxLZXksIHRhZywgbGluZVJlc3QgfTtcbn07XG5jb25zdCBhc3NpZ24gPSAoeyBmaW5hbEtleSwgdGFnLCBsaW5lUmVzdCwgdGFibGUgfSAgICAgICAgICAgICkgICAgICAgICAgICAgPT4ge1xuXHRmaW5hbEtleSBpbiB0YWJsZSAmJiBpdGVyYXRvci50aHJvd3MoRXJyb3IoYER1cGxpY2F0ZSBwcm9wZXJ0eSBkZWZpbml0aW9uYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0aWYgKCB0YWcgKSB7XG5cdFx0b3B0aW9ucy5jb2xsZWN0KHRhZywgbnVsbCwgdGFibGUsIGZpbmFsS2V5KTtcblx0XHRzd2l0Y2ggKCBsaW5lUmVzdCAmJiBsaW5lUmVzdFswXSApIHtcblx0XHRcdGNhc2UgJywnOlxuXHRcdFx0Y2FzZSAnfSc6XG5cdFx0XHRjYXNlICcnOlxuXHRcdFx0Y2FzZSAnIyc6XG5cdFx0XHRcdHRhYmxlW2ZpbmFsS2V5XSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0cmV0dXJuIGxpbmVSZXN0O1xuXHRcdH1cblx0fVxuXHRzd2l0Y2ggKCBsaW5lUmVzdCAmJiBsaW5lUmVzdFswXSApIHtcblx0XHRjYXNlICdcXCcnOlxuXHRcdFx0cmV0dXJuIGFzc2lnbkxpdGVyYWxTdHJpbmcodGFibGUsIGZpbmFsS2V5LCBsaW5lUmVzdCk7XG5cdFx0Y2FzZSAnXCInOlxuXHRcdFx0cmV0dXJuIGFzc2lnbkJhc2ljU3RyaW5nKHRhYmxlLCBmaW5hbEtleSwgbGluZVJlc3QpO1xuXHRcdGNhc2UgJ3snOlxuXHRcdFx0b3B0aW9ucy5pbmxpbmVUYWJsZSB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYElubGluZSBUYWJsZSBpcyBub3QgYWxsb3dlZCBiZWZvcmUgVE9NTCB2MC40YCArIGl0ZXJhdG9yLndoZXJlKCcsIHdoaWNoIGF0ICcpKSk7XG5cdFx0XHRyZXR1cm4gZXF1YWxJbmxpbmVUYWJsZSh0YWJsZSwgZmluYWxLZXksIGxpbmVSZXN0KTtcblx0XHRjYXNlICdbJzpcblx0XHRcdHJldHVybiBlcXVhbFN0YXRpY0FycmF5KHRhYmxlLCBmaW5hbEtleSwgbGluZVJlc3QpO1xuXHR9XG5cdGNvbnN0IHsgMTogbGl0ZXJhbCB9ID0geyAyOiBsaW5lUmVzdCB9ID0gcmVnZXhwcy5WQUxVRV9SRVNUX2V4ZWMobGluZVJlc3QpIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgQmFkIGF0b20gdmFsdWVgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRpZiAoIGxpdGVyYWw9PT0ndHJ1ZScgKSB7IHRhYmxlW2ZpbmFsS2V5XSA9IHRydWU7IH1cblx0ZWxzZSBpZiAoIGxpdGVyYWw9PT0nZmFsc2UnICkgeyB0YWJsZVtmaW5hbEtleV0gPSBmYWxzZTsgfVxuXHRlbHNlIGlmICggb3B0aW9ucy5lbmFibGVOdWxsICYmIGxpdGVyYWw9PT0nbnVsbCcgKSB7IHRhYmxlW2ZpbmFsS2V5XSA9IG51bGw7IH1cblx0ZWxzZSBpZiAoIGxpdGVyYWwuaW5jbHVkZXMoJzonKSApIHtcblx0XHRpZiAoIGxpdGVyYWwuaW5jbHVkZXMoJy0nKSApIHtcblx0XHRcdGlmICggSVNfT0ZGU0VUJChsaXRlcmFsKSApIHtcblx0XHRcdFx0dGFibGVbZmluYWxLZXldID0gbmV3IE9mZnNldERhdGVUaW1lKGxpdGVyYWwpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdG9wdGlvbnMubW9yZURhdGV0aW1lIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgTG9jYWwgRGF0ZS1UaW1lIGlzIG5vdCBhbGxvd2VkIGJlZm9yZSBUT01MIHYwLjVgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggYXQgJykpKTtcblx0XHRcdFx0dGFibGVbZmluYWxLZXldID0gbmV3IExvY2FsRGF0ZVRpbWUobGl0ZXJhbCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0b3B0aW9ucy5tb3JlRGF0ZXRpbWUgfHwgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBMb2NhbCBUaW1lIGlzIG5vdCBhbGxvd2VkIGJlZm9yZSBUT01MIHYwLjVgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggYXQgJykpKTtcblx0XHRcdHRhYmxlW2ZpbmFsS2V5XSA9IG5ldyBMb2NhbFRpbWUobGl0ZXJhbCk7XG5cdFx0fVxuXHR9XG5cdGVsc2UgaWYgKCBsaXRlcmFsLmluZGV4T2YoJy0nKSE9PWxpdGVyYWwubGFzdEluZGV4T2YoJy0nKSAmJiBsaXRlcmFsWzBdIT09Jy0nICkge1xuXHRcdG9wdGlvbnMubW9yZURhdGV0aW1lIHx8IGl0ZXJhdG9yLnRocm93cyhTeW50YXhFcnJvcihgTG9jYWwgRGF0ZSBpcyBub3QgYWxsb3dlZCBiZWZvcmUgVE9NTCB2MC41YCArIGl0ZXJhdG9yLndoZXJlKCcsIHdoaWNoIGF0ICcpKSk7XG5cdFx0dGFibGVbZmluYWxLZXldID0gbmV3IExvY2FsRGF0ZShsaXRlcmFsKTtcblx0fVxuXHRlbHNlIHtcblx0XHR0YWJsZVtmaW5hbEtleV0gPSBsaXRlcmFsLmluY2x1ZGVzKCcuJykgfHwgbGl0ZXJhbC5pbmNsdWRlcygnbicpIHx8ICggbGl0ZXJhbC5pbmNsdWRlcygnZScpIHx8IGxpdGVyYWwuaW5jbHVkZXMoJ0UnKSApICYmICFsaXRlcmFsLnN0YXJ0c1dpdGgoJzB4Jylcblx0XHRcdD8gb3B0aW9ucy5wcmVzZXJ2ZUxpdGVyYWwgPyBMaXRlcmFsT2JqZWN0KGxpdGVyYWwsIEZsb2F0KGxpdGVyYWwpKSA6IEZsb2F0KGxpdGVyYWwpXG5cdFx0XHQ6IG9wdGlvbnMucHJlc2VydmVMaXRlcmFsID8gTGl0ZXJhbE9iamVjdChsaXRlcmFsLCBJbnRlZ2VyKGxpdGVyYWwpKSA6IEludGVnZXIobGl0ZXJhbClcblx0XHQ7XG5cdH1cblx0cmV0dXJuIGxpbmVSZXN0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKCkgICAgICAgID0+IHtcblx0Y29uc3Qgcm9vdFRhYmxlICAgICAgICA9IG5ldyBvcHRpb25zLlRhYmxlO1xuXHRsZXQgbGFzdFNlY3Rpb25UYWJsZSAgICAgICAgPSByb290VGFibGU7XG5cdHdoaWxlICggaXRlcmF0b3IucmVzdCgpICkge1xuXHRcdGNvbnN0IGxpbmUgICAgICAgICA9IGl0ZXJhdG9yLm5leHQoKS5yZXBsYWNlKHJlZ2V4cHMuUFJFX1dISVRFU1BBQ0UsICcnKTtcblx0XHRpZiAoIGxpbmUgKSB7XG5cdFx0XHRpZiAoIGxpbmVbMF09PT0nWycgKSB7XG5cdFx0XHRcdGNvbnN0IHsgbGVhZGluZ0tleXMsIGZpbmFsS2V5LCBhc0FycmF5SXRlbSwgdGFnLCBsaW5lUmVzdCB9ID0gcmVnZXhwcy5UQUJMRV9ERUZJTklUSU9OX2V4ZWNfZ3JvdXBzKGxpbmUsIHBhcnNlS2V5cyk7XG5cdFx0XHRcdGNvbnN0IHRhYmxlICAgICAgICA9IHByZXBhcmVUYWJsZShyb290VGFibGUsIGxlYWRpbmdLZXlzKTtcblx0XHRcdFx0aWYgKCBsaW5lUmVzdCApIHtcblx0XHRcdFx0XHRsaW5lUmVzdFswXT09PScjJyB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYFVuZXhwZWN0IGNoYXJhY2h0b3IgYWZ0ZXIgdGFibGUgaGVhZGVyYCArIGl0ZXJhdG9yLndoZXJlKCcgYXQgJykpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsYXN0U2VjdGlvblRhYmxlID0gYXBwZW5kVGFibGUodGFibGUsIGZpbmFsS2V5LCBhc0FycmF5SXRlbSwgdGFnKTtcblx0XHRcdFx0b3B0aW9ucy5wcmVzZXJ2ZUNvbW1lbnQgJiYgbGluZVJlc3QgJiYgKCBsYXN0U2VjdGlvblRhYmxlW2NvbW1lbnRGb3JUaGlzXSA9IGFzQXJyYXlJdGVtID8gbGluZVJlc3Quc2xpY2UoMSkgOiB0YWJsZVtjb21tZW50Rm9yKGZpbmFsS2V5KV0gPSBsaW5lUmVzdC5zbGljZSgxKSApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoIGxpbmVbMF09PT0nIycgKSB7XG5cdFx0XHRcdHJlZ2V4cHMuX19DT05UUk9MX0NIQVJBQ1RFUl9FWENMVURFX3Rlc3QobGluZSkgJiYgaXRlcmF0b3IudGhyb3dzKFN5bnRheEVycm9yKGBDb250cm9sIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBUYWIgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gY29tbWVudHNgICsgaXRlcmF0b3Iud2hlcmUoJywgd2hpY2ggd2FzIGZvdW5kIGF0ICcpKSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3QgZm9yQ29tbWVudCAgICAgICAgICAgICA9IEZvckNvbW1lbnQobGFzdFNlY3Rpb25UYWJsZSwgbGluZSk7XG5cdFx0XHRcdGxldCByZXN0ICAgICAgICAgICAgID0gYXNzaWduKGZvckNvbW1lbnQpO1xuXHRcdFx0XHR0eXBlb2YgcmVzdD09PSdzdHJpbmcnIHx8ICggcmVzdCA9IHggICAgICAgIChyZXN0KSApO1xuXHRcdFx0XHRpZiAoIHJlc3QgKSB7XG5cdFx0XHRcdFx0cmVzdFswXT09PScjJyB8fCBpdGVyYXRvci50aHJvd3MoU3ludGF4RXJyb3IoYFVuZXhwZWN0IGNoYXJhY2h0b3IgYWZ0ZXIga2V5L3ZhbHVlIHBhaXJgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdFx0XHRcdGlmICggb3B0aW9ucy5wcmVzZXJ2ZUNvbW1lbnQgKSB7IGZvckNvbW1lbnQudGFibGVbY29tbWVudEZvcihmb3JDb21tZW50LmZpbmFsS2V5KV0gPSByZXN0LnNsaWNlKDEpOyB9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHJvb3RUYWJsZTtcbn07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwiaW1wb3J0IEFycmF5IGZyb20gJy5BcnJheSc7XG5pbXBvcnQgZnJvbUNoYXJDb2RlIGZyb20gJy5TdHJpbmcuZnJvbUNoYXJDb2RlJztcbmltcG9ydCBmcm9tRW50cmllcyBmcm9tICcuT2JqZWN0LmZyb21FbnRyaWVzJztcbmltcG9ydCBOdWxsIGZyb20gJy5udWxsJztcblxuaW1wb3J0IHsgdGhlUmVnRXhwIH0gZnJvbSAnQGx0ZC9qLXJlZ2V4cCc7XG5cbmNvbnN0IEVTQ0FQRUQgPSAvKiNfX1BVUkVfXyovTnVsbCAgICAgICAgKHtcblx0Li4uLyojX19QVVJFX18qL2Zyb21FbnRyaWVzKC8qI19fUFVSRV9fKi9bIC4uLkFycmF5KDB4MjApIF0ubWFwKChfLCBjaGFyQ29kZSkgPT4gWyBmcm9tQ2hhckNvZGUoY2hhckNvZGUpLCAnXFxcXHUnICsgY2hhckNvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkucGFkU3RhcnQoNCwgJzAnKSBdKSksXG5cdCdcXGInOiAnXFxcXGInLFxuXHQnXFx0JzogJ1xcXFx0Jyxcblx0J1xcbic6ICdcXFxcbicsXG5cdCdcXGYnOiAnXFxcXGYnLFxuXHQnXFxyJzogJ1xcXFxyJyxcblx0J1wiJzogJ1xcXFxcIicsXG5cdCdcIlwiXCInOiAnXCJcIlxcXFxcIicsXG5cdCdcXFxcJzogJ1xcXFxcXFxcJyxcblx0J1xceDdGJzogJ1xcXFx1MDA3RicsXG59KTtcblxuY29uc3QgeyB0ZXN0OiBORUVEX0JBU0lDIH0gPSB0aGVSZWdFeHAoL1tcXHgwMC1cXHgwOFxceDBBLVxceDFGJ1xceDdGXS8pO1xuY29uc3QgQllfRVNDQVBFID0gL1teXFx4MDAtXFx4MDhcXHgwQS1cXHgxRlwiXFxcXFxceDdGXSt8Li9ncztcbmNvbnN0IHsgdGVzdDogTkVFRF9FU0NBUEUgfSA9IHRoZVJlZ0V4cCgvXltcXHgwMC1cXHgwOFxceDBBLVxceDFGXCJcXFxcXFx4N0ZdLyk7XG5leHBvcnQgY29uc3Qgc2luZ2xlbGluZVN0cmluZyA9ICh2YWx1ZSAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4ge1xuXHRpZiAoIE5FRURfQkFTSUModmFsdWUpICkge1xuXHRcdGNvbnN0IHBhcnRzID0gdmFsdWUubWF0Y2goQllfRVNDQVBFKSA7XG5cdFx0bGV0IGluZGV4ID0gcGFydHMubGVuZ3RoO1xuXHRcdGRvIHsgaWYgKCBORUVEX0VTQ0FQRShwYXJ0c1stLWluZGV4XSApICkgeyBwYXJ0c1tpbmRleF0gPSBFU0NBUEVEW3BhcnRzW2luZGV4XSBdIDsgfSB9XG5cdFx0d2hpbGUgKCBpbmRleCApO1xuXHRcdHJldHVybiBgXCIke3BhcnRzLmpvaW4oJycpfVwiYDtcblx0fVxuXHRyZXR1cm4gYCcke3ZhbHVlfSdgO1xufTtcbmV4cG9ydCBjb25zdCBzaW5nbGVsaW5lQmFzaWNTdHJpbmcgPSAodmFsdWUgICAgICAgICkgICAgICAgICAgICAgICAgPT4ge1xuXHRpZiAoIHZhbHVlICkge1xuXHRcdGNvbnN0IHBhcnRzID0gdmFsdWUubWF0Y2goQllfRVNDQVBFKSA7XG5cdFx0bGV0IGluZGV4ID0gcGFydHMubGVuZ3RoO1xuXHRcdGRvIHsgaWYgKCBORUVEX0VTQ0FQRShwYXJ0c1stLWluZGV4XSApICkgeyBwYXJ0c1tpbmRleF0gPSBFU0NBUEVEW3BhcnRzW2luZGV4XSBdIDsgfSB9XG5cdFx0d2hpbGUgKCBpbmRleCApO1xuXHRcdHJldHVybiBgXCIke3BhcnRzLmpvaW4oJycpfVwiYDtcblx0fVxuXHRyZXR1cm4gYFwiXCJgO1xufTtcblxuY29uc3QgeyB0ZXN0OiBORUVEX01VTFRJTElORV9CQVNJQyB9ID0gdGhlUmVnRXhwKC9bXFx4MDAtXFx4MDhcXHgwQS1cXHgxRlxceDdGXXwnJycvKTtcbmV4cG9ydCBjb25zdCB7IHRlc3Q6IG11bHRpbGluZU5lZWRCYXNpYyB9ID0gdGhlUmVnRXhwKC9bXFx4MDAtXFx4MDhcXHgwQi1cXHgxRlxceDdGXXwnJycvKTtcbmNvbnN0IHsgdGVzdDogUkVBTF9NVUxUSUxJTkVfRVNDQVBFIH0gPSB0aGVSZWdFeHAoL1tcXHgwMC1cXHgwOFxceDBBLVxceDFGXFxcXFxceDdGXXxcIlwiXCIvKTtcbmNvbnN0IEJZX01VTFRJTElORV9FU0NBUEUgPSAvW15cXHgwMC1cXHgwOFxceDBBLVxceDFGXCJcXFxcXFx4N0ZdK3xcIlwiXCJ8Li9ncztcbmNvbnN0IHsgdGVzdDogTkVFRF9NVUxUSUxJTkVfRVNDQVBFIH0gPSB0aGVSZWdFeHAoL14oPzpbXFx4MDAtXFx4MDhcXHgwQS1cXHgxRlxcXFxcXHg3Rl18XCJcIlwiKS8pO1xuY29uc3QgZXNjYXBlX211bHRpbGluZSA9IChsaW5lcyAgICAgICAgICAsIGxpbmVJbmRleCAgICAgICAgKSA9PiB7XG5cdGNvbnN0IGxpbmUgPSBsaW5lc1tsaW5lSW5kZXhdIDtcblx0aWYgKCBSRUFMX01VTFRJTElORV9FU0NBUEUobGluZSkgKSB7XG5cdFx0Y29uc3QgcGFydHMgPSBsaW5lLm1hdGNoKEJZX01VTFRJTElORV9FU0NBUEUpIDtcblx0XHRsZXQgaW5kZXggPSBwYXJ0cy5sZW5ndGg7XG5cdFx0ZG8geyBpZiAoIE5FRURfTVVMVElMSU5FX0VTQ0FQRShwYXJ0c1stLWluZGV4XSApICkgeyBwYXJ0c1tpbmRleF0gPSBFU0NBUEVEW3BhcnRzW2luZGV4XSBdIDsgfSB9XG5cdFx0d2hpbGUgKCBpbmRleCApO1xuXHRcdGxpbmVzW2xpbmVJbmRleF0gPSBwYXJ0cy5qb2luKCcnKTtcblx0fVxufTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGNvbnN0IExpbmVzID0gKGxpbmVzICAgICAgICAgICAgICAgICAgICkgICAgICAgID0+ICggbGluZXMgPSBbICcnLCAuLi5saW5lcyBdICAgICAgICAgICkubGVuZ3RoPT09MSA/IFsgJycsICcnIF0gOiBsaW5lcyAgICAgICAgIDtcblxuZXhwb3J0IGNvbnN0IG11bHRpbGluZVN0cmluZyA9IChsaW5lcyAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IHtcblx0Y29uc3QgbGFzdEluZGV4ID0gbGluZXMubGVuZ3RoIC0gMTtcblx0bGV0IGluZGV4ID0gbGFzdEluZGV4O1xuXHRkbyB7IGlmICggTkVFRF9NVUxUSUxJTkVfQkFTSUMobGluZXNbaW5kZXhdICkgKSB7IGJyZWFrOyB9IH1cblx0d2hpbGUgKCAtLWluZGV4ICk7XG5cdGlmICggaW5kZXggKSB7XG5cdFx0aW5kZXggPSBsYXN0SW5kZXg7XG5cdFx0ZXNjYXBlX211bHRpbGluZShsaW5lcywgaW5kZXgpO1xuXHRcdGxpbmVzW2luZGV4XSArPSBsaW5lc1swXSA9ICdcIlwiXCInO1xuXHRcdHdoaWxlICggLS1pbmRleCApIHsgZXNjYXBlX211bHRpbGluZShsaW5lcywgaW5kZXgpOyB9XG5cdH1cblx0ZWxzZXsgbGluZXNbbGFzdEluZGV4XSArPSBsaW5lc1swXSA9ICdcXCdcXCdcXCcnOyB9XG5cdHJldHVybiBsaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xufTtcblxuZXhwb3J0IGNvbnN0IG11bHRpbGluZUJhc2ljU3RyaW5nID0gKGxpbmVzICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IHtcblx0bGV0IGluZGV4ID0gbGluZXMubGVuZ3RoIC0gMTtcblx0ZXNjYXBlX211bHRpbGluZShsaW5lcywgaW5kZXgpO1xuXHRsaW5lc1tpbmRleF0gKz0gbGluZXNbMF0gPSAnXCJcIlwiJztcblx0d2hpbGUgKCAtLWluZGV4ICkgeyBlc2NhcGVfbXVsdGlsaW5lKGxpbmVzLCBpbmRleCk7IH1cblx0cmV0dXJuIGxpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xufTtcblxuZXhwb3J0IGNvbnN0IG11bHRpbGluZUxpdGVyYWxTdHJpbmcgPSAobGluZXMgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4ge1xuXHRsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lc1swXSA9ICdcXCdcXCdcXCcnO1xuXHRyZXR1cm4gbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG59O1xuIiwiaW1wb3J0IEZsb2F0NjRBcnJheSBmcm9tICcuRmxvYXQ2NEFycmF5JztcbmltcG9ydCBVaW50OEFycmF5IGZyb20gJy5VaW50OEFycmF5JztcbmltcG9ydCBJbmZpbml0eSBmcm9tICcuSW5maW5pdHknO1xuaW1wb3J0IE5hTiBmcm9tICcuTmFOJztcbmltcG9ydCBpcyBmcm9tICcuT2JqZWN0LmlzJztcblxuaW1wb3J0IHsgdGhlUmVnRXhwIH0gZnJvbSAnQGx0ZC9qLXJlZ2V4cCc7XG5cbmNvbnN0IF9JbmZpbml0eSA9IC1JbmZpbml0eTtcblxuY29uc3QgeyB0ZXN0OiBJTlRFR0VSX0xJS0UgfSA9IHRoZVJlZ0V4cCgvXi0/XFxkKyQvKTtcbmNvbnN0IGVuc3VyZUZsb2F0ID0gKGxpdGVyYWwgICAgICAgICkgPT4gSU5URUdFUl9MSUtFKGxpdGVyYWwpID8gbGl0ZXJhbCArICcuMCcgOiBsaXRlcmFsO1xuXG5jb25zdCBmbG9hdDY0QXJyYXkgPSBuZXcgRmxvYXQ2NEFycmF5KFsgTmFOIF0pO1xuY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGZsb2F0NjRBcnJheS5idWZmZXIpO1xuY29uc3QgTmFOXzcgPSB1aW50OEFycmF5WzddIDtcblxuZXhwb3J0IGNvbnN0IGZsb2F0ID0gTmFOXzc9PT1uZXcgVWludDhBcnJheShuZXcgRmxvYXQ2NEFycmF5KFsgLU5hTiBdKS5idWZmZXIpWzddIFxuXHQ/ICh2YWx1ZSAgICAgICAgKSA9PiB2YWx1ZVxuXHRcdD8gdmFsdWU9PT1JbmZpbml0eSA/ICdpbmYnIDogdmFsdWU9PT1fSW5maW5pdHkgPyAnLWluZicgOiBlbnN1cmVGbG9hdCgnJyArIHZhbHVlKVxuXHRcdDogdmFsdWU9PT12YWx1ZSA/IGlzKHZhbHVlLCAwKSA/ICcwLjAnIDogJy0wLjAnIDogJ25hbidcblx0OiAodmFsdWUgICAgICAgICkgPT4gdmFsdWVcblx0XHQ/IHZhbHVlPT09SW5maW5pdHkgPyAnaW5mJyA6IHZhbHVlPT09X0luZmluaXR5ID8gJy1pbmYnIDogZW5zdXJlRmxvYXQoJycgKyB2YWx1ZSlcblx0XHQ6IHZhbHVlPT09dmFsdWUgPyBpcyh2YWx1ZSwgMCkgPyAnMC4wJyA6ICctMC4wJyA6ICggZmxvYXQ2NEFycmF5WzBdID0gdmFsdWUsIHVpbnQ4QXJyYXlbN10gKT09PU5hTl83ID8gJ25hbicgOiAnLW5hbic7XG4iLCJpbXBvcnQgVHlwZUVycm9yIGZyb20gJy5UeXBlRXJyb3InO1xuaW1wb3J0IFN5bWJvbCBmcm9tICcuU3ltYm9sJztcbmltcG9ydCBBcnJheSBmcm9tICcuQXJyYXknO1xuaW1wb3J0IERBVEUgZnJvbSAnLkRhdGUucHJvdG90eXBlJztcbmltcG9ydCBpc1Byb3RvdHlwZU9mIGZyb20gJy5PYmplY3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2YnO1xuaW1wb3J0IGdldE93blByb3BlcnR5TmFtZXMgZnJvbSAnLk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzJztcbmltcG9ydCBpcyBmcm9tICcuT2JqZWN0LmlzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy5BcnJheS5pc0FycmF5JztcbmltcG9ydCB1bmRlZmluZWQgZnJvbSAnLnVuZGVmaW5lZCc7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLmNsYXNzLmlzU3RyaW5nJztcbmltcG9ydCBpc051bWJlciBmcm9tICcuY2xhc3MuaXNOdW1iZXInO1xuaW1wb3J0IGlzQmlnSW50IGZyb20gJy5jbGFzcy5pc0JpZ0ludCc7XG5pbXBvcnQgaXNCb29sZWFuIGZyb20gJy5jbGFzcy5pc0Jvb2xlYW4nO1xuXG5pbXBvcnQgeyB0aGVSZWdFeHAgfSBmcm9tICdAbHRkL2otcmVnZXhwJztcblxuaW1wb3J0ICogYXMgcmVnZXhwcyBmcm9tICcuLi9yZWdleHBzJztcblxuaW1wb3J0IHsgY29tbWVudEZvclRoaXMsIGdldENPTU1FTlQsIGdldENvbW1lbnQgfSBmcm9tICcuLi90eXBlcy9jb21tZW50JztcbmltcG9ydCB7IHNpbmdsZWxpbmVTdHJpbmcgfSBmcm9tICcuL3N0cmluZyc7XG5pbXBvcnQgeyBmbG9hdCB9IGZyb20gJy4vZmxvYXQnO1xuaW1wb3J0IHsgaXNTZWN0aW9uLCBvZklubGluZSB9IGZyb20gJy4uL3R5cGVzL25vbi1hdG9tJztcbmltcG9ydCB7IF9saXRlcmFsIH0gZnJvbSAnLi4vdHlwZXMvYXRvbSc7XG5cbmNvbnN0IGlzRGF0ZSA9IC8qI19fUFVSRV9fKi9pc1Byb3RvdHlwZU9mLmJpbmQoREFURSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XG5cbmNvbnN0IHsgdGVzdDogQkFSRSB9ID0gdGhlUmVnRXhwKC9eW1xcdy1dKyQvKTtcbmNvbnN0ICRLZXkkID0gKGtleSAgICAgICAgKSAgICAgICAgID0+IEJBUkUoa2V5KSA/IGtleSA6IHNpbmdsZWxpbmVTdHJpbmcoa2V5KTtcblxuY29uc3QgRklSU1QgPSAvW14uXSsvO1xuY29uc3QgbGl0ZXJhbFN0cmluZyA9ICh2YWx1ZSAgICAgICAgKSAgICAgICAgICAgICAgICA9PiBgJyR7dmFsdWV9J2A7XG5jb25zdCAkS2V5cyA9IChrZXlzICAgICAgICApICAgICAgICAgPT4gcmVnZXhwcy5pc0FtYXppbmcoa2V5cykgPyBrZXlzLnJlcGxhY2UoRklSU1QsIGxpdGVyYWxTdHJpbmcpIDoga2V5cz09PSdudWxsJyA/IGAnbnVsbCdgIDoga2V5cztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVE9NTFNlY3Rpb24gZXh0ZW5kcyBBcnJheSAgICAgICAgIHtcblx0XG5cdCAgICAgICAgICAgICAgICAgZG9jdW1lbnQgICAgICAgICAgICAgIDtcblx0XG5cdGNvbnN0cnVjdG9yIChkb2N1bWVudCAgICAgICAgICAgICAgKSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0XG5cdFtTeW1ib2wudG9QcmltaXRpdmVdICgpIHsgcmV0dXJuIHRoaXMuam9pbih0aGlzLmRvY3VtZW50Lm5ld2xpbmUpOyB9XG5cdFxuXHRhcHBlbmROZXdsaW5lICgpIHsgdGhpc1t0aGlzLmxlbmd0aF0gPSAnJzsgfVxuXHQgICAgICAgIHNldCBhcHBlbmRMaW5lIChzb3VyY2UgICAgICAgICkgeyB0aGlzW3RoaXMubGVuZ3RoXSA9IHNvdXJjZTsgfVxuXHQgICAgICAgIHNldCBhcHBlbmRJbmxpbmUgKHNvdXJjZSAgICAgICAgKSB7IHRoaXNbdGhpcy5sZW5ndGggLSAxXSArPSBzb3VyY2U7IH0gICBcblx0ICAgICAgICBzZXQgYXBwZW5kSW5saW5lSWYgKHNvdXJjZSAgICAgICAgKSB7IHNvdXJjZSAmJiAoIHRoaXNbdGhpcy5sZW5ndGggLSAxXSArPSBzb3VyY2UgKTsgfS8vL1xuXHRcblx0KiBhc3NpZ25CbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb2N1bWVudEtleXNfICAgICAgICAgICAgICAgICAgICwgc2VjdGlvbktleXNfICAgICAgICAgICAgICAgICAgLCB0YWJsZSAgICwgdGFibGVLZXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAge1xuXHRcdGNvbnN0IHsgZG9jdW1lbnQgfSA9IHRoaXM7XG5cdFx0Y29uc3QgeyBuZXdsaW5lVW5kZXJIZWFkZXIsIG5ld2xpbmVVbmRlclNlY3Rpb25CdXRQYWlyIH0gPSBkb2N1bWVudDtcblx0XHRjb25zdCBuZXdsaW5lQWZ0ZXJEb3R0ZWQgPSBzZWN0aW9uS2V5c18gPyBkb2N1bWVudC5uZXdsaW5lVW5kZXJQYWlyQnV0RG90dGVkIDogZmFsc2U7XG5cdFx0Y29uc3QgbmV3bGluZUFmdGVyUGFpciA9IHNlY3Rpb25LZXlzXyA/IGRvY3VtZW50Lm5ld2xpbmVVbmRlckRvdHRlZCA6IGRvY3VtZW50Lm5ld2xpbmVVbmRlclBhaXI7XG5cdFx0Zm9yICggY29uc3QgdGFibGVLZXkgb2YgdGFibGVLZXlzICkge1xuXHRcdFx0Y29uc3QgdmFsdWUgICAgICAgICAgICAgICAgID0gdGFibGVbdGFibGVLZXldIDtcblx0XHRcdGNvbnN0ICRrZXkkID0gJEtleSQodGFibGVLZXkpO1xuXHRcdFx0Y29uc3QgZG9jdW1lbnRLZXlzID0gZG9jdW1lbnRLZXlzXyArICRrZXkkO1xuXHRcdFx0aWYgKCBpc0FycmF5KHZhbHVlKSApIHtcblx0XHRcdFx0Y29uc3QgeyBsZW5ndGggfSA9IHZhbHVlO1xuXHRcdFx0XHRpZiAoIGxlbmd0aCApIHtcblx0XHRcdFx0XHRsZXQgZmlyc3RJdGVtID0gdmFsdWVbMF07XG5cdFx0XHRcdFx0aWYgKCBpc1NlY3Rpb24oZmlyc3RJdGVtKSApIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhYmxlSGVhZGVyID0gYFtbJHtkb2N1bWVudEtleXN9XV1gICAgICAgICAgO1xuXHRcdFx0XHRcdFx0Y29uc3QgZG9jdW1lbnRLZXlzXyA9IGRvY3VtZW50S2V5cyArICcuJyAgICAgICAgICAgICAgICA7XG5cdFx0XHRcdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0XHRcdFx0bGV0IHRhYmxlICAgICAgICAgICAgICAgICA9IGZpcnN0SXRlbTtcblx0XHRcdFx0XHRcdGZvciAoIDsgOyApIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50LmFwcGVuZFNlY3Rpb24oKTtcblx0XHRcdFx0XHRcdFx0c2VjdGlvblswXSA9IHRhYmxlSGVhZGVyICsgZ2V0Q09NTUVOVCh0YWJsZSwgY29tbWVudEZvclRoaXMpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5ld2xpbmVVbmRlckhlYWRlciApIHtcblx0XHRcdFx0XHRcdFx0XHRzZWN0aW9uWzFdID0gJyc7XG5cdFx0XHRcdFx0XHRcdFx0eWllbGQgc2VjdGlvbi5hc3NpZ25CbG9jayhkb2N1bWVudEtleXNfLCBgYCwgdGFibGUsIGdldE93blByb3BlcnR5TmFtZXModGFibGUpKTtcblx0XHRcdFx0XHRcdFx0XHRuZXdsaW5lVW5kZXJTZWN0aW9uQnV0UGFpciAmJiBzZWN0aW9uLmxlbmd0aCE9PTIgJiYgc2VjdGlvbi5hcHBlbmROZXdsaW5lKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0eWllbGQgc2VjdGlvbi5hc3NpZ25CbG9jayhkb2N1bWVudEtleXNfLCBgYCwgdGFibGUsIGdldE93blByb3BlcnR5TmFtZXModGFibGUpKTtcblx0XHRcdFx0XHRcdFx0XHRuZXdsaW5lVW5kZXJTZWN0aW9uQnV0UGFpciAmJiBzZWN0aW9uLmFwcGVuZE5ld2xpbmUoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoICsraW5kZXg9PT1sZW5ndGggKSB7IGJyZWFrOyB9XG5cdFx0XHRcdFx0XHRcdHRhYmxlID0gKCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIClbaW5kZXhdIDtcblx0XHRcdFx0XHRcdFx0aWYgKCAhaXNTZWN0aW9uKHRhYmxlKSApIHsgdGhyb3cgVHlwZUVycm9yKGB0aGUgZmlyc3QgdGFibGUgaXRlbSBtYXJrZWQgYnkgU2VjdGlvbigpIG1lYW5zIHRoZSBwYXJlbnQgYXJyYXkgaXMgYW4gYXJyYXkgb2YgdGFibGVzLCB3aGljaCBjYW4gbm90IGluY2x1ZGUgb3RoZXIgdHlwZXMgb3IgdGFibGUgbm90IG1hcmtlZCBieSBTZWN0aW9uKCkgYW55IG1vcmUgaW4gdGhlIHJlc3QgaXRlbXNgKTsgfVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgeyBsZXQgaW5kZXggPSAxOyB3aGlsZSAoIGluZGV4IT09bGVuZ3RoICkgeyBpZiAoIGlzU2VjdGlvbih2YWx1ZVtpbmRleCsrXSApICkgeyB0aHJvdyBUeXBlRXJyb3IoYGlmIGFuIGFycmF5IGlzIG5vdCBhcnJheSBvZiB0YWJsZXMsIGl0IGNhbiBub3QgaW5jbHVkZSBhbnkgdGFibGUgdGhhdCBtYXJrZWQgYnkgU2VjdGlvbigpYCk7IH0gfSB9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZiAoIGlzU2VjdGlvbih2YWx1ZSkgKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50LmFwcGVuZFNlY3Rpb24oKTtcblx0XHRcdFx0XHRzZWN0aW9uWzBdID0gYFske2RvY3VtZW50S2V5c31dJHtcblx0XHRcdFx0XHRcdGRvY3VtZW50LnByZWZlckNvbW1lbnRGb3JUaGlzXG5cdFx0XHRcdFx0XHRcdD8gZ2V0Q09NTUVOVCh2YWx1ZSwgY29tbWVudEZvclRoaXMpIHx8IGdldENvbW1lbnQodGFibGUsIHRhYmxlS2V5KVxuXHRcdFx0XHRcdFx0XHQ6IGdldENvbW1lbnQodGFibGUsIHRhYmxlS2V5KSB8fCBnZXRDT01NRU5UKHZhbHVlLCBjb21tZW50Rm9yVGhpcylcblx0XHRcdFx0XHR9YDtcblx0XHRcdFx0XHRpZiAoIG5ld2xpbmVVbmRlckhlYWRlciApIHtcblx0XHRcdFx0XHRcdHNlY3Rpb25bMV0gPSAnJztcblx0XHRcdFx0XHRcdHlpZWxkIHNlY3Rpb24uYXNzaWduQmxvY2soZG9jdW1lbnRLZXlzICsgJy4nICAgICAgICAgICAgICAgICwgYGAsIHZhbHVlLCBnZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKSk7XG5cdFx0XHRcdFx0XHRuZXdsaW5lVW5kZXJTZWN0aW9uQnV0UGFpciAmJiBzZWN0aW9uLmxlbmd0aCE9PTIgJiYgc2VjdGlvbi5hcHBlbmROZXdsaW5lKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0eWllbGQgc2VjdGlvbi5hc3NpZ25CbG9jayhkb2N1bWVudEtleXMgKyAnLicgICAgICAgICAgICAgICAgLCBgYCwgdmFsdWUsIGdldE93blByb3BlcnR5TmFtZXModmFsdWUpKTtcblx0XHRcdFx0XHRcdG5ld2xpbmVVbmRlclNlY3Rpb25CdXRQYWlyICYmIHNlY3Rpb24uYXBwZW5kTmV3bGluZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc2VjdGlvbktleXMgPSBzZWN0aW9uS2V5c18gKyAka2V5JDtcblx0XHRcdHRoaXMuYXBwZW5kTGluZSA9ICRLZXlzKHNlY3Rpb25LZXlzKSArICcgPSAnO1xuXHRcdFx0Y29uc3QgdmFsdWVLZXlzSWZWYWx1ZUlzRG90dGVkVGFibGUgPSB0aGlzLnZhbHVlKCcnLCB2YWx1ZSwgdHJ1ZSk7XG5cdFx0XHRpZiAoIHZhbHVlS2V5c0lmVmFsdWVJc0RvdHRlZFRhYmxlICkge1xuXHRcdFx0XHQtLXRoaXMubGVuZ3RoO1xuXHRcdFx0XHR5aWVsZCB0aGlzLmFzc2lnbkJsb2NrKGRvY3VtZW50S2V5cyArICcuJyAgICAgICAgICAgICAgICAsIHNlY3Rpb25LZXlzICsgJy4nICAgICAgICAgICAgICAgICwgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdmFsdWVLZXlzSWZWYWx1ZUlzRG90dGVkVGFibGUpO1xuXHRcdFx0XHRuZXdsaW5lQWZ0ZXJEb3R0ZWQgJiYgdGhpcy5hcHBlbmROZXdsaW5lKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy5hcHBlbmRJbmxpbmVJZiA9IGdldENvbW1lbnQodGFibGUsIHRhYmxlS2V5KTtcblx0XHRcdFx0bmV3bGluZUFmdGVyUGFpciAmJiB0aGlzLmFwcGVuZE5ld2xpbmUoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0XG5cdCAgICAgICAgdmFsdWUgKGluZGVudCAgICAgICAgLCB2YWx1ZSAgICAgICAgICAgICAgICAsIHJldHVyblZhbHVlS2V5c0lmVmFsdWVJc0RvdHRlZFRhYmxlICAgICAgICAgKSAgICAgICAgICAgICAgICAgIHtcblx0XHRzd2l0Y2ggKCB0eXBlb2YgdmFsdWUgKSB7XG5cdFx0XHRjYXNlICdvYmplY3QnOlxuXHRcdFx0XHRpZiAoIHZhbHVlPT09bnVsbCApIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMuZG9jdW1lbnQubnVsbERpc2FibGVkICkgeyB0aHJvdyBUeXBlRXJyb3IoYHRvbWwgY2FuIG5vdCBzdHJpbmdpZnkgXCJudWxsXCIgdHlwZSB2YWx1ZSB3aXRob3V0IHRydXRoeSBvcHRpb25zLnhOdWxsYCk7IH1cblx0XHRcdFx0XHR0aGlzLmFwcGVuZElubGluZSA9ICdudWxsJztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBpbmxpbmVNb2RlID0gb2ZJbmxpbmUodmFsdWUpO1xuXHRcdFx0XHRpZiAoIGlzQXJyYXkodmFsdWUpICkge1xuXHRcdFx0XHRcdGlmICggaW5saW5lTW9kZT09PXVuZGVmaW5lZCApIHsgdGhpcy5zdGF0aWNBcnJheShpbmRlbnQsIHZhbHVlKTsgfVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgeyAkc2luZ2xlbGluZUFycmF5ID0gaW5saW5lTW9kZSB9ID0gdGhpcy5kb2N1bWVudDtcblx0XHRcdFx0XHRcdHRoaXMuc2luZ2xlbGluZUFycmF5KGluZGVudCwgdmFsdWUsICRzaW5nbGVsaW5lQXJyYXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGlubGluZU1vZGUhPT11bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aW5saW5lTW9kZSB8fCB0aGlzLmRvY3VtZW50Lm11bHRpbGluZVRhYmxlRGlzYWJsZWRcblx0XHRcdFx0XHRcdD8gdGhpcy5pbmxpbmVUYWJsZShpbmRlbnQsIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgKVxuXHRcdFx0XHRcdFx0OiB0aGlzLm11bHRpbGluZVRhYmxlKGluZGVudCwgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAsIHRoaXMuZG9jdW1lbnQubXVsdGlsaW5lVGFibGVDb21tYSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBpc0RhdGUodmFsdWUpICkge1xuXHRcdFx0XHRcdHRoaXMuYXBwZW5kSW5saW5lID0gdmFsdWUudG9JU09TdHJpbmcoKS5yZXBsYWNlKCdUJywgdGhpcy5kb2N1bWVudC5UKS5yZXBsYWNlKCdaJywgdGhpcy5kb2N1bWVudC5aKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIF9saXRlcmFsIGluIHZhbHVlICkge1xuXHRcdFx0XHRcdGNvbnN0IGxpdGVyYWwgPSAoIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApW19saXRlcmFsXTtcblx0XHRcdFx0XHRpZiAoIHR5cGVvZiBsaXRlcmFsPT09J3N0cmluZycgKSB7IHRoaXMuYXBwZW5kSW5saW5lID0gbGl0ZXJhbDsgfVxuXHRcdFx0XHRcdGVsc2UgaWYgKCBpc0FycmF5KGxpdGVyYWwpICkge1xuXHRcdFx0XHRcdFx0Y29uc3QgeyBsZW5ndGggfSA9IGxpdGVyYWw7XG5cdFx0XHRcdFx0XHRpZiAoIGxlbmd0aCApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5hcHBlbmRJbmxpbmUgPSBsaXRlcmFsWzBdO1xuXHRcdFx0XHRcdFx0XHRsZXQgaW5kZXggPSAxO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIGluZGV4IT09bGVuZ3RoICkgeyB0aGlzLmFwcGVuZExpbmUgPSBsaXRlcmFsW2luZGV4KytdIDsgfVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7IHRocm93IFR5cGVFcnJvcihgbGl0ZXJhbCB2YWx1ZSBpcyBicm9rZW5gKTsgfVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIHsgdGhyb3cgVHlwZUVycm9yKGBsaXRlcmFsIHZhbHVlIGlzIGJyb2tlbmApOyB9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBpc1N0cmluZyh2YWx1ZSkgKSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5zdHJpbmdpZnkgcmVmdXNlIHRvIGhhbmRsZSBbb2JqZWN0IFN0cmluZ11gKTsgfVxuXHRcdFx0XHRpZiAoIGlzTnVtYmVyKHZhbHVlKSApIHsgdGhyb3cgVHlwZUVycm9yKGBUT01MLnN0cmluZ2lmeSByZWZ1c2UgdG8gaGFuZGxlIFtvYmplY3QgTnVtYmVyXWApOyB9XG5cdFx0XHRcdGlmICggaXNCaWdJbnQodmFsdWUpICkgeyB0aHJvdyBUeXBlRXJyb3IoYFRPTUwuc3RyaW5naWZ5IHJlZnVzZSB0byBoYW5kbGUgW29iamVjdCBCaWdJbnRdYCk7IH1cblx0XHRcdFx0aWYgKCBpc0Jvb2xlYW4odmFsdWUpICkgeyB0aHJvdyBUeXBlRXJyb3IoYFRPTUwuc3RyaW5naWZ5IHJlZnVzZSB0byBoYW5kbGUgW29iamVjdCBCb29sZWFuXWApOyB9XG5cdFx0XHRcdGlmICggcmV0dXJuVmFsdWVLZXlzSWZWYWx1ZUlzRG90dGVkVGFibGUgKSB7XG5cdFx0XHRcdFx0Y29uc3Qga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXModmFsdWUgICAgICAgICAgICAgICAgICAgICAgICApO1xuXHRcdFx0XHRcdGlmICgga2V5cy5sZW5ndGggKSB7IHJldHVybiBrZXlzOyB9XG5cdFx0XHRcdFx0dGhpcy5hcHBlbmRJbmxpbmUgPSAneyB9Jztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmlubGluZVRhYmxlKGluZGVudCwgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYmlnaW50Jzpcblx0XHRcdFx0dGhpcy5hcHBlbmRJbmxpbmUgPSAnJyArIHZhbHVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRcdHRoaXMuYXBwZW5kSW5saW5lID0gdGhpcy5kb2N1bWVudC5hc0ludGVnZXIodmFsdWUpID8gaXModmFsdWUsIC0wKSA/ICctMCcgOiAnJyArIHZhbHVlIDogZmxvYXQodmFsdWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0XHRcdHRoaXMuYXBwZW5kSW5saW5lID0gc2luZ2xlbGluZVN0cmluZyh2YWx1ZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYm9vbGVhbic6XG5cdFx0XHRcdHRoaXMuYXBwZW5kSW5saW5lID0gdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IFR5cGVFcnJvcihgdG9tbCBjYW4gbm90IHN0cmluZ2lmeSBcIiR7dHlwZW9mIHZhbHVlfVwiIHR5cGUgdmFsdWVgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0XG5cdCAgICAgICAgc2luZ2xlbGluZUFycmF5IChpbmRlbnQgICAgICAgICwgc3RhdGljQXJyYXkgICAgICAgICAgICAgICAgICAgICAgLCBpbmxpbmVNb2RlICAgICAgICAgICAgICAgKSB7XG5cdFx0Y29uc3QgeyBsZW5ndGggfSA9IHN0YXRpY0FycmF5O1xuXHRcdGlmICggbGVuZ3RoICkge1xuXHRcdFx0dGhpcy5hcHBlbmRJbmxpbmUgPSBpbmxpbmVNb2RlJjBiMTAgPyAnWyAnIDogJ1snO1xuXHRcdFx0dGhpcy52YWx1ZShpbmRlbnQsIHN0YXRpY0FycmF5WzBdICwgZmFsc2UpO1xuXHRcdFx0bGV0IGluZGV4ID0gMTtcblx0XHRcdHdoaWxlICggaW5kZXghPT1sZW5ndGggKSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kSW5saW5lID0gJywgJztcblx0XHRcdFx0dGhpcy52YWx1ZShpbmRlbnQsIHN0YXRpY0FycmF5W2luZGV4KytdICwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5hcHBlbmRJbmxpbmUgPSBpbmxpbmVNb2RlJjBiMTAgPyAnIF0nIDogJ10nO1xuXHRcdH1cblx0XHRlbHNlIHsgdGhpcy5hcHBlbmRJbmxpbmUgPSBpbmxpbmVNb2RlJjBiMDEgPyAnWyBdJyA6ICdbXSc7IH1cblx0fVxuXHQgICAgICAgIHN0YXRpY0FycmF5IChpbmRlbnQgICAgICAgICwgc3RhdGljQXJyYXkgICAgICAgICAgICAgICAgICAgICAgKSB7XG5cdFx0dGhpcy5hcHBlbmRJbmxpbmUgPSAnWyc7XG5cdFx0Y29uc3QgaW5kZW50XyA9IGluZGVudCArIHRoaXMuZG9jdW1lbnQuaW5kZW50O1xuXHRcdGNvbnN0IHsgbGVuZ3RoIH0gPSBzdGF0aWNBcnJheTtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdHdoaWxlICggaW5kZXghPT1sZW5ndGggKSB7XG5cdFx0XHR0aGlzLmFwcGVuZExpbmUgPSBpbmRlbnRfO1xuXHRcdFx0dGhpcy52YWx1ZShpbmRlbnRfLCBzdGF0aWNBcnJheVtpbmRleCsrXSAsIGZhbHNlKTtcblx0XHRcdHRoaXMuYXBwZW5kSW5saW5lID0gJywnO1xuXHRcdH1cblx0XHR0aGlzLmFwcGVuZExpbmUgPSBpbmRlbnQgKyAnXSc7XG5cdH1cblx0XG5cdCAgICAgICAgaW5saW5lVGFibGUgKGluZGVudCAgICAgICAgLCBpbmxpbmVUYWJsZSAgICAgICAgICAgICAgICAgICAgICApIHtcblx0XHRjb25zdCBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhpbmxpbmVUYWJsZSk7XG5cdFx0aWYgKCBrZXlzLmxlbmd0aCApIHtcblx0XHRcdHRoaXMuYXBwZW5kSW5saW5lID0gJ3sgJztcblx0XHRcdHRoaXMuYXNzaWduSW5saW5lKGluZGVudCwgaW5saW5lVGFibGUsIGBgLCBrZXlzKTtcblx0XHRcdHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHRoaXNbdGhpcy5sZW5ndGggLSAxXSAuc2xpY2UoMCwgLTIpICsgJyB9Jztcblx0XHR9XG5cdFx0ZWxzZSB7IHRoaXMuYXBwZW5kSW5saW5lID0gJ3sgfSc7IH1cblx0fVxuXHQgICAgICAgIG11bHRpbGluZVRhYmxlIChpbmRlbnQgICAgICAgICwgaW5saW5lVGFibGUgICAgICAgICAgICAgICAgICAgICAgLCBjb21tYSAgICAgICAgICAgICAgICAgICAgICkge1xuXHRcdHRoaXMuYXBwZW5kSW5saW5lID0gJ3snO1xuXHRcdHRoaXMuYXNzaWduTXVsdGlsaW5lKGluZGVudCwgaW5saW5lVGFibGUsIGBgLCBnZXRPd25Qcm9wZXJ0eU5hbWVzKGlubGluZVRhYmxlKSwgY29tbWEpO1xuXHRcdHRoaXMuYXBwZW5kTGluZSA9IGluZGVudCArICd9Jztcblx0fVxuXHQgICAgICAgIGFzc2lnbklubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRlbnQgICAgICAgICwgaW5saW5lVGFibGUgICAsIGtleXNfICAgICAgICAgICAgICAgICAgICwga2V5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcblx0XHRmb3IgKCBjb25zdCBrZXkgb2Yga2V5cyApIHtcblx0XHRcdGNvbnN0IHZhbHVlICAgICAgICAgICAgICAgICA9IGlubGluZVRhYmxlW2tleV0gO1xuXHRcdFx0Y29uc3Qga2V5cyA9IGtleXNfICsgJEtleSQoa2V5KTtcblx0XHRcdGNvbnN0IGJlZm9yZV92YWx1ZSA9IHRoaXMuYXBwZW5kSW5saW5lID0gJEtleXMoa2V5cykgKyAnID0gJztcblx0XHRcdGNvbnN0IHZhbHVlS2V5c0lmVmFsdWVJc0RvdHRlZFRhYmxlID0gdGhpcy52YWx1ZShpbmRlbnQsIHZhbHVlLCB0cnVlKTtcblx0XHRcdGlmICggdmFsdWVLZXlzSWZWYWx1ZUlzRG90dGVkVGFibGUgKSB7XG5cdFx0XHRcdHRoaXNbdGhpcy5sZW5ndGggLSAxXSA9IHRoaXNbdGhpcy5sZW5ndGggLSAxXSAuc2xpY2UoMCwgLWJlZm9yZV92YWx1ZS5sZW5ndGgpO1xuXHRcdFx0XHR0aGlzLmFzc2lnbklubGluZShpbmRlbnQsIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgLCBrZXlzICsgJy4nICAgICAgICAgICAgICAgICwgdmFsdWVLZXlzSWZWYWx1ZUlzRG90dGVkVGFibGUpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7IHRoaXMuYXBwZW5kSW5saW5lID0gJywgJzsgfVxuXHRcdH1cblx0fVxuXHQgICAgICAgIGFzc2lnbk11bHRpbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRlbnQgICAgICAgICwgaW5saW5lVGFibGUgICAsIGtleXNfICAgICAgICAgICAgICAgICAgICwga2V5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNvbW1hICAgICAgICAgICAgICAgICAgICAgKSB7XG5cdFx0Y29uc3QgaW5kZW50XyA9IGluZGVudCArIHRoaXMuZG9jdW1lbnQuaW5kZW50O1xuXHRcdGZvciAoIGNvbnN0IGtleSBvZiBrZXlzICkge1xuXHRcdFx0Y29uc3QgdmFsdWUgICAgICAgICAgICAgICAgID0gaW5saW5lVGFibGVba2V5XSA7XG5cdFx0XHRjb25zdCBrZXlzID0ga2V5c18gKyAkS2V5JChrZXkpO1xuXHRcdFx0dGhpcy5hcHBlbmRMaW5lID0gaW5kZW50XyArICRLZXlzKGtleXMpICsgJyA9ICc7XG5cdFx0XHRjb25zdCB2YWx1ZUtleXNJZlZhbHVlSXNEb3R0ZWRUYWJsZSA9IHRoaXMudmFsdWUoaW5kZW50XywgdmFsdWUsIHRydWUpO1xuXHRcdFx0aWYgKCB2YWx1ZUtleXNJZlZhbHVlSXNEb3R0ZWRUYWJsZSApIHtcblx0XHRcdFx0LS10aGlzLmxlbmd0aDtcblx0XHRcdFx0dGhpcy5hc3NpZ25NdWx0aWxpbmUoaW5kZW50LCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICwga2V5cyArICcuJyAgICAgICAgICAgICAgICAsIHZhbHVlS2V5c0lmVmFsdWVJc0RvdHRlZFRhYmxlLCBjb21tYSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29tbWFcblx0XHRcdFx0XHQ/IHRoaXMuYXBwZW5kSW5saW5lID0gJywnICsgZ2V0Q29tbWVudChpbmxpbmVUYWJsZSwga2V5KVxuXHRcdFx0XHRcdDogdGhpcy5hcHBlbmRJbmxpbmVJZiA9IGdldENvbW1lbnQoaW5saW5lVGFibGUsIGtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdFxufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsImltcG9ydCBUeXBlRXJyb3IgZnJvbSAnLlR5cGVFcnJvcic7XG5pbXBvcnQgUmFuZ2VFcnJvciBmcm9tICcuUmFuZ2VFcnJvcic7XG5pbXBvcnQgU3ludGF4RXJyb3IgZnJvbSAnLlN5bnRheEVycm9yJztcbmltcG9ydCBBcnJheSBmcm9tICcuQXJyYXknO1xuaW1wb3J0IGlzU2FmZUludGVnZXIgZnJvbSAnLk51bWJlci5pc1NhZmVJbnRlZ2VyJztcbmltcG9ydCBNQVhfU0FGRV9JTlRFR0VSIGZyb20gJy5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUic7XG5pbXBvcnQgTnVsbCBmcm9tICcubnVsbCc7XG5cbmltcG9ydCB7IHRoZVJlZ0V4cCB9IGZyb20gJ0BsdGQvai1yZWdleHAnO1xuXG5pbXBvcnQgVE9NTFNlY3Rpb24gZnJvbSAnLi9zZWN0aW9uJztcblxuY29uc3QgbmFtZTJjb2RlID0gLyojX19QVVJFX18qL051bGwoe1xuXHRkb2N1bWVudDogMCxcblx0c2VjdGlvbjogMSxcblx0aGVhZGVyOiAyLFxuXHRwYWlyczogMyxcblx0cGFpcjogNCxcbn0gICAgICAgICApO1xuXG5jb25zdCB7IHRlc3Q6IElTX0lOREVOVCB9ID0gdGhlUmVnRXhwKC9eW1xcdCBdKiQvKTtcblxuY29uc3QgcmV0dXJuX2ZhbHNlID0gKCkgPT4gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRPTUxEb2N1bWVudCBleHRlbmRzIEFycmF5ICAgICAgICAgICAgICB7XG5cdFxuXHQgICAgICAgICBnZXQgWydjb25zdHJ1Y3RvciddICgpIHsgcmV0dXJuIEFycmF5OyB9XG5cdFxuXHQwID0gbmV3IFRPTUxTZWN0aW9uKHRoaXMpO1xuXHRcblx0ICAgICAgICAgYXNJbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByZXR1cm5fZmFsc2U7XG5cdCAgICAgICAgIG5ld2xpbmUgICAgICAgICAgICAgICAgICAgICA9ICcnO1xuXHQgICAgICAgICBuZXdsaW5lVW5kZXJTZWN0aW9uICAgICAgICAgID0gdHJ1ZTtcblx0ICAgICAgICAgbmV3bGluZVVuZGVyU2VjdGlvbkJ1dFBhaXIgICAgICAgICAgPSB0cnVlO1xuXHQgICAgICAgICBuZXdsaW5lVW5kZXJIZWFkZXIgICAgICAgICAgPSB0cnVlO1xuXHQgICAgICAgICBuZXdsaW5lVW5kZXJQYWlyICAgICAgICAgID0gZmFsc2U7XG5cdCAgICAgICAgIG5ld2xpbmVVbmRlclBhaXJCdXREb3R0ZWQgICAgICAgICAgPSBmYWxzZTtcblx0ICAgICAgICAgbmV3bGluZVVuZGVyRG90dGVkICAgICAgICAgID0gZmFsc2U7XG5cdCAgICAgICAgIGluZGVudCAgICAgICAgID0gJ1xcdCc7XG5cdCAgICAgICAgIFQgICAgICAgICAgICAgICAgICA9ICdUJztcblx0ICAgICAgICAgWiAgICAgICAgICAgID0gJ1onO1xuXHQgICAgICAgICBudWxsRGlzYWJsZWQgICAgICAgICAgPSB0cnVlO1xuXHQgICAgICAgICBtdWx0aWxpbmVUYWJsZURpc2FibGVkICAgICAgICAgID0gdHJ1ZTtcblx0ICAgICAgICAgbXVsdGlsaW5lVGFibGVDb21tYSAgICAgICAgICA7XG5cdCAgICAgICAgIHByZWZlckNvbW1lbnRGb3JUaGlzICAgICAgICAgID0gZmFsc2U7XG5cdCAgICAgICAgICRzaW5nbGVsaW5lQXJyYXkgICAgICAgICAgICAgICAgO1xuXHRcblx0Y29uc3RydWN0b3IgKG9wdGlvbnMgICAgICAgICAgICAgICAgICApIHtcblx0XHRcblx0XHRzdXBlcigpO1xuXHRcdFxuXHRcdGlmICggb3B0aW9ucz09bnVsbCApIHsgcmV0dXJuIHRoaXM7IH1cblx0XHRcblx0XHRjb25zdCB7IGludGVnZXIgfSA9IG9wdGlvbnM7XG5cdFx0aWYgKCBpbnRlZ2VyPT09dW5kZWZpbmVkICkge31cblx0XHRlbHNlIGlmICggaW50ZWdlcj09PU1BWF9TQUZFX0lOVEVHRVIgKSB7IHRoaXMuYXNJbnRlZ2VyID0gaXNTYWZlSW50ZWdlcjsgfVxuXHRcdGVsc2UgaWYgKCB0eXBlb2YgaW50ZWdlcj09PSdudW1iZXInICkge1xuXHRcdFx0aWYgKCAhaXNTYWZlSW50ZWdlcihpbnRlZ2VyKSApIHsgdGhyb3cgUmFuZ2VFcnJvcihgVE9NTC5zdHJpbmdpZnkoLHtpbnRlZ2VyfSkgY2FuIG9ubHkgYmUgYSBzYWZlIGludGVnZXJgKTsgfVxuXHRcdFx0Y29uc3QgbWF4ID0gaW50ZWdlcj49MCA/IGludGVnZXIgOiAtaW50ZWdlciAtIDE7XG5cdFx0XHRjb25zdCBtaW4gPSBpbnRlZ2VyPj0wID8gLWludGVnZXIgOiBpbnRlZ2VyO1xuXHRcdFx0dGhpcy5hc0ludGVnZXIgPSAobnVtYmVyICAgICAgICApID0+IGlzU2FmZUludGVnZXIobnVtYmVyKSAmJiBtaW48PW51bWJlciAmJiBudW1iZXI8PW1heDtcblx0XHR9XG5cdFx0ZWxzZSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5zdHJpbmdpZnkoLHtpbnRlZ2VyfSkgY2FuIG9ubHkgYmUgbnVtYmVyYCk7IH1cblx0XHRcblx0XHRjb25zdCB7IG5ld2xpbmUgfSA9IG9wdGlvbnM7XG5cdFx0aWYgKCBuZXdsaW5lPT09dW5kZWZpbmVkICkge31cblx0XHRlbHNlIGlmICggbmV3bGluZT09PSdcXG4nIHx8IG5ld2xpbmU9PT0nXFxyXFxuJyApIHsgdGhpcy5uZXdsaW5lID0gbmV3bGluZTsgfVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhyb3cgdHlwZW9mIG5ld2xpbmU9PT0nc3RyaW5nJ1xuXHRcdFx0XHQ/IFN5bnRheEVycm9yKGBUT01MLnN0cmluZ2lmeSgse25ld2xpbmV9KSBjYW4gb25seSBiZSB2YWxpZCBUT01MIG5ld2xpbmVgKVxuXHRcdFx0XHQ6IFR5cGVFcnJvcihgVE9NTC5zdHJpbmdpZnkoLHtuZXdsaW5lfSkgY2FuIG9ubHkgYmUgc3RyaW5nYCk7XG5cdFx0fVxuXHRcdFxuXHRcdGNvbnN0IHsgcHJlZmVyQ29tbWVudEZvciB9ID0gb3B0aW9ucztcblx0XHRpZiAoIHByZWZlckNvbW1lbnRGb3I9PT11bmRlZmluZWQgKSB7fVxuXHRcdGVsc2UgaWYgKCBwcmVmZXJDb21tZW50Rm9yPT09J3RoaXMnIHx8IHByZWZlckNvbW1lbnRGb3I9PT0na2V5JyApIHsgdGhpcy5wcmVmZXJDb21tZW50Rm9yVGhpcyA9IHByZWZlckNvbW1lbnRGb3I9PT0ndGhpcyc7IH1cblx0XHRlbHNlIHsgdGhyb3cgVHlwZUVycm9yKGBUT01MLnN0cmluZ2lmeSgse3ByZWZlckNvbW1lbnRGb3IpIGNhbiBvbmx5IGJlICdrZXknIG9yICd0aGlzJ2ApOyB9XG5cdFx0XG5cdFx0Y29uc3QgeyBbb3B0aW9ucy5uZXdsaW5lQXJvdW5kIHx8ICdoZWFkZXInXTogYXJvdW5kID0gbmFtZTJjb2RlLmhlYWRlciB9ID0gbmFtZTJjb2RlO1xuXHRcdHRoaXMubmV3bGluZVVuZGVyU2VjdGlvbiA9IGFyb3VuZD4wO1xuXHRcdHRoaXMubmV3bGluZVVuZGVyU2VjdGlvbkJ1dFBhaXIgPSBhcm91bmQ9PT0xIHx8IGFyb3VuZD09PTI7XG5cdFx0dGhpcy5uZXdsaW5lVW5kZXJIZWFkZXIgPSBhcm91bmQ+MTtcblx0XHR0aGlzLm5ld2xpbmVVbmRlclBhaXIgPSBhcm91bmQ+Mjtcblx0XHR0aGlzLm5ld2xpbmVVbmRlclBhaXJCdXREb3R0ZWQgPSBhcm91bmQ9PT0zO1xuXHRcdHRoaXMubmV3bGluZVVuZGVyRG90dGVkID0gYXJvdW5kPjM7XG5cdFx0XG5cdFx0Y29uc3QgeyBpbmRlbnQgfSA9IG9wdGlvbnM7XG5cdFx0aWYgKCBpbmRlbnQ9PT11bmRlZmluZWQgKSB7fVxuXHRcdGVsc2UgaWYgKCB0eXBlb2YgaW5kZW50PT09J3N0cmluZycgKSB7XG5cdFx0XHRpZiAoICFJU19JTkRFTlQoaW5kZW50KSApIHsgdGhyb3cgU3ludGF4RXJyb3IoYFRPTUwuc3RyaW5naWZ5KCx7aW5kZW50fSkgY2FuIG9ubHkgaW5jbHVkZSBUYWIgb3IgU3BhY2VgKTsgfVxuXHRcdFx0dGhpcy5pbmRlbnQgPSBpbmRlbnQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKCB0eXBlb2YgaW5kZW50PT09J251bWJlcicgKSB7XG5cdFx0XHRpZiAoICFpc1NhZmVJbnRlZ2VyKGluZGVudCkgKSB7IHRocm93IFJhbmdlRXJyb3IoYFRPTUwuc3RyaW5naWZ5KCx7aW5kZW50OiR7aW5kZW50fX0pIGlzIG91dCBvZiByYW5nZWApOyB9XG5cdFx0XHR0aGlzLmluZGVudCA9ICcgJy5yZXBlYXQoaW5kZW50KTtcblx0XHR9XG5cdFx0ZWxzZSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5zdHJpbmdpZnkoLHtpbmRlbnR9KSBjYW4gbm90IGJlIFwiJHt0eXBlb2YgaW5kZW50fVwiIHR5cGVgKTsgfVxuXHRcdFxuXHRcdGNvbnN0IHsgVCB9ID0gb3B0aW9ucztcblx0XHRpZiAoIFQ9PT11bmRlZmluZWQgKSB7fVxuXHRcdGVsc2UgaWYgKCBUPT09JyAnIHx8IFQ9PT0ndCcgfHwgVD09PSdUJyApIHsgdGhpcy5UID0gVDsgfVxuXHRcdGVsc2UgeyB0aHJvdyBUeXBlRXJyb3IoYFRPTUwuc3RyaW5naWZ5KCx7VH0pIGNhbiBvbmx5IGJlIFwiVFwiIG9yIFwiIFwiIG9yIFwidFwiYCk7IH1cblx0XHRcblx0XHRjb25zdCB7IFogfSA9IG9wdGlvbnM7XG5cdFx0aWYgKCBaPT09dW5kZWZpbmVkICkge31cblx0XHRlbHNlIGlmICggWj09PSd6JyB8fCBaPT09J1onICkgeyB0aGlzLlogPSBaOyB9XG5cdFx0ZWxzZSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5zdHJpbmdpZnkoLHtafSkgY2FuIG9ubHkgYmUgXCJaXCIgb3IgXCJ6XCJgKTsgfVxuXHRcdFxuXHRcdGlmICggb3B0aW9ucy54TnVsbCApIHsgdGhpcy5udWxsRGlzYWJsZWQgPSBmYWxzZTsgfVxuXHRcdFxuXHRcdGNvbnN0IHsgeEJlZm9yZU5ld2xpbmVJbk11bHRpbGluZVRhYmxlIH0gPSBvcHRpb25zO1xuXHRcdGlmICggeEJlZm9yZU5ld2xpbmVJbk11bHRpbGluZVRhYmxlPT09dW5kZWZpbmVkICkge31cblx0XHRlbHNlIGlmICggeEJlZm9yZU5ld2xpbmVJbk11bHRpbGluZVRhYmxlPT09JycgfHwgeEJlZm9yZU5ld2xpbmVJbk11bHRpbGluZVRhYmxlPT09JywnICkge1xuXHRcdFx0dGhpcy5tdWx0aWxpbmVUYWJsZURpc2FibGVkID0gZmFsc2U7XG5cdFx0XHR0aGlzLm11bHRpbGluZVRhYmxlQ29tbWEgPSAhIXhCZWZvcmVOZXdsaW5lSW5NdWx0aWxpbmVUYWJsZTtcblx0XHR9XG5cdFx0ZWxzZSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5zdHJpbmdpZnkoLHt4QmVmb3JlTmV3bGluZUluTXVsdGlsaW5lVGFibGV9KSBjYW4gb25seSBiZSBcIlwiIG9yIFwiLFwiYCk7IH1cblx0XHRcblx0XHRjb25zdCAkc2luZ2xlbGluZUFycmF5ID0gb3B0aW9ucy5mb3JjZUlubGluZUFycmF5U3BhY2luZztcblx0XHRzd2l0Y2ggKCAkc2luZ2xlbGluZUFycmF5ICkge1xuXHRcdFx0Y2FzZSB1bmRlZmluZWQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAwOlxuXHRcdFx0Y2FzZSAxOlxuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHR0aGlzLiRzaW5nbGVsaW5lQXJyYXkgPSAkc2luZ2xlbGluZUFycmF5O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IHR5cGVvZiAkc2luZ2xlbGluZUFycmF5PT09J251bWJlcidcblx0XHRcdFx0XHQ/IFJhbmdlRXJyb3IoYGFycmF5IGlubGluZSBtb2RlIG11c3QgYmUgMCB8IDEgfCAyIHwgMywgbm90IGluY2x1ZGluZyAkeyRzaW5nbGVsaW5lQXJyYXl9YClcblx0XHRcdFx0XHQ6IFR5cGVFcnJvcihgYXJyYXkgaW5saW5lIG1vZGUgbXVzdCBiZSBcIm51bWJlclwiIHR5cGUsIG5vdCBpbmNsdWRpbmcgJHskc2luZ2xlbGluZUFycmF5PT09bnVsbCA/ICdcIm51bGxcIicgOiB0eXBlb2YgJHNpbmdsZWxpbmVBcnJheX1gKTtcblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIHRoaXM7XG5cdFx0XG5cdH1cblx0XG5cdGFwcGVuZFNlY3Rpb24gKCkgeyByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aF0gPSBuZXcgVE9NTFNlY3Rpb24odGhpcyk7IH1cblx0XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwiaW1wb3J0IFdlYWtTZXQgZnJvbSAnLldlYWtTZXQnO1xuaW1wb3J0IGhhcyBmcm9tICcuV2Vha1NldC5wcm90b3R5cGUuaGFzJztcbmltcG9ydCBhZGQgZnJvbSAnLldlYWtTZXQucHJvdG90eXBlLmFkZCc7XG5pbXBvcnQgZ2V0T3duUHJvcGVydHlOYW1lcyBmcm9tICcuT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMnO1xuaW1wb3J0IGZyZWV6ZSBmcm9tICcuT2JqZWN0LmZyZWV6ZSc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuQXJyYXkuaXNBcnJheSc7XG5pbXBvcnQgTnVsbCBmcm9tICcubnVsbCc7XG5cbmltcG9ydCB7IHggfSBmcm9tICcuLi9qLWxleGVyJzsvLy8gZXh0ZXJuYWxcblxuaW1wb3J0IFRPTUxEb2N1bWVudCBmcm9tICcuL2RvY3VtZW50JztcbmNvbnN0IGxpbmVzRnJvbVN0cmluZ2lmeSA9IG5ldyBXZWFrU2V0ICAgICAgICAgICAgICAgICAgICgpO1xuY29uc3QgYmVMaW5lc0Zyb21TdHJpbmdpZnkgPSAvKiNfX1BVUkVfXyovYWRkLmJpbmQobGluZXNGcm9tU3RyaW5naWZ5KTtcbmV4cG9ydCBjb25zdCBpc0xpbmVzRnJvbVN0cmluZ2lmeSA9IC8qI19fUFVSRV9fKi9oYXMuYmluZChsaW5lc0Zyb21TdHJpbmdpZnkpO1xuZXhwb3J0IGRlZmF1bHQgKHJvb3RUYWJsZSAgICAgICAgICAgICAgICAsIG9wdGlvbnMgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICA9PiB7XG5cdGNvbnN0IGRvY3VtZW50ID0gbmV3IFRPTUxEb2N1bWVudChvcHRpb25zKTtcblx0Y29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50WzBdO1xuXHRzZWN0aW9uWzBdID0gJyc7XG5cdHggICAgICAoc2VjdGlvbi5hc3NpZ25CbG9jayhgYCwgYGAsIHJvb3RUYWJsZSwgZ2V0T3duUHJvcGVydHlOYW1lcyhyb290VGFibGUpKSk7XG5cdGRvY3VtZW50Lm5ld2xpbmVVbmRlclNlY3Rpb25CdXRQYWlyICYmIHNlY3Rpb24ubGVuZ3RoIT09MSAmJiBzZWN0aW9uLmFwcGVuZE5ld2xpbmUoKTtcblx0ZG9jdW1lbnQubmV3bGluZVVuZGVyU2VjdGlvbiB8fCBkb2N1bWVudFtkb2N1bWVudC5sZW5ndGggLSAxXSAuYXBwZW5kTmV3bGluZSgpO1xuXHRpZiAoIGRvY3VtZW50Lm5ld2xpbmUgKSB7IHJldHVybiBkb2N1bWVudC5qb2luKGRvY3VtZW50Lm5ld2xpbmUpOyB9XG5cdGNvbnN0IGxpbmVzID0gZG9jdW1lbnQuZmxhdCgpO1xuXHRiZUxpbmVzRnJvbVN0cmluZ2lmeShsaW5lcyk7XG5cdHJldHVybiBsaW5lcztcbn07XG5cbmV4cG9ydCB7IGlubGluZSwgU2VjdGlvbiB9IGZyb20gJy4uL3R5cGVzL25vbi1hdG9tJztcbmV4cG9ydCB7IF9saXRlcmFsIH0gZnJvbSAnLi4vdHlwZXMvYXRvbSc7XG5pbXBvcnQgeyBMaXRlcmFsT2JqZWN0IH0gZnJvbSAnLi4vdHlwZXMvYXRvbSc7XG5pbXBvcnQgeyBtdWx0aWxpbmVUYWJsZSwgbXVsdGlsaW5lQXJyYXkgfSBmcm9tICcuLi90eXBlcy9ub24tYXRvbSc7XG5pbXBvcnQgeyBzaW5nbGVsaW5lQmFzaWNTdHJpbmcsIExpbmVzLCBtdWx0aWxpbmVTdHJpbmcsIG11bHRpbGluZUJhc2ljU3RyaW5nLCBtdWx0aWxpbmVMaXRlcmFsU3RyaW5nLCBtdWx0aWxpbmVOZWVkQmFzaWMgfSBmcm9tICcuL3N0cmluZyc7XG5leHBvcnQgY29uc3QgbXVsdGlsaW5lID0gLyojX19QVVJFX18qLyggKCkgPT4ge1xuXHRjb25zdCBtdWx0aWxpbmUgPSAodmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0cmluZyAgICAgICAgICkgPT5cblx0XHR0eXBlb2YgdmFsdWU9PT0nc3RyaW5nJyA/IExpdGVyYWxPYmplY3QoKCBtdWx0aWxpbmVOZWVkQmFzaWModmFsdWUpID8gbXVsdGlsaW5lQmFzaWNTdHJpbmcgOiBtdWx0aWxpbmVMaXRlcmFsU3RyaW5nICkoKCAnXFxuJyArIHZhbHVlICkuc3BsaXQoJ1xcbicpICAgICAgICAgKSwgdmFsdWUpIDpcblx0XHRcdGlzQXJyYXkodmFsdWUpID8gTGl0ZXJhbE9iamVjdChtdWx0aWxpbmVTdHJpbmcoTGluZXModmFsdWUpKSwgdHlwZW9mIHN0cmluZz09PSdzdHJpbmcnID8gc3RyaW5nIDogTnVsbChudWxsKSkgOlxuXHRcdFx0XHRtdWx0aWxpbmVUYWJsZSh2YWx1ZSk7XG5cdG11bHRpbGluZS5iYXNpYyA9IChsaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0cmluZyAgICAgICAgICkgPT5cblx0XHR0eXBlb2YgbGluZXM9PT0nc3RyaW5nJ1xuXHRcdFx0PyBMaXRlcmFsT2JqZWN0KG11bHRpbGluZUJhc2ljU3RyaW5nKCggJ1xcbicgKyBsaW5lcyApLnNwbGl0KCdcXG4nKSAgICAgICAgICksIGxpbmVzKVxuXHRcdFx0OiBMaXRlcmFsT2JqZWN0KG11bHRpbGluZUJhc2ljU3RyaW5nKExpbmVzKGxpbmVzKSksIHR5cGVvZiBzdHJpbmc9PT0nc3RyaW5nJyA/IHN0cmluZyA6IE51bGwobnVsbCkpXG5cdDtcblx0bXVsdGlsaW5lLmFycmF5ID0gbXVsdGlsaW5lQXJyYXk7XG5cdGZyZWV6ZShtdWx0aWxpbmUpO1xuXHRyZXR1cm4gbXVsdGlsaW5lO1xufSApKCk7XG5leHBvcnQgY29uc3QgYmFzaWMgPSAodmFsdWUgICAgICAgICkgPT4gTGl0ZXJhbE9iamVjdChzaW5nbGVsaW5lQmFzaWNTdHJpbmcodmFsdWUpLCB2YWx1ZSk7XG5leHBvcnQgY29uc3QgbGl0ZXJhbCA9IChsaXRlcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgLi4uY2hhcnMgICAgICAgICAgKSA9PiB7XG5cdGlmICggdHlwZW9mIGxpdGVyYWw9PT0nc3RyaW5nJyApIHtcblx0XHRpZiAoIGNoYXJzLmxlbmd0aD09PTEgKSB7XG5cdFx0XHRyZXR1cm4gTGl0ZXJhbE9iamVjdChsaXRlcmFsLmluY2x1ZGVzKCdcXG4nKSA/IGxpdGVyYWwuc3BsaXQoJ1xcbicpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGl0ZXJhbCwgY2hhcnNbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblx0XHR9XG5cdH1cblx0ZWxzZSB7XG5cdFx0bGV0IGluZGV4ID0gY2hhcnMubGVuZ3RoO1xuXHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRjb25zdCB7IHJhdyB9ID0gbGl0ZXJhbDtcblx0XHRcdGxpdGVyYWwgPSByYXdbaW5kZXhdIDtcblx0XHRcdHdoaWxlICggaW5kZXggKSB7IGNoYXJzWy0taW5kZXhdICs9IHJhd1tpbmRleF0gOyB9XG5cdFx0XHRsaXRlcmFsID0gY2hhcnMuam9pbignJykgKyBsaXRlcmFsO1xuXHRcdH1cblx0XHRlbHNlIHsgbGl0ZXJhbCA9IGxpdGVyYWwucmF3WzBdIDsgfVxuXHR9XG5cdHJldHVybiBMaXRlcmFsT2JqZWN0KGxpdGVyYWwuaW5jbHVkZXMoJ1xcbicpID8gbGl0ZXJhbC5zcGxpdCgnXFxuJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsaXRlcmFsLCBOdWxsKG51bGwpKTtcbn07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwiaW1wb3J0IEVycm9yIGZyb20gJy5FcnJvcic7XG5pbXBvcnQgVHlwZUVycm9yIGZyb20gJy5UeXBlRXJyb3InO1xuaW1wb3J0IGlzVmlldyBmcm9tICcuQXJyYXlCdWZmZXIuaXNWaWV3JztcbmltcG9ydCBpc0FycmF5IGZyb20gJy5BcnJheS5pc0FycmF5JztcbmltcG9ydCBhc3NpZ24gZnJvbSAnLk9iamVjdC5hc3NpZ24nO1xuaW1wb3J0IGFwcGx5IGZyb20gJy5SZWZsZWN0LmFwcGx5JztcbmltcG9ydCB1bmRlZmluZWQgZnJvbSAnLnVuZGVmaW5lZCc7XG5pbXBvcnQgTnVsbCBmcm9tICcubnVsbCc7XG5pbXBvcnQgaXNBcnJheUJ1ZmZlciBmcm9tICcuY2xhc3MuaXNBcnJheUJ1ZmZlcic7XG5pbXBvcnQgVGV4dERlY29kZXIgZnJvbSAnLlRleHREZWNvZGVyJztcblxuaW1wb3J0IHsgY2xlYXJSZWdFeHAsIHRoZVJlZ0V4cCB9IGZyb20gJ0BsdGQvai1yZWdleHAnO1xuXG5pbXBvcnQgKiBhcyBpdGVyYXRvciBmcm9tICcuLi9pdGVyYXRvcic7XG5pbXBvcnQgKiBhcyBvcHRpb25zIGZyb20gJy4uL29wdGlvbnMnO1xuaW1wb3J0IFJvb3QgZnJvbSAnLi9sZXZlbC1sb29wJztcbmltcG9ydCB7IGlzTGluZXNGcm9tU3RyaW5naWZ5IH0gZnJvbSAnLi4vc3RyaW5naWZ5Lyc7XG5cbmNvbnN0IHRleHREZWNvZGVyID0gLyojX19QVVJFX18qL25ldyBUZXh0RGVjb2RlcigndXRmLTgnLCBOdWxsKHsgZmF0YWw6IHRydWUsIGlnbm9yZUJPTTogZmFsc2UgfSkpO1xuY29uc3QgYmluYXJ5MnN0cmluZyA9IChhcnJheUJ1ZmZlckxpa2UgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICA9PiB7XG5cdGlmICggaXNWaWV3KGFycmF5QnVmZmVyTGlrZSkgPyBhcnJheUJ1ZmZlckxpa2UubGVuZ3RoIT09YXJyYXlCdWZmZXJMaWtlLmJ5dGVMZW5ndGggOiAhaXNBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlckxpa2UpICkgeyB0aHJvdyBUeXBlRXJyb3IoYG9ubHkgVWludDhBcnJheSBvciBBcnJheUJ1ZmZlciBpcyBhY2NlcHRhYmxlYCk7IH1cblx0dHJ5IHsgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShhcnJheUJ1ZmZlckxpa2UpOyB9XG5cdGNhdGNoIHsgdGhyb3cgRXJyb3IoYEEgVE9NTCBkb2MgbXVzdCBiZSBhIChmdWwtc2NhbGFyKSB2YWxpZCBVVEYtOCBmaWxlLCB3aXRob3V0IGFueSB1bmtub3duIGNvZGUgcG9pbnQuYCk7IH1cbn07XG5jb25zdCBpc0JpbmFyeUxpa2UgPSAodmFsdWUgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnYnl0ZUxlbmd0aCcgaW4gdmFsdWU7Ly8vXG5cbmNvbnN0IHsgdGVzdDogaW5jbHVkZXNOb25TY2FsYXIgfSA9IHRoZVJlZ0V4cCgvW1xcdUQ4MDAtXFx1REZGRl0vdSk7XG5jb25zdCBhc3NlcnRGdWxTY2FsYXIgPSAoc3RyaW5nICAgICAgICApICAgICAgID0+IHtcblx0aWYgKCBjbGVhclJlZ0V4cChpbmNsdWRlc05vblNjYWxhcihzdHJpbmcpKSApIHsgdGhyb3cgRXJyb3IoYEEgVE9NTCBkb2MgbXVzdCBiZSBhIChmdWwtc2NhbGFyKSB2YWxpZCBVVEYtOCBmaWxlLCB3aXRob3V0IGFueSB1bmNvdXBsZWQgVUNTLTQgY2hhcmFjdGVyIGNvZGUuYCk7IH1cbn07XG5cbmxldCBob2xkaW5nICAgICAgICAgID0gZmFsc2U7XG5cbmNvbnN0IHBhcnNlID0gKHNvdXJjZSAgICAgICAgLCBzcGVjaWZpY2F0aW9uVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtdWx0aWxpbmVTdHJpbmdKb2luZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgYmlnaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBhcmdzTW9kZSAgICAgICAgICAgICAgICAgKSAgICAgICAgPT4ge1xuXHRsZXQgc291cmNlUGF0aCAgICAgICAgID0gJyc7XG5cdGlmICggdHlwZW9mIHNvdXJjZT09PSdvYmplY3QnICYmIHNvdXJjZSApIHtcblx0XHRpZiAoIGlzQXJyYXkoc291cmNlKSApIHsgdGhyb3cgVHlwZUVycm9yKGlzTGluZXNGcm9tU3RyaW5naWZ5KHNvdXJjZSkgPyBgVE9NTC5wYXJzZShhcnJheSBmcm9tIFRPTUwuc3RyaW5naWZ5KCx7bmV3bGluZT99KSlgIDogYFRPTUwucGFyc2UoYXJyYXkpYCk7IH1cblx0XHRlbHNlIGlmICggaXNCaW5hcnlMaWtlKHNvdXJjZSkgKSB7IHNvdXJjZSA9IGJpbmFyeTJzdHJpbmcoc291cmNlKTsgfVxuXHRcdGVsc2Uge1xuXHRcdFx0c291cmNlUGF0aCA9IHNvdXJjZS5wYXRoO1xuXHRcdFx0aWYgKCB0eXBlb2Ygc291cmNlUGF0aCE9PSdzdHJpbmcnICkgeyB0aHJvdyBUeXBlRXJyb3IoYFRPTUwucGFyc2Uoc291cmNlLnBhdGgpYCk7IH1cblx0XHRcdGNvbnN0IHsgZGF0YSwgcmVxdWlyZTogcmVxID0gdHlwZW9mIHJlcXVpcmU9PT0nZnVuY3Rpb24nID8gcmVxdWlyZSA6IHVuZGVmaW5lZCB9ID0gc291cmNlO1xuXHRcdFx0aWYgKCByZXEgKSB7XG5cdFx0XHRcdGNvbnN0IHsgcmVzb2x2ZSB9ID0gcmVxO1xuXHRcdFx0XHRpZiAoIHJlc29sdmUhPW51bGwgKSB7XG5cdFx0XHRcdFx0Y29uc3QgeyBwYXRocyB9ID0gcmVzb2x2ZTtcblx0XHRcdFx0XHRpZiAoIHBhdGhzIT1udWxsICkge1xuXHRcdFx0XHRcdFx0Y29uc3QgcmV0ID0gYXBwbHkocGF0aHMsIHJlc29sdmUsIFsgJycgXSk7XG5cdFx0XHRcdFx0XHRpZiAoIHJldCE9bnVsbCApIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdmFsID0gcmV0WzBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIHZhbCE9bnVsbCApIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBkaXJuYW1lXyA9IHZhbC5yZXBsYWNlKC9ub2RlX21vZHVsZXMkLywgJycpO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggZGlybmFtZV8gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzb3VyY2VQYXRoID0gKCByZXEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKCdwYXRoJykucmVzb2x2ZShkaXJuYW1lXywgc291cmNlUGF0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiBzb3VyY2VQYXRoIT09J3N0cmluZycgKSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5wYXJzZShzb3VyY2UucmVxdWlyZSgncGF0aCcpLnJlc29sdmUpYCk7IH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBkYXRhPT09dW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSAoIHJlcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSgnZnMnKS5yZWFkRmlsZVN5bmMoc291cmNlUGF0aCk7XG5cdFx0XHRcdFx0aWYgKCB0eXBlb2YgZGF0YT09PSdvYmplY3QnICYmIGRhdGEgJiYgaXNCaW5hcnlMaWtlKGRhdGEpICkgeyBzb3VyY2UgPSBiaW5hcnkyc3RyaW5nKGRhdGEpOyB9XG5cdFx0XHRcdFx0ZWxzZSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5wYXJzZShzb3VyY2UucmVxdWlyZSgnZnMnKS5yZWFkRmlsZVN5bmMpYCk7IH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICggdHlwZW9mIGRhdGE9PT0nc3RyaW5nJyApIHsgYXNzZXJ0RnVsU2NhbGFyKHNvdXJjZSA9IGRhdGEpOyB9XG5cdFx0XHRcdGVsc2UgaWYgKCB0eXBlb2YgZGF0YT09PSdvYmplY3QnICYmIGRhdGEgJiYgaXNCaW5hcnlMaWtlKGRhdGEpICkgeyBzb3VyY2UgPSBiaW5hcnkyc3RyaW5nKGRhdGEpOyB9XG5cdFx0XHRcdGVsc2UgeyB0aHJvdyBUeXBlRXJyb3IoYFRPTUwucGFyc2Uoc291cmNlLmRhdGEpYCk7IH1cblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZiAoIGRhdGE9PT11bmRlZmluZWQgKSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5wYXJzZShzb3VyY2UuZGF0YXxzb3VyY2UucmVxdWlyZSlgKTsgfVxuXHRcdFx0XHRlbHNlIGlmICggdHlwZW9mIGRhdGE9PT0nc3RyaW5nJyApIHsgYXNzZXJ0RnVsU2NhbGFyKHNvdXJjZSA9IGRhdGEpOyB9XG5cdFx0XHRcdGVsc2UgaWYgKCB0eXBlb2YgZGF0YT09PSdvYmplY3QnICYmIGRhdGEgJiYgaXNCaW5hcnlMaWtlKGRhdGEpICkgeyBzb3VyY2UgPSBiaW5hcnkyc3RyaW5nKGRhdGEpOyB9XG5cdFx0XHRcdGVsc2UgeyB0aHJvdyBUeXBlRXJyb3IoYFRPTUwucGFyc2Uoc291cmNlLmRhdGEpYCk7IH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0ZWxzZSBpZiAoIHR5cGVvZiBzb3VyY2U9PT0nc3RyaW5nJyApIHsgYXNzZXJ0RnVsU2NhbGFyKHNvdXJjZSk7IH1cblx0ZWxzZSB7IHRocm93IFR5cGVFcnJvcihgVE9NTC5wYXJzZShzb3VyY2UpYCk7IH1cblx0bGV0IGpvaW5lciAgICAgICAgICAgICAgICAgICAgO1xuXHRsZXQga2V5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcblx0aWYgKCB0eXBlb2YgbXVsdGlsaW5lU3RyaW5nSm9pbmVyPT09J29iamVjdCcgJiYgbXVsdGlsaW5lU3RyaW5nSm9pbmVyICkge1xuXHRcdGlmICggYmlnaW50IT09dW5kZWZpbmVkIHx8IHghPT11bmRlZmluZWQgKSB7IHRocm93IFR5cGVFcnJvcihgb3B0aW9ucyBtb2RlID8gYXJncyBtb2RlYCk7IH1cblx0XHRqb2luZXIgPSBtdWx0aWxpbmVTdHJpbmdKb2luZXIuam9pbmVyO1xuXHRcdGJpZ2ludCA9IG11bHRpbGluZVN0cmluZ0pvaW5lci5iaWdpbnQ7XG5cdFx0a2V5cyA9IG11bHRpbGluZVN0cmluZ0pvaW5lci5rZXlzO1xuXHRcdHggPSBtdWx0aWxpbmVTdHJpbmdKb2luZXIueDtcblx0XHRhcmdzTW9kZSA9ICcnO1xuXHR9XG5cdGVsc2UgeyBqb2luZXIgPSBtdWx0aWxpbmVTdHJpbmdKb2luZXI7IH1cblx0bGV0IHJvb3RUYWJsZSAgICAgICA7XG5cdGxldCBwcm9jZXNzICAgICAgICAgICAgICAgICA7XG5cdGlmICggaG9sZGluZyApIHsgdGhyb3cgRXJyb3IoYHBhcnNpbmcgZHVyaW5nIHBhcnNpbmcuYCk7IH1cblx0aG9sZGluZyA9IHRydWU7XG5cdHRyeSB7XG5cdFx0b3B0aW9ucy51c2Uoc3BlY2lmaWNhdGlvblZlcnNpb24sIGpvaW5lciwgYmlnaW50LCBrZXlzLCB4LCBhcmdzTW9kZSk7XG5cdFx0aXRlcmF0b3IudG9kbyhzb3VyY2UsIHNvdXJjZVBhdGgpO1xuXHRcdHNvdXJjZSAmJiBzb3VyY2VbMF09PT0nXFx1RkVGRicgJiYgaXRlcmF0b3IudGhyb3dzKFR5cGVFcnJvcihgVE9NTCBjb250ZW50IChzdHJpbmcpIHNob3VsZCBub3Qgc3RhcnQgd2l0aCBCT00gKFUrRkVGRilgICsgaXRlcmF0b3Iud2hlcmUoJyBhdCAnKSkpO1xuXHRcdHJvb3RUYWJsZSA9IFJvb3QoKTtcblx0XHRwcm9jZXNzID0gb3B0aW9ucy5Qcm9jZXNzKCk7XG5cdH1cblx0ZmluYWxseSB7XG5cdFx0aXRlcmF0b3IuZG9uZSgpOy8vY2xlYXJXZWFrU2V0cygpO1xuXHRcdG9wdGlvbnMuY2xlYXIoKTtcblx0XHRob2xkaW5nID0gZmFsc2U7XG5cdFx0Y2xlYXJSZWdFeHAoKTtcblx0fVxuXHRwcm9jZXNzICYmIHByb2Nlc3MoKTtcblx0cmV0dXJuIHJvb3RUYWJsZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9hc3NpZ24oXG5cdChzb3VyY2UgICAgICAgICwgc3BlY2lmaWNhdGlvblZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbXVsdGlsaW5lU3RyaW5nSm9pbmVyICAgICAgICAgLCB1c2VCaWdJbnQgICAgICAgICAgICAgICAgICAgLCB4T3B0aW9ucyAgICAgICAgICAgICAgICAgICApID0+XG5cdFx0dHlwZW9mIHNwZWNpZmljYXRpb25WZXJzaW9uPT09J251bWJlcidcblx0XHRcdD8gcGFyc2Uoc291cmNlLCBzcGVjaWZpY2F0aW9uVmVyc2lvbiwgbXVsdGlsaW5lU3RyaW5nSm9pbmVyLCB1c2VCaWdJbnQsIHhPcHRpb25zLCAnLCwnKVxuXHRcdFx0OiBwYXJzZShzb3VyY2UsIDEuMCwgc3BlY2lmaWNhdGlvblZlcnNpb24gICAgICAgICAgLCBtdWx0aWxpbmVTdHJpbmdKb2luZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHVzZUJpZ0ludCAgICAgICAgICAgICAgICAgICAgLCAnLCcpXG5cdCxcblx0e1xuXHRcdCcxLjAnOiAoc291cmNlICAgICAgICAsIG11bHRpbGluZVN0cmluZ0pvaW5lciAgICAgICAgICwgdXNlQmlnSW50ICAgICAgICAgICAgICAgICAgICwgeE9wdGlvbnMgICAgICAgICAgICAgICAgICAgKSA9PiBwYXJzZShzb3VyY2UsIDAuMSwgbXVsdGlsaW5lU3RyaW5nSm9pbmVyLCB1c2VCaWdJbnQsIHhPcHRpb25zLCAnLCcpLFxuXHRcdDEuMDogKHNvdXJjZSAgICAgICAgLCBtdWx0aWxpbmVTdHJpbmdKb2luZXIgICAgICAgICAsIHVzZUJpZ0ludCAgICAgICAgICAgICAgICAgICAsIHhPcHRpb25zICAgICAgICAgICAgICAgICAgICkgPT4gcGFyc2Uoc291cmNlLCAxLjAsIG11bHRpbGluZVN0cmluZ0pvaW5lciwgdXNlQmlnSW50LCB4T3B0aW9ucywgJywnKSxcblx0XHQwLjU6IChzb3VyY2UgICAgICAgICwgbXVsdGlsaW5lU3RyaW5nSm9pbmVyICAgICAgICAgLCB1c2VCaWdJbnQgICAgICAgICAgICAgICAgICAgLCB4T3B0aW9ucyAgICAgICAgICAgICAgICAgICApID0+IHBhcnNlKHNvdXJjZSwgMC41LCBtdWx0aWxpbmVTdHJpbmdKb2luZXIsIHVzZUJpZ0ludCwgeE9wdGlvbnMsICcsJyksXG5cdFx0MC40OiAoc291cmNlICAgICAgICAsIG11bHRpbGluZVN0cmluZ0pvaW5lciAgICAgICAgICwgdXNlQmlnSW50ICAgICAgICAgICAgICAgICAgICwgeE9wdGlvbnMgICAgICAgICAgICAgICAgICAgKSA9PiBwYXJzZShzb3VyY2UsIDAuNCwgbXVsdGlsaW5lU3RyaW5nSm9pbmVyLCB1c2VCaWdJbnQsIHhPcHRpb25zLCAnLCcpLFxuXHRcdDAuMzogKHNvdXJjZSAgICAgICAgLCBtdWx0aWxpbmVTdHJpbmdKb2luZXIgICAgICAgICAsIHVzZUJpZ0ludCAgICAgICAgICAgICAgICAgICAsIHhPcHRpb25zICAgICAgICAgICAgICAgICAgICkgPT4gcGFyc2Uoc291cmNlLCAwLjMsIG11bHRpbGluZVN0cmluZ0pvaW5lciwgdXNlQmlnSW50LCB4T3B0aW9ucywgJywnKSxcblx0XHQwLjI6IChzb3VyY2UgICAgICAgICwgbXVsdGlsaW5lU3RyaW5nSm9pbmVyICAgICAgICAgLCB1c2VCaWdJbnQgICAgICAgICAgICAgICAgICAgLCB4T3B0aW9ucyAgICAgICAgICAgICAgICAgICApID0+IHBhcnNlKHNvdXJjZSwgMC4yLCBtdWx0aWxpbmVTdHJpbmdKb2luZXIsIHVzZUJpZ0ludCwgeE9wdGlvbnMsICcsJyksXG5cdFx0MC4xOiAoc291cmNlICAgICAgICAsIG11bHRpbGluZVN0cmluZ0pvaW5lciAgICAgICAgICwgdXNlQmlnSW50ICAgICAgICAgICAgICAgICAgICwgeE9wdGlvbnMgICAgICAgICAgICAgICAgICAgKSA9PiBwYXJzZShzb3VyY2UsIDAuMSwgbXVsdGlsaW5lU3RyaW5nSm9pbmVyLCB1c2VCaWdJbnQsIHhPcHRpb25zLCAnLCcpLFxuXHR9XG4pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0ICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQgICAgICAgICAgICAgICAgICAgIFxuXHRcdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdFx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0XHQgXG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHRcdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0XHQgXG5cdCAgXG4gIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwiaW1wb3J0IHZlcnNpb24gZnJvbSAnLi92ZXJzaW9uP3RleHQnO1xuXG5pbXBvcnQgeyBLZXlzIH0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLyc7XG5pbXBvcnQgc3RyaW5naWZ5LCB7IFNlY3Rpb24sIGlubGluZSwgbXVsdGlsaW5lLCBiYXNpYywgbGl0ZXJhbCB9IGZyb20gJy4vc3RyaW5naWZ5Lyc7XG5pbXBvcnQgeyBPZmZzZXREYXRlVGltZSwgTG9jYWxEYXRlVGltZSwgTG9jYWxEYXRlLCBMb2NhbFRpbWUgfSBmcm9tICcuL3R5cGVzL0RhdGV0aW1lJztcbmltcG9ydCB7IGlzSW5saW5lLCBpc1NlY3Rpb24gfSBmcm9tICcuL3R5cGVzL25vbi1hdG9tJztcbmltcG9ydCB7IGNvbW1lbnRGb3IsIGNvbW1lbnRGb3JUaGlzIH0gZnJvbSAnLi90eXBlcy9jb21tZW50JztcblxuaW1wb3J0IERlZmF1bHQgZnJvbSAnLmRlZmF1bHQnO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qL0RlZmF1bHQoe1xuXHR2ZXJzaW9uLFxuXHRwYXJzZSxcblx0c3RyaW5naWZ5LFxuXHRTZWN0aW9uLCBpbmxpbmUsIG11bHRpbGluZSwgYmFzaWMsIGxpdGVyYWwsIGNvbW1lbnRGb3IsIGNvbW1lbnRGb3JUaGlzLFxuXHRPZmZzZXREYXRlVGltZSwgTG9jYWxEYXRlVGltZSwgTG9jYWxEYXRlLCBMb2NhbFRpbWUsXG5cdGlzSW5saW5lLCBpc1NlY3Rpb24sXG5cdEtleXMsXG59KTtcblxuZXhwb3J0IHtcblx0dmVyc2lvbixcblx0cGFyc2UsXG5cdHN0cmluZ2lmeSxcblx0U2VjdGlvbiwgaW5saW5lLCBtdWx0aWxpbmUsIGJhc2ljLCBsaXRlcmFsLCBjb21tZW50Rm9yLCBjb21tZW50Rm9yVGhpcyxcblx0T2Zmc2V0RGF0ZVRpbWUsIExvY2FsRGF0ZVRpbWUsIExvY2FsRGF0ZSwgTG9jYWxUaW1lLFxuXHRpc0lubGluZSwgaXNTZWN0aW9uLFxuXHRLZXlzLFxufTtcbiJdLCJuYW1lcyI6WyJUeXBlRXJyb3IiLCJTeW50YXhFcnJvciIsIlJlZ0V4cCIsIlByb3h5IiwiYXBwbHkiLCJjcmVhdGUiLCJXZWFrTWFwIiwiT2JqZWN0X2Fzc2lnbiIsIk9iamVjdF9jcmVhdGUiLCJSZWZsZWN0X2FwcGx5IiwiUmVmbGVjdF9vd25LZXlzIiwiT2JqZWN0X2ZyZWV6ZSIsIldlYWtTZXQiLCJzZXRfZGVsIiwibWFwX2dldCIsIm1hcF9zZXQiLCJpc0FycmF5IiwidW5kZWZpbmVkIiwiUmFuZ2VFcnJvciIsInNldF9oYXMiLCJzZXRfYWRkIiwiTnVsbCIsIm9yZGVyaWZ5X051bGwiLCJFcnJvciIsIml0ZXJhdG9yLnRocm93cyIsIml0ZXJhdG9yLndoZXJlIiwiS0VZUyIsInJlZ2V4cHMuc3dpdGNoUmVnRXhwIiwiQmlnSW50IiwiU3ltYm9sIiwiT2JqZWN0IiwiREFURSIsIm9wdGlvbnMuemVyb0RhdGV0aW1lIiwicGFyc2UiLCJwYXJzZUludCIsIm9wdGlvbnMubXVzdFNjYWxhciIsIml0ZXJhdG9yLmxpbmVJbmRleCIsIlVOREVSU0NPUkVTIiwib3B0aW9ucy5hbGxvd0xvbmdlciIsIm9wdGlvbnMudXNpbmdCaWdJbnQiLCJvcHRpb25zLkludGVnZXJNaW5OdW1iZXIiLCJvcHRpb25zLkludGVnZXJNYXhOdW1iZXIiLCJOYU4iLCJfSW5maW5pdHkiLCJvcHRpb25zLnNGbG9hdCIsIm9wdGlvbnMuc0Vycm9yIiwiaXNGaW5pdGUiLCJvcHRpb25zLlRhYmxlIiwib3B0aW9ucy5jb2xsZWN0IiwicmVnZXhwcy5fX0NPTlRST0xfQ0hBUkFDVEVSX0VYQ0xVREVfdGVzdCIsInJlZ2V4cHMuTElURVJBTF9TVFJJTkdfZXhlYyIsIm9wdGlvbnMucHJlc2VydmVMaXRlcmFsIiwicmVnZXhwcy5fX01VTFRJX0xJTkVfTElURVJBTF9TVFJJTkdfZXhlYyIsIml0ZXJhdG9yLm1hcmsiLCJvcHRpb25zLnVzZVdoYXRUb0pvaW5NdWx0aWxpbmVTdHJpbmciLCJvcHRpb25zLkFSR1NfTU9ERSIsInJlZ2V4cHMuQkFTSUNfU1RSSU5HX2V4ZWNfMV9lbmRJbmRleCIsInJlZ2V4cHMuUFJFX1dISVRFU1BBQ0UiLCJyZWdleHBzLk1VTFRJX0xJTkVfQkFTSUNfU1RSSU5HX2V4ZWNfMF9sZW5ndGgiLCJyZWdleHBzLkVTQ0FQRURfRVhDTFVERV9DT05UUk9MX0NIQVJBQ1RFUl90ZXN0Iiwib3B0aW9ucy5LRVlTIiwicmVnZXhwcy5fX0xJVEVSQUxfS0VZX2V4ZWMiLCJyZWdleHBzLl9fQkFSRV9LRVlfZXhlYyIsInJlZ2V4cHMuSVNfRE9UX0tFWSIsInJlZ2V4cHMuRE9UX0tFWSIsIm9wdGlvbnMuZGlzYWJsZURpZ2l0IiwicmVnZXhwcy5pc0FtYXppbmciLCJvcHRpb25zLmVuYWJsZU51bGwiLCJvcHRpb25zLmRpc2FsbG93RW1wdHlLZXkiLCJyZWdleHBzLl9WQUxVRV9QQUlSX2V4ZWMiLCJvcHRpb25zLmFzU3RyaW5ncyIsIm9wdGlvbnMuaW5saW5lVGFibGUiLCJvcHRpb25zLmFzVGFibGVzIiwib3B0aW9ucy5hc0FycmF5cyIsInJlZ2V4cHMuVkFMVUVfUkVTVF9leGVjIiwib3B0aW9ucy5hc0Jvb2xlYW5zIiwib3B0aW9ucy5hc051bGxzIiwib3B0aW9ucy5hc09mZnNldERhdGVUaW1lcyIsIm9wdGlvbnMubW9yZURhdGV0aW1lIiwib3B0aW9ucy5hc0xvY2FsRGF0ZVRpbWVzIiwib3B0aW9ucy5hc0xvY2FsVGltZXMiLCJvcHRpb25zLmFzTG9jYWxEYXRlcyIsIm9wdGlvbnMuYXNGbG9hdHMiLCJvcHRpb25zLmFzSW50ZWdlcnMiLCJyZWdleHBzLlNZTV9XSElURVNQQUNFIiwib3B0aW9ucy5hbGxvd0lubGluZVRhYmxlTXVsdGlsaW5lQW5kVHJhaWxpbmdDb21tYUV2ZW5Ob0NvbW1hIiwib3B0aW9ucy5wcmVzZXJ2ZUNvbW1lbnQiLCJyZWdleHBzLktFWV9WQUxVRV9QQUlSX2V4ZWNfZ3JvdXBzIiwiaXRlcmF0b3IucmVzdCIsIml0ZXJhdG9yLm5leHQiLCJyZWdleHBzLlRBQkxFX0RFRklOSVRJT05fZXhlY19ncm91cHMiLCJBcnJheSIsIkZsb2F0NjRBcnJheSIsIlVpbnQ4QXJyYXkiLCJUZXh0RGVjb2RlciIsImNsZWFyUmVnRXhwIiwib3B0aW9ucy51c2UiLCJpdGVyYXRvci50b2RvIiwib3B0aW9ucy5Qcm9jZXNzIiwiaXRlcmF0b3IuZG9uZSIsIm9wdGlvbnMuY2xlYXIiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0JBQWMsUUFBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSWYsSUFBSSxJQUFJLDZDQUE2QyxJQUFJO0FBQ2hFLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUTtBQUN0QyxHQUFHLFVBQVUsRUFBRSxFQUFFO0FBQ2pCLEVBQUUsT0FBTyxVQUFVLE1BQU0sRUFBRTtBQUMzQixH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QUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQy9CLENBQUMsUUFBUSxLQUFLLEdBQUcsTUFBTSxHQUFHO0FBQzFCLEVBQUUsSUFBSSxLQUFLO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsS0FBSyxPQUFPLEtBQUssR0FBRyxRQUFRLEdBQUcsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDckQsT0FBTztBQUNQLEdBQUcsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNuQyxHQUFHLEtBQUssT0FBTyxZQUFZLEdBQUcsUUFBUSxHQUFHLEVBQUUsTUFBTUEsV0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdkUsR0FBRyxLQUFLLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTUMsYUFBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7QUFDN0QsR0FBRyxLQUFLLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTUEsYUFBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUU7QUFDbkUsR0FBRyxLQUFLLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTUEsYUFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDbkksR0FBRyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNQSxh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 \ No newline at end of file diff --git a/v2realbot/static/js/libs/j-toml/j-toml.min.d.ts b/v2realbot/static/js/libs/j-toml/j-toml.min.d.ts new file mode 100644 index 0000000..5c24e9d --- /dev/null +++ b/v2realbot/static/js/libs/j-toml/j-toml.min.d.ts @@ -0,0 +1,277 @@ +export as namespace TOML; +export = exports; + +declare namespace exports { + + export const version :'1.38.0'; + + export const parse : + & { + (this :void, source :Source, specificationVersion :1.0 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table; + (this :void, source :Source, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table; + (this :void, source :Source, options? :{ readonly joiner? :string, readonly bigint? :boolean | number, readonly x ? :XOptions }) :Table; + } + & { + readonly [SpecificationVersion in 1.0 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1] :{ + (this :void, source :Source, multilineStringJoiner? :string, useBigInt? :boolean | number, xOptions? :XOptions ) :Table; + (this :void, source :Source, options? :{ readonly joiner? :string, readonly bigint? :boolean | number, readonly x ? :XOptions }) :Table; + } + }; + + export function stringify (this :void, rootTable :ReadonlyTable, options? :{ + readonly integer? :number + readonly newline? :'\n' | '\r\n' + readonly newlineAround? :'document' | 'section' | 'header' | 'pairs' | 'pair' + readonly indent? :string | number + readonly T? :'T' | 't' | ' ' + readonly Z? :'Z' | 'z' + readonly xNull? :boolean + readonly xBeforeNewlineInMultilineTable? :',' | '' + readonly forceInlineArraySpacing? :0 | 1 | 2 | 3 + }) :string; + + export function isSection (this :void, table :ReadonlyTable) :boolean; + export function isInline (this :void, value :ReadonlyTable | ReadonlyArray) :boolean; + + export function Section (this :void, table :T) :T; + export function inline (this :void, value :T, inlineMode? :0 | 1 | 2 | 3) :T; + export function inline (this :void, value :T) :T; + export const multiline :{ + readonly array :{ + + (this :void, array :T ) :T + } + + (this :void, table :T ) :T + (this :void, value :string ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object & String + (this :void, lines :readonly string[] ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object + (this :void, lines :readonly string[], value :string) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] | [ `'''`, ...string[], `${string}'''` ] } & object & String + readonly basic :{ + (this :void, value :string ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object & String + (this :void, lines :readonly string[] ) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object + (this :void, lines :readonly string[], value :string) :{ [_literal] :[ `"""`, ...string[], `${string}"""` ] } & object & String + } + }; + export function basic (this :void, value :string ) :{ [_literal] :`"${string}"` } & object & String; + export function literal (this :void, literal :string ) :{ [_literal] :string | [ string, ...string[] ] } & object ; + export function literal (this :void, literal :string, value :string ) :{ [_literal] :string | [ string, ...string[] ] } & object & String; + export function literal (this :void, literal :string, value :number ) :{ [_literal] :string | [ string, ...string[] ] } & object & Number; + export function literal (this :void, literal :string, value :bigint ) :{ [_literal] :string | [ string, ...string[] ] } & object & BigInt; + export function literal (this :void, literal :TemplateStringsArray, ...chars :string[]) :{ [_literal] :string | [ string, ...string[] ] } & object ; + + export function commentFor (this :void, key :string) :symbol; + export const commentForThis :unique symbol; + + export { OffsetDateTime, LocalDateTime, LocalDate, LocalTime, Keys }; + + export { exports as default }; + +} + +declare class OffsetDateTime { + + readonly toJSON :Date['toJSON']; + + readonly [Symbol.toStringTag] :'OffsetDateTime'; + + readonly toISOString :(this :Readonly) => `${number}-${number}-${number}T${number}:${number}:${number}${'' | `.${number}`}${'Z' | `${'+' | '-'}${number}:${number}`}`; + readonly valueOf :(this :Readonly) => `${number}${'' | `.${number}`}`; + + private [OffsetDateTime_ISOString] :string; + private [OffsetDateTime_value] :string; + + constructor (literal :`${number}-${number}-${number}${'T' | 't' | ' '}${number}:${number}:${number}${'' | `.${number}`}${'Z' | 'z' | `${'+' | '-'}${number}:${number}`}`); + + readonly getUTCFullYear :(this :Readonly) => _1_10000; + readonly getUTCMonth :(this :Readonly) => _0_11; + readonly getUTCDate :(this :Readonly) => _1_31; + + readonly getUTCHours :(this :Readonly) => _0_23; + readonly getUTCMinutes :(this :Readonly) => _0_59; + readonly getUTCSeconds :(this :Readonly) => _0_59; + readonly getUTCMilliseconds :(this :Readonly) => _0_999; + + readonly getUTCDay :(this :Readonly) => _0_6; + readonly getTimezoneOffset :(this :Readonly) => _1439_1439; + readonly getTime :(this :Readonly) => number; + +} +declare class LocalDateTime { + + readonly toJSON :Date['toJSON']; + + readonly [Symbol.toStringTag] :'LocalDateTime'; + + readonly toISOString :(this :Readonly) => `${number}-${number}-${number}T${number}:${number}:${number}${'' | `.${number}`}`; + readonly valueOf :(this :Readonly) => `${number}`; + + private [LocalDateTime_ISOString] :string; + private [LocalDateTime_value] :string; + + constructor (literal :`${number}-${number}-${number}${'T' | 't' | ' '}${number}:${number}:${number}${'' | `.${number}`}`); + + readonly getFullYear :(this :Readonly) => _0_9999; + readonly setFullYear :(this :LocalDateTime, year :_0_9999) => void; + readonly getMonth :(this :Readonly) => _0_11; + readonly setMonth :(this :LocalDateTime, month :_0_11) => void; + readonly getDate :(this :Readonly) => _1_31; + readonly setDate :(this :LocalDateTime, date :_1_31) => void; + + readonly getHours :(this :Readonly) => _0_23; + readonly setHours :(this :LocalDateTime, hours :_0_23) => void; + readonly getMinutes :(this :Readonly) => _0_59; + readonly setMinutes :(this :LocalDateTime, min :_0_59) => void; + readonly getSeconds :(this :Readonly) => _0_59; + readonly setSeconds :(this :LocalDateTime, sec :_0_59) => void; + readonly getMilliseconds :(this :Readonly) => _0_999; + readonly setMilliseconds :(this :LocalDateTime, ms :_0_999) => void; + +} +declare class LocalDate { + + readonly toJSON :Date['toJSON']; + + readonly [Symbol.toStringTag] :'LocalDate'; + + readonly toISOString :(this :Readonly) => `${number}-${number}-${number}`; + readonly valueOf :(this :Readonly) => `${number}`; + + private [LocalDate_ISOString] :string; + private [LocalDate_value] :string; + + constructor (literal :`${number}-${number}-${number}`); + + readonly getFullYear :(this :Readonly) => _0_9999; + readonly setFullYear :(this :LocalDate, year :_0_9999) => void; + readonly getMonth :(this :Readonly) => _0_11; + readonly setMonth :(this :LocalDate, month :_0_11) => void; + readonly getDate :(this :Readonly) => _1_31; + readonly setDate :(this :LocalDate, date :_1_31) => void; + +} +declare class LocalTime { + + readonly toJSON :Date['toJSON']; + + readonly [Symbol.toStringTag] :'LocalTime'; + + readonly toISOString :(this :Readonly) => `${number}:${number}:${number}${'' | `.${number}`}`; + readonly valueOf :(this :Readonly) => `${number}`; + + private [LocalTime_ISOString] :string; + private [LocalTime_value] :string; + + constructor (literal :`${number}:${number}:${number}${'' | `.${number}`}`); + + readonly getHours :(this :Readonly) => _0_23; + readonly setHours :(this :LocalTime, hours :_0_23) => void; + readonly getMinutes :(this :Readonly) => _0_59; + readonly setMinutes :(this :LocalTime, min :_0_59) => void; + readonly getSeconds :(this :Readonly) => _0_59; + readonly setSeconds :(this :LocalTime, sec :_0_59) => void; + readonly getMilliseconds :(this :Readonly) => _0_999; + readonly setMilliseconds :(this :LocalTime, ms :_0_999) => void; + +} + +declare class Keys extends RegExp { + readonly lastIndex :number; + constructor (keys :ArrayLike); + readonly test :(this :Keys, key :string) => boolean; +} + +declare const _literal :unique symbol; + +type Source = string | ArrayBufferLike + | { + readonly path :string, + readonly data? :undefined, + readonly require : + | { + readonly resolve? :{ readonly paths? :undefined } + (this :void, id :'fs') :{ + readonly readFileSync :(this :void, path :string) => ArrayBufferLike + } + } + | { + readonly resolve :{ readonly paths :(this :void, request :string) => null | string[] } + (this :void, id :'path') :{ + readonly resolve :(this :void, dirname :string, filename :string) => string + } + (this :void, id :'fs') :{ + readonly readFileSync :(this :void, path :string) => ArrayBufferLike + } + }, + } + | { + readonly path :string, + readonly data :string | ArrayBufferLike, + readonly require? : + | { + readonly resolve? :{ readonly paths? :undefined } + } + | { + readonly resolve :{ readonly paths :(this :void, request :string) => null | string[] } + (this :void, id :'path') :{ + readonly resolve :(this :void, dirname :string, filename :string) => string + } + }, + }; + +type XOptions = null | { + readonly keys? :null | Keys, + readonly order? :boolean, + readonly exact? :boolean, + readonly multi? :boolean, + readonly longer? :boolean, + readonly string? :boolean, + readonly comment? :boolean, + readonly literal? :boolean, + readonly null? :boolean, + readonly tag? :null | ( +
+ (this :void, each : + | { table :Table, key :Key, tag :Tag } + | { array :Array, index :Index, tag :Tag } + | { table :Table, key :Key, array :Array, index :Index, tag :Tag } + ) => void + ), +}; + +type ReadonlyTable = object & { readonly [key :string] :ReadonlyValue }; +type ReadonlyArray = readonly ReadonlyValue[]; +type ReadonlyValue = + | { readonly [_literal] :string | readonly [ string, ...string[] ] } & object + | null | boolean | bigint | number | string + | ReadonlyDatetime | ReadonlyArray | ReadonlyTable +; +interface ReadonlyDatetime { readonly toISOString :(this :this) => string } + +type Table = object & { [key :string] :Value }; +type Array = Value[]; +type Value = + | object & BigInt & { [_literal] :string } + | object & Number & { [_literal] :string } + | object & String & { [_literal] :string | [ string, ...string[] ] } + | null | boolean | bigint | number | string + | Datetime | Array | Table +; +type Datetime = OffsetDateTime | LocalDateTime | LocalDate | LocalTime; +declare const OffsetDateTime_ISOString :unique symbol; +declare const OffsetDateTime_value :unique symbol; +declare const LocalDateTime_ISOString :unique symbol; +declare const LocalDateTime_value :unique symbol; +declare const LocalDate_ISOString :unique symbol; +declare const LocalDate_value :unique symbol; +declare const LocalTime_ISOString :unique symbol; +declare const LocalTime_value :unique symbol; + +type _1439_1439 = -1439 | {} & number | 1439; +type _1_10000 = -1 | {} & number | 10000; +type _0_9999 = 0 | {} & number | 9999; +type _0_999 = 0 | {} & number | 999; +type _0_6 = 0 | 1 | 2 | 3 | 4 | 5 | 6; +type _0_11 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; +type _0_23 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23; +type _1_31 = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31; +type _0_59 = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59; diff --git a/v2realbot/static/js/libs/j-toml/j-toml.min.js b/v2realbot/static/js/libs/j-toml/j-toml.min.js new file mode 100644 index 0000000..b9e81dd --- /dev/null +++ b/v2realbot/static/js/libs/j-toml/j-toml.min.js @@ -0,0 +1,144 @@ +/*!@preserve@license + * 模块名称:j-toml + * 模块功能:龙腾道为汤小明语写的实现。从属于“简计划”。 +      An implementation of TOML written by LongTengDao. Belong to "Plan J". + * 模块版本:1.38.0 + * 许可条款:LGPL-3.0 + * 所属作者:龙腾道 (www.LongTengDao.com) + * 问题反馈:https://GitHub.com/LongTengDao/j-toml/issues + * 项目主页:https://GitHub.com/LongTengDao/j-toml/ + */ +(function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).TOML=t()})(this,(function(){"use strict";const e=SyntaxError,t=RangeError,n=TypeError,i={if:Error}.if,r=void 0,s="undefined"==typeof BigInt?r:BigInt,a=RegExp,l=WeakMap,o=WeakMap.prototype.get,c=WeakMap.prototype.set,u=Object.create,f=Number.isSafeInteger,h=Object.getOwnPropertyNames,d=Object.freeze,p=Object.prototype.isPrototypeOf,g=Object.seal?Object.preventExtensions(Object.create(null)):null,b=Function.prototype.bind,y=RegExp.prototype.test,w=RegExp.prototype.exec,m=Reflect.apply,x=Proxy,T="undefined"==typeof Symbol?r:Symbol.toStringTag,v=Object.defineProperty,O=Object.assign,$=Object,F=Math.floor,I=Array.isArray,S=1/0,k=String.fromCharCode,L=Array,M=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable,B=Function.prototype.apply;var U=A.call.bind(A),D=$.hasOwn||function(){return M.bind?M.call.bind(M):function(e,t){return M.call(e,t)}}(),j=$.create;function C(e){var t=j(g);return D(e,"value")&&(t.value=e.value),D(e,"writable")&&(t.writable=e.writable),D(e,"get")&&(t.get=e.get),D(e,"set")&&(t.set=e.set),D(e,"enumerable")&&(t.enumerable=e.enumerable),D(e,"configurable")&&(t.configurable=e.configurable),t}const _=function(e,t){if(t||"function"==typeof e||(t=e,e=u(g)),O)O(e,t);else for(var n in t)D(t,n)&&(e[n]=t[n]);if(e.default=e,"function"==typeof e)e.prototype&&d(e.prototype);else if(T){var i=u(g);i.value="Module",v(e,T,i)}return d(e)};var N=b?b.bind(y):function(e){return function(t){return y.call(e,t)}},E=b?b.bind(w):function(e){return function(t){return w.call(e,t)}};function P(e){var t=e.test=N(e),n=e.exec=E(e),i=t.source=n.source=e.source;return t.unicode=n.unicode=e.unicode,t.ignoreCase=n.ignoreCase=e.ignoreCase,t.multiline=n.multiline=i.indexOf("^")<0&&i.indexOf("$")<0?null:e.multiline,t.dotAll=n.dotAll=i.indexOf(".")<0?null:e.dotAll,e}function K(e){return P(e)}var W=/[\n\t]+/g,R=/\\./g;function Z(e){return"\\`"===e?"`":e}var q="".includes?function(e,t){return e.includes(t)}:function(e,t){return e.indexOf(t)>-1};function H(t){for(var i=this.U,r=this.I,s=this.M,l=this.S,o=t.raw,c=o[0].replace(W,""),u=1,f=arguments.length;u!==f;){var h=arguments[u];if("string"==typeof h)c+=h;else{var d=h.source;if("string"!=typeof d)throw n("source");if(h.unicode===i)throw e("unicode");if(h.ignoreCase===r)throw e("ignoreCase");if(h.multiline===s&&(q(d,"^")||q(d,"$")))throw e("multiline");if(h.dotAll===l&&q(d,"."))throw e("dotAll");c+=d}c+=o[u++].replace(W,"")}var p=a(i?c=c.replace(R,Z):c,this.flags),g=p.test=N(p),b=p.exec=E(p);return g.source=b.source=c,g.unicode=b.unicode=!i,g.ignoreCase=b.ignoreCase=!r,g.multiline=b.multiline=q(c,"^")||q(c,"$")?!s:null,g.dotAll=b.dotAll=q(c,".")?!l:null,p}var z=b&&b.bind(H);function Y(e){return{U:!q(e,"u"),I:!q(e,"i"),M:!q(e,"m"),S:!q(e,"s"),flags:e}}var J=Y(""),V=x?new x(H,{apply:function(e,t,n){return m(e,J,n)},get:function(e,t){return z(Y(t))},defineProperty:function(){return!1},preventExtensions:function(){return!1}}):function(){H.apply=H.apply;for(var e=function(){return H.apply(J,arguments)},t=63;t--;)!function(t){e[t.flags]=function(){return H.apply(t,arguments)}}(Y((1&t?"":"d")+(2&t?"":"g")+(4&t?"":"i")+(8&t?"":"m")+(8&t?"":"s")+(16&t?"":"u")+(32&t?"":"y")));return d?d(e):e}(),G="$_"in a?function(){var e=/^/;return e.test=e.test,function(t){return e.test(""),t}}():function(e){return e},X=/^[$()*+\-.?[\\\]^{|]/,Q=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/,ee=u(g);function te(e,t,n){for(var i=u(g),r=t?ne:ie,s=e.length,a=0;a{const e=new l;return e.has=e.has,e.get=e.get,e.set=e.set,e},xe=me(),Te=me(),ve=me(),Oe=O(u(g),{defineProperty:(e,t,n)=>{if(D(e,t))return be(e,t,O(u(g),n));if(be(e,t,O(u(g),n))){const n=xe.get(e);return n[n.length]=t,!0}return!1},deleteProperty:(e,t)=>{if(ye(e,t)){const n=xe.get(e),i=n.indexOf(t);return i<0||--n.copyWithin(i,i+1).length,!0}return!1},ownKeys:e=>xe.get(e),construct:(e,t,n)=>Fe(ge(e,t,n)),apply:(e,t,n)=>Fe(m(e,t,n))}),$e=(e,t)=>{xe.set(e,t);const n=new x(e,Oe);return Te.set(n,e),n},Fe=e=>{if(Te.has(e))return e;let t=ve.get(e);return t||(t=$e(e,O([],we(e))),ve.set(e,t),t)},Ie=function(){function e(){throw n("Super constructor Null cannot be invoked with 'new'")}function t(){throw n("Super constructor Null cannot be invoked without 'new'")}const i=e=>(delete e.prototype.constructor,d(e.prototype),e);function r(n){return new.target?new.target===r?e():$e(this,[]):"function"==typeof n?i(n):t()}return r.prototype=null,v(r,"name",O(u(g),{value:"",configurable:!1})),d(r),r}(),Se=WeakMap.prototype.has,ke=WeakMap.prototype.delete,Le=new l,Me=new se,Ae=ke.bind(Le),Be=oe.bind(Me),Ue=Se.bind(Le),De=o.bind(Le),je=c.bind(Le),Ce=e=>(Ae(e),e),_e=ae.bind(Me),Ne=le.bind(Me),Ee=new se,Pe=le.bind(Ee),Ke=ae.bind(Ee),We=new se,Re=le.bind(We),Ze=oe.bind(We),qe=!0,He=!1,ze=new se,Ye=le.bind(ze),Je=ae.bind(ze),Ve=fe(class extends fe{constructor(e,t){return super(),Pe(this),e?t?je(this,!0):Ne(this):(t?Ye:Re)(this),this}}),Ge=fe(class extends Ie{constructor(e,t){return super(),Pe(this),e?t?je(this,!0):Ne(this):(t?Ye:Re)(this),this}}),Xe=[];let Qe="",et=Xe,tt=-1,nt=-1;const it=e=>{throw e},rt=/\r?\n/,st=(e,t)=>{if("string"!=typeof t)throw n("TOML.parse({ path })");Qe=t,et=e.split(rt),tt=et.length-1,nt=-1};class at{lineIndex=nt;type;restColumn;constructor(e,t){return this.type=e,this.restColumn=t,this}must(){return nt===tt&&it(e(`${this.type} is not close until the end of the file`+lt(", which started from ",this.lineIndex,et[this.lineIndex].length-this.restColumn+1))),et[++nt]}nowrap(e){throw it(i(`TOML.parse(${e?`${e}multilineStringJoiner`:",{ joiner }"}) must be passed, while the source including multi-line string`+lt(", which started from ",this.lineIndex,et[this.lineIndex].length-this.restColumn+1)))}}const lt=(e,t=nt,n=0)=>et===Xe?"":Qe?`\n at (${Qe}:${t+1}:${n})`:`${e}line ${t+1}: ${et[t]}`,ot=()=>{Qe="",et=Xe},ct=/[ \t]/,ut=V` + ^${ct}+`.valueOf(),{exec:ft}=V.s` + ^ + ( + (?:\d\d\d\d-\d\d-\d\d \d)? + [\w\-+.:]+ + ) + ${ct}* + (.*) + $`.valueOf(),{exec:ht}=V.s` + ^ + '([^']*)' + ${ct}* + (.*)`.valueOf(),{exec:dt}=V.s` + ^ + (.*?) + '''('{0,2}) + ${ct}* + (.*)`.valueOf(),{exec:pt}=V.s` + ^ + (.*?) + '''() + ${ct}* + (.*)`.valueOf();let gt=pt;const bt=V.s` + ^ + . + ${ct}*`.valueOf(),yt=/[^\x00-\x1F"#'()<>[\\\]`{}\x7F]+/,{exec:wt}=V.s` + ^ + ${ct}* + = + ${ct}* + (?: + <(${yt})> + ${ct}* + )? + (.*) + $`.valueOf(),{exec:mt}=V.s` + ^ + <(${yt})> + ${ct}* + (.*) + $`.valueOf(),{exec:xt}=V.s` + ^ + <(${yt})> + ${ct}* + (.*) + $`.valueOf(),Tt=K(/[^\\"]+|\\.?|"(?!"")"?/sy),vt=e=>{let t=0;for(;Tt.test(e);)t=Tt.lastIndex;return t},Ot=/[^\\\x00-\x08\x0B-\x1F\x7F]+|\\(?:[btnfr"\\]|[\t ]*\n[\t\n ]*|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/g,$t=/[^\\\x00-\x09\x0B-\x1F\x7F]+|\\(?:[btnfr"\\]|[\t ]*\n[\t\n ]*|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/g,Ft=/[^\\\x00-\x09\x0B-\x1F]+|\\(?:[btnfr"\\]|[\t ]*\n[\t\n ]*|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/g,It=/[^\\\x00-\x09\x0B-\x1F]+|\\(?:[btnfr"\\/]|[\t ]*\n[\t\n ]*|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/g;let St=Ot;const kt=e=>!e.replace(St,""),Lt=K(/[^\\"\x00-\x08\x0B-\x1F\x7F]+|\\(?:[btnfr"\\]|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/y),Mt=K(/[^\\"\x00-\x08\x0B-\x1F\x7F]+|\\(?:[btnfr"\\]|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/y),At=K(/[^\\"\x00-\x08\x0B-\x1F]+|\\(?:[btnfr"\\]|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/y),Bt=K(/[^\\"\x00-\x08\x0B-\x1F]+|\\(?:[btnfr"\\/]|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})/y);let Ut=Bt;const Dt=t=>{let n=Ut.lastIndex=1;for(;Ut.test(t);)n=Ut.lastIndex;return n!==t.length&&'"'===t[n]||it(e("Bad basic string"+lt(" at "))),n},{test:jt}=K(/^[ \t]*\./),Ct=/^[ \t]*\.[ \t]*/,{exec:_t}=K(/^[\w-]+/),{exec:Nt}=K(/^[^ \t#=[\]'".]+(?:[ \t]+[^ \t#=[\]'".]+)*/);let Et=Nt;const{exec:Pt}=K(/^'[^'\x00-\x08\x0B-\x1F\x7F]*'/),{exec:Kt}=K(/^'[^'\x00-\x08\x0B-\x1F]*'/);let Wt=Kt,Rt=!0;const Zt=(t,n)=>{const i="["===t[1];i?(Rt||it(e("Array of Tables is not allowed before TOML v0.2"+lt(", which at "))),t=t.slice(2)):t=t.slice(1),t=t.replace(ut,"");const{leadingKeys:r,finalKey:s}=({lineRest:t}=n(t));let a;return(t=t.replace(ut,""))&&"]"===t[0]||it(e("Table header is not closed"+lt(", which is found at "))),(t.length>1?"]"===t[1]===i:!i)||it(e("Square brackets of Table definition statement not match"+lt(" at "))),(t=t.slice(i?2:1).replace(ut,""))&&"<"===t[0]?({1:a,2:t}=xt(t)||it(e("Bad tag"+lt(" at ")))):a="",{leadingKeys:r,finalKey:s,asArrayItem:i,tag:a,lineRest:t}},{test:qt}=K(/[\x00-\x08\x0B-\x1F\x7F]/),{test:Ht}=K(/[\x00-\x08\x0B-\x1F]/);let zt=qt;const Yt=V` + (?: + 0 + (?: + b[01][_01]* + | + o[0-7][_0-7]* + | + x[\dA-Fa-f][_\dA-Fa-f]* + | + (?:\.\d[_\d]*)?(?:[Ee]-?\d[_\d]*)? + ) + | + [1-9][_\d]* + (?:\.\d[_\d]*)?(?:[Ee]-?\d[_\d]*)? + | + inf + | + nan + ) +`.valueOf(),{test:Jt}=V` + ^(?: + -?${Yt} + (?:-${Yt})* + | + true + | + false + )$ +`.valueOf(),{test:Vt}=V`_(?![\dA-Fa-f])`.valueOf(),Gt=e=>Jt(e)&&!Vt(e);let Xt=!0,Qt="",en=null,tn=!0,nn=0,rn=0;const sn={test:()=>!0},an=class extends a{constructor(e){super(`^${te(e)}$`);let t=-1;for(let n=e.length;n;){const{length:i}=e[--n];i>t&&(t=i)}return this.lastIndex=t+1,this}test(e){return e.length{const e=t=>{const i=On(t);return i?i===e||it(n("Types in Array must be same"+lt(". Check "))):$n(t,e),t};return e},In={asNulls:Fn(),asStrings:Fn(),asTables:Fn(),asArrays:Fn(),asBooleans:Fn(),asFloats:Fn(),asIntegers:Fn(),asOffsetDateTimes:Fn(),asLocalDateTimes:Fn(),asLocalDates:Fn(),asLocalTimes:Fn()},Sn=e=>e;let kn,Ln,Mn,An,Bn,Un,Dn,jn,Cn,_n,Nn,En=null,Pn=null;const Kn=(e,t,n,i)=>{const r=u(g);r._linked=Pn,r.tag=e,n&&(r.table=n,r.key=i),t&&(r.array=t,r.index=t.length),Pn=r},Wn=()=>{throw it(e("xOptions.tag is not enabled, but found tag syntax"+lt(" at ")))};let Rn=Wn;const Zn=ArrayBuffer.isView,qn=function(){if("function"==typeof ArrayBuffer){var e=B.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);return function(t){try{e(t)}catch(n){return!1}return!0}}return function(){return!1}}(),Hn=TextDecoder,zn=Symbol,Yn=zn("previous"),Jn=e=>{let t=e,n=t.next();if(!n.done)for(n.value[Yn]=t,n=(t=n.value).next();;)if(n.done){if(t===e)break;t=t[Yn],n=t.next(n.value)}else n.value[Yn]=t,n=(t=n.value).next();return n.value},Vn=zn("_literal"),Gn=(e,t)=>{const n=$(t);return n[Vn]=e,n},Xn=new se,Qn=le.bind(Xn),ei=ae.bind(Xn),ti=new se,ni=le.bind(ti),ii=ae.bind(ti),ri=e=>{const t=[];return Qn(t),e&&ni(t),t},si=Date,ai=Date.parse,li=Object.preventExtensions,oi=Object.getOwnPropertyDescriptors,ci=function(e,t){for(var n=u(g),i=ce(t),r=i.length,s=0;s(d(d(e).prototype),e),fi=/(?:0[1-9]|[12]\d|30)/,hi=/(?:0[1-9]|[12]\d|3[01])/,di=/(?:[01]\d|2[0-3])/,pi=/[0-5]\d/,gi=V` + \d\d\d\d- + (?: + 0 + (?: + [13578]-${hi} + | + [469]-${fi} + | + 2-${/(?:0[1-9]|1\d|2\d)/} + ) + | + 1 + (?: + [02]-${hi} + | + 1-${fi} + ) + ) +`.valueOf(),bi=V` + ${di}:${pi}:${pi} +`.valueOf(),{exec:yi}=K(/(([+-])\d\d):(\d\d)$/),{exec:wi}=V` + ^ + ${gi} + [Tt ] + ${bi} + (?:\.\d{1,3}(\d*?)0*)? + (?:[Zz]|[+-]${di}:${pi}) + $`.valueOf(),{exec:mi}=V` + ^ + ${gi} + [Tt ] + ${bi} + () + [Zz] + $`.valueOf(),{test:xi}=V` + ^ + ${gi} + [Tt ] + ${bi} + (?:\.\d+)? + $`.valueOf(),{test:Ti}=V` + ^ + ${gi} + $`.valueOf(),{test:vi}=V` + ^ + ${bi} + (?:\.\d+)? + $`.valueOf(),Oi=/[ t]/,$i=/[-T:.]/g,Fi=/\.?0+$/,Ii=/\.(\d*?)0+$/,Si=(e,t)=>t,ki=(()=>{const e=function(){return this},t=fe(null);{const e=fe(null);for(const n of we(si.prototype))"constructor"===n||"toJSON"===n||(t[n]=e)}return e.prototype=li(u(si.prototype,t)),d(e)})(),Li=e=>e.replace(Ii,Si).replace($i,""),Mi=/./gs,Ai=e=>"          "[e],Bi=e=>{if(e.startsWith("02-29",5)){const t=+e.slice(0,4);return!(3&t||!(t%100)&&(t%400||!(t%3200)))}return!0},{test:Ui}=V.s`^.....(?:06.30|12.31).23:59:59`.valueOf(),Di=ci(new si(0),oi(si.prototype)),ji=zn("OffsetDateTime_ISOString"),Ci=zn("OffsetDateTime_value"),_i=(e,t=0)=>(Di.setTime(+e[Ci]+t),Di),Ni=ui(class extends ki{[ji];[Ci];get[zn.toStringTag](){return"OffsetDateTime"}valueOf(){return this[Ci]}toISOString(){return this[ji]}constructor(t){Bi(t)||it(e(`Invalid Offset Date-Time ${t}`+lt(" at ")));const n=t.startsWith("60",17);let i=n?t.slice(0,17)+"59"+t.slice(19):t;const{1:r=""}=(cn?mi(i):wi(i))||it(e(`Invalid Offset Date-Time ${t}`+lt(" at "))),s=ai(i=i.replace(Oi,"T").replace("z","Z"));return n&&(Di.setTime(s),Ui(Di.toISOString())||it(e(`Invalid Offset Date-Time ${t}`+lt(" at ")))),super(),this[ji]=i,this[Ci]=((e,t)=>e<0?(""+(e+6216730554e4)).replace(Mi,Ai).padStart(14," ")+t.replace(Mi,Ai)+e:t?(e+".").padStart(16,"0")+t:(""+e).padStart(15,"0"))(s,r),this}getUTCFullYear(){return _i(this).getUTCFullYear()}getUTCMonth(){return _i(this).getUTCMonth()}getUTCDate(){return _i(this).getUTCDate()}getUTCHours(){return _i(this).getUTCHours()}getUTCMinutes(){return _i(this).getUTCMinutes()}getUTCSeconds(){return _i(this).getUTCSeconds()}getUTCMilliseconds(){return _i(this).getUTCMilliseconds()}getUTCDay(){return _i(this).getUTCDay()}getTimezoneOffset(){const e=yi(this[ji]);return e?60*+e[1]+ +(e[2]+e[3]):0}getTime(){return F(+this[Ci])}}),Ei=zn("LocalDateTime_ISOString"),Pi=zn("LocalDateTime_value"),Ki=(e,t,n)=>+e[Ei].slice(t,n),Wi=(e,n,i,r)=>{const s=""+r,a=i-n;if(s.length>a)throw t();e[Pi]=Li(e[Ei]=e[Ei].slice(0,n)+s.padStart(a,"0")+e[Ei].slice(i))},Ri=ui(class extends ki{[Ei];[Pi];get[zn.toStringTag](){return"LocalDateTime"}valueOf(){return this[Pi]}toISOString(){return this[Ei]}constructor(t){return xi(t)&&Bi(t)||it(e(`Invalid Local Date-Time ${t}`+lt(" at "))),super(),this[Pi]=Li(this[Ei]=t.replace(Oi,"T")),this}getFullYear(){return Ki(this,0,4)}setFullYear(e){Wi(this,0,4,e)}getMonth(){return Ki(this,5,7)-1}setMonth(e){Wi(this,5,7,e+1)}getDate(){return Ki(this,8,10)}setDate(e){Wi(this,8,10,e)}getHours(){return Ki(this,11,13)}setHours(e){Wi(this,11,13,e)}getMinutes(){return Ki(this,14,16)}setMinutes(e){Wi(this,14,16,e)}getSeconds(){return Ki(this,17,19)}setSeconds(e){Wi(this,17,19,e)}getMilliseconds(){return+this[Pi].slice(14,17).padEnd(3,"0")}setMilliseconds(e){this[Pi]=Li(this[Ei]=this[Ei].slice(0,19)+(e?("."+(""+e).padStart(3,"0")).replace(Fi,""):""))}}),Zi=zn("LocalDate_ISOString"),qi=zn("LocalDate_value"),Hi=(e,t,n)=>+e[Zi].slice(t,n),zi=(e,n,i,r)=>{const s=""+r,a=i-n;if(s.length>a)throw t();e[qi]=Li(e[Zi]=e[Zi].slice(0,n)+s.padStart(a,"0")+e[Zi].slice(i))},Yi=ui(class extends ki{[Zi];[qi];get[zn.toStringTag](){return"LocalDate"}valueOf(){return this[qi]}toISOString(){return this[Zi]}constructor(t){return Ti(t)&&Bi(t)||it(e(`Invalid Local Date ${t}`+lt(" at "))),super(),this[qi]=Li(this[Zi]=t),this}getFullYear(){return Hi(this,0,4)}setFullYear(e){zi(this,0,4,e)}getMonth(){return Hi(this,5,7)-1}setMonth(e){zi(this,5,7,e+1)}getDate(){return Hi(this,8,10)}setDate(e){zi(this,8,10,e)}}),Ji=zn("LocalTime_ISOString"),Vi=zn("LocalTime_value"),Gi=(e,t,n)=>+e[Ji].slice(t,n),Xi=(e,n,i,r)=>{const s=""+r;if(s.length>i-n)throw t();e[Vi]=Li(e[Ji]=e[Ji].slice(0,n)+s.padStart(2,"0")+e[Ji].slice(i))},Qi=ui(class extends ki{[Ji];[Vi];get[zn.toStringTag](){return"LocalTime"}valueOf(){return this[Vi]}toISOString(){return this[Ji]}constructor(t){return vi(t)||it(e(`Invalid Local Time ${t}`+lt(" at "))),super(),this[Vi]=Li(this[Ji]=t),this}getHours(){return Gi(this,0,2)}setHours(e){Xi(this,0,2,e)}getMinutes(){return Gi(this,3,5)}setMinutes(e){Xi(this,3,5,e)}getSeconds(){return Gi(this,6,8)}setSeconds(e){Xi(this,6,8,e)}getMilliseconds(){return+this[Vi].slice(6,9).padEnd(3,"0")}setMilliseconds(e){this[Vi]=Li(this[Ji]=this[Ji].slice(0,8)+(e?("."+(""+e).padStart(3,"0")).replace(Fi,""):""))}}),er=parseInt,tr=String.fromCodePoint,nr=/[^\\]+|\\(?:[\\"btnfr/]|u.{4}|U.{8})/gs,ir=/[^\n\\]+|\n|\\(?:[\t ]*\n[\t\n ]*|[\\"btnfr/]|u.{4}|U.{8})/gs,rr=e=>{if(!e)return"";const n=e.match(nr),{length:i}=n;let r=0;do{const e=n[r];if("\\"===e[0])switch(e[1]){case"\\":n[r]="\\";break;case'"':n[r]='"';break;case"b":n[r]="\b";break;case"t":n[r]="\t";break;case"n":n[r]="\n";break;case"f":n[r]="\f";break;case"r":n[r]="\r";break;case"u":const i=er(e.slice(2),16);Xt&&55295{if(!e)return"";const r=e.match(ir),{length:s}=r;let a=0;do{const e=r[a];if("\n"===e)++i,r[a]=n;else if("\\"===e[0])switch(e[1]){case"\n":case" ":case"\t":for(let t=0;t=e.indexOf("\n",t)+1;)++i;r[a]="";break;case"\\":r[a]="\\";break;case'"':r[a]='"';break;case"b":r[a]="\b";break;case"t":r[a]="\t";break;case"n":r[a]="\n";break;case"f":r[a]="\f";break;case"r":r[a]="\r";break;case"u":const n=er(e.slice(2),16);Xt&&55295(or(e)||cr(e))&&!ur(e),pr=s&&-s("0x8000000000000000"),gr=s&&s("0x7FFFFFFFFFFFFFFF"),br=n=>{if(!0===tn)return(n=>{dr(n)||it(e(`Invalid Integer ${n}`+lt(" at ")));const i="-"===n[0]?-s(n.replace(hr,"")):s(n.replace(hr,""));return bn||pr<=i&&i<=gr||it(t(`Integer expect 64 bit range (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807), not includes ${n}`+lt(" meet at "))),i})(n);if(!1===tn)return(n=>{dr(n)||it(e(`Invalid Integer ${n}`+lt(" at ")));const i=er(n.replace(fr,""));return f(i)||it(t(`Integer did not use BitInt must fit Number.isSafeInteger, not includes ${n}`+lt(" meet at "))),i})(n);dr(n)||it(e(`Invalid Integer ${n}`+lt(" at ")));const i=er(n.replace(fr,""));if(nn<=i&&i<=rn)return i;const r="-"===n[0]?-s(n.replace(hr,"")):s(n.replace(hr,""));return bn||pr<=r&&r<=gr||it(t(`Integer expect 64 bit range (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807), not includes ${n}`+lt(" meet at "))),r},yr=isFinite,wr=-1/0,{test:mr}=V` + ^ + ${ar} + (?: + \.\d[_\d]* + (?:[eE][-+]?\d[_\d]*)? + | + [eE][-+]?\d[_\d]* + ) + $`.valueOf(),xr=/_/g,{test:Tr}=K(/^[-+]?0(?:\.0+)?(?:[eE][-+]?0+)?$/),{exec:vr}=K(/^[-0]?(\d*)(?:\.(\d+))?(?:e\+?(-?\d+))?$/),{exec:Or}=K(/^[-+]?0?(\d*)(?:\.(\d*?)0*)?(?:[eE]\+?(-?\d+))?$/),$r=n=>{if(!mr(n)||lr(n)){if(pn){if("inf"===n||"+inf"===n)return S;if("-inf"===n)return wr;if("nan"===n||"+nan"===n)return NaN;if("-nan"===n)return NaN}else if(!dn){if("inf"===n||"+inf"===n)return S;if("-inf"===n)return wr}throw it(e(`Invalid Float ${n}`+lt(" at ")))}const i=n.replace(xr,""),r=+i;if(dn){yr(r)||it(t(`Float ${n} has been as big as inf`+lt(" at "))),r||Tr(i)||it(t(`Float ${n} has been as little as ${"-"===n[0]?"-":""}0`+lt(" at ")));const{1:e,2:s="",3:a=""}=vr(r),{1:l,2:o="",3:c=""}=Or(i);l+o===e+s&&c-o.length==a-s.length||it(t(`Float ${n} has lost its exact and been ${r}`+lt(" at ")))}return r},Fr=(e,t)=>{const{length:n}=t;let r=0;for(;r{let s;if(n){let n;t in e?ei(n=e[t])&&!ii(n)||it(i("Trying to push Table to non-ArrayOfTables value"+lt(" at "))):n=e[t]=ri(!1),r&&Rn(r,n,e,t),n[n.length]=s=new gn(qe)}else t in e?(s=e[t],Je(s)&&it(i("A table defined implicitly via key/value pair can not be accessed to via []"+lt(", which at "))),(e=>!!Ze(e)&&(Ne(e),!0))(s)||it(i("Duplicate Table definition"+lt(" at ")))):e[t]=s=new gn(qe),r&&Rn(r,null,e,t);return s},Sr=(e,t)=>{const{length:n}=t;let r=0;for(;r(zt(t)&&it(e("Control characters other than Tab are not permitted in a Literal String"+lt(", which was found at "))),t),Lr=(t,n,i)=>{if(!i.startsWith("'''")){const r=ht(i)||it(e("Bad literal string"+lt(" at "))),s=kr(r[1]);return t[n]=on?Gn(i.slice(0,s.length+2),s):s,r[2]}const r=gt(i.slice(3));if(r){const e=kr(r[1])+r[2];return t[n]=on?Gn(i.slice(0,e.length+6),e):e,r[3]}const s=new at("Multi-line Literal String",i.length),a=!(i=i.slice(3));if(a){i=s.must();const e=gt(i);if(e){const r=kr(e[1])+e[2];return t[n]=on?Gn(["'''",i.slice(0,r.length+3)],r):r,e[3]}}null===en&&s.nowrap(Qt);for(const e=[kr(i)];;){const r=s.must(),l=gt(r);if(l){e[e.length]=kr(l[1])+l[2];const r=e.join(en);return on?(e[e.length-1]+="'''",a?e.unshift("'''"):e[0]=`'''${i}`,t[n]=Gn(e,r)):t[n]=r,l[3]}e[e.length]=kr(r)}},Mr=(t,n,i)=>{if(!i.startsWith('"""')){const e=Dt(i),r=rr(i.slice(1,e));return t[n]=on?Gn(i.slice(0,e+1),r):r,i.slice(e+1).replace(ut,"")}let r=3+vt(i.slice(3));if(i.length!==r){const s=i.slice(3,r);kt(s)||it(e("Bad multi-line basic string"+lt(" at ")));const a=rr(s)+(i.startsWith('"',r+=3)?i.startsWith('"',++r)?(++r,'""'):'"':"");return t[n]=on?Gn(i.slice(0,r),a):a,i.slice(r).replace(ut,"")}const s=new at("Multi-line Basic String",r),a=(i=i.slice(3))?0:1;if(a){i=s.must();let r=vt(i);if(i.length!==r){const s=i.slice(0,r);kt(s)||it(e("Bad multi-line basic string"+lt(" at ")));const l=sr(s,en,a)+(i.startsWith('"',r+=3)?i.startsWith('"',++r)?(++r,'""'):'"':"");return t[n]=on?Gn(['"""',i.slice(0,r)],l):l,i.slice(r).replace(ut,"")}}null===en&&s.nowrap(Qt),kt(i+"\n")||it(e("Bad multi-line basic string"+lt(" at ")));for(const l=[i];;){const r=s.must();let o=vt(r);if(r.length!==o){const s=r.slice(0,o);kt(s)||it(e("Bad multi-line basic string"+lt(" at ")));const c=sr(l.join("\n")+"\n"+s,en,a)+(r.startsWith('"',o+=3)?r.startsWith('"',++o)?(++o,'""'):'"':"");return on?(a?l.unshift('"""'):l[0]=`"""${i}`,l[l.length]=`${s}"""`,t[n]=Gn(l,c)):t[n]=c,r.slice(o).replace(ut,"")}kt(r+"\n")||it(e("Bad multi-line basic string"+lt(" at "))),l[l.length]=r}},Ar=fe(null),Br=e=>Ar[e]||(Ar[e]=zn(e)),Ur=zn("this"),{test:Dr}=K(/\r?\n/g),jr=(t,i)=>{if(i in t){const r=t[i];if("string"!=typeof r)throw n(`the value of comment must be a string, while "${null===r?"null":typeof r}" type is found`);if(Dr(r))throw e("the value of comment must be a string and can not include newline");return` #${r}`}return""},Cr=(e,t)=>t in Ar?jr(e,Ar[t]):"",{test:_r}=K(/(?:[Zz]|[+-]\d\d:\d\d)$/),{test:Nr}=K(/^\[[\t ]*]/),Er=t=>{let n=t;const r=[];let s=-1;for(;;){if(n||it(e("Empty bare key"+lt(" at "))),'"'===n[0]){const e=Dt(n);Tn.test(r[++s]=rr(n.slice(1,e)))||it(i("Key not allowed"+lt(" at "))),n=n.slice(e+1)}else{const t="'"===n[0],a=((t?Wt:Et)(n)||it(e(`Bad ${t?"literal string":"bare"} key`+lt(" at "))))[0];n=n.slice(a.length),Tn.test(r[++s]=t?a.slice(1,-1):a)||it(i("Key not allowed"+lt(" at ")))}if(!jt(n))break;n=n.replace(Ct,"")}if(xn){const i=t.slice(0,-n.length);(Gt(i)||yn&&"null"===i)&&it(e("Bad bare key disabled by xOptions.string"+lt(" at ")))}if(hn){let t=s;do{r[t]||it(e("Empty key is not allowed before TOML v0.5"+lt(", which at ")))}while(t--)}const a=r[s];return r.length=s,{leadingKeys:r,finalKey:a,lineRest:n}},Pr=(t,n)=>{if("<"===n[0]){const{1:i}=({2:n}=mt(n)||it(e("Bad tag "+lt(" at "))));switch(Rn(i,t,null),n&&n[0]){case",":case"]":case"":case"#":return t[t.length]=r,n}}switch(n[0]){case"'":return Lr(Ln(t),t.length,n);case'"':return Mr(Ln(t),t.length,n);case"{":return un||it(e("Inline Table is not allowed before TOML v0.4"+lt(", which at "))),Wr(Mn(t),t.length,n);case"[":return Kr(An(t),t.length,n)}const{1:i}=({2:n}=ft(n)||it(e("Bad atom value"+lt(" at "))));return"true"===i?Bn(t)[t.length]=!0:"false"===i?Bn(t)[t.length]=!1:yn&&"null"===i?kn(t)[t.length]=null:i.includes(":")?i.includes("-")?_r(i)?jn(t)[t.length]=new Ni(i):(fn||it(e("Local Date-Time is not allowed before TOML v0.5"+lt(", which at "))),Cn(t)[t.length]=new Ri(i)):(fn||it(e("Local Time is not allowed before TOML v0.5"+lt(", which at "))),Nn(t)[t.length]=new Qi(i)):i.indexOf("-")!==i.lastIndexOf("-")&&"-"!==i[0]?(fn||it(e("Local Date is not allowed before TOML v0.5"+lt(", which at "))),_n(t)[t.length]=new Yi(i)):i.includes(".")||i.includes("n")||(i.includes("e")||i.includes("E"))&&!i.startsWith("0x")?Un(t)[t.length]=on?Gn(i,$r(i)):$r(i):Dn(t)[t.length]=on?Gn(i,br(i)):br(i),n},Kr=function*(t,n,i){const r=t[n]=ri(!0);if(Nr(i))return je(r,"]"===i[1]?0:3),i.slice(i.indexOf("]")).replace(bt,"");const s=new at("Static Array",i.length);let a=i.startsWith("[ ")||i.startsWith("[\t")?3:0;for(i=i.replace(bt,"");!i||"#"===i[0];)a=null,i=s.must().replace(ut,"");if("]"===i[0])return null===a||je(r,a),i.replace(bt,"");for(;;){const t=Pr(r,i);for(i="string"==typeof t?t:yield t;!i||"#"===i[0];)a=null,i=s.must().replace(ut,"");if(","!==i[0]){if("]"===i[0])break;throw it(e("Unexpect character in static array item value"+lt(", which is found at ")))}for(i=i.replace(bt,"");!i||"#"===i[0];)a=null,i=s.must().replace(ut,"");if("]"===i[0])break}return null===a||je(r,a),i.replace(bt,"")},Wr=function*(t,n,i){const r=t[n]=new gn(qe,!0);if(wn){const e=new at("Inline Table",i.length);i=i.replace(bt,"");let t=!0;for(;;){for(;!i||"#"===i[0];)t=!1,i=e.must().replace(ut,"");if("}"===i[0])break;const n=Rr(r,i),s=Zr(n);if(i="string"==typeof s?s:yield s){if("#"===i[0]){mn&&(n.table[Br(n.finalKey)]=i.slice(1)),t=!1;do{i=e.must().replace(ut,"")}while(!i||"#"===i[0])}}else{t=!1;do{i=e.must().replace(ut,"")}while(!i||"#"===i[0])}","===i[0]&&(i=i.replace(bt,""))}t||je(r,!1)}else if("}"!==(i=i.replace(bt,"")||it(e("Inline Table is intended to appear on a single line"+lt(", which broken at "))))[0])for(;;){"#"===i[0]&&it(e("Inline Table is intended to appear on a single line"+lt(", which broken at ")));const t=Zr(Rr(r,i));if("}"===(i=("string"==typeof t?t:yield t)||it(e("Inline Table is intended to appear on a single line"+lt(", which broken at "))))[0])break;","===i[0]&&"}"===(i=i.replace(bt,"")||it(e("Inline Table is intended to appear on a single line"+lt(", which broken at "))))[0]&&it(e("The last property of an Inline Table can not have a trailing comma"+lt(", which was found at ")))}return i.replace(bt,"")},Rr=(t,n)=>{const{leadingKeys:i,finalKey:r,tag:s}=({lineRest:n}=(({leadingKeys:t,finalKey:n,lineRest:i})=>{const{1:r=""}=({2:i}=wt(i)||it(e("Keys must equal something"+lt(", but missing at "))));return r||i&&"#"!==i[0]||it(e("Value can not be missing after euqal sign"+lt(", which is found at "))),{leadingKeys:t,finalKey:n,tag:r,lineRest:i}})(Er(n)));return{table:Sr(t,i),finalKey:r,tag:s,lineRest:n}},Zr=({finalKey:t,tag:n,lineRest:s,table:a})=>{if(t in a&&it(i("Duplicate property definition"+lt(" at "))),n)switch(Rn(n,null,a,t),s&&s[0]){case",":case"}":case"":case"#":return a[t]=r,s}switch(s&&s[0]){case"'":return Lr(a,t,s);case'"':return Mr(a,t,s);case"{":return un||it(e("Inline Table is not allowed before TOML v0.4"+lt(", which at "))),Wr(a,t,s);case"[":return Kr(a,t,s)}const{1:l}=({2:s}=ft(s)||it(e("Bad atom value"+lt(" at "))));return"true"===l?a[t]=!0:"false"===l?a[t]=!1:yn&&"null"===l?a[t]=null:l.includes(":")?l.includes("-")?_r(l)?a[t]=new Ni(l):(fn||it(e("Local Date-Time is not allowed before TOML v0.5"+lt(", which at "))),a[t]=new Ri(l)):(fn||it(e("Local Time is not allowed before TOML v0.5"+lt(", which at "))),a[t]=new Qi(l)):l.indexOf("-")!==l.lastIndexOf("-")&&"-"!==l[0]?(fn||it(e("Local Date is not allowed before TOML v0.5"+lt(", which at "))),a[t]=new Yi(l)):a[t]=l.includes(".")||l.includes("n")||(l.includes("e")||l.includes("E"))&&!l.startsWith("0x")?on?Gn(l,$r(l)):$r(l):on?Gn(l,br(l)):br(l),s},qr=()=>{const t=new gn;let n=t;for(;nt!==tt;){const i=et[++nt].replace(ut,"");if(i)if("["===i[0]){const{leadingKeys:r,finalKey:s,asArrayItem:a,tag:l,lineRest:o}=Zt(i,Er),c=Fr(t,r);o&&("#"===o[0]||it(e("Unexpect charachtor after table header"+lt(" at ")))),n=Ir(c,s,a,l),mn&&o&&(n[Ur]=a?o.slice(1):c[Br(s)]=o.slice(1))}else if("#"===i[0])zt(i)&&it(e("Control characters other than Tab are not permitted in comments"+lt(", which was found at ")));else{const t=Rr(n,i);let r=Zr(t);"string"==typeof r||(r=Jn(r)),r&&("#"===r[0]||it(e("Unexpect charachtor after key/value pair"+lt(" at "))),mn&&(t.table[Br(t.finalKey)]=r.slice(1)))}}return t},Hr=Number.MAX_SAFE_INTEGER,zr=Date.prototype,Yr=String.prototype.valueOf,Jr=function(){if(B.bind){var e=B.bind(Yr);return function(t){try{e(t)}catch(n){return!1}return!0}}return function(e){try{Yr.apply(e)}catch(t){return!1}return!0}}(),Vr=Number.prototype.valueOf,Gr=function(){if(B.bind){var e=B.bind(Vr);return function(t){try{e(t)}catch(n){return!1}return!0}}return function(e){try{Vr.apply(e)}catch(t){return!1}return!0}}(),Xr=function(){if("function"==typeof BigInt){var e=B.bind(BigInt.prototype.valueOf);return function(t){try{e(t)}catch(n){return!1}return!0}}return function(){return!1}}(),Qr=BigInt.prototype.valueOf,es=function(){if(B.bind){var e=B.bind(Qr);return function(t){try{e(t)}catch(n){return!1}return!0}}return function(e){try{Qr.apply(e)}catch(t){return!1}return!0}}(),ts=fe({...pe([...L(32)].map(((e,t)=>[k(t),"\\u"+t.toString(16).toUpperCase().padStart(4,"0")]))),"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"','"""':'""\\"',"\\":"\\\\","":"\\u007F"}),{test:ns}=K(/[\x00-\x08\x0A-\x1F'\x7F]/),is=/[^\x00-\x08\x0A-\x1F"\\\x7F]+|./gs,{test:rs}=K(/^[\x00-\x08\x0A-\x1F"\\\x7F]/),ss=e=>{if(ns(e)){const t=e.match(is);let n=t.length;do{rs(t[--n])&&(t[n]=ts[t[n]])}while(n);return`"${t.join("")}"`}return`'${e}'`},{test:as}=K(/[\x00-\x08\x0A-\x1F\x7F]|'''/),{test:ls}=K(/[\x00-\x08\x0B-\x1F\x7F]|'''/),{test:os}=K(/[\x00-\x08\x0A-\x1F\\\x7F]|"""/),cs=/[^\x00-\x08\x0A-\x1F"\\\x7F]+|"""|./gs,{test:us}=K(/^(?:[\x00-\x08\x0A-\x1F\\\x7F]|""")/),fs=(e,t)=>{const n=e[t];if(os(n)){const i=n.match(cs);let r=i.length;do{us(i[--r])&&(i[r]=ts[i[r]])}while(r);e[t]=i.join("")}},hs=e=>1===(e=["",...e]).length?["",""]:e,ds=e=>{let t=e.length-1;for(fs(e,t),e[t]+=e[0]='"""';--t;)fs(e,t);return e},ps=e=>(e[e.length-1]+=e[0]="'''",e),gs=Float64Array,bs=Uint8Array,ys=-1/0,{test:ws}=K(/^-?\d+$/),ms=e=>ws(e)?e+".0":e,xs=new gs([NaN]),Ts=new bs(xs.buffer),vs=Ts[7],Os=vs===new bs(new gs([NaN]).buffer)[7]?e=>e?e===S?"inf":e===ys?"-inf":ms(""+e):e==e?he(e,0)?"0.0":"-0.0":"nan":e=>e?e===S?"inf":e===ys?"-inf":ms(""+e):e==e?he(e,0)?"0.0":"-0.0":(xs[0]=e,Ts[7]===vs?"nan":"-nan"),$s=p.bind(zr),{test:Fs}=K(/^[\w-]+$/),Is=e=>Fs(e)?e:ss(e),Ss=/[^.]+/,ks=e=>`'${e}'`,Ls=e=>Gt(e)?e.replace(Ss,ks):"null"===e?"'null'":e;class Ms extends L{document;constructor(e){return super(),this.document=e,this}[zn.toPrimitive](){return this.join(this.document.newline)}appendNewline(){this[this.length]=""}set appendLine(e){this[this.length]=e}set appendInline(e){this[this.length-1]+=e}set appendInlineIf(e){e&&(this[this.length-1]+=e)}*assignBlock(e,t,i,r){const{document:s}=this,{newlineUnderHeader:a,newlineUnderSectionButPair:l}=s,o=!!t&&s.newlineUnderPairButDotted,c=t?s.newlineUnderDotted:s.newlineUnderPair;for(const u of r){const r=i[u],f=Is(u),d=e+f;if(I(r)){const{length:e}=r;if(e){let t=r[0];if(_e(t)){const i=`[[${d}]]`,o=d+".";let c=0,u=t;for(;;){const t=s.appendSection();if(t[0]=i+jr(u,Ur),a?(t[1]="",yield t.assignBlock(o,"",u,h(u)),l&&2!==t.length&&t.appendNewline()):(yield t.assignBlock(o,"",u,h(u)),l&&t.appendNewline()),++c===e)break;if(u=r[c],!_e(u))throw n("the first table item marked by Section() means the parent array is an array of tables, which can not include other types or table not marked by Section() any more in the rest items")}continue}{let t=1;for(;t!==e;)if(_e(r[t++]))throw n("if an array is not array of tables, it can not include any table that marked by Section()")}}}else if(_e(r)){const e=s.appendSection();e[0]=`[${d}]${s.preferCommentForThis?jr(r,Ur)||Cr(i,u):Cr(i,u)||jr(r,Ur)}`,a?(e[1]="",yield e.assignBlock(d+".","",r,h(r)),l&&2!==e.length&&e.appendNewline()):(yield e.assignBlock(d+".","",r,h(r)),l&&e.appendNewline());continue}const p=t+f;this.appendLine=Ls(p)+" = ";const g=this.value("",r,!0);g?(--this.length,yield this.assignBlock(d+".",p+".",r,g),o&&this.appendNewline()):(this.appendInlineIf=Cr(i,u),c&&this.appendNewline())}}value(e,t,i){switch(typeof t){case"object":if(null===t){if(this.document.nullDisabled)throw n('toml can not stringify "null" type value without truthy options.xNull');this.appendInline="null";break}const s=De(t);if(I(t)){if(s===r)this.staticArray(e,t);else{const{$singlelineArray:n=s}=this.document;this.singlelineArray(e,t,n)}break}if(s!==r){s||this.document.multilineTableDisabled?this.inlineTable(e,t):this.multilineTable(e,t,this.document.multilineTableComma);break}if($s(t)){this.appendInline=t.toISOString().replace("T",this.document.T).replace("Z",this.document.Z);break}if(Vn in t){const e=t[Vn];if("string"==typeof e)this.appendInline=e;else{if(!I(e))throw n("literal value is broken");{const{length:t}=e;if(!t)throw n("literal value is broken");{this.appendInline=e[0];let n=1;for(;n!==t;)this.appendLine=e[n++]}}}break}if(Jr(t))throw n("TOML.stringify refuse to handle [object String]");if(Gr(t))throw n("TOML.stringify refuse to handle [object Number]");if(Xr(t))throw n("TOML.stringify refuse to handle [object BigInt]");if(es(t))throw n("TOML.stringify refuse to handle [object Boolean]");if(i){const e=h(t);if(e.length)return e;this.appendInline="{ }"}else this.inlineTable(e,t);break;case"bigint":this.appendInline=""+t;break;case"number":this.appendInline=this.document.asInteger(t)?he(t,-0)?"-0":""+t:Os(t);break;case"string":this.appendInline=ss(t);break;case"boolean":this.appendInline=t?"true":"false";break;default:throw n(`toml can not stringify "${typeof t}" type value`)}return null}singlelineArray(e,t,n){const{length:i}=t;if(i){this.appendInline=2&n?"[ ":"[",this.value(e,t[0],!1);let r=1;for(;r!==i;)this.appendInline=", ",this.value(e,t[r++],!1);this.appendInline=2&n?" ]":"]"}else this.appendInline=1&n?"[ ]":"[]"}staticArray(e,t){this.appendInline="[";const n=e+this.document.indent,{length:i}=t;let r=0;for(;r!==i;)this.appendLine=n,this.value(n,t[r++],!1),this.appendInline=",";this.appendLine=e+"]"}inlineTable(e,t){const n=h(t);n.length?(this.appendInline="{ ",this.assignInline(e,t,"",n),this[this.length-1]=this[this.length-1].slice(0,-2)+" }"):this.appendInline="{ }"}multilineTable(e,t,n){this.appendInline="{",this.assignMultiline(e,t,"",h(t),n),this.appendLine=e+"}"}assignInline(e,t,n,i){for(const r of i){const i=t[r],s=n+Is(r),a=this.appendInline=Ls(s)+" = ",l=this.value(e,i,!0);l?(this[this.length-1]=this[this.length-1].slice(0,-a.length),this.assignInline(e,i,s+".",l)):this.appendInline=", "}}assignMultiline(e,t,n,i,r){const s=e+this.document.indent;for(const a of i){const i=t[a],l=n+Is(a);this.appendLine=s+Ls(l)+" = ";const o=this.value(s,i,!0);o?(--this.length,this.assignMultiline(e,i,l+".",o,r)):r?this.appendInline=","+Cr(t,a):this.appendInlineIf=Cr(t,a)}}}const As=fe({document:0,section:1,header:2,pairs:3,pair:4}),{test:Bs}=K(/^[\t ]*$/),Us=()=>!1;class Ds extends L{get["constructor"](){return L}0=new Ms(this);asInteger=Us;newline="";newlineUnderSection=!0;newlineUnderSectionButPair=!0;newlineUnderHeader=!0;newlineUnderPair=!1;newlineUnderPairButDotted=!1;newlineUnderDotted=!1;indent="\t";T="T";Z="Z";nullDisabled=!0;multilineTableDisabled=!0;multilineTableComma;preferCommentForThis=!1;$singlelineArray;constructor(i){if(super(),null==i)return this;const{integer:r}=i;if(void 0===r);else if(r===Hr)this.asInteger=f;else{if("number"!=typeof r)throw n("TOML.stringify(,{integer}) can only be number");{if(!f(r))throw t("TOML.stringify(,{integer}) can only be a safe integer");const e=r>=0?r:-r-1,n=r>=0?-r:r;this.asInteger=t=>f(t)&&n<=t&&t<=e}}const{newline:s}=i;if(void 0===s);else{if("\n"!==s&&"\r\n"!==s)throw"string"==typeof s?e("TOML.stringify(,{newline}) can only be valid TOML newline"):n("TOML.stringify(,{newline}) can only be string");this.newline=s}const{preferCommentFor:a}=i;if(void 0===a);else{if("this"!==a&&"key"!==a)throw n("TOML.stringify(,{preferCommentFor) can only be 'key' or 'this'");this.preferCommentForThis="this"===a}const{[i.newlineAround||"header"]:l=As.header}=As;this.newlineUnderSection=l>0,this.newlineUnderSectionButPair=1===l||2===l,this.newlineUnderHeader=l>1,this.newlineUnderPair=l>2,this.newlineUnderPairButDotted=3===l,this.newlineUnderDotted=l>3;const{indent:o}=i;if(void 0===o);else if("string"==typeof o){if(!Bs(o))throw e("TOML.stringify(,{indent}) can only include Tab or Space");this.indent=o}else{if("number"!=typeof o)throw n(`TOML.stringify(,{indent}) can not be "${typeof o}" type`);if(!f(o))throw t(`TOML.stringify(,{indent:${o}}) is out of range`);this.indent=" ".repeat(o)}const{T:c}=i;if(void 0===c);else{if(" "!==c&&"t"!==c&&"T"!==c)throw n('TOML.stringify(,{T}) can only be "T" or " " or "t"');this.T=c}const{Z:u}=i;if(void 0===u);else{if("z"!==u&&"Z"!==u)throw n('TOML.stringify(,{Z}) can only be "Z" or "z"');this.Z=u}i.xNull&&(this.nullDisabled=!1);const{xBeforeNewlineInMultilineTable:h}=i;if(void 0===h);else{if(""!==h&&","!==h)throw n('TOML.stringify(,{xBeforeNewlineInMultilineTable}) can only be "" or ","');this.multilineTableDisabled=!1,this.multilineTableComma=!!h}const d=i.forceInlineArraySpacing;switch(d){case void 0:break;case 0:case 1:case 2:case 3:this.$singlelineArray=d;break;default:throw"number"==typeof d?t(`array inline mode must be 0 | 1 | 2 | 3, not including ${d}`):n('array inline mode must be "number" type, not including '+(null===d?'"null"':typeof d))}return this}appendSection(){return this[this.length]=new Ms(this)}}const js=new se,Cs=le.bind(js),_s=ae.bind(js),Ns=(()=>{const e=(e,t)=>"string"==typeof e?Gn((ls(e)?ds:ps)(("\n"+e).split("\n")),e):I(e)?Gn((e=>{const t=e.length-1;let n=t;do{if(as(e[n]))break}while(--n);if(n)for(n=t,fs(e,n),e[n]+=e[0]='"""';--n;)fs(e,n);else e[t]+=e[0]="'''";return e})(hs(e)),"string"==typeof t?t:fe(null)):(e=>(je(e,!1),Be(e),e))(e);return e.basic=(e,t)=>"string"==typeof e?Gn(ds(("\n"+e).split("\n")),e):Gn(ds(hs(e)),"string"==typeof t?t:fe(null)),e.array=Ce,d(e),e})(),Es=new Hn("utf-8",fe({fatal:!0,ignoreBOM:!1})),Ps=e=>{if(Zn(e)?e.length!==e.byteLength:!qn(e))throw n("only Uint8Array or ArrayBuffer is acceptable");try{return Es.decode(e)}catch{throw i("A TOML doc must be a (ful-scalar) valid UTF-8 file, without any unknown code point.")}},Ks=e=>"byteLength"in e,{test:Ws}=K(/[\uD800-\uDFFF]/u),Rs=e=>{if(G(Ws(e)))throw i("A TOML doc must be a (ful-scalar) valid UTF-8 file, without any uncoupled UCS-4 character code.")};let Zs=!1;const qs=(e,a,l,o,c,u)=>{let d,p,g,b,y="";if("object"==typeof e&&e){if(I(e))throw n(_s(e)?"TOML.parse(array from TOML.stringify(,{newline?}))":"TOML.parse(array)");if(Ks(e))e=Ps(e);else{if(y=e.path,"string"!=typeof y)throw n("TOML.parse(source.path)");const{data:t,require:i=("function"==typeof require?require:r)}=e;if(i){const{resolve:s}=i;if(null!=s){const{paths:e}=s;if(null!=e){const t=m(e,s,[""]);if(null!=t){const e=t[0];if(null!=e){const t=e.replace(/node_modules$/,"");if(t&&(y=i("path").resolve(t,y),"string"!=typeof y))throw n("TOML.parse(source.require('path').resolve)")}}}}if(t===r){const t=i("fs").readFileSync(y);if("object"!=typeof t||!t||!Ks(t))throw n("TOML.parse(source.require('fs').readFileSync)");e=Ps(t)}else if("string"==typeof t)Rs(e=t);else{if("object"!=typeof t||!t||!Ks(t))throw n("TOML.parse(source.data)");e=Ps(t)}}else{if(t===r)throw n("TOML.parse(source.data|source.require)");if("string"==typeof t)Rs(e=t);else{if("object"!=typeof t||!t||!Ks(t))throw n("TOML.parse(source.data)");e=Ps(t)}}}}else{if("string"!=typeof e)throw n("TOML.parse(source)");Rs(e)}if("object"==typeof l&&l){if(o!==r||c!==r)throw n("options mode ? args mode");d=l.joiner,o=l.bigint,p=l.keys,c=l.x,u=""}else d=l;if(Zs)throw i("parsing during parsing.");Zs=!0;try{((e,a,l,o,c,u)=>{let d;switch(Qt=u,e){case 1:Xt=d=fn=pn=un=!0,cn=hn=!1;break;case.5:Xt=fn=pn=un=!0,d=cn=hn=!1;break;case.4:Xt=hn=un=!0,d=cn=fn=pn=!1;break;case.3:Xt=hn=!0,d=cn=fn=pn=un=!1;break;case.2:case.1:cn=hn=!0,Xt=d=fn=pn=un=!1;break;default:throw t("TOML.parse(,specificationVersion)")}if((e=>{switch(e){case 1:gt=dt,Wt=Pt,zt=qt,St=Ot,Ut=Lt,Et=_t,Rt=!0;break;case.5:gt=pt,Wt=Pt,zt=qt,St=$t,Ut=Mt,Et=_t,Rt=!0;break;case.4:gt=pt,Wt=Kt,zt=Ht,St=Ft,Ut=At,Et=_t,Rt=!0;break;default:gt=pt,Wt=Kt,zt=Ht,St=It,Ut=Bt,Et=Nt,Rt=!1}})(e),"string"==typeof a)en=a;else{if(a!==r)throw n(`TOML.parse(${Qt?`${Qt}multilineStringJoiner`:",{ joiner }"})`);en=null}if(l===r||!0===l)tn=!0;else if(!1===l)tn=!1;else{if("number"!=typeof l)throw n(`TOML.parse(${Qt?`${Qt},useBigInt`:",{ bigint }"})`);if(!f(l))throw t(`TOML.parse(${Qt?`${Qt},useBigInt`:",{ bigint }"})`);tn=null,l>=0?nn=-(rn=l):rn=-(nn=l)-1}if(!s&&!1!==tn)throw i(`Can't work without TOML.parse(${Qt?`${Qt},useBigInt`:",{ bigint }"}) being set to false, because the host doesn't have BigInt support`);if(null==o)Tn=sn;else{if(!ln(o))throw n("TOML.parse(,{ keys })");Tn=o}if(null==c)gn=Ve,dn=bn=yn=wn=!1,Rn=Wn;else{if("object"!=typeof c)throw n(`TOML.parse(${Qt?`${Qt},,xOptions`:",{ x }"})`);{const{order:e,longer:t,exact:i,null:r,multi:s,comment:a,string:l,literal:o,tag:u,...f}=c,p=h(f);if(p.length)throw n(`TOML.parse(${Qt?`${Qt},,{ ${p.join(", ")} }`:`,{ x: { ${p.join(", ")} } }`})`);if(gn=e?Ge:Ve,bn=!t,dn=!!i,yn=!!r,wn=!!s,mn=!!a,xn=!!l,on=!!o,u){if("function"!=typeof u)throw n(`TOML.parse(${Qt?`${Qt},,{ tag }`:",{ x: { tag } }"})`);if(!d)throw n(`TOML.parse(${Qt?`${Qt},,xOptions`:",{ x }"}) xOptions.tag needs at least TOML 1.0 to support mixed type array`);En=u,Rn=Kn}else Rn=Wn}}d?kn=Ln=Mn=An=Bn=Un=Dn=jn=Cn=_n=Nn=Sn:({asNulls:kn,asStrings:Ln,asTables:Mn,asArrays:An,asBooleans:Bn,asFloats:Un,asIntegers:Dn,asOffsetDateTimes:jn,asLocalDateTimes:Cn,asLocalDates:_n,asLocalTimes:Nn}=In)})(a,d,o,p,c,u),st(e,y),e&&"\ufeff"===e[0]&&it(n("TOML content (string) should not start with BOM (U+FEFF)"+lt(" at "))),g=qr(),b=(()=>{if(Pn){const e=En;let t=Pn;return Pn=null,()=>{const n=e;let i=t;t=null;do{n(i)}while(i=i._linked)}}return null})()}finally{ot(),Tn=sn,en=En=Pn=null,cn=!1,Zs=!1,G()}return b&&b(),g};return _({version:"1.38.0",parse:O(((e,t,n,i,r)=>"number"==typeof t?qs(e,t,n,i,r,",,"):qs(e,1,t,n,i,",")),{"1.0":(e,t,n,i)=>qs(e,.1,t,n,i,","),1:(e,t,n,i)=>qs(e,1,t,n,i,","),.5:(e,t,n,i)=>qs(e,.5,t,n,i,","),.4:(e,t,n,i)=>qs(e,.4,t,n,i,","),.3:(e,t,n,i)=>qs(e,.3,t,n,i,","),.2:(e,t,n,i)=>qs(e,.2,t,n,i,","),.1:(e,t,n,i)=>qs(e,.1,t,n,i,",")}),stringify:(e,t)=>{const n=new Ds(t),i=n[0];if(i[0]="",Jn(i.assignBlock("","",e,h(e))),n.newlineUnderSectionButPair&&1!==i.length&&i.appendNewline(),n.newlineUnderSection||n[n.length-1].appendNewline(),n.newline)return n.join(n.newline);const r=n.flat();return Cs(r),r},Section:e=>{if(I(e))throw n("array can not be section, maybe you want to use it on the tables in it");return Ne(e),Ae(e),e},inline:(e,i,s)=>{if(I(e)){if(s)i=3;else if(i===r)i=3;else if(0!==i&&1!==i&&2!==i&&3!==i)throw"number"==typeof i?t(`array inline mode must be 0 | 1 | 2 | 3, not including ${i}`):n('array inline mode must be "number" type, not including '+(null===i?'"null"':typeof i));je(e,i)}else je(e,!0),Be(e);return e},multiline:Ns,basic:e=>Gn((e=>{if(e){const t=e.match(is);let n=t.length;do{rs(t[--n])&&(t[n]=ts[t[n]])}while(n);return`"${t.join("")}"`}return'""'})(e),e),literal:(e,...t)=>{if("string"==typeof e){if(1===t.length)return Gn(e.includes("\n")?e.split("\n"):e,t[0])}else{let n=t.length;if(n){const{raw:i}=e;for(e=i[n];n;)t[--n]+=i[n];e=t.join("")+e}else e=e.raw[0]}return Gn(e.includes("\n")?e.split("\n"):e,fe(null))},commentFor:Br,commentForThis:Ur,OffsetDateTime:Ni,LocalDateTime:Ri,LocalDate:Yi,LocalTime:Qi,isInline:Ue,isSection:_e,Keys:an})})); +//# sourceMappingURL=j-toml.min.js.map \ No newline at end of file diff --git a/v2realbot/static/js/libs/j-toml/j-toml.min.js.gz b/v2realbot/static/js/libs/j-toml/j-toml.min.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..35591bcfc37415d0de72d6c769136d5b7344c80f GIT binary patch literal 15635 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 };\n\nfunction RE ( template ) {\n\tvar U = this.U;\n\tvar I = this.I;\n\tvar M = this.M;\n\tvar S = this.S;\n\tvar raw = template.raw;\n\tvar source = raw[0] .replace(NT, '');\n\tvar index = 1;\n\tvar length = arguments.length;\n\twhile ( index!==length ) {\n\t\tvar value \n\t\t\t \n\t\t\t \n\t\t\t \n\t\t\t \n\t\t\t \n\t\t = arguments[index];\n\t\tif ( typeof value==='string' ) { source += value; }\n\t\telse {\n\t\t\tvar value_source = value.source;\n\t\t\tif ( typeof value_source!=='string' ) { throw TypeError('source'); }\n\t\t\tif ( value.unicode===U ) { throw SyntaxError('unicode'); }\n\t\t\tif ( value.ignoreCase===I ) { throw SyntaxError('ignoreCase'); }\n\t\t\tif ( value.multiline===M && ( includes(value_source, '^') || includes(value_source, '$') ) ) { throw SyntaxError('multiline'); }\n\t\t\tif ( value.dotAll===S && includes(value_source, '.') ) { throw SyntaxError('dotAll'); }\n\t\t\tsource += value_source;\n\t\t}\n\t\tsource += raw[index++] .replace(NT, '');\n\t}\n\tvar re = RegExp(U ? source = source.replace(ESCAPE, graveAccentReplacer) : source, this.flags);\n\tvar test = re.test = Test(re);\n\tvar exec = re.exec = Exec(re);\n\ttest.source = exec.source = source;\n\ttest.unicode = exec.unicode = !U;\n\ttest.ignoreCase = exec.ignoreCase = !I;\n\ttest.multiline = exec.multiline = includes(source, '^') || includes(source, '$') ? !M : null;\n\ttest.dotAll = exec.dotAll = includes(source, '.') ? !S : null;\n\treturn re;\n}\n\nvar RE_bind = bind && /*#__PURE__*/bind.bind(RE );\n\nfunction Context (flags ) {\n\treturn {\n\t\tU: !includes(flags, 'u'),\n\t\tI: !includes(flags, 'i'),\n\t\tM: !includes(flags, 'm'),\n\t\tS: !includes(flags, 's'),\n\t\tflags: flags\n\t};\n}\n\nvar CONTEXT = /*#__PURE__*/Context('');\n\nexport default Proxy\n\t? /*#__PURE__*/new Proxy(RE, {\n\t\tapply: function (RE, thisArg, args ) { return apply(RE, CONTEXT, args); }\n\t\t,\n\t\tget: function (RE, flags ) { return RE_bind(Context(flags)); }\n\t\t,\n\t\tdefineProperty: function () { return false; }\n\t\t,\n\t\tpreventExtensions: function () { return false; }\n\t})\n\t: /*#__PURE__*/function () {\n\t\tRE.apply = RE.apply;\n\t\tvar newRegExp = function () { return RE.apply(CONTEXT, arguments ); } ;\n\t\tvar d = 1;\n\t\tvar g = d*2;\n\t\tvar i = g*2;\n\t\tvar m = i*2;\n\t\tvar s = i*2;\n\t\tvar u = s*2;\n\t\tvar y = u*2;\n\t\tvar flags = y*2 - 1;\n\t\twhile ( flags-- ) {\n\t\t\t( function (context) {\n\t\t\t\tnewRegExp[context.flags] = function () { return RE.apply(context, arguments ); };\n\t\t\t} )(Context(\n\t\t\t\t( flags & d ? '' : 'd' )\n\t\t\t\t+\n\t\t\t\t( flags & g ? '' : 'g' )\n\t\t\t\t+\n\t\t\t\t( flags & i ? '' : 'i' )\n\t\t\t\t+\n\t\t\t\t( flags & m ? '' : 'm' )\n\t\t\t\t+\n\t\t\t\t( flags & s ? '' : 's' )\n\t\t\t\t+\n\t\t\t\t( flags & u ? '' : 'u' )\n\t\t\t\t+\n\t\t\t\t( flags & y ? '' : 'y' )\n\t\t\t));\n\t\t}\n\t\treturn freeze ? freeze(newRegExp) : newRegExp;\n\t}();\n\n \n\t \n\t \n\t \n\t \n\t \n ", + "import RegExp from '.RegExp';\n\nvar clearRegExp = '$_' in RegExp\n\t? /*#__PURE__*/function () {\n\t\tvar REGEXP = /^/;\n\t\tREGEXP.test = REGEXP.test;\n\t\treturn function clearRegExp (value ) {\n\t\t\tREGEXP.test('');\n\t\t\treturn value;\n\t\t};\n\t}()\n\t: function clearRegExp (value ) {\n\t\treturn value;\n\t};\n\nexport default clearRegExp;", + "import create from '.Object.create?=';\nimport NULL from '.null.prototype';\n\nvar NEED_TO_ESCAPE_IN_REGEXP = /^[$()*+\\-.?[\\\\\\]^{|]/;\nvar SURROGATE_PAIR = /^[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/;\nvar GROUP = /*#__PURE__*/create(NULL) ;\n\nexport default function groupify (branches , uFlag , noEscape ) {\n\tvar group = create(NULL) ;\n\tvar appendBranch = uFlag ? appendPointBranch : appendCodeBranch;\n\tfor ( var length = branches.length, index = 0; index [];\n\nconst newWeakMap = () => {\n\tconst weakMap = new WeakMap;\n\tweakMap.has = weakMap.has;\n\tweakMap.get = weakMap.get;\n\tweakMap.set = weakMap.set;\n\treturn weakMap;\n};\nconst target2keeper = /*#__PURE__*/newWeakMap() \n\t \n\t \n ;\nconst proxy2target = /*#__PURE__*/newWeakMap() \n\t \n\t \n\t \n ;\nconst target2proxy = /*#__PURE__*/newWeakMap() \n\t \n\t \n ;\n\nconst ExternalDescriptor = (source ) => {\n\tconst target = Object_create(NULL) ;\n\tif ( hasOwn(source, 'enumerable') ) { target.enumerable = source.enumerable; }\n\tif ( hasOwn(source, 'configurable') ) { target.configurable = source.configurable; }\n\tif ( hasOwn(source, 'value') ) { target.value = source.value; }\n\tif ( hasOwn(source, 'writable') ) { target.writable = source.writable; }\n\tif ( hasOwn(source, 'get') ) { target.get = source.get; }\n\tif ( hasOwn(source, 'set') ) { target.set = source.set; }\n\treturn target;\n};\n\nconst handlers = /*#__PURE__*/Object_assign(Object_create(NULL), {\n\tdefineProperty: (target , key , descriptor ) => {\n\t\tif ( hasOwn(target, key) ) {\n\t\t\treturn Reflect_defineProperty(target, key, Object_assign(Object_create(NULL), descriptor));\n\t\t}\n\t\tif ( Reflect_defineProperty(target, key, Object_assign(Object_create(NULL), descriptor)) ) {\n\t\t\tconst keeper = target2keeper.get(target) ;\n\t\t\tkeeper[keeper.length] = key;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\tdeleteProperty: (target , key ) => {\n\t\tif ( Reflect_deleteProperty(target, key) ) {\n\t\t\tconst keeper = target2keeper.get(target) ;\n\t\t\tconst index = keeper.indexOf(key);\n\t\t\tindex<0 || --keeper.copyWithin(index, index + 1).length;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\townKeys: (target ) => target2keeper.get(target) ,\n\tconstruct: (target , args , newTarget ) => orderify(Reflect_construct(target, args, newTarget)),\n\tapply: (target , thisArg , args ) => orderify(Reflect_apply(target, thisArg, args)),\n});\n\nconst newProxy = (target , keeper ) => {\n\ttarget2keeper.set(target, keeper);\n\tconst proxy = new Proxy (target, handlers);\n\tproxy2target.set(proxy, target);\n\treturn proxy;\n};\n\nexport const isOrdered = (object ) => proxy2target.has(object);\nexport const is = (object1 , object2 ) => Object_is(\n\tproxy2target.get(object1) || object1,\n\tproxy2target.get(object2) || object2,\n);\n\nexport const orderify = (object ) => {\n\tif ( proxy2target.has(object) ) { return object; }\n\tlet proxy = target2proxy.get(object) ;\n\tif ( proxy ) { return proxy; }\n\tproxy = newProxy(object, Object_assign(Keeper (), Reflect_ownKeys(object)));\n\ttarget2proxy.set(object, proxy);\n\treturn proxy;\n};\n\n \nexport const { create } = {\n\tcreate (proto , ...descriptorMaps ) {\n\t\tconst keeper = Keeper ();\n\t\tif ( descriptorMaps.length ) {\n\t\t\tconst descriptorMap = Object_assign(newProxy(Object_create(NULL) , keeper), ...descriptorMaps);\n\t\t\tconst { length } = keeper;\n\t\t\tlet index = 0;\n\t\t\twhile ( index!==length ) {\n\t\t\t\tconst key = keeper[index++] ;\n\t\t\t\tdescriptorMap[key] = ExternalDescriptor(descriptorMap[key]);\n\t\t\t}\n\t\t\treturn newProxy(Object_create(proto, descriptorMap) , keeper );\n\t\t}\n\t\treturn newProxy(Object_create(proto) , keeper );\n\t}\n};\nexport const { defineProperties } = {\n\tdefineProperties (object , descriptorMap , ...descriptorMaps ) {\n\t\tconst keeper = Keeper ();\n\t\tdescriptorMap = Object_assign(newProxy(Object_create(NULL) , keeper), descriptorMap, ...descriptorMaps);\n\t\tconst { length } = keeper;\n\t\tlet index = 0;\n\t\twhile ( index!==length ) {\n\t\t\tconst key = keeper[index++] ;\n\t\t\tdescriptorMap[key] = ExternalDescriptor(descriptorMap[key]);\n\t\t}\n\t\treturn Object_defineProperties(orderify(object), descriptorMap);\n\t}\n};\nexport const getOwnPropertyDescriptors = (object ) => {\n\tconst descriptorMap = Object_create(NULL) ;\n\tconst keeper = Object_assign(Keeper (), Reflect_ownKeys(object));\n\tconst { length } = keeper;\n\tlet index = 0;\n\twhile ( index!==length ) {\n\t\tconst key = keeper[index++] ;\n\t\tdescriptorMap[key] = Object_assign(Object_create(NULL), Object_getOwnPropertyDescriptor(object, key) );\n\t}\n\treturn newProxy(descriptorMap, keeper);\n};\n\nexport const Null = /*#__PURE__*/function () {\n\tfunction throwConstructing () { throw TypeError(`Super constructor Null cannot be invoked with 'new'`); }\n\tfunction throwApplying () { throw TypeError(`Super constructor Null cannot be invoked without 'new'`); }\n\tconst Nullify = (constructor ) => {\n\t\tdelete constructor.prototype.constructor;\n\t\tObject_freeze(constructor.prototype);\n\t\treturn constructor;\n\t};\n\tfunction Null ( constructor ) {\n\t\treturn new.target\n\t\t\t? new.target===Null\n\t\t\t\t? /*#__PURE__*/throwConstructing()\n\t\t\t\t: /*#__PURE__*/newProxy(this, Keeper ())\n\t\t\t: typeof constructor==='function'\n\t\t\t\t? /*#__PURE__*/Nullify(constructor)\n\t\t\t\t: /*#__PURE__*/throwApplying();\n\t}\n\t//@ts-ignore\n\tNull.prototype = null;\n\tObject_defineProperty(Null, 'name', Object_assign(Object_create(NULL), { value: '', configurable: false }));\n\t//delete Null.length;\n\tObject_freeze(Null);\n\treturn Null;\n}() ;\n \n\nconst DEFAULT = /*#__PURE__*/Object_assign(class extends null { writable () {} enumerable () {} configurable () {} }.prototype , {\n\tconstructor: undefined,\n\twritable: true,\n\tenumerable: true,\n\tconfigurable: true,\n});\nexport const fromEntries = (entries , proto ) => {\n\tconst target = Object_fromEntries(entries);\n\tconst keeper = Object_assign(Keeper (), Reflect_ownKeys(target));\n\tif ( proto===undefined ) { return newProxy(target , keeper); }\n\tif ( proto===null ) { return newProxy(Object_assign(Object_create(proto), target) , keeper); }\n\tconst descriptorMap = Object_create(NULL) ;\n\tconst { length } = keeper;\n\tlet index = 0;\n\twhile ( index!==length ) {\n\t\tconst key = keeper[index++] ;\n\t\t( descriptorMap[key] = Object_create(DEFAULT) ).value = target[key];\n\t}\n\treturn newProxy(Object_create(proto, descriptorMap) , keeper);\n};\n\nimport Default from '.default';\nexport default /*#__PURE__*/Default({\n\tversion,\n\tisOrdered,\n\tis,\n\torderify,\n\tcreate,\n\tdefineProperties,\n\tNull,\n\tfromEntries,\n\tgetOwnPropertyDescriptors,\n});\n", + "import TypeError from '.TypeError';\nimport RangeError from '.RangeError';\nimport WeakSet from '.WeakSet';\nimport WeakMap from '.WeakMap';\nimport set_has from '.WeakSet.prototype.has';\nimport set_add from '.WeakSet.prototype.add';\nimport set_del from '.WeakSet.prototype.delete';\nimport map_has from '.WeakMap.prototype.has';\nimport map_get from '.WeakMap.prototype.get';\nimport map_set from '.WeakMap.prototype.set';\nimport map_del from '.WeakMap.prototype.delete';\nimport isArray from '.Array.isArray';\nimport undefined from '.undefined';\n\nconst INLINES = new WeakMap ();\nconst SECTIONS = new WeakSet ();\n\nconst deInline = /*#__PURE__*/map_del.bind(INLINES) ;\nconst deSection = /*#__PURE__*/set_del.bind(SECTIONS) ;\n\nexport const isInline = /*#__PURE__*/map_has.bind(INLINES) ;\nexport const ofInline = /*#__PURE__*/map_get.bind(INLINES) \n\t \n\t \n\t \n ;\nexport const beInline = /*#__PURE__*/map_set.bind(INLINES) \n\t \n\t \n ;\nexport const inline = (value , mode , looping ) => {\n\tif ( isArray(value) ) {\n\t\tif ( looping ) { mode = 3; }\n\t\telse {\n\t\t\tif ( mode===undefined ) { mode = 3; }\n\t\t\telse if ( mode!==0 && mode!==1 && mode!==2 && mode!==3 ) {\n\t\t\t\tthrow typeof mode==='number'\n\t\t\t\t\t? RangeError(`array inline mode must be 0 | 1 | 2 | 3, not including ${mode}`)\n\t\t\t\t\t: TypeError(`array inline mode must be \"number\" type, not including ${mode===null ? '\"null\"' : typeof mode}`);\n\t\t\t}\n\t\t}\n\t\tbeInline(value, mode);\n\t}\n\telse {\n\t\tbeInline(value, true);\n\t\tdeSection(value);\n\t}\n\treturn value;\n};\nexport const multilineTable = (value ) => {\n\tbeInline(value, false);\n\tdeSection(value);\n\treturn value;\n};\nexport const multilineArray = (value ) => {\n\tdeInline(value);\n\treturn value;\n};\n\nexport const isSection = /*#__PURE__*/set_has.bind(SECTIONS) ;\nexport const beSection = /*#__PURE__*/set_add.bind(SECTIONS) ;\nexport const Section = (table ) => {\n\tif ( isArray(table) ) { throw TypeError(`array can not be section, maybe you want to use it on the tables in it`); }\n\tbeSection(table);\n\tdeInline(table);\n\treturn table;\n};\n\n ", + "import WeakSet from '.WeakSet';\nimport has from '.WeakSet.prototype.has';\nimport add from '.WeakSet.prototype.add';\nimport del from '.WeakSet.prototype.delete';\nimport Null from '.null';\n\nimport { Null as orderify_Null } from '@ltd/j-orderify';\n\nimport { beInline, beSection } from './non-atom';\n\nexport { isInline } from './non-atom';\nexport const INLINE = true;\n\nconst tables = new WeakSet ();\nconst tables_add = /*#__PURE__*/add.bind(tables);\nexport const isTable = /*#__PURE__*/has.bind(tables) ;\n\nconst implicitTables = new WeakSet ();\nconst implicitTables_add = /*#__PURE__*/add.bind(implicitTables);\nconst implicitTables_del = /*#__PURE__*/del.bind(implicitTables) ;\nexport const directlyIfNot = (table ) => {\n\tif ( implicitTables_del(table) ) {\n\t\tbeSection(table);\n\t\treturn true;\n\t}\n\treturn false;\n};\nexport const DIRECTLY = true;\nexport const IMPLICITLY = false;\n\nconst pairs = new WeakSet ();\nconst pairs_add = /*#__PURE__*/add.bind(pairs);\nexport const fromPair = /*#__PURE__*/has.bind(pairs) ;\nexport const PAIR = true;\n\nexport const PlainTable = /*#__PURE__*/Null(class Table extends Null {\n\t \n\tconstructor (isDirect , isInline$fromPair ) {\n\t\tsuper();\n\t\ttables_add(this);\n\t\tisDirect\n\t\t\t? isInline$fromPair ? beInline(this, true) : beSection(this)\n\t\t\t: ( isInline$fromPair ? pairs_add : implicitTables_add )(this);\n\t\treturn this;\n\t}\n});\n\nexport const OrderedTable = /*#__PURE__*/Null(class Table extends orderify_Null {\n\t \n\tconstructor (isDirect , isInline$fromPair ) {\n\t\tsuper();\n\t\ttables_add(this);\n\t\tisDirect\n\t\t\t? isInline$fromPair ? beInline(this, true) : beSection(this)\n\t\t\t: ( isInline$fromPair ? pairs_add : implicitTables_add )(this);\n\t\treturn this;\n\t}\n});\n\n \n\t \n \n \n\t \n\t \n \n", + "import Error from '.Error';\nimport TypeError from '.TypeError';\nimport SyntaxError from '.SyntaxError';\n\n//import * as options from './options';\n\nconst NONE = [];\nlet sourcePath = '';\nlet sourceLines = NONE;\nlet lastLineIndex = -1;\nexport let lineIndex = -1;\n\nexport const throws = (error ) => {\n\t//if ( sourceLines!==NONE ) { done(); options.clear(); }\n\tthrow error;\n};\n\nconst EOL = /\\r?\\n/;\nexport const todo = (source , path ) => {\n\tif ( typeof path!=='string' ) { throw TypeError(`TOML.parse({ path })`); }\n\tsourcePath = path;\n\tsourceLines = source.split(EOL);\n\tlastLineIndex = sourceLines.length - 1;\n\tlineIndex = -1;\n};\n\nexport const next = () => sourceLines[++lineIndex] ;\n\nexport const rest = () => lineIndex!==lastLineIndex;\n\nexport class mark {\n\t lineIndex = lineIndex;\n\t type ;\n\t restColumn ;\n\tconstructor (type , restColumn ) {\n\t\tthis.type = type;\n\t\tthis.restColumn = restColumn;\n\t\treturn this;\n\t}\n\tmust ( ) {\n\t\tlineIndex===lastLineIndex && throws(SyntaxError(`${this.type} is not close until the end of the file` + where(', which started from ', this.lineIndex, sourceLines[this.lineIndex] .length - this.restColumn + 1)));\n\t\treturn sourceLines[++lineIndex] ;\n\t}\n\tnowrap ( argsMode ) {\n\t\tthrow throws(Error(`TOML.parse(${argsMode ? `${argsMode}multilineStringJoiner` : `,{ joiner }`}) must be passed, while the source including multi-line string` + where(', which started from ', this.lineIndex, sourceLines[this.lineIndex] .length - this.restColumn + 1)));\n\t}\n};\n\nexport const where = (pre , rowIndex = lineIndex, columnNumber = 0) => sourceLines===NONE ? '' :\n\tsourcePath\n\t\t? `\\n at (${sourcePath}:${rowIndex + 1}:${columnNumber})`\n\t\t: `${pre}line ${rowIndex + 1}: ${sourceLines[rowIndex]}`;\n\nexport const done = () => {\n\tsourcePath = '';\n\tsourceLines = NONE;\n};\n", + "import SyntaxError from '.SyntaxError';\n\nimport { newRegExp, theRegExp } from '@ltd/j-regexp';\n\nimport * as iterator from './iterator';\n\n/* nested (readable) */\n\nconst Whitespace = /[ \\t]/;\n\nexport const PRE_WHITESPACE = /*#__PURE__*/newRegExp`\n\t^${Whitespace}+`.valueOf();\n\nexport const { exec: VALUE_REST_exec } = /*#__PURE__*/newRegExp.s `\n\t^\n\t(\n\t\t(?:\\d\\d\\d\\d-\\d\\d-\\d\\d \\d)?\n\t\t[\\w\\-+.:]+\n\t)\n\t${Whitespace}*\n\t(.*)\n\t$`.valueOf();\n\nexport const { exec: LITERAL_STRING_exec } = /*#__PURE__*/newRegExp.s `\n\t^\n\t'([^']*)'\n\t${Whitespace}*\n\t(.*)`.valueOf();\n\nconst { exec: MULTI_LINE_LITERAL_STRING_0_1_2 } = /*#__PURE__*/newRegExp.s `\n\t^\n\t(.*?)\n\t'''('{0,2})\n\t${Whitespace}*\n\t(.*)`.valueOf();\nconst { exec: MULTI_LINE_LITERAL_STRING_0 } = /*#__PURE__*/newRegExp.s `\n\t^\n\t(.*?)\n\t'''()\n\t${Whitespace}*\n\t(.*)`.valueOf();\nexport\nlet __MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0;\n\nexport const SYM_WHITESPACE = /*#__PURE__*/newRegExp.s`\n\t^\n\t.\n\t${Whitespace}*`.valueOf();\n\n\nexport const Tag = /[^\\x00-\\x1F\"#'()<>[\\\\\\]`{}\\x7F]+/;\n\nconst { exec: KEY_VALUE_PAIR_exec } = /*#__PURE__*/newRegExp.s `\n\t^\n\t${Whitespace}*\n\t=\n\t${Whitespace}*\n\t(?:\n\t\t<(${Tag})>\n\t\t${Whitespace}*\n\t)?\n\t(.*)\n\t$`.valueOf();\n\nexport const { exec: _VALUE_PAIR_exec } = /*#__PURE__*/newRegExp.s `\n\t^\n\t<(${Tag})>\n\t${Whitespace}*\n\t(.*)\n\t$`.valueOf();\n\nconst { exec: TAG_REST_exec } = /*#__PURE__*/newRegExp.s `\n\t^\n\t<(${Tag})>\n\t${Whitespace}*\n\t(.*)\n\t$`.valueOf();\n\n/* optimized (avoid overflow or lost) */\n\nconst MULTI_LINE_BASIC_STRING = theRegExp(/[^\\\\\"]+|\\\\.?|\"(?!\"\")\"?/sy);\nexport const MULTI_LINE_BASIC_STRING_exec_0_length = (_ ) => {\n\tlet lastIndex = /*MULTI_LINE_BASIC_STRING.lastIndex = */0;\n\twhile ( MULTI_LINE_BASIC_STRING.test(_) ) { lastIndex = MULTI_LINE_BASIC_STRING.lastIndex; }\n\treturn lastIndex;\n};\n\nconst ESCAPED_EXCLUDE_CONTROL_CHARACTER_TAB______ = /[^\\\\\\x00-\\x08\\x0B-\\x1F\\x7F]+|\\\\(?:[btnfr\"\\\\]|[\\t ]*\\n[\\t\\n ]*|u[\\dA-Fa-f]{4}|U[\\dA-Fa-f]{8})/g;\nconst ESCAPED_EXCLUDE_CONTROL_CHARACTER__________ = /[^\\\\\\x00-\\x09\\x0B-\\x1F\\x7F]+|\\\\(?:[btnfr\"\\\\]|[\\t ]*\\n[\\t\\n ]*|u[\\dA-Fa-f]{4}|U[\\dA-Fa-f]{8})/g;/// Tab\nconst ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL______ = /[^\\\\\\x00-\\x09\\x0B-\\x1F]+|\\\\(?:[btnfr\"\\\\]|[\\t ]*\\n[\\t\\n ]*|u[\\dA-Fa-f]{4}|U[\\dA-Fa-f]{8})/g;/// Tab \\newline\nconst ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL_SLASH = /[^\\\\\\x00-\\x09\\x0B-\\x1F]+|\\\\(?:[btnfr\"\\\\/]|[\\t ]*\\n[\\t\\n ]*|u[\\dA-Fa-f]{4}|U[\\dA-Fa-f]{8})/g;/// not \\newline\nlet __ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER_TAB______;\nexport const ESCAPED_EXCLUDE_CONTROL_CHARACTER_test = (_ ) => !_.replace(__ESCAPED_EXCLUDE_CONTROL_CHARACTER, '');/// op?\n\nconst BASIC_STRING_TAB______ = theRegExp(/[^\\\\\"\\x00-\\x08\\x0B-\\x1F\\x7F]+|\\\\(?:[btnfr\"\\\\]|u[\\dA-Fa-f]{4}|U[\\dA-Fa-f]{8})/y);\nconst BASIC_STRING__________ = theRegExp(/[^\\\\\"\\x00-\\x08\\x0B-\\x1F\\x7F]+|\\\\(?:[btnfr\"\\\\]|u[\\dA-Fa-f]{4}|U[\\dA-Fa-f]{8})/y);/// Tab\nconst BASIC_STRING_DEL______ = theRegExp(/[^\\\\\"\\x00-\\x08\\x0B-\\x1F]+|\\\\(?:[btnfr\"\\\\]|u[\\dA-Fa-f]{4}|U[\\dA-Fa-f]{8})/y);/// Tab\nconst BASIC_STRING_DEL_SLASH = theRegExp(/[^\\\\\"\\x00-\\x08\\x0B-\\x1F]+|\\\\(?:[btnfr\"\\\\/]|u[\\dA-Fa-f]{4}|U[\\dA-Fa-f]{8})/y);/// Tab\nlet __BASIC_STRING = BASIC_STRING_DEL_SLASH;\nexport const BASIC_STRING_exec_1_endIndex = (line ) => {\n\tlet lastIndex = __BASIC_STRING.lastIndex = 1;\n\twhile ( __BASIC_STRING.test(line) ) { lastIndex = __BASIC_STRING.lastIndex; }\n\tlastIndex!==line.length && line[lastIndex]==='\"' || iterator.throws(SyntaxError(`Bad basic string` + iterator.where(' at ')));\n\treturn lastIndex;\n};\n\nexport\nconst { test: IS_DOT_KEY } = theRegExp(/^[ \\t]*\\./);\nexport\nconst DOT_KEY = /^[ \\t]*\\.[ \\t]*/;\nconst { exec: BARE_KEY_STRICT } = theRegExp(/^[\\w-]+/);\nconst { exec: BARE_KEY_FREE } = theRegExp(/^[^ \\t#=[\\]'\".]+(?:[ \\t]+[^ \\t#=[\\]'\".]+)*/);\nexport\nlet __BARE_KEY_exec = BARE_KEY_FREE;\nconst { exec: LITERAL_KEY____ } = theRegExp(/^'[^'\\x00-\\x08\\x0B-\\x1F\\x7F]*'/);\nconst { exec: LITERAL_KEY_DEL } = theRegExp(/^'[^'\\x00-\\x08\\x0B-\\x1F]*'/);\nexport\nlet __LITERAL_KEY_exec = LITERAL_KEY_DEL;\nlet supportArrayOfTables = true;\n\nexport const TABLE_DEFINITION_exec_groups = (lineRest , parseKeys ) => {\n\tconst asArrayItem = lineRest[1]==='[';\n\tif ( asArrayItem ) {\n\t\tsupportArrayOfTables || iterator.throws(SyntaxError(`Array of Tables is not allowed before TOML v0.2` + iterator.where(', which at ')));\n\t\tlineRest = lineRest.slice(2);\n\t}\n\telse { lineRest = lineRest.slice(1); }\n\tlineRest = lineRest.replace(PRE_WHITESPACE, '');\n\tconst { leadingKeys, finalKey } = { lineRest } = parseKeys(lineRest);\n\tlineRest = lineRest.replace(PRE_WHITESPACE, '');\n\tlineRest && lineRest[0]===']' || iterator.throws(SyntaxError(`Table header is not closed` + iterator.where(', which is found at ')));\n\t( lineRest.length>1 ? lineRest[1]===']'===asArrayItem : !asArrayItem ) || iterator.throws(SyntaxError(`Square brackets of Table definition statement not match` + iterator.where(' at ')));\n\tlineRest = lineRest.slice(asArrayItem ? 2 : 1).replace(PRE_WHITESPACE, '');\n\tlet tag ;\n\tif ( lineRest && lineRest[0]==='<' ) { ( { 1: tag, 2: lineRest } = TAG_REST_exec(lineRest) || iterator.throws(SyntaxError(`Bad tag` + iterator.where(' at '))) ); }\n\telse { tag = ''; }\n\treturn { leadingKeys, finalKey, asArrayItem, tag, lineRest };\n};\n\nexport const KEY_VALUE_PAIR_exec_groups = ({ leadingKeys, finalKey, lineRest } ) => {\n\tconst { 1: tag = '' } = { 2: lineRest } = KEY_VALUE_PAIR_exec(lineRest) || iterator.throws(SyntaxError(`Keys must equal something` + iterator.where(', but missing at ')));\n\ttag || lineRest && lineRest[0]!=='#' || iterator.throws(SyntaxError(`Value can not be missing after euqal sign` + iterator.where(', which is found at ')));\n\treturn { leadingKeys, finalKey, tag, lineRest };\n};\n\nconst { test: CONTROL_CHARACTER_EXCLUDE_TAB____ } = theRegExp(/[\\x00-\\x08\\x0B-\\x1F\\x7F]/);\nconst { test: CONTROL_CHARACTER_EXCLUDE_TAB_DEL } = theRegExp(/[\\x00-\\x08\\x0B-\\x1F]/);\nexport\nlet __CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB____;\n\nexport const switchRegExp = (specificationVersion ) => {\n\tswitch ( specificationVersion ) {\n\t\tcase 1.0:\n\t\t\t__MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0_1_2;\n\t\t\t__LITERAL_KEY_exec = LITERAL_KEY____;\n\t\t\t__CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB____;\n\t\t\t__ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER_TAB______;\n\t\t\t__BASIC_STRING = BASIC_STRING_TAB______;\n\t\t\t__BARE_KEY_exec = BARE_KEY_STRICT;\n\t\t\tsupportArrayOfTables = true;\n\t\t\tbreak;\n\t\tcase 0.5:\n\t\t\t__MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0;\n\t\t\t__LITERAL_KEY_exec = LITERAL_KEY____;\n\t\t\t__CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB____;\n\t\t\t__ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER__________;\n\t\t\t__BASIC_STRING = BASIC_STRING__________;\n\t\t\t__BARE_KEY_exec = BARE_KEY_STRICT;\n\t\t\tsupportArrayOfTables = true;\n\t\t\tbreak;\n\t\tcase 0.4:\n\t\t\t__MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0;\n\t\t\t__LITERAL_KEY_exec = LITERAL_KEY_DEL;\n\t\t\t__CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB_DEL;\n\t\t\t__ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL______;\n\t\t\t__BASIC_STRING = BASIC_STRING_DEL______;\n\t\t\t__BARE_KEY_exec = BARE_KEY_STRICT;\n\t\t\tsupportArrayOfTables = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t__MULTI_LINE_LITERAL_STRING_exec = MULTI_LINE_LITERAL_STRING_0;\n\t\t\t__LITERAL_KEY_exec = LITERAL_KEY_DEL;\n\t\t\t__CONTROL_CHARACTER_EXCLUDE_test = CONTROL_CHARACTER_EXCLUDE_TAB_DEL;\n\t\t\t__ESCAPED_EXCLUDE_CONTROL_CHARACTER = ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL_SLASH;\n\t\t\t__BASIC_STRING = BASIC_STRING_DEL_SLASH;\n\t\t\t__BARE_KEY_exec = BARE_KEY_FREE;\n\t\t\tsupportArrayOfTables = false;\n\t}\n};\n\nconst NUM = /*#__PURE__*/newRegExp`\n\t(?:\n\t\t0\n\t\t(?:\n\t\t\tb[01][_01]*\n\t\t|\n\t\t\to[0-7][_0-7]*\n\t\t|\n\t\t\tx[\\dA-Fa-f][_\\dA-Fa-f]*\n\t\t|\n\t\t\t(?:\\.\\d[_\\d]*)?(?:[Ee]-?\\d[_\\d]*)?\n\t\t)\n\t|\n\t\t[1-9][_\\d]*\n\t\t(?:\\.\\d[_\\d]*)?(?:[Ee]-?\\d[_\\d]*)?\n\t|\n\t\tinf\n\t|\n\t\tnan\n\t)\n`.valueOf();\nconst { test: IS_AMAZING } = /*#__PURE__*/newRegExp`\n\t^(?:\n\t\t-?${NUM}\n\t\t(?:-${NUM})*\n\t|\n\t\ttrue\n\t|\n\t\tfalse\n\t)$\n`.valueOf();\nconst { test: BAD_DXOB } = /*#__PURE__*/newRegExp`_(?![\\dA-Fa-f])`.valueOf();\nexport const isAmazing = (keys ) => IS_AMAZING(keys) && !BAD_DXOB(keys);\n", + "import SyntaxError from '.SyntaxError';\nimport RangeError from '.RangeError';\nimport TypeError from '.TypeError';\nimport Error from '.Error';\nimport BigInt from '.BigInt?';\nimport RegExp from '.RegExp';\nimport WeakMap from '.WeakMap';\nimport get from '.WeakMap.prototype.get';\nimport set from '.WeakMap.prototype.set';\nimport create from '.Object.create';\nimport isSafeInteger from '.Number.isSafeInteger';\nimport getOwnPropertyNames from '.Object.getOwnPropertyNames';\nimport freeze from '.Object.freeze';\nimport isPrototypeOf from '.Object.prototype.isPrototypeOf';\nimport undefined from '.undefined';\nimport NULL from '.null.prototype';\n\nimport { groupify } from '@ltd/j-regexp';\n\nimport { PlainTable, OrderedTable } from './types/Table';\nimport * as iterator from './iterator';\nimport * as regexps from './regexps';\n\nexport let mustScalar = true;\n\nexport let ARGS_MODE = '';\n\n/* options */\n\nexport let useWhatToJoinMultilineString = null;\nexport let usingBigInt = true;\nexport let IntegerMinNumber = 0;\nexport let IntegerMaxNumber = 0;\n\n \n\n \n\t \n\t \n\t \n\t \n\t \n\t \n\t \n\t \n\t \n\t \n \nconst ANY = {\n\ttest: () => true,\n};\n \n\t \n \nexport const Keys = class KeysRegExp extends RegExp {\n\t \n\tconstructor (keys ) {\n\t\tsuper(`^${groupify(keys)}$`);\n\t\tlet maxLength = -1;\n\t\tfor ( let index = keys.length; index; ) {\n\t\t\tconst { length } = keys[--index] ;\n\t\t\tif ( length>maxLength ) { maxLength = length; }\n\t\t}\n\t\tthis.lastIndex = maxLength+1;\n\t\treturn this;\n\t}\n\t test ( key ) {\n\t\treturn key.length {\n\tconst as = (array ) => {\n\t\tconst got = arrayTypes_get(array);\n\t\tgot\n\t\t\t? got===as || iterator.throws(TypeError(`Types in Array must be same` + iterator.where('. Check ')))\n\t\t\t: arrayTypes_set(array, as);\n\t\treturn array;\n\t};\n\treturn as;\n};\nconst AS_TYPED = {\n\tasNulls: As(),\n\tasStrings: As(),\n\tasTables: As(),\n\tasArrays: As(),\n\tasBooleans: As(),\n\tasFloats: As(),\n\tasIntegers: As(),\n\tasOffsetDateTimes: As(),\n\tasLocalDateTimes: As(),\n\tasLocalDates: As(),\n\tasLocalTimes: As(),\n};\nconst asMixed = (array ) => array;\nexport let\n\tasNulls ,\n\tasStrings ,\n\tasTables ,\n\tasArrays ,\n\tasBooleans ,\n\tasFloats ,\n\tasIntegers ,\n\tasOffsetDateTimes ,\n\tasLocalDateTimes ,\n\tasLocalDates ,\n\tasLocalTimes ;\n\n \n\n \nlet processor = null;\nlet each = null;\n \n\t \n\t \n\t \n \nconst collect_on = (tag , array , table , key ) => {\n\tconst _each = create(NULL) ;\n\t_each._linked = each;\n\t_each.tag = tag;\n\tif ( table ) {\n\t\t_each.table = table;\n\t\t_each.key = key ;\n\t}\n\tif ( array ) {\n\t\t_each.array = array;\n\t\t_each.index = array.length;\n\t}\n\teach = _each;\n};\nconst collect_off = () => { throw iterator.throws(SyntaxError(`xOptions.tag is not enabled, but found tag syntax` + iterator.where(' at '))); };\nexport let collect = collect_off;\n \nexport const Process = () => {\n\tif ( each ) {\n\t\tconst _processor = processor ;\n\t\tlet _each = each;\n\t\teach = null;\n\t\treturn () => {\n\t\t\tconst processor = _processor;\n\t\t\tlet each = _each ;\n\t\t\t_each = null;\n\t\t\tdo { processor(each); }\n\t\t\twhile ( each = each._linked );\n\t\t};\n\t}\n\treturn null;\n};\n\n/* use & clear */\n\nexport const clear = () => {\n\tKEYS = ANY;\n\tuseWhatToJoinMultilineString = processor = each = null;\n\tzeroDatetime = false;\n};\n\nexport const use = (specificationVersion , multilineStringJoiner , useBigInt , keys , xOptions , argsMode ) => {\n\t\n\tARGS_MODE = argsMode;\n\t\n\tlet mixed ;\n\tswitch ( specificationVersion ) {\n\t\tcase 1.0:\n\t\t\tmustScalar = mixed = moreDatetime = sFloat = inlineTable = true;\n\t\t\tzeroDatetime = disallowEmptyKey = false;\n\t\t\tbreak;\n\t\tcase 0.5:\n\t\t\tmustScalar = moreDatetime = sFloat = inlineTable = true;\n\t\t\tmixed = zeroDatetime = disallowEmptyKey = false;\n\t\t\tbreak;\n\t\tcase 0.4:\n\t\t\tmustScalar = disallowEmptyKey = inlineTable = true;\n\t\t\tmixed = zeroDatetime = moreDatetime = sFloat = false;\n\t\t\tbreak;\n\t\tcase 0.3:\n\t\t\tmustScalar = disallowEmptyKey = true;\n\t\t\tmixed = zeroDatetime = moreDatetime = sFloat = inlineTable = false;\n\t\t\tbreak;\n\t\tcase 0.2:\n\t\t\tzeroDatetime = disallowEmptyKey = true;\n\t\t\tmustScalar = mixed = moreDatetime = sFloat = inlineTable = false;\n\t\t\tbreak;\n\t\tcase 0.1:\n\t\t\tzeroDatetime = disallowEmptyKey = true;\n\t\t\tmustScalar = mixed = moreDatetime = sFloat = inlineTable = false;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow RangeError(`TOML.parse(,specificationVersion)`);\n\t}\n\tregexps.switchRegExp(specificationVersion);\n\t\n\tif ( typeof multilineStringJoiner==='string' ) { useWhatToJoinMultilineString = multilineStringJoiner; }\n\telse if ( multilineStringJoiner===undefined ) { useWhatToJoinMultilineString = null; }\n\telse { throw TypeError(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE}multilineStringJoiner` : `,{ joiner }`})`); }\n\t\n\tif ( useBigInt===undefined || useBigInt===true ) { usingBigInt = true; }\n\telse if ( useBigInt===false ) { usingBigInt = false; }\n\telse {\n\t\tif ( typeof useBigInt!=='number' ) { throw TypeError(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},useBigInt` : `,{ bigint }`})`); }\n\t\tif ( !isSafeInteger(useBigInt) ) { throw RangeError(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},useBigInt` : `,{ bigint }`})`); }\n\t\tusingBigInt = null;\n\t\tuseBigInt>=0\n\t\t\t? IntegerMinNumber = -( IntegerMaxNumber = useBigInt )\n\t\t\t: IntegerMaxNumber = -( IntegerMinNumber = useBigInt ) - 1;\n\t}\n\tif ( !BigInt && usingBigInt!==false ) { throw Error(`Can't work without TOML.parse(${ARGS_MODE ? `${ARGS_MODE},useBigInt` : `,{ bigint }`}) being set to false, because the host doesn't have BigInt support`); }\n\t\n\tif ( keys==null ) { KEYS = ANY; }\n\telse {\n\t\tif ( !isKeys(keys) ) { throw TypeError(`TOML.parse(,{ keys })`); }\n\t\tKEYS = keys;\n\t}\n\t\n\tif ( xOptions==null ) {\n\t\tTable = PlainTable;\n\t\tsError = allowLonger = enableNull = allowInlineTableMultilineAndTrailingCommaEvenNoComma = false;\n\t\tcollect = collect_off;\n\t}\n\telse if ( typeof xOptions!=='object' ) {\n\t\tthrow TypeError(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},,xOptions` : `,{ x }`})`);\n\t}\n\telse {\n\t\tconst { order, longer, exact, null: _null, multi, comment, string, literal, tag, ...unknown } = xOptions;\n\t\tconst unknownNames = getOwnPropertyNames(unknown);\n\t\tif ( unknownNames.length ) { throw TypeError(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},,{ ${unknownNames.join(', ')} }` : `,{ x: { ${unknownNames.join(', ')} } }`})`); }\n\t\tTable = order ? OrderedTable : PlainTable;\n\t\tallowLonger = !longer;\n\t\tsError = !!exact;\n\t\tenableNull = !!_null;\n\t\tallowInlineTableMultilineAndTrailingCommaEvenNoComma = !!multi;\n\t\tpreserveComment = !!comment;\n\t\tdisableDigit = !!string;\n\t\tpreserveLiteral = !!literal;\n\t\tif ( tag ) {\n\t\t\tif ( typeof tag!=='function' ) { throw TypeError(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},,{ tag }` : `,{ x: { tag } }`})`); }\n\t\t\tif ( !mixed ) { throw TypeError(`TOML.parse(${ARGS_MODE ? `${ARGS_MODE},,xOptions` : `,{ x }`}) xOptions.tag needs at least TOML 1.0 to support mixed type array`); }\n\t\t\tprocessor = tag;\n\t\t\tcollect = collect_on;\n\t\t}\n\t\telse { collect = collect_off; }\n\t}\n\t\n\tmixed\n\t\t? asNulls = asStrings = asTables = asArrays = asBooleans = asFloats = asIntegers = asOffsetDateTimes = asLocalDateTimes = asLocalDates = asLocalTimes = asMixed\n\t\t: ( { asNulls, asStrings, asTables, asArrays, asBooleans, asFloats, asIntegers, asOffsetDateTimes, asLocalDateTimes, asLocalDates, asLocalTimes } = AS_TYPED );\n\t\n};\n\n \n \n", + "import Symbol from '.Symbol';\n\nconst previous = Symbol('previous') ;\n\n \n\t \n\t\t \n\t\t \n\t \n \n\nexport const x = (rootStack ) => {\n\tlet stack = rootStack;\n\tlet result = stack.next();\n\tif ( !result.done ) {\n\t\tresult.value[previous] = stack;\n\t\tresult = ( stack = result.value ).next();\n\t\tfor ( ; ; ) {\n\t\t\tif ( result.done ) {\n\t\t\t\tif ( stack===rootStack ) { break; }\n\t\t\t\tstack = stack[previous] ;\n\t\t\t\tresult = stack.next(result.value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresult.value[previous] = stack;\n\t\t\t\tresult = ( stack = result.value ).next();\n\t\t\t}\n\t\t}\n\t}\n\treturn result.value;\n};\n\n \n \n\t \n\t\t \n\t\t\t \n\t\t\t \n\t \n\t \n\t\t \n\t\t\t \n\t\t\t \n\t \n", + "import Symbol from '.Symbol';\nimport Object from '.Object';\n\nexport const _literal = Symbol('_literal') ;\n\nexport const LiteralObject = (literal , value ) => {\n\tconst object = Object(value) ;\n\tobject[_literal] = literal;\n\treturn object;\n};\n", + "import WeakSet from '.WeakSet';\nimport has from '.WeakSet.prototype.has';\nimport add from '.WeakSet.prototype.add';\n\nconst arrays = new WeakSet ();\nconst arrays_add = /*#__PURE__*/add.bind(arrays);\nexport const isArray = /*#__PURE__*/has.bind(arrays) ;\n\nexport const OF_TABLES = false;\nexport const STATICALLY = true;\nconst staticalArrays = new WeakSet ();\nconst staticalArrays_add = /*#__PURE__*/add.bind(staticalArrays);\nexport const isStatic = /*#__PURE__*/has.bind(staticalArrays) ;\n\nexport const newArray = (isStatic ) => {\n\tconst array = [];\n\tarrays_add(array);\n\tisStatic && staticalArrays_add(array);\n\treturn array;\n};\n\n \n\t \n\t \n \n", + "import SyntaxError from '.SyntaxError';\nimport RangeError from '.RangeError';\nimport NativeDate from '.Date';\nimport parse from '.Date.parse';\nimport floor from '.Math.floor';\nimport ownKeys from '.Reflect.ownKeys';\n///import is from '.Object.is';\nimport create from '.Object.create';\nimport preventExtensions from '.Object.preventExtensions';\nimport freeze from '.Object.freeze';\nimport getOwnPropertyDescriptors from '.Object.getOwnPropertyDescriptors';\nimport Symbol from '.Symbol';\nimport defineProperties from '.null.defineProperties';\nimport Null from '.null';\n\nimport { newRegExp, theRegExp } from '@ltd/j-regexp';\n\nimport * as options from '../options';\nimport * as iterator from '../iterator';\n\nconst fpc = (c ) => {\n\tfreeze(freeze(c).prototype);\n\treturn c;\n};\n\nconst _29_ = /(?:0[1-9]|1\\d|2\\d)/;\nconst _30_ = /(?:0[1-9]|[12]\\d|30)/;\nconst _31_ = /(?:0[1-9]|[12]\\d|3[01])/;\nconst _23_ = /(?:[01]\\d|2[0-3])/;\nconst _59_ = /[0-5]\\d/;\n\nconst YMD = /*#__PURE__*/newRegExp`\n\t\\d\\d\\d\\d-\n\t(?:\n\t\t0\n\t\t(?:\n\t\t\t[13578]-${_31_}\n\t\t\t|\n\t\t\t[469]-${_30_}\n\t\t\t|\n\t\t\t2-${_29_}\n\t\t)\n\t\t|\n\t\t1\n\t\t(?:\n\t\t\t[02]-${_31_}\n\t\t\t|\n\t\t\t1-${_30_}\n\t\t)\n\t)\n`.valueOf();\n\nconst HMS = /*#__PURE__*/newRegExp`\n\t${_23_}:${_59_}:${_59_}\n`.valueOf();\n\nexport const OFFSET$ = /(?:[Zz]|[+-]\\d\\d:\\d\\d)$/;\n\nconst { exec: Z_exec } = theRegExp (/(([+-])\\d\\d):(\\d\\d)$/);\n\nconst { exec: OFFSET_DATETIME_exec } = /*#__PURE__*/newRegExp`\n\t^\n\t${YMD}\n\t[Tt ]\n\t${HMS}\n\t(?:\\.\\d{1,3}(\\d*?)0*)?\n\t(?:[Zz]|[+-]${_23_}:${_59_})\n\t$`.valueOf();\n\nconst { exec: OFFSET_DATETIME_ZERO_exec } = /*#__PURE__*/newRegExp`\n\t^\n\t${YMD}\n\t[Tt ]\n\t${HMS}\n\t()\n\t[Zz]\n\t$`.valueOf();\n\nconst { test: IS_LOCAL_DATETIME } = /*#__PURE__*/newRegExp`\n\t^\n\t${YMD}\n\t[Tt ]\n\t${HMS}\n\t(?:\\.\\d+)?\n\t$`.valueOf();\n\nconst { test: IS_LOCAL_DATE } = /*#__PURE__*/newRegExp`\n\t^\n\t${YMD}\n\t$`.valueOf();\n\nconst { test: IS_LOCAL_TIME } = /*#__PURE__*/newRegExp`\n\t^\n\t${HMS}\n\t(?:\\.\\d+)?\n\t$`.valueOf();\n\nconst T = /[ t]/;\nconst DELIMITER_DOT = /[-T:.]/g;\nconst DOT_ZERO = /\\.?0+$/;\nconst ZERO = /\\.(\\d*?)0+$/;\nconst zeroReplacer = (match , p1 ) => p1;\n\nconst Datetime = /*#__PURE__*/( () => {\n\tconst Datetime = function ( ) {\n\t\treturn this;\n\t} ;//expression? :undefined, literal? :undefined, dotValue? :undefined\n\t// > .setTime()\n\t// > .getTime() : Date.parse('T')\n\t// [Symbol.toPrimitive]('number') > .valueOf()\n\t// > .toISOString()\n\tconst descriptors = Null(null) ;\n\t{\n\t\tconst descriptor = Null(null);\n\t\tfor ( const key of ownKeys(NativeDate.prototype ) ) {\n\t\t\tkey==='constructor' ||\n\t\t\tkey==='toJSON' ||\n\t\t\t( descriptors[key] = descriptor );\n\t\t}\n\t}\n\tDatetime.prototype = preventExtensions(create(NativeDate.prototype, descriptors));\n\treturn freeze(Datetime);\n} )();\n\n \n \n \n \n \n \n \n \n \n \n \n\nconst Value = (ISOString ) => ISOString.replace(ZERO, zeroReplacer).replace(DELIMITER_DOT, '');\n\nconst d = /./gs;\nconst d2u = (d ) => '\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009'[d ] ;\nconst ValueOFFSET = (time , more ) => time<0\n\t? ( '' + ( time + 62167305540000 ) ).replace(d, d2u).padStart(14, '\\u2000') + more.replace(d, d2u) + time\n\t: more\n\t\t? ( time + '.' ).padStart(16, '0') + more\n\t\t: ( '' + time ).padStart(15, '0');\n\nconst validateLeap = (literal ) => {\n\tif ( literal.startsWith('02-29', 5) ) {\n\t\tconst year = +literal.slice(0, 4);\n\t\treturn (\n\t\t\tyear & 0b11 ? false :\n\t\t\t\tyear%100 ? true :\n\t\t\t\t\tyear%400 ? false :\n\t\t\t\t\t\tyear%3200 ? true :\n\t\t\t\t\t\t\tfalse\n\t\t);\n\t}\n\treturn true;\n};\nconst { test: VALIDATE_LEAP } = /*#__PURE__*/newRegExp.s`^.....(?:06.30|12.31).23:59:59`.valueOf();\n\nconst DATE = /*#__PURE__*/defineProperties(new NativeDate(0), /*#__PURE__*/getOwnPropertyDescriptors(NativeDate.prototype));\n\nconst OffsetDateTime_ISOString = Symbol('OffsetDateTime_ISOString') ;\nconst OffsetDateTime_value = Symbol('OffsetDateTime_value') ;\nconst OffsetDateTime_use = (that , $ = 0) => {\n\tDATE.setTime(+that[OffsetDateTime_value] + $);\n\treturn DATE;\n};\n/*const OffsetDateTime_get = (that :InstanceType, start :number, end :number) => +that[OffsetDateTime_ISOString].slice(start, end);\nconst OffsetDateTime_set = (that :InstanceType, start :number, end :number, value :number, reserveMore :boolean) => {\n\tif ( end ) {\n\t\tconst string = '' + value;\n\t\tconst size = end - start;\n\t\tif ( string.length>size ) { throw RangeError(); }///\n\t\tthat[OffsetDateTime_ISOString] = that[OffsetDateTime_ISOString].slice(0, start) + string.padStart(size, '0') + that[OffsetDateTime_ISOString].slice(end);\n\t}\n\tconst time = parse(that[OffsetDateTime_ISOString]);\n\treturn that[OffsetDateTime_value] = ValueOFFSET(time, that[OffsetDateTime_value].includes('-')\n\t\t? that[OffsetDateTime_value].slice(14, that[OffsetDateTime_value].indexOf('-', 14))\n\t\t: that[OffsetDateTime_value].slice(15)\n\t);///time\n};*///\nexport const OffsetDateTime = /*#__PURE__*/fpc(class OffsetDateTime extends Datetime {\n\t\n\t[OffsetDateTime_ISOString] ;\n\t[OffsetDateTime_value] ;\n\t\n\tget [Symbol.toStringTag] () { return 'OffsetDateTime' ; }\n\t\n\t valueOf ( ) { return this[OffsetDateTime_value]; }\n\ttoISOString ( ) { return this[OffsetDateTime_ISOString]; }\n\t\n\tconstructor (literal ) {\n\t\tvalidateLeap(literal) || iterator.throws(SyntaxError(`Invalid Offset Date-Time ${literal}` + iterator.where(' at ')));\n\t\tconst with60 = literal.startsWith('60', 17);\n\t\tlet without60 = with60 ? literal.slice(0, 17) + '59' + literal.slice(19) : literal;\n\t\tconst { 1: more = '' } = ( options.zeroDatetime ? OFFSET_DATETIME_ZERO_exec(without60) : OFFSET_DATETIME_exec(without60) ) || iterator.throws(SyntaxError(`Invalid Offset Date-Time ${literal}` + iterator.where(' at ')));\n\t\tconst time = parse(without60 = without60.replace(T, 'T').replace('z', 'Z'));\n\t\tif ( with60 ) {\n\t\t\tDATE.setTime(time);\n\t\t\tVALIDATE_LEAP(DATE.toISOString()) || iterator.throws(SyntaxError(`Invalid Offset Date-Time ${literal}` + iterator.where(' at ')));\n\t\t}\n\t\tsuper();\n\t\tthis[OffsetDateTime_ISOString] = without60;\n\t\tthis[OffsetDateTime_value] = ValueOFFSET(time, more);\n\t\treturn this;\n\t}\n\t\n\tgetUTCFullYear ( ) { return OffsetDateTime_use(this).getUTCFullYear(); }\n\t///get year () :FullYear { return OffsetDateTime_get(this, 0, 4); }\n\t///set year (value :FullYear) { OffsetDateTime_set(this, 0, 4, value, true); }\n\tgetUTCMonth ( ) { return OffsetDateTime_use(this).getUTCMonth(); }\n\t///get month () { return OffsetDateTime_get(this, 5, 7); }\n\t///set month (value) { OffsetDateTime_set(this, 5, 7, value, true); }\n\tgetUTCDate ( ) { return OffsetDateTime_use(this).getUTCDate(); }\n\t///get day () :Date { return OffsetDateTime_get(this, 8, 10); }\n\t///set day (value :Date) { OffsetDateTime_set(this, 8, 10, value, true); }\n\t\n\tgetUTCHours ( ) { return OffsetDateTime_use(this).getUTCHours(); }\n\t///get hour () :Hours { return OffsetDateTime_get(this, 11, 13); }\n\t///set hour (value :Hours) { OffsetDateTime_set(this, 11, 13, value, true); }\n\tgetUTCMinutes ( ) { return OffsetDateTime_use(this).getUTCMinutes(); }\n\t///get minute () :Minutes { return OffsetDateTime_get(this, 14, 16); }\n\t///set minute (value :Minutes) { OffsetDateTime_set(this, 14, 16, value, true); }\n\tgetUTCSeconds ( ) { return OffsetDateTime_use(this).getUTCSeconds(); }\n\t///get second () :Seconds { return OffsetDateTime_get(this, 17, 19); }\n\t///set second (value :Seconds) { OffsetDateTime_set(this, 17, 19, value, true); }\n\tgetUTCMilliseconds ( ) { return OffsetDateTime_use(this).getUTCMilliseconds(); }///\n\t///get millisecond () :Milliseconds { return this[OffsetDateTime_value]%1000; }///\n\t/*set millisecond (value :Milliseconds) {\n\t\tthis[OffsetDateTime_ISOString] = this[OffsetDateTime_ISOString].slice(0, 19) + ( value ? ( '.' + ( '' + value ).padStart(3, '0') ).replace(DOT_ZERO, '') : '' ) + this[OffsetDateTime_ISOString].slice(this[OffsetDateTime_ISOString].search(OFFSET$));\n\t\tOffsetDateTime_set(this, 0, 0, 0, false);\n\t}*///\n\t///get microsecond () :Milliseconds\n\t///set microsecond (value :Milliseconds)\n\t///get nanosecond () :Milliseconds\n\t///set nanosecond (value :Milliseconds)\n\t\n\tgetUTCDay ( ) { return OffsetDateTime_use(this).getUTCDay(); }\n\t///get dayOfWeek () { return OffsetDateTime_use(this, this.getTimezoneOffset()*60000).getUTCDay() || 7; }\n\tgetTimezoneOffset ( ) {\n\t\tconst z = Z_exec(this[OffsetDateTime_ISOString]);\n\t\treturn z ? +z[1]*60 + +( z[2] + z[3] ) : 0;\n\t}\n\t///get offset () { return this[OffsetDateTime_ISOString].endsWith('Z') ? 'Z' : this[OffsetDateTime_ISOString].slice(-6); }\n\t/*set offset (value) {\n\t\tthis[OffsetDateTime_ISOString] = this[OffsetDateTime_ISOString].slice(0, this[OffsetDateTime_ISOString].endsWith('Z') ? -1 : -6) + value;\n\t\tOffsetDateTime_set(this, 0, 0, 0, true);\n\t}*///\n\tgetTime ( ) { return floor(+this[OffsetDateTime_value]); }///\n\t/*setTime (this :OffsetDateTime, value :Time) :void {\n\t\tvalue = DATE.setTime(value);\n\t\tconst z = Z_exec(this[OffsetDateTime_ISOString]);\n\t\tDATE.setTime(value + ( z ? +z[1]*60 + +( z[2] + z[3] ) : 0 )*60000);\n\t\tthis[OffsetDateTime_ISOString] = z ? DATE.toISOString().slice(0, -1) + z[0] : DATE.toISOString();\n\t\tthis[OffsetDateTime_value] = ValueOFFSET(value, '');\n\t\t///return value;\n\t}*/\n\t\n});\n\nconst LocalDateTime_ISOString = Symbol('LocalDateTime_ISOString') ;\nconst LocalDateTime_value = Symbol('LocalDateTime_value') ;\nconst LocalDateTime_get = (that , start , end ) => +that[LocalDateTime_ISOString].slice(start, end);\nconst LocalDateTime_set = (that , start , end , value ) => {\n\tconst string = '' + value;\n\tconst size = end - start;\n\tif ( string.length>size ) { throw RangeError(); }///\n\tthat[LocalDateTime_value] = Value(\n\t\tthat[LocalDateTime_ISOString] = that[LocalDateTime_ISOString].slice(0, start) + string.padStart(size, '0') + that[LocalDateTime_ISOString].slice(end)\n\t);\n};\nexport const LocalDateTime = /*#__PURE__*/fpc(class LocalDateTime extends Datetime {\n\t\n\t[LocalDateTime_ISOString] ;\n\t[LocalDateTime_value] ;\n\t\n\tget [Symbol.toStringTag] () { return 'LocalDateTime' ; }\n\t\n\t valueOf ( ) { return this[LocalDateTime_value]; }\n\ttoISOString ( ) { return this[LocalDateTime_ISOString]; }\n\t\n\tconstructor (literal ) {\n\t\tIS_LOCAL_DATETIME(literal) && validateLeap(literal) || iterator.throws(SyntaxError(`Invalid Local Date-Time ${literal}` + iterator.where(' at ')));\n\t\tsuper();\n\t\tthis[LocalDateTime_value] = Value(\n\t\t\tthis[LocalDateTime_ISOString] = literal.replace(T, 'T')\n\t\t);\n\t\treturn this;\n\t}\n\t\n\tgetFullYear ( ) { return LocalDateTime_get(this, 0, 4); }\n\tsetFullYear ( value ) { LocalDateTime_set(this, 0, 4, value); }\n\tgetMonth ( ) { return LocalDateTime_get(this, 5, 7) - 1; }\n\tsetMonth ( value ) { LocalDateTime_set(this, 5, 7, value + 1); }\n\tgetDate ( ) { return LocalDateTime_get(this, 8, 10); }\n\tsetDate ( value ) { LocalDateTime_set(this, 8, 10, value); }\n\t\n\tgetHours ( ) { return LocalDateTime_get(this, 11, 13); }\n\tsetHours ( value ) { LocalDateTime_set(this, 11, 13, value); }\n\tgetMinutes ( ) { return LocalDateTime_get(this, 14, 16); }\n\tsetMinutes ( value ) { LocalDateTime_set(this, 14, 16, value); }\n\tgetSeconds ( ) { return LocalDateTime_get(this, 17, 19); }\n\tsetSeconds ( value ) { LocalDateTime_set(this, 17, 19, value); }\n\tgetMilliseconds ( ) { return +this[LocalDateTime_value].slice(14, 17).padEnd(3, '0'); }///\n\tsetMilliseconds ( value ) {\n\t\tthis[LocalDateTime_value] = Value(\n\t\t\tthis[LocalDateTime_ISOString] = this[LocalDateTime_ISOString].slice(0, 19) + ( value ? ( '.' + ( '' + value ).padStart(3, '0') ).replace(DOT_ZERO, '') : '' )\n\t\t);\n\t}\n\t\n});\n\nconst LocalDate_ISOString = Symbol('LocalDate_ISOString') ;\nconst LocalDate_value = Symbol('LocalDate_value') ;\nconst LocalDate_get = (that , start , end ) => +that[LocalDate_ISOString].slice(start, end);\nconst LocalDate_set = (that , start , end , value ) => {\n\tconst string = '' + value;\n\tconst size = end - start;\n\tif ( string.length>size ) { throw RangeError(); }///\n\tthat[LocalDate_value] = Value(\n\t\tthat[LocalDate_ISOString] = that[LocalDate_ISOString].slice(0, start) + string.padStart(size, '0') + that[LocalDate_ISOString].slice(end)\n\t);\n};\nexport const LocalDate = /*#__PURE__*/fpc(class LocalDate extends Datetime {\n\t\n\t[LocalDate_ISOString] ;\n\t[LocalDate_value] ;\n\t\n\tget [Symbol.toStringTag] () { return 'LocalDate' ; }\n\t\n\t valueOf ( ) { return this[LocalDate_value]; }\n\ttoISOString ( ) { return this[LocalDate_ISOString]; }\n\t\n\tconstructor (literal ) {\n\t\tIS_LOCAL_DATE(literal) && validateLeap(literal) || iterator.throws(SyntaxError(`Invalid Local Date ${literal}` + iterator.where(' at ')));\n\t\tsuper();\n\t\tthis[LocalDate_value] = Value(\n\t\t\tthis[LocalDate_ISOString] = literal\n\t\t);\n\t\treturn this;\n\t}\n\t\n\tgetFullYear ( ) { return LocalDate_get(this, 0, 4); }\n\tsetFullYear ( value ) { LocalDate_set(this, 0, 4, value); }\n\tgetMonth ( ) { return LocalDate_get(this, 5, 7) - 1; }\n\tsetMonth ( value ) { LocalDate_set(this, 5, 7, value + 1); }\n\tgetDate ( ) { return LocalDate_get(this, 8, 10); }\n\tsetDate ( value ) { LocalDate_set(this, 8, 10, value); }\n\t\n});\n\nconst LocalTime_ISOString = Symbol('LocalTime_ISOString') ;\nconst LocalTime_value = Symbol('LocalTime_value') ;\nconst LocalTime_get = (that , start , end ) => +that[LocalTime_ISOString].slice(start, end);\nconst LocalTime_set = (that , start , end , value ) => {\n\tconst string = '' + value;\n\tconst size = end - start;\n\tif ( string.length>size ) { throw RangeError(); }///\n\tthat[LocalTime_value] = Value(\n\t\tthat[LocalTime_ISOString] = that[LocalTime_ISOString].slice(0, start) + string.padStart(2, '0') + that[LocalTime_ISOString].slice(end)\n\t);\n};\nexport const LocalTime = /*#__PURE__*/fpc(class LocalTime extends Datetime {\n\t\n\t[LocalTime_ISOString] ;\n\t[LocalTime_value] ;\n\t\n\tget [Symbol.toStringTag] () { return 'LocalTime' ; }\n\t\n\t valueOf ( ) { return this[LocalTime_value]; }\n\ttoISOString ( ) { return this[LocalTime_ISOString]; }\n\t\n\tconstructor (literal ) {\n\t\tIS_LOCAL_TIME(literal) || iterator.throws(SyntaxError(`Invalid Local Time ${literal}` + iterator.where(' at ')));\n\t\tsuper();\n\t\tthis[LocalTime_value] = Value(\n\t\t\tthis[LocalTime_ISOString] = literal\n\t\t);\n\t\treturn this;\n\t}\n\t\n\tgetHours ( ) { return LocalTime_get(this, 0, 2); }\n\tsetHours ( value ) { LocalTime_set(this, 0, 2, value); }\n\tgetMinutes ( ) { return LocalTime_get(this, 3, 5); }\n\tsetMinutes ( value ) { LocalTime_set(this, 3, 5, value); }\n\tgetSeconds ( ) { return LocalTime_get(this, 6, 8); }\n\tsetSeconds ( value ) { LocalTime_set(this, 6, 8, value); }\n\tgetMilliseconds ( ) { return +this[LocalTime_value].slice(6, 9).padEnd(3, '0'); }///\n\tsetMilliseconds ( value ) {\n\t\tthis[LocalTime_value] = Value(\n\t\t\tthis[LocalTime_ISOString] = this[LocalTime_ISOString].slice(0, 8) + ( value ? ( '.' + ( '' + value ).padStart(3, '0') ).replace(DOT_ZERO, '') : '' )\n\t\t);\n\t}\n\t\n});\n", + "import RangeError from '.RangeError';\nimport parseInt from '.parseInt';\nimport fromCharCode from '.String.fromCharCode';\nimport fromCodePoint from '.String.fromCodePoint';\n\nimport * as iterator from '../iterator';\nimport * as options from '../options';\n\nconst ESCAPED_IN_SINGLE_LINE = /[^\\\\]+|\\\\(?:[\\\\\"btnfr/]|u.{4}|U.{8})/gs;\nconst ESCAPED_IN_MULTI_LINE = /[^\\n\\\\]+|\\n|\\\\(?:[\\t ]*\\n[\\t\\n ]*|[\\\\\"btnfr/]|u.{4}|U.{8})/gs;\n\nexport const BasicString = (literal ) => {\n\tif ( !literal ) { return ''; }\n\tconst parts = literal.match(ESCAPED_IN_SINGLE_LINE) ;\n\tconst { length } = parts;\n\tlet index = 0;\n\tdo {\n\t\tconst part = parts[index] ;\n\t\tif ( part[0]==='\\\\' ) {\n\t\t\tswitch ( part[1] ) {\n\t\t\t\tcase '\\\\': parts[index] = '\\\\'; break;\n\t\t\t\tcase '\"': parts[index] = '\"'; break;\n\t\t\t\tcase 'b': parts[index] = '\\b'; break;\n\t\t\t\tcase 't': parts[index] = '\\t'; break;\n\t\t\t\tcase 'n': parts[index] = '\\n'; break;\n\t\t\t\tcase 'f': parts[index] = '\\f'; break;\n\t\t\t\tcase 'r': parts[index] = '\\r'; break;\n\t\t\t\tcase 'u':\n\t\t\t\t\tconst charCode = parseInt(part.slice(2), 16);\n\t\t\t\t\toptions.mustScalar && 0xD7FF {\n\tif ( !literal ) { return ''; }\n\tconst parts = literal.match(ESCAPED_IN_MULTI_LINE) ;\n\tconst { length } = parts;\n\tlet index = 0;\n\tdo {\n\t\tconst part = parts[index] ;\n\t\tif ( part==='\\n' ) {\n\t\t\t++n;\n\t\t\tparts[index] = useWhatToJoinMultilineString;\n\t\t}\n\t\telse if ( part[0]==='\\\\' ) {\n\t\t\tswitch ( part[1] ) {\n\t\t\t\tcase '\\n':\n\t\t\t\tcase ' ':\n\t\t\t\tcase '\\t':\n\t\t\t\t\tfor ( let i = 0; i = part.indexOf('\\n', i) + 1; ) { ++n; }\n\t\t\t\t\tparts[index] = '';\n\t\t\t\t\tbreak;\n\t\t\t\tcase '\\\\': parts[index] = '\\\\'; break;\n\t\t\t\tcase '\"': parts[index] = '\"'; break;\n\t\t\t\tcase 'b': parts[index] = '\\b'; break;\n\t\t\t\tcase 't': parts[index] = '\\t'; break;\n\t\t\t\tcase 'n': parts[index] = '\\n'; break;\n\t\t\t\tcase 'f': parts[index] = '\\f'; break;\n\t\t\t\tcase 'r': parts[index] = '\\r'; break;\n\t\t\t\tcase 'u':\n\t\t\t\t\tconst charCode = parseInt(part.slice(2), 16);\n\t\t\t\t\toptions.mustScalar && 0xD7FF ( IS_D_INTEGER(literal) || /*options.xob && */IS_XOB_INTEGER(literal) ) && !BAD_XOB(literal);\n\nconst MIN = BigInt && -/*#__PURE__*/BigInt('0x8000000000000000');// -(2n**(64n-1n)) || -MAX-1n\nconst MAX = BigInt && /*#__PURE__*/BigInt('0x7FFFFFFFFFFFFFFF');// 2n**(64n-1n)-1n || -MIN-1n\n\nconst BigIntInteger = (literal ) => {\n\tIS_INTEGER(literal) || iterator.throws(SyntaxError(`Invalid Integer ${literal}` + iterator.where(' at ')));\n\tconst bigInt = literal[0]==='-'\n\t\t? -BigInt(literal.replace(UNDERSCORES_SIGN, ''))\n\t\t: BigInt(literal.replace(UNDERSCORES_SIGN, ''));\n\toptions.allowLonger || MIN<=bigInt && bigInt<=MAX || iterator.throws(RangeError(`Integer expect 64 bit range (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807), not includes ${literal}` + iterator.where(' meet at ')));\n\treturn bigInt;\n};\n\nconst NumberInteger = (literal ) => {\n\tIS_INTEGER(literal) || iterator.throws(SyntaxError(`Invalid Integer ${literal}` + iterator.where(' at ')));\n\tconst number = parseInt(literal.replace(UNDERSCORES, ''));\n\tisSafeInteger(number) || iterator.throws(RangeError(`Integer did not use BitInt must fit Number.isSafeInteger, not includes ${literal}` + iterator.where(' meet at ')));\n\treturn number;\n};\n\nexport const Integer = (literal ) => {\n\tif ( options.usingBigInt===true ) { return BigIntInteger(literal); }\n\tif ( options.usingBigInt===false ) { return NumberInteger(literal); }\n\tIS_INTEGER(literal) || iterator.throws(SyntaxError(`Invalid Integer ${literal}` + iterator.where(' at ')));\n\tconst number = parseInt(literal.replace(UNDERSCORES, ''));\n\tif ( options.IntegerMinNumber<=number && number<=options.IntegerMaxNumber ) { return number; }\n\tconst bigInt = literal[0]==='-'\n\t\t? -BigInt(literal.replace(UNDERSCORES_SIGN, ''))\n\t\t: BigInt(literal.replace(UNDERSCORES_SIGN, ''));\n\toptions.allowLonger || MIN<=bigInt && bigInt<=MAX || iterator.throws(RangeError(`Integer expect 64 bit range (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807), not includes ${literal}` + iterator.where(' meet at ')));\n\treturn bigInt;\n};\n", + "import SyntaxError from '.SyntaxError';\nimport RangeError from '.RangeError';\nimport isFinite from '.isFinite';\nimport Infinity from '.Infinity';\nimport NaN from '.NaN';\n\nimport { newRegExp, theRegExp } from '@ltd/j-regexp';\nimport { INTEGER_D, BAD_D } from './Integer';\n\nimport * as iterator from '../iterator';\nimport * as options from '../options';\n\nconst _NaN = -NaN;\nconst _Infinity = -Infinity;\nconst { test: IS_FLOAT } = /*#__PURE__*/newRegExp`\n\t^\n\t${INTEGER_D}\n\t(?:\n\t\t\\.\\d[_\\d]*\n\t\t(?:[eE][-+]?\\d[_\\d]*)?\n\t|\n\t\t[eE][-+]?\\d[_\\d]*\n\t)\n\t$`.valueOf();\nconst UNDERSCORES = /_/g;\nconst { test: IS_ZERO } = theRegExp(/^[-+]?0(?:\\.0+)?(?:[eE][-+]?0+)?$/);\nconst { exec: NORMALIZED } = theRegExp (/^[-0]?(\\d*)(?:\\.(\\d+))?(?:e\\+?(-?\\d+))?$/);\nconst { exec: ORIGINAL } = theRegExp (/^[-+]?0?(\\d*)(?:\\.(\\d*?)0*)?(?:[eE]\\+?(-?\\d+))?$/);\n\nexport const Float = (literal ) => {\n\tif ( !IS_FLOAT(literal) || BAD_D(literal) ) {\n\t\tif ( options.sFloat ) {\n\t\t\tif ( literal==='inf' || literal==='+inf' ) { return Infinity; }\n\t\t\tif ( literal==='-inf' ) { return _Infinity; }\n\t\t\tif ( literal==='nan' || literal==='+nan' ) { return NaN; }\n\t\t\tif ( literal==='-nan' ) { return _NaN; }\n\t\t}\n\t\telse if ( !options.sError ) {\n\t\t\tif ( literal==='inf' || literal==='+inf' ) { return Infinity; }\n\t\t\tif ( literal==='-inf' ) { return _Infinity; }\n\t\t}\n\t\tthrow iterator.throws(SyntaxError(`Invalid Float ${literal}` + iterator.where(' at ')));\n\t}\n\tconst withoutUnderscores = literal.replace(UNDERSCORES, '');\n\tconst number = +withoutUnderscores;\n\tif ( options.sError ) {\n\t\tisFinite(number) || iterator.throws(RangeError(`Float ${literal} has been as big as inf` + iterator.where(' at ')));\n\t\tnumber || IS_ZERO(withoutUnderscores) || iterator.throws(RangeError(`Float ${literal} has been as little as ${literal[0]==='-' ? '-' : ''}0` + iterator.where(' at ')));\n\t\tconst { 1: normalized_integer, 2: normalized_fractional = '', 3: normalized_exponent = '' } = NORMALIZED(number ) ;\n\t\tconst { 1: original_integer, 2: original_fractional = '', 3: original_exponent = '' } = ORIGINAL(withoutUnderscores) ;\n\t\toriginal_integer + original_fractional===normalized_integer + normalized_fractional\n\t\t&&\n\t\toriginal_exponent - original_fractional.length===normalized_exponent - normalized_fractional.length\n\t\t||\n\t\titerator.throws(RangeError(`Float ${literal} has lost its exact and been ${number}` + iterator.where(' at ')));\n\t}\n\treturn number;\n};\n", + "import Error from '.Error';\nimport SyntaxError from '.SyntaxError';\n\nimport * as iterator from '../iterator';\nimport * as regexps from '../regexps';\nimport { LiteralObject } from '../types/atom';\nimport { newArray, OF_TABLES, isArray, isStatic } from '../types/Array';\nimport { DIRECTLY, IMPLICITLY, PAIR, isTable, isInline, directlyIfNot, fromPair } from '../types/Table';\nimport * as options from '../options';\nimport { BasicString, MultilineBasicString } from '../types/String';\n\nexport const prepareTable = (table , keys ) => {\n\tconst { length } = keys;\n\tlet index = 0;\n\twhile ( index {\n\tlet lastTable ;\n\tif ( asArrayItem ) {\n\t\tlet arrayOfTables ;\n\t\tif ( finalKey in table ) { isArray(arrayOfTables = table[finalKey]) && !isStatic(arrayOfTables) || iterator.throws(Error(`Trying to push Table to non-ArrayOfTables value` + iterator.where(' at '))); }\n\t\telse { arrayOfTables = table[finalKey] = newArray(OF_TABLES); }\n\t\ttag && options.collect(tag, arrayOfTables, table, finalKey);\n\t\tarrayOfTables[arrayOfTables.length] = lastTable = new options.Table(DIRECTLY);\n\t}\n\telse {\n\t\tif ( finalKey in table ) {\n\t\t\tlastTable = table[finalKey];\n\t\t\tfromPair(lastTable) && iterator.throws(Error(`A table defined implicitly via key/value pair can not be accessed to via []` + iterator.where(', which at ')));\n\t\t\tdirectlyIfNot(lastTable) || iterator.throws(Error(`Duplicate Table definition` + iterator.where(' at ')));\n\t\t}\n\t\telse { table[finalKey] = lastTable = new options.Table(DIRECTLY); }\n\t\ttag && options.collect(tag, null, table, finalKey);\n\t}\n\treturn lastTable;\n};\n\nexport const prepareInlineTable = (table , keys ) => {\n\tconst { length } = keys;\n\tlet index = 0;\n\twhile ( index {\n\tregexps.__CONTROL_CHARACTER_EXCLUDE_test(literal) && iterator.throws(SyntaxError(`Control characters other than Tab are not permitted in a Literal String` + iterator.where(', which was found at ')));\n\treturn literal;\n};\n\nexport const assignLiteralString = ( (table , finalKey , literal ) => {\n\tif ( !literal.startsWith(`'''`) ) {\n\t\tconst $ = regexps.LITERAL_STRING_exec(literal) || iterator.throws(SyntaxError(`Bad literal string` + iterator.where(' at ')));\n\t\tconst value = checkLiteralString($[1]);\n\t\ttable[finalKey] = options.preserveLiteral ? LiteralObject(literal.slice(0, value.length + 2), value) : value;\n\t\treturn $[2];\n\t}\n\tconst $ = regexps.__MULTI_LINE_LITERAL_STRING_exec(literal.slice(3));\n\tif ( $ ) {\n\t\tconst value = checkLiteralString($[1]) + $[2];\n\t\ttable[finalKey] = options.preserveLiteral ? LiteralObject(literal.slice(0, value.length + 6), value) : value;\n\t\treturn $[3];\n\t}\n\tconst start = new iterator.mark('Multi-line Literal String', literal.length);\n\tconst leadingNewline = !( literal = literal.slice(3) );\n\tif ( leadingNewline ) {\n\t\tliteral = start.must();\n\t\tconst $ = regexps.__MULTI_LINE_LITERAL_STRING_exec(literal);\n\t\tif ( $ ) {\n\t\t\tconst value = checkLiteralString($[1]) + $[2];\n\t\t\ttable[finalKey] = options.preserveLiteral ? LiteralObject([ `'''`, literal.slice(0, value.length + 3) ], value) : value;\n\t\t\treturn $[3];\n\t\t}\n\t}\n\toptions.useWhatToJoinMultilineString===null && start.nowrap(options.ARGS_MODE);\n\tfor ( const lines = [ checkLiteralString(literal) ]; ; ) {\n\t\tconst line = start.must();\n\t\tconst $ = regexps.__MULTI_LINE_LITERAL_STRING_exec(line);\n\t\tif ( $ ) {\n\t\t\tlines[lines.length] = checkLiteralString($[1]) + $[2];\n\t\t\tconst value = lines.join(options.useWhatToJoinMultilineString );\n\t\t\tif ( options.preserveLiteral ) {\n\t\t\t\tlines[lines.length - 1] += `'''`;\n\t\t\t\tleadingNewline ? lines.unshift(`'''`) : lines[0] = `'''${literal}`;\n\t\t\t\ttable[finalKey] = LiteralObject(lines, value);\n\t\t\t}\n\t\t\telse { table[finalKey] = value; }\n\t\t\treturn $[3];\n\t\t}\n\t\tlines[lines.length] = checkLiteralString(line);\n\t}\n} ) \n\t \n\t \n ;\n\nexport const assignBasicString = ( (table , finalKey , literal ) => {\n\tif ( !literal.startsWith('\"\"\"') ) {\n\t\tconst index = regexps.BASIC_STRING_exec_1_endIndex(literal);\n\t\tconst value = BasicString(literal.slice(1, index));\n\t\ttable[finalKey] = options.preserveLiteral ? LiteralObject(literal.slice(0, index + 1), value) : value;\n\t\treturn literal.slice(index + 1).replace(regexps.PRE_WHITESPACE, '');\n\t}\n\tlet length = 3 + regexps.MULTI_LINE_BASIC_STRING_exec_0_length(literal.slice(3));\n\tif ( literal.length!==length ) {\n\t\tconst $ = literal.slice(3, length);\n\t\tregexps.ESCAPED_EXCLUDE_CONTROL_CHARACTER_test($) || iterator.throws(SyntaxError(`Bad multi-line basic string` + iterator.where(' at ')));\n\t\tconst value = BasicString($) + ( literal.startsWith('\"', length += 3) ? literal.startsWith('\"', ++length) ? ( ++length, '\"\"' ) : '\"' : '' );\n\t\ttable[finalKey] = options.preserveLiteral ? LiteralObject(literal.slice(0, length), value) : value;\n\t\treturn literal.slice(length).replace(regexps.PRE_WHITESPACE, '');\n\t}\n\tconst start = new iterator.mark('Multi-line Basic String', length);\n\tconst skipped = ( literal = literal.slice(3) ) ? 0 : 1;\n\tif ( skipped ) {\n\t\tliteral = start.must();\n\t\tlet length = regexps.MULTI_LINE_BASIC_STRING_exec_0_length(literal);\n\t\tif ( literal.length!==length ) {\n\t\t\tconst $ = literal.slice(0, length);\n\t\t\tregexps.ESCAPED_EXCLUDE_CONTROL_CHARACTER_test($) || iterator.throws(SyntaxError(`Bad multi-line basic string` + iterator.where(' at ')));\n\t\t\tconst value = MultilineBasicString($, options.useWhatToJoinMultilineString , skipped) + ( literal.startsWith('\"', length += 3) ? literal.startsWith('\"', ++length) ? ( ++length, '\"\"' ) : '\"' : '' );\n\t\t\ttable[finalKey] = options.preserveLiteral ? LiteralObject([ '\"\"\"', literal.slice(0, length) ], value) : value;\n\t\t\treturn literal.slice(length).replace(regexps.PRE_WHITESPACE, '');\n\t\t}\n\t}\n\toptions.useWhatToJoinMultilineString===null && start.nowrap(options.ARGS_MODE);\n\tregexps.ESCAPED_EXCLUDE_CONTROL_CHARACTER_test(literal + '\\n') || iterator.throws(SyntaxError(`Bad multi-line basic string` + iterator.where(' at ')));\n\tfor ( const lines = [ literal ]; ; ) {\n\t\tconst line = start.must();\n\t\tlet length = regexps.MULTI_LINE_BASIC_STRING_exec_0_length(line);\n\t\tif ( line.length!==length ) {\n\t\t\tconst $ = line.slice(0, length);\n\t\t\tregexps.ESCAPED_EXCLUDE_CONTROL_CHARACTER_test($) || iterator.throws(SyntaxError(`Bad multi-line basic string` + iterator.where(' at ')));\n\t\t\tconst value = MultilineBasicString(lines.join('\\n') + '\\n' + $, options.useWhatToJoinMultilineString , skipped) + ( line.startsWith('\"', length += 3) ? line.startsWith('\"', ++length) ? ( ++length, '\"\"' ) : '\"' : '' );\n\t\t\tif ( options.preserveLiteral ) {\n\t\t\t\tskipped ? lines.unshift('\"\"\"') : lines[0] = `\"\"\"${literal}`;\n\t\t\t\tlines[lines.length] = `${$}\"\"\"`;\n\t\t\t\ttable[finalKey] = LiteralObject(lines, value);\n\t\t\t}\n\t\t\telse { table[finalKey] = value; }\n\t\t\treturn line.slice(length).replace(regexps.PRE_WHITESPACE, '');\n\t\t}\n\t\tregexps.ESCAPED_EXCLUDE_CONTROL_CHARACTER_test(line + '\\n') || iterator.throws(SyntaxError(`Bad multi-line basic string` + iterator.where(' at ')));\n\t\tlines[lines.length] = line;\n\t}\n} ) \n\t \n\t \n ;\n\n \n \n", + "import TypeError from '.TypeError';\nimport SyntaxError from '.SyntaxError';\nimport Symbol from '.Symbol';\nimport Null from '.null';\n\nimport { theRegExp } from '@ltd/j-regexp';\n\nconst KEYS = /*#__PURE__*/Null (null);\nexport const commentFor = (key ) => KEYS[key] || ( KEYS[key] = Symbol(key) );\nexport const commentForThis = Symbol('this') ;\n\nconst { test: includesNewline } = theRegExp(/\\r?\\n/g);\nexport const getCOMMENT = (table , keyComment ) => {\n\tif ( keyComment in table ) {\n\t\tconst comment = table[keyComment];\n\t\tif ( typeof comment!=='string' ) { throw TypeError(`the value of comment must be a string, while \"${comment===null ? 'null' : typeof comment}\" type is found`); }\n\t\tif ( includesNewline(comment) ) { throw SyntaxError(`the value of comment must be a string and can not include newline`); }\n\t\treturn ` #${comment}`;///\n\t}\n\treturn '';\n};\nexport const getComment = (table , key ) => key in KEYS ? getCOMMENT(table, KEYS[key] ) : '';\n", + "import Error from '.Error';\nimport SyntaxError from '.SyntaxError';\nimport undefined from '.undefined';\n\nimport { theRegExp } from '@ltd/j-regexp';\n\nimport { x } from '../j-lexer';/// external\n\nimport * as iterator from '../iterator';\nimport { LiteralObject } from '../types/atom';\nimport { INLINE, DIRECTLY } from '../types/Table';\nimport { newArray, STATICALLY } from '../types/Array';\nimport { OffsetDateTime, LocalDateTime, LocalDate, LocalTime, OFFSET$ } from '../types/Datetime';\nimport { BasicString } from '../types/String';\nimport { Integer } from '../types/Integer';\nimport { Float } from '../types/Float';\nimport * as options from '../options';\nimport * as regexps from '../regexps';\nimport { appendTable, prepareTable, prepareInlineTable, assignLiteralString, assignBasicString } from './on-the-spot';\n\nimport { commentFor, commentForThis } from '../types/comment';\nimport { beInline } from '../types/non-atom';\n\nconst { test: IS_OFFSET$ } = theRegExp(OFFSET$);\nconst { test: IS_EMPTY } = theRegExp(/^\\[[\\t ]*]/);\n\nconst parseKeys = (rest ) => {\n\tlet lineRest = rest;\n\tconst leadingKeys = [];\n\tlet lastIndex = -1;\n\tfor ( ; ; ) {\n\t\tlineRest || iterator.throws(SyntaxError(`Empty bare key` + iterator.where(' at ')));\n\t\tif ( lineRest[0]==='\"' ) {\n\t\t\tconst index = regexps.BASIC_STRING_exec_1_endIndex(lineRest);\n\t\t\toptions.KEYS.test(leadingKeys[++lastIndex] = BasicString(lineRest.slice(1, index))) || iterator.throws(Error(`Key not allowed` + iterator.where(' at ')));\n\t\t\tlineRest = lineRest.slice(index + 1);\n\t\t}\n\t\telse {\n\t\t\tconst isQuoted = lineRest[0]==='\\'';\n\t\t\tconst key = ( ( isQuoted ? regexps.__LITERAL_KEY_exec : regexps.__BARE_KEY_exec )(lineRest) || iterator.throws(SyntaxError(`Bad ${isQuoted ? 'literal string' : 'bare'} key` + iterator.where(' at '))) )[0];\n\t\t\tlineRest = lineRest.slice(key.length);\n\t\t\toptions.KEYS.test(leadingKeys[++lastIndex] = isQuoted ? key.slice(1, -1) : key) || iterator.throws(Error(`Key not allowed` + iterator.where(' at ')));\n\t\t}\n\t\tif ( regexps.IS_DOT_KEY(lineRest) ) { lineRest = lineRest.replace(regexps.DOT_KEY, ''); }\n\t\telse { break; }\n\t}\n\tif ( options.disableDigit ) {\n\t\tconst keys = rest.slice(0, -lineRest.length);\n\t\t( regexps.isAmazing(keys) || options.enableNull && keys==='null' ) && iterator.throws(SyntaxError(`Bad bare key disabled by xOptions.string` + iterator.where(' at ')));\n\t}\n\tif ( options.disallowEmptyKey ) {\n\t\tlet index = lastIndex;\n\t\tdo { leadingKeys[index] || iterator.throws(SyntaxError(`Empty key is not allowed before TOML v0.5` + iterator.where(', which at '))); }\n\t\twhile ( index-- );\n\t}\n\tconst finalKey = leadingKeys[lastIndex] ;\n\tleadingKeys.length = lastIndex;\n\treturn { leadingKeys, finalKey, lineRest };\n};\n\nconst push = (lastArray , lineRest ) => {\n\tif ( lineRest[0]==='<' ) {\n\t\tconst { 1: tag } = { 2: lineRest } = regexps._VALUE_PAIR_exec(lineRest) || iterator.throws(SyntaxError(`Bad tag ` + iterator.where(' at ')));\n\t\toptions.collect(tag, lastArray, null);\n\t\tswitch ( lineRest && lineRest[0] ) {\n\t\t\tcase ',':\n\t\t\tcase ']':\n\t\t\tcase '':\n\t\t\tcase '#':\n\t\t\t\tlastArray[lastArray.length] = undefined;\n\t\t\t\treturn lineRest;\n\t\t}\n\t}\n\tswitch ( lineRest[0] ) {\n\t\tcase '\\'':\n\t\t\treturn assignLiteralString(options.asStrings(lastArray), lastArray.length, lineRest);\n\t\tcase '\"':\n\t\t\treturn assignBasicString(options.asStrings(lastArray), lastArray.length, lineRest);\n\t\tcase '{':\n\t\t\toptions.inlineTable || iterator.throws(SyntaxError(`Inline Table is not allowed before TOML v0.4` + iterator.where(', which at ')));\n\t\t\treturn equalInlineTable(options.asTables(lastArray), lastArray.length, lineRest);\n\t\tcase '[':\n\t\t\treturn equalStaticArray(options.asArrays(lastArray), lastArray.length, lineRest);\n\t}\n\tconst { 1: literal } = { 2: lineRest } = regexps.VALUE_REST_exec(lineRest) || iterator.throws(SyntaxError(`Bad atom value` + iterator.where(' at ')));\n\tif ( literal==='true' ) { options.asBooleans(lastArray)[lastArray.length] = true; }\n\telse if ( literal==='false' ) { options.asBooleans(lastArray)[lastArray.length] = false; }\n\telse if ( options.enableNull && literal==='null' ) { options.asNulls(lastArray)[lastArray.length] = null; }\n\telse if ( literal.includes(':') ) {\n\t\tif ( literal.includes('-') ) {\n\t\t\tif ( IS_OFFSET$(literal) ) {\n\t\t\t\toptions.asOffsetDateTimes(lastArray)[lastArray.length] = new OffsetDateTime(literal);\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.moreDatetime || iterator.throws(SyntaxError(`Local Date-Time is not allowed before TOML v0.5` + iterator.where(', which at ')));\n\t\t\t\toptions.asLocalDateTimes(lastArray)[lastArray.length] = new LocalDateTime(literal);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\toptions.moreDatetime || iterator.throws(SyntaxError(`Local Time is not allowed before TOML v0.5` + iterator.where(', which at ')));\n\t\t\toptions.asLocalTimes(lastArray)[lastArray.length] = new LocalTime(literal);\n\t\t}\n\t}\n\telse if ( literal.indexOf('-')!==literal.lastIndexOf('-') && literal[0]!=='-' ) {\n\t\toptions.moreDatetime || iterator.throws(SyntaxError(`Local Date is not allowed before TOML v0.5` + iterator.where(', which at ')));\n\t\toptions.asLocalDates(lastArray)[lastArray.length] = new LocalDate(literal);\n\t}\n\telse {\n\t\tliteral.includes('.') || literal.includes('n') || ( literal.includes('e') || literal.includes('E') ) && !literal.startsWith('0x')\n\t\t\t? options.asFloats(lastArray)[lastArray.length] = options.preserveLiteral ? LiteralObject(literal, Float(literal)) : Float(literal)\n\t\t\t: options.asIntegers(lastArray)[lastArray.length] = options.preserveLiteral ? LiteralObject(literal, Integer(literal)) : Integer(literal)\n\t\t;\n\t}\n\treturn lineRest;\n};\n\nconst equalStaticArray = function * ( table , finalKey , lineRest ) {\n\tconst staticArray = table[finalKey] = newArray(STATICALLY);\n\tif ( IS_EMPTY(lineRest) ) {\n\t\tbeInline(staticArray, lineRest[1]===']' ? 0 : 3);\n\t\treturn lineRest.slice(lineRest.indexOf(']')).replace(regexps.SYM_WHITESPACE, '');\n\t}\n\tconst start = new iterator.mark('Static Array', lineRest.length);\n\tlet inline = lineRest.startsWith('[ ') || lineRest.startsWith('[\\t') ? 3 : 0;\n\tlineRest = lineRest.replace(regexps.SYM_WHITESPACE, '');\n\twhile ( !lineRest || lineRest[0]==='#' ) {\n\t\tinline = null;\n\t\tlineRest = start.must().replace(regexps.PRE_WHITESPACE, '');\n\t}\n\tif ( lineRest[0]===']' ) {\n\t\tinline===null || beInline(staticArray, inline);\n\t\treturn lineRest.replace(regexps.SYM_WHITESPACE, '');\n\t}\n\tfor ( ; ; ) {\n\t\tconst rest = push(staticArray, lineRest);\n\t\tlineRest = typeof rest==='string' ? rest : yield rest;\n\t\twhile ( !lineRest || lineRest[0]==='#' ) {\n\t\t\tinline = null;\n\t\t\tlineRest = start.must().replace(regexps.PRE_WHITESPACE, '');\n\t\t}\n\t\tif ( lineRest[0]===',' ) {\n\t\t\tlineRest = lineRest.replace(regexps.SYM_WHITESPACE, '');\n\t\t\twhile ( !lineRest || lineRest[0]==='#' ) {\n\t\t\t\tinline = null;\n\t\t\t\tlineRest = start.must().replace(regexps.PRE_WHITESPACE, '');\n\t\t\t}\n\t\t\tif ( lineRest[0]===']' ) { break; }\n\t\t}\n\t\telse {\n\t\t\tif ( lineRest[0]===']' ) { break; }\n\t\t\tthrow iterator.throws(SyntaxError(`Unexpect character in static array item value` + iterator.where(', which is found at ')));\n\t\t}\n\t}\n\tinline===null || beInline(staticArray, inline);\n\treturn lineRest.replace(regexps.SYM_WHITESPACE, '');\n} \n\t \n\t \n ;\n\nconst equalInlineTable = function * ( table , finalKey , lineRest ) {\n\tconst inlineTable = table[finalKey] = new options.Table(DIRECTLY, INLINE);\n\tif ( options.allowInlineTableMultilineAndTrailingCommaEvenNoComma ) {\n\t\tconst start = new iterator.mark('Inline Table', lineRest.length);\n\t\tlineRest = lineRest.replace(regexps.SYM_WHITESPACE, '');\n\t\tlet inline = true;\n\t\tfor ( ; ; ) {\n\t\t\twhile ( !lineRest || lineRest[0]==='#' ) {\n\t\t\t\tinline = false;\n\t\t\t\tlineRest = start.must().replace(regexps.PRE_WHITESPACE, '');\n\t\t\t}\n\t\t\tif ( lineRest[0]==='}' ) { break; }\n\t\t\tconst forComment = ForComment(inlineTable, lineRest);\n\t\t\tconst rest = assign(forComment);\n\t\t\tlineRest = typeof rest==='string' ? rest : yield rest;\n\t\t\tif ( lineRest ) {\n\t\t\t\tif ( lineRest[0]==='#' ) {\n\t\t\t\t\tif ( options.preserveComment ) { forComment.table[commentFor(forComment.finalKey)] = lineRest.slice(1); }\n\t\t\t\t\tinline = false;\n\t\t\t\t\tdo { lineRest = start.must().replace(regexps.PRE_WHITESPACE, ''); }\n\t\t\t\t\twhile ( !lineRest || lineRest[0]==='#' );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tinline = false;\n\t\t\t\tdo { lineRest = start.must().replace(regexps.PRE_WHITESPACE, ''); }\n\t\t\t\twhile ( !lineRest || lineRest[0]==='#' );\n\t\t\t}\n\t\t\tif ( lineRest[0]===',' ) { lineRest = lineRest.replace(regexps.SYM_WHITESPACE, ''); }\n\t\t}\n\t\tinline || beInline(inlineTable, false);\n\t}\n\telse {\n\t\tlineRest = lineRest.replace(regexps.SYM_WHITESPACE, '') || iterator.throws(SyntaxError(`Inline Table is intended to appear on a single line` + iterator.where(', which broken at ')));\n\t\tif ( lineRest[0]!=='}' ) {\n\t\t\tfor ( ; ; ) {\n\t\t\t\tlineRest[0]==='#' && iterator.throws(SyntaxError(`Inline Table is intended to appear on a single line` + iterator.where(', which broken at ')));\n\t\t\t\tconst rest = assign(ForComment(inlineTable, lineRest));\n\t\t\t\tlineRest = ( typeof rest==='string' ? rest : yield rest ) || iterator.throws(SyntaxError(`Inline Table is intended to appear on a single line` + iterator.where(', which broken at ')));\n\t\t\t\tif ( lineRest[0]==='}' ) { break; }\n\t\t\t\tif ( lineRest[0]===',' ) {\n\t\t\t\t\tlineRest = lineRest.replace(regexps.SYM_WHITESPACE, '') || iterator.throws(SyntaxError(`Inline Table is intended to appear on a single line` + iterator.where(', which broken at ')));\n\t\t\t\t\tlineRest[0]==='}' && iterator.throws(SyntaxError(`The last property of an Inline Table can not have a trailing comma` + iterator.where(', which was found at ')));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn lineRest.replace(regexps.SYM_WHITESPACE, '');\n} \n\t \n\t \n ;\n\n \nconst ForComment = (lastInlineTable , lineRest ) => {\n\tconst { leadingKeys, finalKey, tag } = { lineRest } = regexps.KEY_VALUE_PAIR_exec_groups(parseKeys(lineRest));\n\treturn { table: prepareInlineTable(lastInlineTable, leadingKeys), finalKey, tag, lineRest };\n};\nconst assign = ({ finalKey, tag, lineRest, table } ) => {\n\tfinalKey in table && iterator.throws(Error(`Duplicate property definition` + iterator.where(' at ')));\n\tif ( tag ) {\n\t\toptions.collect(tag, null, table, finalKey);\n\t\tswitch ( lineRest && lineRest[0] ) {\n\t\t\tcase ',':\n\t\t\tcase '}':\n\t\t\tcase '':\n\t\t\tcase '#':\n\t\t\t\ttable[finalKey] = undefined;\n\t\t\t\treturn lineRest;\n\t\t}\n\t}\n\tswitch ( lineRest && lineRest[0] ) {\n\t\tcase '\\'':\n\t\t\treturn assignLiteralString(table, finalKey, lineRest);\n\t\tcase '\"':\n\t\t\treturn assignBasicString(table, finalKey, lineRest);\n\t\tcase '{':\n\t\t\toptions.inlineTable || iterator.throws(SyntaxError(`Inline Table is not allowed before TOML v0.4` + iterator.where(', which at ')));\n\t\t\treturn equalInlineTable(table, finalKey, lineRest);\n\t\tcase '[':\n\t\t\treturn equalStaticArray(table, finalKey, lineRest);\n\t}\n\tconst { 1: literal } = { 2: lineRest } = regexps.VALUE_REST_exec(lineRest) || iterator.throws(SyntaxError(`Bad atom value` + iterator.where(' at ')));\n\tif ( literal==='true' ) { table[finalKey] = true; }\n\telse if ( literal==='false' ) { table[finalKey] = false; }\n\telse if ( options.enableNull && literal==='null' ) { table[finalKey] = null; }\n\telse if ( literal.includes(':') ) {\n\t\tif ( literal.includes('-') ) {\n\t\t\tif ( IS_OFFSET$(literal) ) {\n\t\t\t\ttable[finalKey] = new OffsetDateTime(literal);\n\t\t\t}\n\t\t\telse {\n\t\t\t\toptions.moreDatetime || iterator.throws(SyntaxError(`Local Date-Time is not allowed before TOML v0.5` + iterator.where(', which at ')));\n\t\t\t\ttable[finalKey] = new LocalDateTime(literal);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\toptions.moreDatetime || iterator.throws(SyntaxError(`Local Time is not allowed before TOML v0.5` + iterator.where(', which at ')));\n\t\t\ttable[finalKey] = new LocalTime(literal);\n\t\t}\n\t}\n\telse if ( literal.indexOf('-')!==literal.lastIndexOf('-') && literal[0]!=='-' ) {\n\t\toptions.moreDatetime || iterator.throws(SyntaxError(`Local Date is not allowed before TOML v0.5` + iterator.where(', which at ')));\n\t\ttable[finalKey] = new LocalDate(literal);\n\t}\n\telse {\n\t\ttable[finalKey] = literal.includes('.') || literal.includes('n') || ( literal.includes('e') || literal.includes('E') ) && !literal.startsWith('0x')\n\t\t\t? options.preserveLiteral ? LiteralObject(literal, Float(literal)) : Float(literal)\n\t\t\t: options.preserveLiteral ? LiteralObject(literal, Integer(literal)) : Integer(literal)\n\t\t;\n\t}\n\treturn lineRest;\n};\n\nexport default () => {\n\tconst rootTable = new options.Table;\n\tlet lastSectionTable = rootTable;\n\twhile ( iterator.rest() ) {\n\t\tconst line = iterator.next().replace(regexps.PRE_WHITESPACE, '');\n\t\tif ( line ) {\n\t\t\tif ( line[0]==='[' ) {\n\t\t\t\tconst { leadingKeys, finalKey, asArrayItem, tag, lineRest } = regexps.TABLE_DEFINITION_exec_groups(line, parseKeys);\n\t\t\t\tconst table = prepareTable(rootTable, leadingKeys);\n\t\t\t\tif ( lineRest ) {\n\t\t\t\t\tlineRest[0]==='#' || iterator.throws(SyntaxError(`Unexpect charachtor after table header` + iterator.where(' at ')));\n\t\t\t\t}\n\t\t\t\tlastSectionTable = appendTable(table, finalKey, asArrayItem, tag);\n\t\t\t\toptions.preserveComment && lineRest && ( lastSectionTable[commentForThis] = asArrayItem ? lineRest.slice(1) : table[commentFor(finalKey)] = lineRest.slice(1) );\n\t\t\t}\n\t\t\telse if ( line[0]==='#' ) {\n\t\t\t\tregexps.__CONTROL_CHARACTER_EXCLUDE_test(line) && iterator.throws(SyntaxError(`Control characters other than Tab are not permitted in comments` + iterator.where(', which was found at ')));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst forComment = ForComment(lastSectionTable, line);\n\t\t\t\tlet rest = assign(forComment);\n\t\t\t\ttypeof rest==='string' || ( rest = x (rest) );\n\t\t\t\tif ( rest ) {\n\t\t\t\t\trest[0]==='#' || iterator.throws(SyntaxError(`Unexpect charachtor after key/value pair` + iterator.where(' at ')));\n\t\t\t\t\tif ( options.preserveComment ) { forComment.table[commentFor(forComment.finalKey)] = rest.slice(1); }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn rootTable;\n};\n\n \n\n \n ", + "import Array from '.Array';\nimport fromCharCode from '.String.fromCharCode';\nimport fromEntries from '.Object.fromEntries';\nimport Null from '.null';\n\nimport { theRegExp } from '@ltd/j-regexp';\n\nconst ESCAPED = /*#__PURE__*/Null ({\n\t.../*#__PURE__*/fromEntries(/*#__PURE__*/[ ...Array(0x20) ].map((_, charCode) => [ fromCharCode(charCode), '\\\\u' + charCode.toString(16).toUpperCase().padStart(4, '0') ])),\n\t'\\b': '\\\\b',\n\t'\\t': '\\\\t',\n\t'\\n': '\\\\n',\n\t'\\f': '\\\\f',\n\t'\\r': '\\\\r',\n\t'\"': '\\\\\"',\n\t'\"\"\"': '\"\"\\\\\"',\n\t'\\\\': '\\\\\\\\',\n\t'\\x7F': '\\\\u007F',\n});\n\nconst { test: NEED_BASIC } = theRegExp(/[\\x00-\\x08\\x0A-\\x1F'\\x7F]/);\nconst BY_ESCAPE = /[^\\x00-\\x08\\x0A-\\x1F\"\\\\\\x7F]+|./gs;\nconst { test: NEED_ESCAPE } = theRegExp(/^[\\x00-\\x08\\x0A-\\x1F\"\\\\\\x7F]/);\nexport const singlelineString = (value ) => {\n\tif ( NEED_BASIC(value) ) {\n\t\tconst parts = value.match(BY_ESCAPE) ;\n\t\tlet index = parts.length;\n\t\tdo { if ( NEED_ESCAPE(parts[--index] ) ) { parts[index] = ESCAPED[parts[index] ] ; } }\n\t\twhile ( index );\n\t\treturn `\"${parts.join('')}\"`;\n\t}\n\treturn `'${value}'`;\n};\nexport const singlelineBasicString = (value ) => {\n\tif ( value ) {\n\t\tconst parts = value.match(BY_ESCAPE) ;\n\t\tlet index = parts.length;\n\t\tdo { if ( NEED_ESCAPE(parts[--index] ) ) { parts[index] = ESCAPED[parts[index] ] ; } }\n\t\twhile ( index );\n\t\treturn `\"${parts.join('')}\"`;\n\t}\n\treturn `\"\"`;\n};\n\nconst { test: NEED_MULTILINE_BASIC } = theRegExp(/[\\x00-\\x08\\x0A-\\x1F\\x7F]|'''/);\nexport const { test: multilineNeedBasic } = theRegExp(/[\\x00-\\x08\\x0B-\\x1F\\x7F]|'''/);\nconst { test: REAL_MULTILINE_ESCAPE } = theRegExp(/[\\x00-\\x08\\x0A-\\x1F\\\\\\x7F]|\"\"\"/);\nconst BY_MULTILINE_ESCAPE = /[^\\x00-\\x08\\x0A-\\x1F\"\\\\\\x7F]+|\"\"\"|./gs;\nconst { test: NEED_MULTILINE_ESCAPE } = theRegExp(/^(?:[\\x00-\\x08\\x0A-\\x1F\\\\\\x7F]|\"\"\")/);\nconst escape_multiline = (lines , lineIndex ) => {\n\tconst line = lines[lineIndex] ;\n\tif ( REAL_MULTILINE_ESCAPE(line) ) {\n\t\tconst parts = line.match(BY_MULTILINE_ESCAPE) ;\n\t\tlet index = parts.length;\n\t\tdo { if ( NEED_MULTILINE_ESCAPE(parts[--index] ) ) { parts[index] = ESCAPED[parts[index] ] ; } }\n\t\twhile ( index );\n\t\tlines[lineIndex] = parts.join('');\n\t}\n};\n\n \nexport const Lines = (lines ) => ( lines = [ '', ...lines ] ).length===1 ? [ '', '' ] : lines ;\n\nexport const multilineString = (lines ) => {\n\tconst lastIndex = lines.length - 1;\n\tlet index = lastIndex;\n\tdo { if ( NEED_MULTILINE_BASIC(lines[index] ) ) { break; } }\n\twhile ( --index );\n\tif ( index ) {\n\t\tindex = lastIndex;\n\t\tescape_multiline(lines, index);\n\t\tlines[index] += lines[0] = '\"\"\"';\n\t\twhile ( --index ) { escape_multiline(lines, index); }\n\t}\n\telse{ lines[lastIndex] += lines[0] = '\\'\\'\\''; }\n\treturn lines ;\n};\n\nexport const multilineBasicString = (lines ) => {\n\tlet index = lines.length - 1;\n\tescape_multiline(lines, index);\n\tlines[index] += lines[0] = '\"\"\"';\n\twhile ( --index ) { escape_multiline(lines, index); }\n\treturn lines ;\n};\n\nexport const multilineLiteralString = (lines ) => {\n\tlines[lines.length - 1] += lines[0] = '\\'\\'\\'';\n\treturn lines ;\n};\n", + "import Float64Array from '.Float64Array';\nimport Uint8Array from '.Uint8Array';\nimport Infinity from '.Infinity';\nimport NaN from '.NaN';\nimport is from '.Object.is';\n\nimport { theRegExp } from '@ltd/j-regexp';\n\nconst _Infinity = -Infinity;\n\nconst { test: INTEGER_LIKE } = theRegExp(/^-?\\d+$/);\nconst ensureFloat = (literal ) => INTEGER_LIKE(literal) ? literal + '.0' : literal;\n\nconst float64Array = new Float64Array([ NaN ]);\nconst uint8Array = new Uint8Array(float64Array.buffer);\nconst NaN_7 = uint8Array[7] ;\n\nexport const float = NaN_7===new Uint8Array(new Float64Array([ -NaN ]).buffer)[7] \n\t? (value ) => value\n\t\t? value===Infinity ? 'inf' : value===_Infinity ? '-inf' : ensureFloat('' + value)\n\t\t: value===value ? is(value, 0) ? '0.0' : '-0.0' : 'nan'\n\t: (value ) => value\n\t\t? value===Infinity ? 'inf' : value===_Infinity ? '-inf' : ensureFloat('' + value)\n\t\t: value===value ? is(value, 0) ? '0.0' : '-0.0' : ( float64Array[0] = value, uint8Array[7] )===NaN_7 ? 'nan' : '-nan';\n", + "import TypeError from '.TypeError';\nimport Symbol from '.Symbol';\nimport Array from '.Array';\nimport DATE from '.Date.prototype';\nimport isPrototypeOf from '.Object.prototype.isPrototypeOf';\nimport getOwnPropertyNames from '.Object.getOwnPropertyNames';\nimport is from '.Object.is';\nimport isArray from '.Array.isArray';\nimport undefined from '.undefined';\nimport isString from '.class.isString';\nimport isNumber from '.class.isNumber';\nimport isBigInt from '.class.isBigInt';\nimport isBoolean from '.class.isBoolean';\n\nimport { theRegExp } from '@ltd/j-regexp';\n\nimport * as regexps from '../regexps';\n\nimport { commentForThis, getCOMMENT, getComment } from '../types/comment';\nimport { singlelineString } from './string';\nimport { float } from './float';\nimport { isSection, ofInline } from '../types/non-atom';\nimport { _literal } from '../types/atom';\n\nconst isDate = /*#__PURE__*/isPrototypeOf.bind(DATE) ;\n\nconst { test: BARE } = theRegExp(/^[\\w-]+$/);\nconst $Key$ = (key ) => BARE(key) ? key : singlelineString(key);\n\nconst FIRST = /[^.]+/;\nconst literalString = (value ) => `'${value}'`;\nconst $Keys = (keys ) => regexps.isAmazing(keys) ? keys.replace(FIRST, literalString) : keys==='null' ? `'null'` : keys;\n\nexport default class TOMLSection extends Array {\n\t\n\t document ;\n\t\n\tconstructor (document ) {\n\t\tsuper();\n\t\tthis.document = document;\n\t\treturn this;\n\t}\n\t\n\t[Symbol.toPrimitive] () { return this.join(this.document.newline); }\n\t\n\tappendNewline () { this[this.length] = ''; }\n\t set appendLine (source ) { this[this.length] = source; }\n\t set appendInline (source ) { this[this.length - 1] += source; } \n\t set appendInlineIf (source ) { source && ( this[this.length - 1] += source ); }///\n\t\n\t* assignBlock (documentKeys_ , sectionKeys_ , table , tableKeys ) {\n\t\tconst { document } = this;\n\t\tconst { newlineUnderHeader, newlineUnderSectionButPair } = document;\n\t\tconst newlineAfterDotted = sectionKeys_ ? document.newlineUnderPairButDotted : false;\n\t\tconst newlineAfterPair = sectionKeys_ ? document.newlineUnderDotted : document.newlineUnderPair;\n\t\tfor ( const tableKey of tableKeys ) {\n\t\t\tconst value = table[tableKey] ;\n\t\t\tconst $key$ = $Key$(tableKey);\n\t\t\tconst documentKeys = documentKeys_ + $key$;\n\t\t\tif ( isArray(value) ) {\n\t\t\t\tconst { length } = value;\n\t\t\t\tif ( length ) {\n\t\t\t\t\tlet firstItem = value[0];\n\t\t\t\t\tif ( isSection(firstItem) ) {\n\t\t\t\t\t\tconst tableHeader = `[[${documentKeys}]]` ;\n\t\t\t\t\t\tconst documentKeys_ = documentKeys + '.' ;\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tlet table = firstItem;\n\t\t\t\t\t\tfor ( ; ; ) {\n\t\t\t\t\t\t\tconst section = document.appendSection();\n\t\t\t\t\t\t\tsection[0] = tableHeader + getCOMMENT(table, commentForThis);\n\t\t\t\t\t\t\tif ( newlineUnderHeader ) {\n\t\t\t\t\t\t\t\tsection[1] = '';\n\t\t\t\t\t\t\t\tyield section.assignBlock(documentKeys_, ``, table, getOwnPropertyNames(table));\n\t\t\t\t\t\t\t\tnewlineUnderSectionButPair && section.length!==2 && section.appendNewline();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tyield section.assignBlock(documentKeys_, ``, table, getOwnPropertyNames(table));\n\t\t\t\t\t\t\t\tnewlineUnderSectionButPair && section.appendNewline();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( ++index===length ) { break; }\n\t\t\t\t\t\t\ttable = ( value )[index] ;\n\t\t\t\t\t\t\tif ( !isSection(table) ) { throw TypeError(`the first table item marked by Section() means the parent array is an array of tables, which can not include other types or table not marked by Section() any more in the rest items`); }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse { let index = 1; while ( index!==length ) { if ( isSection(value[index++] ) ) { throw TypeError(`if an array is not array of tables, it can not include any table that marked by Section()`); } } }\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ( isSection(value) ) {\n\t\t\t\t\tconst section = document.appendSection();\n\t\t\t\t\tsection[0] = `[${documentKeys}]${\n\t\t\t\t\t\tdocument.preferCommentForThis\n\t\t\t\t\t\t\t? getCOMMENT(value, commentForThis) || getComment(table, tableKey)\n\t\t\t\t\t\t\t: getComment(table, tableKey) || getCOMMENT(value, commentForThis)\n\t\t\t\t\t}`;\n\t\t\t\t\tif ( newlineUnderHeader ) {\n\t\t\t\t\t\tsection[1] = '';\n\t\t\t\t\t\tyield section.assignBlock(documentKeys + '.' , ``, value, getOwnPropertyNames(value));\n\t\t\t\t\t\tnewlineUnderSectionButPair && section.length!==2 && section.appendNewline();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tyield section.assignBlock(documentKeys + '.' , ``, value, getOwnPropertyNames(value));\n\t\t\t\t\t\tnewlineUnderSectionButPair && section.appendNewline();\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst sectionKeys = sectionKeys_ + $key$;\n\t\t\tthis.appendLine = $Keys(sectionKeys) + ' = ';\n\t\t\tconst valueKeysIfValueIsDottedTable = this.value('', value, true);\n\t\t\tif ( valueKeysIfValueIsDottedTable ) {\n\t\t\t\t--this.length;\n\t\t\t\tyield this.assignBlock(documentKeys + '.' , sectionKeys + '.' , value , valueKeysIfValueIsDottedTable);\n\t\t\t\tnewlineAfterDotted && this.appendNewline();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.appendInlineIf = getComment(table, tableKey);\n\t\t\t\tnewlineAfterPair && this.appendNewline();\n\t\t\t}\n\t\t}\n\t}\n\t\n\t value (indent , value , returnValueKeysIfValueIsDottedTable ) {\n\t\tswitch ( typeof value ) {\n\t\t\tcase 'object':\n\t\t\t\tif ( value===null ) {\n\t\t\t\t\tif ( this.document.nullDisabled ) { throw TypeError(`toml can not stringify \"null\" type value without truthy options.xNull`); }\n\t\t\t\t\tthis.appendInline = 'null';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst inlineMode = ofInline(value);\n\t\t\t\tif ( isArray(value) ) {\n\t\t\t\t\tif ( inlineMode===undefined ) { this.staticArray(indent, value); }\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst { $singlelineArray = inlineMode } = this.document;\n\t\t\t\t\t\tthis.singlelineArray(indent, value, $singlelineArray);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( inlineMode!==undefined ) {\n\t\t\t\t\tinlineMode || this.document.multilineTableDisabled\n\t\t\t\t\t\t? this.inlineTable(indent, value )\n\t\t\t\t\t\t: this.multilineTable(indent, value , this.document.multilineTableComma);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( isDate(value) ) {\n\t\t\t\t\tthis.appendInline = value.toISOString().replace('T', this.document.T).replace('Z', this.document.Z);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( _literal in value ) {\n\t\t\t\t\tconst literal = ( value )[_literal];\n\t\t\t\t\tif ( typeof literal==='string' ) { this.appendInline = literal; }\n\t\t\t\t\telse if ( isArray(literal) ) {\n\t\t\t\t\t\tconst { length } = literal;\n\t\t\t\t\t\tif ( length ) {\n\t\t\t\t\t\t\tthis.appendInline = literal[0];\n\t\t\t\t\t\t\tlet index = 1;\n\t\t\t\t\t\t\twhile ( index!==length ) { this.appendLine = literal[index++] ; }\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse { throw TypeError(`literal value is broken`); }\n\t\t\t\t\t}\n\t\t\t\t\telse { throw TypeError(`literal value is broken`); }\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( isString(value) ) { throw TypeError(`TOML.stringify refuse to handle [object String]`); }\n\t\t\t\tif ( isNumber(value) ) { throw TypeError(`TOML.stringify refuse to handle [object Number]`); }\n\t\t\t\tif ( isBigInt(value) ) { throw TypeError(`TOML.stringify refuse to handle [object BigInt]`); }\n\t\t\t\tif ( isBoolean(value) ) { throw TypeError(`TOML.stringify refuse to handle [object Boolean]`); }\n\t\t\t\tif ( returnValueKeysIfValueIsDottedTable ) {\n\t\t\t\t\tconst keys = getOwnPropertyNames(value );\n\t\t\t\t\tif ( keys.length ) { return keys; }\n\t\t\t\t\tthis.appendInline = '{ }';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.inlineTable(indent, value );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'bigint':\n\t\t\t\tthis.appendInline = '' + value;\n\t\t\t\tbreak;\n\t\t\tcase 'number':\n\t\t\t\tthis.appendInline = this.document.asInteger(value) ? is(value, -0) ? '-0' : '' + value : float(value);\n\t\t\t\tbreak;\n\t\t\tcase 'string':\n\t\t\t\tthis.appendInline = singlelineString(value);\n\t\t\t\tbreak;\n\t\t\tcase 'boolean':\n\t\t\t\tthis.appendInline = value ? 'true' : 'false';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow TypeError(`toml can not stringify \"${typeof value}\" type value`);\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t singlelineArray (indent , staticArray , inlineMode ) {\n\t\tconst { length } = staticArray;\n\t\tif ( length ) {\n\t\t\tthis.appendInline = inlineMode&0b10 ? '[ ' : '[';\n\t\t\tthis.value(indent, staticArray[0] , false);\n\t\t\tlet index = 1;\n\t\t\twhile ( index!==length ) {\n\t\t\t\tthis.appendInline = ', ';\n\t\t\t\tthis.value(indent, staticArray[index++] , false);\n\t\t\t}\n\t\t\tthis.appendInline = inlineMode&0b10 ? ' ]' : ']';\n\t\t}\n\t\telse { this.appendInline = inlineMode&0b01 ? '[ ]' : '[]'; }\n\t}\n\t staticArray (indent , staticArray ) {\n\t\tthis.appendInline = '[';\n\t\tconst indent_ = indent + this.document.indent;\n\t\tconst { length } = staticArray;\n\t\tlet index = 0;\n\t\twhile ( index!==length ) {\n\t\t\tthis.appendLine = indent_;\n\t\t\tthis.value(indent_, staticArray[index++] , false);\n\t\t\tthis.appendInline = ',';\n\t\t}\n\t\tthis.appendLine = indent + ']';\n\t}\n\t\n\t inlineTable (indent , inlineTable ) {\n\t\tconst keys = getOwnPropertyNames(inlineTable);\n\t\tif ( keys.length ) {\n\t\t\tthis.appendInline = '{ ';\n\t\t\tthis.assignInline(indent, inlineTable, ``, keys);\n\t\t\tthis[this.length - 1] = this[this.length - 1] .slice(0, -2) + ' }';\n\t\t}\n\t\telse { this.appendInline = '{ }'; }\n\t}\n\t multilineTable (indent , inlineTable , comma ) {\n\t\tthis.appendInline = '{';\n\t\tthis.assignMultiline(indent, inlineTable, ``, getOwnPropertyNames(inlineTable), comma);\n\t\tthis.appendLine = indent + '}';\n\t}\n\t assignInline (indent , inlineTable , keys_ , keys ) {\n\t\tfor ( const key of keys ) {\n\t\t\tconst value = inlineTable[key] ;\n\t\t\tconst keys = keys_ + $Key$(key);\n\t\t\tconst before_value = this.appendInline = $Keys(keys) + ' = ';\n\t\t\tconst valueKeysIfValueIsDottedTable = this.value(indent, value, true);\n\t\t\tif ( valueKeysIfValueIsDottedTable ) {\n\t\t\t\tthis[this.length - 1] = this[this.length - 1] .slice(0, -before_value.length);\n\t\t\t\tthis.assignInline(indent, value , keys + '.' , valueKeysIfValueIsDottedTable);\n\t\t\t}\n\t\t\telse { this.appendInline = ', '; }\n\t\t}\n\t}\n\t assignMultiline (indent , inlineTable , keys_ , keys , comma ) {\n\t\tconst indent_ = indent + this.document.indent;\n\t\tfor ( const key of keys ) {\n\t\t\tconst value = inlineTable[key] ;\n\t\t\tconst keys = keys_ + $Key$(key);\n\t\t\tthis.appendLine = indent_ + $Keys(keys) + ' = ';\n\t\t\tconst valueKeysIfValueIsDottedTable = this.value(indent_, value, true);\n\t\t\tif ( valueKeysIfValueIsDottedTable ) {\n\t\t\t\t--this.length;\n\t\t\t\tthis.assignMultiline(indent, value , keys + '.' , valueKeysIfValueIsDottedTable, comma);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcomma\n\t\t\t\t\t? this.appendInline = ',' + getComment(inlineTable, key)\n\t\t\t\t\t: this.appendInlineIf = getComment(inlineTable, key);\n\t\t\t}\n\t\t}\n\t}\n\t\n}\n\n \n\n \n ", + "import TypeError from '.TypeError';\nimport RangeError from '.RangeError';\nimport SyntaxError from '.SyntaxError';\nimport Array from '.Array';\nimport isSafeInteger from '.Number.isSafeInteger';\nimport MAX_SAFE_INTEGER from '.Number.MAX_SAFE_INTEGER';\nimport Null from '.null';\n\nimport { theRegExp } from '@ltd/j-regexp';\n\nimport TOMLSection from './section';\n\nconst name2code = /*#__PURE__*/Null({\n\tdocument: 0,\n\tsection: 1,\n\theader: 2,\n\tpairs: 3,\n\tpair: 4,\n} );\n\nconst { test: IS_INDENT } = theRegExp(/^[\\t ]*$/);\n\nconst return_false = () => false;\n\nexport default class TOMLDocument extends Array {\n\t\n\t get ['constructor'] () { return Array; }\n\t\n\t0 = new TOMLSection(this);\n\t\n\t asInteger = return_false;\n\t newline = '';\n\t newlineUnderSection = true;\n\t newlineUnderSectionButPair = true;\n\t newlineUnderHeader = true;\n\t newlineUnderPair = false;\n\t newlineUnderPairButDotted = false;\n\t newlineUnderDotted = false;\n\t indent = '\\t';\n\t T = 'T';\n\t Z = 'Z';\n\t nullDisabled = true;\n\t multilineTableDisabled = true;\n\t multilineTableComma ;\n\t preferCommentForThis = false;\n\t $singlelineArray ;\n\t\n\tconstructor (options ) {\n\t\t\n\t\tsuper();\n\t\t\n\t\tif ( options==null ) { return this; }\n\t\t\n\t\tconst { integer } = options;\n\t\tif ( integer===undefined ) {}\n\t\telse if ( integer===MAX_SAFE_INTEGER ) { this.asInteger = isSafeInteger; }\n\t\telse if ( typeof integer==='number' ) {\n\t\t\tif ( !isSafeInteger(integer) ) { throw RangeError(`TOML.stringify(,{integer}) can only be a safe integer`); }\n\t\t\tconst max = integer>=0 ? integer : -integer - 1;\n\t\t\tconst min = integer>=0 ? -integer : integer;\n\t\t\tthis.asInteger = (number ) => isSafeInteger(number) && min<=number && number<=max;\n\t\t}\n\t\telse { throw TypeError(`TOML.stringify(,{integer}) can only be number`); }\n\t\t\n\t\tconst { newline } = options;\n\t\tif ( newline===undefined ) {}\n\t\telse if ( newline==='\\n' || newline==='\\r\\n' ) { this.newline = newline; }\n\t\telse {\n\t\t\tthrow typeof newline==='string'\n\t\t\t\t? SyntaxError(`TOML.stringify(,{newline}) can only be valid TOML newline`)\n\t\t\t\t: TypeError(`TOML.stringify(,{newline}) can only be string`);\n\t\t}\n\t\t\n\t\tconst { preferCommentFor } = options;\n\t\tif ( preferCommentFor===undefined ) {}\n\t\telse if ( preferCommentFor==='this' || preferCommentFor==='key' ) { this.preferCommentForThis = preferCommentFor==='this'; }\n\t\telse { throw TypeError(`TOML.stringify(,{preferCommentFor) can only be 'key' or 'this'`); }\n\t\t\n\t\tconst { [options.newlineAround || 'header']: around = name2code.header } = name2code;\n\t\tthis.newlineUnderSection = around>0;\n\t\tthis.newlineUnderSectionButPair = around===1 || around===2;\n\t\tthis.newlineUnderHeader = around>1;\n\t\tthis.newlineUnderPair = around>2;\n\t\tthis.newlineUnderPairButDotted = around===3;\n\t\tthis.newlineUnderDotted = around>3;\n\t\t\n\t\tconst { indent } = options;\n\t\tif ( indent===undefined ) {}\n\t\telse if ( typeof indent==='string' ) {\n\t\t\tif ( !IS_INDENT(indent) ) { throw SyntaxError(`TOML.stringify(,{indent}) can only include Tab or Space`); }\n\t\t\tthis.indent = indent;\n\t\t}\n\t\telse if ( typeof indent==='number' ) {\n\t\t\tif ( !isSafeInteger(indent) ) { throw RangeError(`TOML.stringify(,{indent:${indent}}) is out of range`); }\n\t\t\tthis.indent = ' '.repeat(indent);\n\t\t}\n\t\telse { throw TypeError(`TOML.stringify(,{indent}) can not be \"${typeof indent}\" type`); }\n\t\t\n\t\tconst { T } = options;\n\t\tif ( T===undefined ) {}\n\t\telse if ( T===' ' || T==='t' || T==='T' ) { this.T = T; }\n\t\telse { throw TypeError(`TOML.stringify(,{T}) can only be \"T\" or \" \" or \"t\"`); }\n\t\t\n\t\tconst { Z } = options;\n\t\tif ( Z===undefined ) {}\n\t\telse if ( Z==='z' || Z==='Z' ) { this.Z = Z; }\n\t\telse { throw TypeError(`TOML.stringify(,{Z}) can only be \"Z\" or \"z\"`); }\n\t\t\n\t\tif ( options.xNull ) { this.nullDisabled = false; }\n\t\t\n\t\tconst { xBeforeNewlineInMultilineTable } = options;\n\t\tif ( xBeforeNewlineInMultilineTable===undefined ) {}\n\t\telse if ( xBeforeNewlineInMultilineTable==='' || xBeforeNewlineInMultilineTable===',' ) {\n\t\t\tthis.multilineTableDisabled = false;\n\t\t\tthis.multilineTableComma = !!xBeforeNewlineInMultilineTable;\n\t\t}\n\t\telse { throw TypeError(`TOML.stringify(,{xBeforeNewlineInMultilineTable}) can only be \"\" or \",\"`); }\n\t\t\n\t\tconst $singlelineArray = options.forceInlineArraySpacing;\n\t\tswitch ( $singlelineArray ) {\n\t\t\tcase undefined:\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\tcase 3:\n\t\t\t\tthis.$singlelineArray = $singlelineArray;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow typeof $singlelineArray==='number'\n\t\t\t\t\t? RangeError(`array inline mode must be 0 | 1 | 2 | 3, not including ${$singlelineArray}`)\n\t\t\t\t\t: TypeError(`array inline mode must be \"number\" type, not including ${$singlelineArray===null ? '\"null\"' : typeof $singlelineArray}`);\n\t\t}\n\t\t\n\t\treturn this;\n\t\t\n\t}\n\t\n\tappendSection () { return this[this.length] = new TOMLSection(this); }\n\t\n}\n\n ", + "import WeakSet from '.WeakSet';\nimport has from '.WeakSet.prototype.has';\nimport add from '.WeakSet.prototype.add';\nimport getOwnPropertyNames from '.Object.getOwnPropertyNames';\nimport freeze from '.Object.freeze';\nimport isArray from '.Array.isArray';\nimport Null from '.null';\n\nimport { x } from '../j-lexer';/// external\n\nimport TOMLDocument from './document';\nconst linesFromStringify = new WeakSet ();\nconst beLinesFromStringify = /*#__PURE__*/add.bind(linesFromStringify);\nexport const isLinesFromStringify = /*#__PURE__*/has.bind(linesFromStringify);\nexport default (rootTable , options ) => {\n\tconst document = new TOMLDocument(options);\n\tconst section = document[0];\n\tsection[0] = '';\n\tx (section.assignBlock(``, ``, rootTable, getOwnPropertyNames(rootTable)));\n\tdocument.newlineUnderSectionButPair && section.length!==1 && section.appendNewline();\n\tdocument.newlineUnderSection || document[document.length - 1] .appendNewline();\n\tif ( document.newline ) { return document.join(document.newline); }\n\tconst lines = document.flat();\n\tbeLinesFromStringify(lines);\n\treturn lines;\n};\n\nexport { inline, Section } from '../types/non-atom';\nexport { _literal } from '../types/atom';\nimport { LiteralObject } from '../types/atom';\nimport { multilineTable, multilineArray } from '../types/non-atom';\nimport { singlelineBasicString, Lines, multilineString, multilineBasicString, multilineLiteralString, multilineNeedBasic } from './string';\nexport const multiline = /*#__PURE__*/( () => {\n\tconst multiline = (value , string ) =>\n\t\ttypeof value==='string' ? LiteralObject(( multilineNeedBasic(value) ? multilineBasicString : multilineLiteralString )(( '\\n' + value ).split('\\n') ), value) :\n\t\t\tisArray(value) ? LiteralObject(multilineString(Lines(value)), typeof string==='string' ? string : Null(null)) :\n\t\t\t\tmultilineTable(value);\n\tmultiline.basic = (lines , string ) =>\n\t\ttypeof lines==='string'\n\t\t\t? LiteralObject(multilineBasicString(( '\\n' + lines ).split('\\n') ), lines)\n\t\t\t: LiteralObject(multilineBasicString(Lines(lines)), typeof string==='string' ? string : Null(null))\n\t;\n\tmultiline.array = multilineArray;\n\tfreeze(multiline);\n\treturn multiline;\n} )();\nexport const basic = (value ) => LiteralObject(singlelineBasicString(value), value);\nexport const literal = (literal , ...chars ) => {\n\tif ( typeof literal==='string' ) {\n\t\tif ( chars.length===1 ) {\n\t\t\treturn LiteralObject(literal.includes('\\n') ? literal.split('\\n') : literal, chars[0] );\n\t\t}\n\t}\n\telse {\n\t\tlet index = chars.length;\n\t\tif ( index ) {\n\t\t\tconst { raw } = literal;\n\t\t\tliteral = raw[index] ;\n\t\t\twhile ( index ) { chars[--index] += raw[index] ; }\n\t\t\tliteral = chars.join('') + literal;\n\t\t}\n\t\telse { literal = literal.raw[0] ; }\n\t}\n\treturn LiteralObject(literal.includes('\\n') ? literal.split('\\n') : literal, Null(null));\n};\n\n ", + "import Error from '.Error';\nimport TypeError from '.TypeError';\nimport isView from '.ArrayBuffer.isView';\nimport isArray from '.Array.isArray';\nimport assign from '.Object.assign';\nimport apply from '.Reflect.apply';\nimport undefined from '.undefined';\nimport Null from '.null';\nimport isArrayBuffer from '.class.isArrayBuffer';\nimport TextDecoder from '.TextDecoder';\n\nimport { clearRegExp, theRegExp } from '@ltd/j-regexp';\n\nimport * as iterator from '../iterator';\nimport * as options from '../options';\nimport Root from './level-loop';\nimport { isLinesFromStringify } from '../stringify/';\n\nconst textDecoder = /*#__PURE__*/new TextDecoder('utf-8', Null({ fatal: true, ignoreBOM: false }));\nconst binary2string = (arrayBufferLike ) => {\n\tif ( isView(arrayBufferLike) ? arrayBufferLike.length!==arrayBufferLike.byteLength : !isArrayBuffer(arrayBufferLike) ) { throw TypeError(`only Uint8Array or ArrayBuffer is acceptable`); }\n\ttry { return textDecoder.decode(arrayBufferLike); }\n\tcatch { throw Error(`A TOML doc must be a (ful-scalar) valid UTF-8 file, without any unknown code point.`); }\n};\nconst isBinaryLike = (value ) => 'byteLength' in value;///\n\nconst { test: includesNonScalar } = theRegExp(/[\\uD800-\\uDFFF]/u);\nconst assertFulScalar = (string ) => {\n\tif ( clearRegExp(includesNonScalar(string)) ) { throw Error(`A TOML doc must be a (ful-scalar) valid UTF-8 file, without any uncoupled UCS-4 character code.`); }\n};\n\nlet holding = false;\n\nconst parse = (source , specificationVersion , multilineStringJoiner , bigint , x , argsMode ) => {\n\tlet sourcePath = '';\n\tif ( typeof source==='object' && source ) {\n\t\tif ( isArray(source) ) { throw TypeError(isLinesFromStringify(source) ? `TOML.parse(array from TOML.stringify(,{newline?}))` : `TOML.parse(array)`); }\n\t\telse if ( isBinaryLike(source) ) { source = binary2string(source); }\n\t\telse {\n\t\t\tsourcePath = source.path;\n\t\t\tif ( typeof sourcePath!=='string' ) { throw TypeError(`TOML.parse(source.path)`); }\n\t\t\tconst { data, require: req = typeof require==='function' ? require : undefined } = source;\n\t\t\tif ( req ) {\n\t\t\t\tconst { resolve } = req;\n\t\t\t\tif ( resolve!=null ) {\n\t\t\t\t\tconst { paths } = resolve;\n\t\t\t\t\tif ( paths!=null ) {\n\t\t\t\t\t\tconst ret = apply(paths, resolve, [ '' ]);\n\t\t\t\t\t\tif ( ret!=null ) {\n\t\t\t\t\t\t\tconst val = ret[0];\n\t\t\t\t\t\t\tif ( val!=null ) {\n\t\t\t\t\t\t\t\tconst dirname_ = val.replace(/node_modules$/, '');\n\t\t\t\t\t\t\t\tif ( dirname_ ) {\n\t\t\t\t\t\t\t\t\tsourcePath = ( req )('path').resolve(dirname_, sourcePath);\n\t\t\t\t\t\t\t\t\tif ( typeof sourcePath!=='string' ) { throw TypeError(`TOML.parse(source.require('path').resolve)`); }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( data===undefined ) {\n\t\t\t\t\tconst data = ( req )('fs').readFileSync(sourcePath);\n\t\t\t\t\tif ( typeof data==='object' && data && isBinaryLike(data) ) { source = binary2string(data); }\n\t\t\t\t\telse { throw TypeError(`TOML.parse(source.require('fs').readFileSync)`); }\n\t\t\t\t}\n\t\t\t\telse if ( typeof data==='string' ) { assertFulScalar(source = data); }\n\t\t\t\telse if ( typeof data==='object' && data && isBinaryLike(data) ) { source = binary2string(data); }\n\t\t\t\telse { throw TypeError(`TOML.parse(source.data)`); }\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ( data===undefined ) { throw TypeError(`TOML.parse(source.data|source.require)`); }\n\t\t\t\telse if ( typeof data==='string' ) { assertFulScalar(source = data); }\n\t\t\t\telse if ( typeof data==='object' && data && isBinaryLike(data) ) { source = binary2string(data); }\n\t\t\t\telse { throw TypeError(`TOML.parse(source.data)`); }\n\t\t\t}\n\t\t}\n\t}\n\telse if ( typeof source==='string' ) { assertFulScalar(source); }\n\telse { throw TypeError(`TOML.parse(source)`); }\n\tlet joiner ;\n\tlet keys ;\n\tif ( typeof multilineStringJoiner==='object' && multilineStringJoiner ) {\n\t\tif ( bigint!==undefined || x!==undefined ) { throw TypeError(`options mode ? args mode`); }\n\t\tjoiner = multilineStringJoiner.joiner;\n\t\tbigint = multilineStringJoiner.bigint;\n\t\tkeys = multilineStringJoiner.keys;\n\t\tx = multilineStringJoiner.x;\n\t\targsMode = '';\n\t}\n\telse { joiner = multilineStringJoiner; }\n\tlet rootTable ;\n\tlet process ;\n\tif ( holding ) { throw Error(`parsing during parsing.`); }\n\tholding = true;\n\ttry {\n\t\toptions.use(specificationVersion, joiner, bigint, keys, x, argsMode);\n\t\titerator.todo(source, sourcePath);\n\t\tsource && source[0]==='\\uFEFF' && iterator.throws(TypeError(`TOML content (string) should not start with BOM (U+FEFF)` + iterator.where(' at ')));\n\t\trootTable = Root();\n\t\tprocess = options.Process();\n\t}\n\tfinally {\n\t\titerator.done();//clearWeakSets();\n\t\toptions.clear();\n\t\tholding = false;\n\t\tclearRegExp();\n\t}\n\tprocess && process();\n\treturn rootTable;\n};\n\nexport default /*#__PURE__*/assign(\n\t(source , specificationVersion , multilineStringJoiner , useBigInt , xOptions ) =>\n\t\ttypeof specificationVersion==='number'\n\t\t\t? parse(source, specificationVersion, multilineStringJoiner, useBigInt, xOptions, ',,')\n\t\t\t: parse(source, 1.0, specificationVersion , multilineStringJoiner , useBigInt , ',')\n\t,\n\t{\n\t\t'1.0': (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.1, multilineStringJoiner, useBigInt, xOptions, ','),\n\t\t1.0: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 1.0, multilineStringJoiner, useBigInt, xOptions, ','),\n\t\t0.5: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.5, multilineStringJoiner, useBigInt, xOptions, ','),\n\t\t0.4: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.4, multilineStringJoiner, useBigInt, xOptions, ','),\n\t\t0.3: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.3, multilineStringJoiner, useBigInt, xOptions, ','),\n\t\t0.2: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.2, multilineStringJoiner, useBigInt, xOptions, ','),\n\t\t0.1: (source , multilineStringJoiner , useBigInt , xOptions ) => parse(source, 0.1, multilineStringJoiner, useBigInt, xOptions, ','),\n\t}\n);\n\n \n\t \n\t \n\t \n\t\t \n\t\t \n\t\t\t \n\t\t \n\t\t \n\t\t\t \n\t\t \n\t \n \n\n \n", + "import version from './version?text';\n\nimport { Keys } from './options';\nimport parse from './parse/';\nimport stringify, { Section, inline, multiline, basic, literal } from './stringify/';\nimport { OffsetDateTime, LocalDateTime, LocalDate, LocalTime } from './types/Datetime';\nimport { isInline, isSection } from './types/non-atom';\nimport { commentFor, commentForThis } from './types/comment';\n\nimport Default from '.default';\nexport default /*#__PURE__*/Default({\n\tversion,\n\tparse,\n\tstringify,\n\tSection, inline, multiline, basic, literal, commentFor, commentForThis,\n\tOffsetDateTime, LocalDateTime, LocalDate, LocalTime,\n\tisInline, isSection,\n\tKeys,\n});\n\nexport {\n\tversion,\n\tparse,\n\tstringify,\n\tSection, inline, multiline, basic, literal, commentFor, commentForThis,\n\tOffsetDateTime, LocalDateTime, LocalDate, LocalTime,\n\tisInline, isSection,\n\tKeys,\n};\n" + ], + "names": + ["Test","bind","test","re","string","call","Exec","exec","__PURE__","source","unicode","ignoreCase","multiline","indexOf","dotAll","theRegExp","NT","ESCAPE","graveAccentReplacer","$$","includes","that","searchString","RE","template","U","this","I","M","S","raw","replace","index","length","arguments","value","value_source","TypeError","SyntaxError","RegExp","flags","RE_bind","Context","CONTEXT","newRegExp","Proxy","apply","thisArg","args","get","defineProperty","preventExtensions","y","context","d","g","i","s","u","freeze","clearRegExp$1","REGEXP","NEED_TO_ESCAPE_IN_REGEXP","SURROGATE_PAIR","GROUP","create","NULL","groupify","branches","uFlag","noEscape","group","appendBranch","appendPointBranch","appendCodeBranch","sourcify","branch","character","slice","charAt","needEscape","singleCharactersBranch","noEmptyBranch","sub_branches","push","unshift","join","newWeakMap","weakMap","WeakMap","has","set","target2keeper","proxy2target","target2proxy","handlers","Object_assign","Object_create","target","key","descriptor","hasOwn","Reflect_defineProperty","keeper","deleteProperty","Reflect_deleteProperty","copyWithin","ownKeys","construct","newTarget","orderify","Reflect_construct","Reflect_apply","newProxy","proxy","object","Reflect_ownKeys","Null","throwConstructing","throwApplying","Nullify","constructor","prototype","Object_freeze","Object_defineProperty","configurable","INLINES","SECTIONS","WeakSet","deInline","map_del","deSection","set_del","isInline","map_has","ofInline","map_get","beInline","map_set","multilineArray","isSection","set_has","beSection","set_add","tables","tables_add","add","isTable","implicitTables","implicitTables_add","implicitTables_del","del","DIRECTLY","IMPLICITLY","pairs","pairs_add","fromPair","PlainTable","isDirect","isInline$fromPair","super","OrderedTable","orderify_Null","NONE","sourcePath","sourceLines","lastLineIndex","lineIndex","throws","error","EOL","todo","path","split","mark","type","restColumn","must","where","nowrap","argsMode","Error","pre","rowIndex","columnNumber","done","Whitespace","PRE_WHITESPACE","valueOf","VALUE_REST_exec","LITERAL_STRING_exec","MULTI_LINE_LITERAL_STRING_0_1_2","MULTI_LINE_LITERAL_STRING_0","__MULTI_LINE_LITERAL_STRING_exec","SYM_WHITESPACE","Tag","KEY_VALUE_PAIR_exec","_VALUE_PAIR_exec","TAG_REST_exec","MULTI_LINE_BASIC_STRING","MULTI_LINE_BASIC_STRING_exec_0_length","_","lastIndex","ESCAPED_EXCLUDE_CONTROL_CHARACTER_TAB______","ESCAPED_EXCLUDE_CONTROL_CHARACTER__________","ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL______","ESCAPED_EXCLUDE_CONTROL_CHARACTER_DEL_SLASH","__ESCAPED_EXCLUDE_CONTROL_CHARACTER","ESCAPED_EXCLUDE_CONTROL_CHARACTER_test","BASIC_STRING_TAB______","BASIC_STRING__________","BASIC_STRING_DEL______","BASIC_STRING_DEL_SLASH","__BASIC_STRING","BASIC_STRING_exec_1_endIndex","line","iterator.throws","iterator.where","IS_DOT_KEY","DOT_KEY","BARE_KEY_STRICT","BARE_KEY_FREE","__BARE_KEY_exec","LITERAL_KEY____","LITERAL_KEY_DEL","__LITERAL_KEY_exec","supportArrayOfTables","TABLE_DEFINITION_exec_groups","lineRest","parseKeys","asArrayItem","leadingKeys","finalKey","tag","CONTROL_CHARACTER_EXCLUDE_TAB____","CONTROL_CHARACTER_EXCLUDE_TAB_DEL","__CONTROL_CHARACTER_EXCLUDE_test","NUM","IS_AMAZING","BAD_DXOB","isAmazing","keys","mustScalar","ARGS_MODE","useWhatToJoinMultilineString","usingBigInt","IntegerMinNumber","IntegerMaxNumber","ANY","Keys","maxLength","isKeys","isPrototypeOf","preserveLiteral","zeroDatetime","inlineTable","moreDatetime","disallowEmptyKey","sError","sFloat","Table","allowLonger","enableNull","allowInlineTableMultilineAndTrailingCommaEvenNoComma","preserveComment","disableDigit","KEYS","arrayTypes","arrayTypes_get","arrayTypes_set","As","as","array","got","AS_TYPED","asNulls","asStrings","asTables","asArrays","asBooleans","asFloats","asIntegers","asOffsetDateTimes","asLocalDateTimes","asLocalDates","asLocalTimes","asMixed","processor","each","collect_on","table","_each","_linked","collect_off","collect","previous","Symbol","x","rootStack","stack","result","next","_literal","LiteralObject","literal","Object","arrays","arrays_add","isArray","staticalArrays","staticalArrays_add","isStatic","newArray","fpc","c","_30_","_31_","_23_","_59_","YMD","HMS","Z_exec","OFFSET_DATETIME_exec","OFFSET_DATETIME_ZERO_exec","IS_LOCAL_DATETIME","IS_LOCAL_DATE","IS_LOCAL_TIME","T","DELIMITER_DOT","DOT_ZERO","ZERO","zeroReplacer","match","p1","Datetime","descriptors","NativeDate","Value","ISOString","d2u","validateLeap","startsWith","year","VALIDATE_LEAP","DATE","defineProperties","getOwnPropertyDescriptors","OffsetDateTime_ISOString","OffsetDateTime_value","OffsetDateTime_use","$","setTime","OffsetDateTime","toStringTag","toISOString","with60","without60","more","options.zeroDatetime","time","parse","padStart","ValueOFFSET","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","getUTCDay","getTimezoneOffset","z","getTime","floor","LocalDateTime_ISOString","LocalDateTime_value","LocalDateTime_get","start","end","LocalDateTime_set","size","RangeError","LocalDateTime","getFullYear","setFullYear","getMonth","setMonth","getDate","setDate","getHours","setHours","getMinutes","setMinutes","getSeconds","setSeconds","getMilliseconds","padEnd","setMilliseconds","LocalDate_ISOString","LocalDate_value","LocalDate_get","LocalDate_set","LocalDate","LocalTime_ISOString","LocalTime_value","LocalTime_get","LocalTime_set","LocalTime","ESCAPED_IN_SINGLE_LINE","ESCAPED_IN_MULTI_LINE","BasicString","parts","part","charCode","parseInt","options.mustScalar","fromCharCode","codePoint","fromCodePoint","MultilineBasicString","n","iterator.lineIndex","INTEGER_D","BAD_D","IS_D_INTEGER","IS_XOB_INTEGER","BAD_XOB","UNDERSCORES","UNDERSCORES_SIGN","IS_INTEGER","MIN","BigInt","MAX","Integer","options.usingBigInt","bigInt","options.allowLonger","BigIntInteger","number","isSafeInteger","NumberInteger","options.IntegerMinNumber","options.IntegerMaxNumber","_Infinity","IS_FLOAT","IS_ZERO","NORMALIZED","ORIGINAL","Float","options.sFloat","Infinity","options.sError","withoutUnderscores","isFinite","normalized_integer","normalized_fractional","normalized_exponent","original_integer","original_fractional","original_exponent","prepareTable","options.Table","appendTable","lastTable","arrayOfTables","options.collect","directlyIfNot","prepareInlineTable","checkLiteralString","regexps.__CONTROL_CHARACTER_EXCLUDE_test","assignLiteralString","regexps.LITERAL_STRING_exec","options.preserveLiteral","regexps.__MULTI_LINE_LITERAL_STRING_exec","iterator.mark","leadingNewline","options.useWhatToJoinMultilineString","options.ARGS_MODE","lines","assignBasicString","regexps.BASIC_STRING_exec_1_endIndex","regexps.PRE_WHITESPACE","regexps.MULTI_LINE_BASIC_STRING_exec_0_length","regexps.ESCAPED_EXCLUDE_CONTROL_CHARACTER_test","skipped","commentFor","commentForThis","includesNewline","getCOMMENT","keyComment","comment","getComment","IS_OFFSET$","IS_EMPTY","rest","options.KEYS","isQuoted","regexps.__LITERAL_KEY_exec","regexps.__BARE_KEY_exec","regexps.IS_DOT_KEY","regexps.DOT_KEY","options.disableDigit","regexps.isAmazing","options.enableNull","options.disallowEmptyKey","lastArray","regexps._VALUE_PAIR_exec","undefined","options.asStrings","options.inlineTable","equalInlineTable","options.asTables","equalStaticArray","options.asArrays","regexps.VALUE_REST_exec","options.asBooleans","options.asNulls","options.asOffsetDateTimes","options.moreDatetime","options.asLocalDateTimes","options.asLocalTimes","lastIndexOf","options.asLocalDates","options.asFloats","options.asIntegers","staticArray","regexps.SYM_WHITESPACE","inline","options.allowInlineTableMultilineAndTrailingCommaEvenNoComma","forComment","ForComment","assign","options.preserveComment","lastInlineTable","regexps.KEY_VALUE_PAIR_exec_groups","Root","rootTable","lastSectionTable","regexps.TABLE_DEFINITION_exec_groups","ESCAPED","fromEntries","Array","map","toString","toUpperCase","NEED_BASIC","BY_ESCAPE","NEED_ESCAPE","singlelineString","NEED_MULTILINE_BASIC","multilineNeedBasic","REAL_MULTILINE_ESCAPE","BY_MULTILINE_ESCAPE","NEED_MULTILINE_ESCAPE","escape_multiline","Lines","multilineBasicString","multilineLiteralString","INTEGER_LIKE","ensureFloat","float64Array","Float64Array","uint8Array","Uint8Array","buffer","NaN_7","float","is","isDate","BARE","$Key$","FIRST","literalString","$Keys","TOMLSection","document","toPrimitive","newline","appendNewline","appendLine","appendInline","appendInlineIf","assignBlock","documentKeys_","sectionKeys_","tableKeys","newlineUnderHeader","newlineUnderSectionButPair","newlineAfterDotted","newlineUnderPairButDotted","newlineAfterPair","newlineUnderDotted","newlineUnderPair","tableKey","$key$","documentKeys","firstItem","tableHeader","section","appendSection","getOwnPropertyNames","preferCommentForThis","sectionKeys","valueKeysIfValueIsDottedTable","indent","returnValueKeysIfValueIsDottedTable","nullDisabled","inlineMode","$singlelineArray","singlelineArray","multilineTableDisabled","multilineTable","multilineTableComma","Z","isString","isNumber","isBigInt","isBoolean","asInteger","indent_","assignInline","comma","assignMultiline","keys_","before_value","name2code","header","pair","IS_INDENT","return_false","TOMLDocument","newlineUnderSection","options","integer","MAX_SAFE_INTEGER","max","min","preferCommentFor","newlineAround","around","repeat","xNull","xBeforeNewlineInMultilineTable","forceInlineArraySpacing","linesFromStringify","beLinesFromStringify","isLinesFromStringify","multilineString","basic","textDecoder","TextDecoder","fatal","ignoreBOM","binary2string","arrayBufferLike","isView","byteLength","isArrayBuffer","decode","isBinaryLike","includesNonScalar","assertFulScalar","clearRegExp","holding","specificationVersion","multilineStringJoiner","bigint","joiner","process","data","require","req","resolve","paths","ret","val","dirname_","readFileSync","useBigInt","xOptions","mixed","regexps.switchRegExp","order","longer","exact","null","_null","multi","unknown","unknownNames","options.use","iterator.todo","_processor","options.Process","iterator.done","Default","version","stringify","flat","Section","mode","looping","singlelineBasicString","chars"], + "mappings": + "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" +} \ No newline at end of file diff --git a/v2realbot/static/js/libs/j-toml/j-toml.min.js.map.gz b/v2realbot/static/js/libs/j-toml/j-toml.min.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..f250cbf390c991ba1331c31a10078c836bbba310 GIT binary patch literal 56486 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 literal 0 HcmV?d00001 diff --git a/v2realbot/static/js/livewebsocket.js b/v2realbot/static/js/livewebsocket.js index cb826ad..6f90db6 100644 --- a/v2realbot/static/js/livewebsocket.js +++ b/v2realbot/static/js/livewebsocket.js @@ -23,6 +23,7 @@ function populate_rt_status_header(runnerId) { success:function(data){ //console.log(JSON.stringify(data)) //add status on chart + $("#statusArchId").text(data.id) $("#statusRegime").text("REALTIME: "+data.id) $("#statusName").text(data.run_name) $("#statusMode").text(data.run_mode) diff --git a/v2realbot/static/js/mytables.js b/v2realbot/static/js/mytables.js index 336fcfe..3d181fc 100644 --- a/v2realbot/static/js/mytables.js +++ b/v2realbot/static/js/mytables.js @@ -50,8 +50,8 @@ function refresh_stratin_and_callback(row, callback) { contentType: "application/json", dataType: "json", success:function(data){ - console.log("fetched data ok") - console.log(JSON.stringify(data,null,2)); + //console.log("fetched data ok") + //console.log(JSON.stringify(data,null,2)); }, error: function(xhr, status, error) { var err = eval("(" + xhr.responseText + ")"); @@ -65,7 +65,7 @@ function refresh_stratin_and_callback(row, callback) { // Both requests have completed successfully //console.log("Result from request:", result); - console.log("calling calbback") + //console.log("calling calbback") //call callback function callback(response) @@ -236,19 +236,19 @@ $(document).ready(function () { filterList[i] = filterList[i].trim(); } - console.log("filter list") - console.log(filterList) - console.log(minsize) + //console.log("filter list") + //console.log(filterList) + //console.log(minsize) var row = "" //zakrouhleno na milisekundy var puvodni = parseFloat(parseInt(parseFloat($('#trade-timestamp').val())*1000))/1000 - console.log(puvodni) + //console.log(puvodni) $('#trades-data-table').html(row); data.forEach((tradeLine) => { //console.log(JSON.stringify(tradeLine)) date = new Date(tradeLine.timestamp) timestamp = date.getTime()/1000 - console.log(timestamp) + //console.log(timestamp) //trade contains filtered condition or size a.time > b.time ? 1 : -1; - +var ind_editor = null var indConfig = null settings = {} settings @@ -56,6 +58,13 @@ var indConfig_default = [ {name: "ema", titlevisible: false, embed: true, displa {name: "sec_price", titlevisible: true, embed: true, display: true, priceScaleId: "right", lastValueVisible: false},] //console.log(JSON.stringify(indConfig_default, null,null, 2)) +function store_activated_buttons_state() { + activatedButtons = [] + //ulozime si stav aktivovaných buttonků před změnou - mozna do sluzby + $('#indicatorsButtons .switcher-active-item').each(function() { + activatedButtons.push($(this).text()); + }); +} function initialize_statusheader() { @@ -132,9 +141,11 @@ function initialize_statusheader() { } - +//pokud neni v configuraci vracime default function get_ind_config(indName) { + def = {name: "ema", titlevisible: false, embed: true, display: true, priceScaleId: "middle", lastValueVisible: false} + if (indConfig == null) { indConfig = get_from_config("indConfig", indConfig_default) } @@ -144,7 +155,7 @@ function get_ind_config(indName) { { return indConfig[i] } - return null + return def } function toggle_vertical_line(time) { @@ -328,25 +339,183 @@ function remove_indicator_buttons() { elem1.remove() } +//pomocna funkce pro vytvoreni buttonu indiaktoru +function create_indicator_button(item, index, def) { + // //div pro kazdy button + // var buttonContainer = document.createElement('div'); + // buttonContainer.classList.add('button-container'); + + var itemEl = document.createElement('button'); + itemEl.innerText = item.name; + itemEl.id = "IND"+index; + itemEl.title = item.cnf + itemEl.style.color = item.series.options().color; + //pokud jde o pridanou on the fly - vybarvime jinak + if (item.added) { + itemEl.style.outline = "solid 1px" + } + itemEl.classList.add('switcher-item'); + if (def) { + itemEl.classList.add('switcher-active-item'); + } + + // //jeste vytvorime pod tim overlay a nad to az dame linky + // // Create the overlay element. + // const overlay = document.createElement("div"); + // overlay.id = "OVR"+index; + // overlay.classList.add("overlayLayer"); + // overlay.classList.add("hidden"); + + // // Create the action buttons. + // const actionShow = document.createElement("div"); + // actionShow.id = "actionShow"; + // actionShow.textContent = "Show"; + + itemEl.addEventListener('click', function() { + onItemClickedToggle(index); + }); + + // const actionEdit = document.createElement("div"); + // actionEdit.id = "actionEdit"; + // actionEdit.textContent = "Edit"; + + itemEl.addEventListener('contextmenu', function(e) { + //edit modal zatim nemame + onItemClickedEdit(e, index); + }); + + // // Append the action buttons to the overlay. + // overlay.appendChild(actionShow); + // overlay.appendChild(actionEdit); + + // // Add a hover listener to the button. + // itemEl.addEventListener("mouseover", toggleOverlay(index)); + // itemEl.addEventListener("mouseout", toggleOverlay(index)); + + // buttonContainer.appendChild(itemEl) + // buttonContainer.appendChild(overlay) + return itemEl +} + +//pomocne funkce +function onResetClicked() { + indList.forEach(function (item, index) { + vis = true; + const elem = document.getElementById("IND"+index); + if (elem.classList.contains("switcher-active-item")) { + vis = false; + } + elem.classList.toggle("switcher-active-item"); + if (indList[index].series) { + indList[index].series.applyOptions({ + visible: vis }); + } + }) +} + + +function generateIndicators(e) { + alert("stratvars generated to clipboard from selected indicators") +} + +//editace indikatoru, vcetne vytvoreni noveho +function onItemClickedEdit(e, index) { + if (ind_editor) { + ind_editor.dispose() + } + title = `#[stratvars.indicators.name] + ` + const elem = document.getElementById("IND"+index); + //console.log("element",elem) + //jde o update + if (elem) { + elem.classList.replace('switcher-item', 'switcher-item-highlighted'); + $('#indicatorName').val(elem.textContent) + $('#indicatorNameTitle').text(elem.textContent) + title = elem.title + } + //jde o novy zaznam - davame pryc delete + else { + $('#deleteIndicatorButton').hide(); + } + e.preventDefault() + //$('#stratvar_id').val(row.id); + $('#indicatorId').val(index) + + require(["vs/editor/editor.main"], () => { + ind_editor = monaco.editor.create(document.getElementById('indicatorTOML_editor'), { + value: title, + language: 'toml', + theme: 'tomlTheme-dark', + automaticLayout: true + }); + }); + window.$('#indicatorModal').modal('show'); +} + +//togle profit line +function profitLineToggle() { + vis = true; + const elem = document.getElementById("profitLine"); + if (elem.classList.contains("switcher-active-item")) { + vis = false; + } + elem.classList.toggle("switcher-active-item"); + //v ifu kvuli workaroundu + if (profitLine) { + profitLine.applyOptions({ + visible: vis }); + } +} + + +//toggle indiktoru +function onItemClickedToggle(index) { + vis = true; + const elem = document.getElementById("IND"+index); + if (elem.classList.contains("switcher-active-item")) { + vis = false; + } + elem.classList.toggle("switcher-active-item"); + //v ifu kvuli workaroundu + if (indList[index].series) { + indList[index].series.applyOptions({ + visible: vis }); + } + //zatim takto workaround, pak vymyslet systemove pro vsechny tickbased indikatory + if (indList[index].name == "tick_price") { + if (!vis && indList[index].series) { + chart.removeSeries(indList[index].series) + chart.timeScale().fitContent(); + indList[index].series = null + } + } + +} + +//funkce pro vytvoreni buttonku indikatoru function populate_indicator_buttons(def) { + + //vytvoreni outer button divu var buttonElement = document.createElement('div'); buttonElement.id = "indicatorsButtons" buttonElement.classList.add('switcher'); + //iterace nad indikatory a vytvareni buttonků indList.forEach(function (item, index) { - var itemEl = document.createElement('button'); - itemEl.innerText = item.name; - itemEl.id = "IND"+index; - itemEl.title = item.cnf - itemEl.style.color = item.series.options().color; - itemEl.classList.add('switcher-item'); - if (def) { - itemEl.classList.add('switcher-active-item'); + index_ind = index + active = false + + //console.log("activatedButtons", activatedButtons) + //console.log("obsahuje item.name", activatedButtons.includes(item.name), item.name) + //pokud existuje v aktivnich pak + if ((activatedButtons) && (activatedButtons.includes(item.name))) { + active = true } - itemEl.addEventListener('click', function() { - onItemClicked1(index); - }); - buttonElement.appendChild(itemEl); + //vytvoreni buttonku + itemEl = create_indicator_button(item, index, def||active); + //prirazeni do divu + buttonElement.appendChild(itemEl); ; }); //create toggle all button @@ -361,51 +530,47 @@ function populate_indicator_buttons(def) { }); buttonElement.appendChild(itemEl); - function onResetClicked() { - indList.forEach(function (item, index) { - vis = true; - const elem = document.getElementById("IND"+index); - if (elem.classList.contains("switcher-active-item")) { - vis = false; - } - elem.classList.toggle("switcher-active-item"); - if (indList[index].series) { - indList[index].series.applyOptions({ - visible: vis }); - } - }) - } + //button pro toggle profitu + var itemEl = document.createElement('button'); + itemEl.innerText = "prof" + itemEl.classList.add('switcher-item'); + itemEl.style.color = "#99912b" + itemEl.id = "profitLine" + itemEl.addEventListener('click', function(e) { + profitLineToggle(); + }); + buttonElement.appendChild(itemEl); - function onItemClicked1(index) { - vis = true; - const elem = document.getElementById("IND"+index); - if (elem.classList.contains("switcher-active-item")) { - vis = false; - } - elem.classList.toggle("switcher-active-item"); - //v ifu kvuli workaroundu - if (indList[index].series) { - indList[index].series.applyOptions({ - visible: vis }); - } - //zatim takto workaround, pak vymyslet systemove pro vsechny tickbased indikatory - if (indList[index].name == "tick_price") { - if (!vis && indList[index].series) { - chart.removeSeries(indList[index].series) - chart.timeScale().fitContent(); - indList[index].series = null - } - } + //create plus button to create new button + var itemEl = document.createElement('button'); + itemEl.innerText = "+" + itemEl.classList.add('switcher-item'); + //na tomto je navesena jquery pro otevreni modalu + itemEl.id = "button_addindicator" + itemEl.addEventListener('click', function(e) { + index_ind++ + onItemClickedEdit(e, index_ind); + }); + buttonElement.appendChild(itemEl); + //save indicator buttons - will generate indicators to stratvars + var itemEl = document.createElement('button'); + itemEl.innerText = "generate" + itemEl.classList.add('switcher-item'); + //na tomto je navesena jquery pro otevreni modalu + itemEl.id = "save_indicators" + itemEl.addEventListener('click', function(e) { + index_ind++ + generateIndicators(e); + }); + buttonElement.appendChild(itemEl); - - } - return buttonElement; + return buttonElement; } //range switch pro chart https://jsfiddle.net/TradingView/qrb9a850/ -function createSimpleSwitcher(items, activeItem, activeItemChangedCallback) { +function createSimpleSwitcher(items, activeItem, activeItemChangedCallback, data) { var switcherElement = document.createElement('div'); switcherElement.classList.add('switcher'); @@ -432,7 +597,7 @@ function createSimpleSwitcher(items, activeItem, activeItemChangedCallback) { activeItem = item; - activeItemChangedCallback(item); + activeItemChangedCallback(item, data); } return switcherElement; @@ -485,6 +650,7 @@ function format_date(datum, markettime = false, timeonly = false) { } function clear_status_header() { + $("#statusArchId").text("") $("#statusRegime").text("") $("#statusName").text("") $("#statusMode").text("") diff --git a/v2realbot/static/main.css b/v2realbot/static/main.css index 6f12c15..f25de77 100644 --- a/v2realbot/static/main.css +++ b/v2realbot/static/main.css @@ -372,12 +372,64 @@ pre { /* color: var(--bs-dark-text-emphasis); */ /* } */ + +.overlayLayer { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: inline-table; + justify-content: center; + align-items: center; + background-color: rgba(0, 0, 0, 0.5); + opacity: 0; + transition: opacity 0.3s; + /* z-index: 2; */ +} + + +.actionText { + color: white; +} + + + + +/* #indicatorModal { + position: absolute; + top: 10px; + left: 10px; + z-index: 1000; +} */ + .highlighted { color: #989393; background-color: #242a31; /* color: var(--bs-dark-text-emphasis); */ } +.switcher-item-highlighted { + position: relative; + z-index: 1; + /* cursor: pointer; */ + text-decoration: double; + display: inline-block; + padding: 1px 6px; + font-size: 14px; + /* color: #262b3e; */ + /* background-color: #818581; */ + background-color: #0202022e; + margin-right: 8px; + margin-bottom: 6px; + /* border: 1px; */ + border-radius: 4px; + outline: solid 1px; + outline-color: #73df4d; + /* outline-width: 1px; */ + border-style: none; +} + /* .switcher { display: flex; align-items: center; @@ -426,7 +478,15 @@ pre { outline: none; } */ +.button-container { + position: relative; + display: inline-block; + margin-bottom: 10px; +} + .switcher-item { + position: relative; + z-index: 1; /* cursor: pointer; */ text-decoration: double; display: inline-block; @@ -445,6 +505,10 @@ pre { border-style: none; } +.switcher-item:hover + .overlayLayer { + opacity: 1; +} + .switcher-item:hover { background-color: #f2f3f521; } diff --git a/v2realbot/strategy/StrategyClassicSL.py b/v2realbot/strategy/StrategyClassicSL.py index 90d3b70..ae88dba 100644 --- a/v2realbot/strategy/StrategyClassicSL.py +++ b/v2realbot/strategy/StrategyClassicSL.py @@ -104,13 +104,13 @@ class StrategyClassicSL(Strategy): rel_profit = 0 #spoctene celkovy relativni profit za trade v procentech ((trade_profit/vstup_naklady)*100) if vstup_cena != 0 and int(data.order.qty) != 0: - rel_profit = (trade_profit / (vstup_cena * float(data.order.qty))) * 100 + rel_profit = round((trade_profit / (vstup_cena * float(data.order.qty))) * 100,5) #pokud jde o finalni FILL - pridame do pole tento celkovy relativnich profit (ze ktereho se pocita kumulativni relativni profit) rel_profit_cum_calculated = 0 if data.event == TradeEvent.FILL: self.state.rel_profit_cum.append(rel_profit) - rel_profit_cum_calculated = np.mean(self.state.rel_profit_cum) + rel_profit_cum_calculated = round(np.mean(self.state.rel_profit_cum),5) self.state.ilog(e=f"BUY notif - SHORT PROFIT:{round(float(trade_profit),3)} celkem:{round(float(self.state.profit),3)} rel:{float(rel_profit)} rel_cum:{round(rel_profit_cum_calculated,7)}", msg=str(data.event), rel_profit_cum=str(self.state.rel_profit_cum), bought_amount=bought_amount, avg_costs=avg_costs, trade_qty=data.qty, trade_price=data.price, orderid=str(data.order.id)) @@ -216,13 +216,13 @@ class StrategyClassicSL(Strategy): rel_profit = 0 #spoctene celkovy relativni profit za trade v procentech ((trade_profit/vstup_naklady)*100) if vstup_cena != 0 and data.order.qty != 0: - rel_profit = (trade_profit / (vstup_cena * float(data.order.qty))) * 100 + rel_profit = round((trade_profit / (vstup_cena * float(data.order.qty))) * 100,5) rel_profit_cum_calculated = 0 #pokud jde o finalni FILL - pridame do pole relativnich profit (ze ktereho se pocita kumulativni relativni profit) if data.event == TradeEvent.FILL: self.state.rel_profit_cum.append(rel_profit) - rel_profit_cum_calculated = np.mean(self.state.rel_profit_cum) + rel_profit_cum_calculated = round(np.mean(self.state.rel_profit_cum),5) self.state.ilog(e=f"SELL notif - PROFIT:{round(float(trade_profit),3)} celkem:{round(float(self.state.profit),3)} rel:{float(rel_profit)} rel_cum:{round(rel_profit_cum_calculated,7)}", msg=str(data.event), rel_profit_cum = str(self.state.rel_profit_cum), sold_amount=sold_amount, avg_costs=avg_costs, trade_qty=data.qty, trade_price=data.price, orderid=str(data.order.id)) diff --git a/v2realbot/strategy/base.py b/v2realbot/strategy/base.py index c2d6405..bc2130c 100644 --- a/v2realbot/strategy/base.py +++ b/v2realbot/strategy/base.py @@ -692,7 +692,7 @@ class StrategyState: self.bars = AttributeDict(bars) self.trades = AttributeDict(trades) self.indicators = AttributeDict(time=[]) - #pro mapping indikatoru pro pouziti v operation statementu + #pro mapping indikatoru pro pouziti v operation expressionu self.ind_mapping = {} self.cbar_indicators = AttributeDict(time=[]) #secondary timeframe indicators diff --git a/v2realbot/strategyblocks/indicators/RSI.py b/v2realbot/strategyblocks/indicators/RSI.py index 759a563..7b37efc 100644 --- a/v2realbot/strategyblocks/indicators/RSI.py +++ b/v2realbot/strategyblocks/indicators/RSI.py @@ -3,6 +3,8 @@ from v2realbot.strategy.base import StrategyState from v2realbot.indicators.indicators import ema, natr, roc from v2realbot.indicators.oscillators import rsi from traceback import format_exc +from v2realbot.strategyblocks.indicators.helpers import get_source_series + #RSI INDICATOR # type = RSI, source = [close, vwap, hlcc4], rsi_length = [14], MA_length = int (optional), on_confirmed_only = [true, false] # pokud existuje MA, vytvarime i stejnojnojmenny MAcko @@ -19,16 +21,14 @@ def populate_dynamic_RSI_indicator(data, state: StrategyState, name): #poustet kazdy tick nebo jenom na confirmed baru (on_confirmed_only = true) on_confirmed_only = safe_get(options, 'on_confirmed_only', False) - req_source = safe_get(options, 'source', 'vwap') - if req_source not in ["close", "vwap","hlcc4"]: - state.ilog(lvl=1,e=f"Unknown source error {req_source} for {name}") - return - rsi_length = int(safe_get(options, "RSI_length",14)) + req_source = safe_get(options, 'source', 'vwap') + rsi_length = int(safe_get(options, "length",14)) rsi_MA_length = safe_get(options, "MA_length", None) if on_confirmed_only is False or (on_confirmed_only is True and data['confirmed']==1): try: - source = state.bars[req_source] + #source = state.bars[req_source] + source = get_source_series(state, req_source) #cekame na dostatek dat if len(source) > rsi_length: rsi_res = rsi(source, rsi_length) diff --git a/v2realbot/strategyblocks/indicators/custom/_upscaled_rsi_wip.py b/v2realbot/strategyblocks/indicators/custom/_upscaled_rsi_wip.py index 49f79f3..a93d6f5 100644 --- a/v2realbot/strategyblocks/indicators/custom/_upscaled_rsi_wip.py +++ b/v2realbot/strategyblocks/indicators/custom/_upscaled_rsi_wip.py @@ -25,6 +25,8 @@ def upscaledrsi(state, params): #pokud potrebuju jen close nebo open muzu pouzit toto # vezme to N-th element z pole + + #TODO resample any series def resample_close_prices(bars, new_resolution): # Check that the new resolution is a multiple of the old resolution. if new_resolution % bars['resolution'][-1] != 0: diff --git a/v2realbot/strategyblocks/indicators/custom/basestats.py b/v2realbot/strategyblocks/indicators/custom/basestats.py index 50d8cf2..309ad19 100644 --- a/v2realbot/strategyblocks/indicators/custom/basestats.py +++ b/v2realbot/strategyblocks/indicators/custom/basestats.py @@ -7,6 +7,7 @@ from traceback import format_exc from v2realbot.ml.ml import ModelML import numpy as np from collections import defaultdict +from scipy.stats import linregress #vstupem je bud indicator nebo bar parametr #na tomto vstupu dokaze provest zakladni statisticke funkce pro subpole X hodnot zpatky @@ -61,6 +62,26 @@ def basestats(state, params): #val = 2 * (angle_deg / 180) - 1 elif func =="stdev": val = np.std(source_array) + #linregres slope + elif func == "slope": + if len(source_array) < 4: + return -2, "less than 4 elmnts" + try: + np.seterr(all="raise") + val, _, _, _, _ = linregress(np.arange(len(source_array)), source_array) + val = round(val, 4) + except FloatingPointError: + return -2, "FloatingPointError" + #zatim takto, dokud nebudou podporovany indikatory s vice vystupnimi + elif func == "intercept": + if len(source_array) < 4: + return -2, "less than 4 elmnts" + try: + np.seterr(all="raise") + _, val, _, _, _ = linregress(np.arange(len(source_array)), source_array) + val = round(val, 4) + except FloatingPointError: + return -2, "FloatingPointError" else: return -2, "wrong function" diff --git a/v2realbot/strategyblocks/indicators/custom/statement.py b/v2realbot/strategyblocks/indicators/custom/expression.py similarity index 78% rename from v2realbot/strategyblocks/indicators/custom/statement.py rename to v2realbot/strategyblocks/indicators/custom/expression.py index 6e8e91a..52a2fd9 100644 --- a/v2realbot/strategyblocks/indicators/custom/statement.py +++ b/v2realbot/strategyblocks/indicators/custom/expression.py @@ -2,17 +2,17 @@ from v2realbot.utils.utils import isrising, isfalling,zoneNY, price2dec, print, from v2realbot.strategy.base import StrategyState import numpy as np -#allows executing a statement - pozor neni sanitized a zatim se spousti i v globalni scopu +#allows executing a expression - pozor neni sanitized a zatim se spousti i v globalni scopu #v pripade jineho nez soukromeho uziti zabezpecit #do budoucna prozkoumat NUMEXPR - ten omezuje jen na operatory a univerzalni funkce #eval nyni umi i user-defined function, string operation and control statements #teroeticky se dá pouzit i SYMPY - kde se daji vytvorit jednotlive symboly s urcitou funkcni -def statement(state: StrategyState, params): - funcName = "statement" +def expression(state: StrategyState, params): + funcName = "expression" #indicator name - operation = safe_get(params, "statement", None) + operation = safe_get(params, "expression", None) if operation is None : return -2, "required param missing" @@ -20,7 +20,7 @@ def statement(state: StrategyState, params): state.ilog(lvl=1,e=f"BEFORE {funcName} {operation=}", **params) #pro zacatek eval - val = eval(operation, None, state.ind_mapping) + val = eval(operation, {'state': state}, state.ind_mapping) if not np.isfinite(val): diff --git a/v2realbot/strategyblocks/indicators/custom/ma.py b/v2realbot/strategyblocks/indicators/custom/ma.py index 2de3c9b..1489d13 100644 --- a/v2realbot/strategyblocks/indicators/custom/ma.py +++ b/v2realbot/strategyblocks/indicators/custom/ma.py @@ -10,7 +10,7 @@ from collections import defaultdict from v2realbot.strategyblocks.indicators.helpers import value_or_indicator -#IMPLEMENTS different types of moving averages +#IMPLEMENTS different types of moving averages in package v2realbot.indicators.moving_averages def ma(state, params): funcName = "ma" type = safe_get(params, "type", "ema")