Skip to content

Commit

Permalink
Pull request #5275: Feature/DXCF-5463
Browse files Browse the repository at this point in the history
Merge in DXCHARTS/dxchart5 from feature/DXCF-5463 to master

* commit 'd6272b239d505e648a78aca6396d0a46a4ab2b1f':
  DXCF-5463 // chore: updated package versions
  [DXCF-5463] [DXREQ-23641] Switching to using candle identifiers // copyright fix
  [DXCF-5463] [DXREQ-23641] Switching to using candle identifiers // init

GitOrigin-RevId: 5a5071511a518972205f86c1f3084c97497e371b
  • Loading branch information
disyakidneyshot authored and dxcity committed Nov 19, 2024
1 parent 5bba94e commit 031cb6e
Show file tree
Hide file tree
Showing 188 changed files with 281 additions and 369 deletions.
8 changes: 4 additions & 4 deletions docs/codesandbox/cli/model/html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ interface HTMLImport {

export const isHTMLFile = (filepath: string) => getFileName(filepath)?.includes('html') ?? false;

export const combineRelativeParsedImportToAbsolute = (htmlFile: string, originalFilepath: string) =>
export const combineRelativeParsedImportToAbsolute = (htmlFile: string, originalFilepath: string) =>
path.resolve(htmlFile, `../${originalFilepath}`);

export const parseHTMLImports = (htmlFilepath: string, html: string): HTMLImport[] => {
Expand Down Expand Up @@ -87,9 +87,9 @@ export const HTMLFilesToCSBPayload = (htmlFiles: string[]): CodeSandboxPayload =

const htmlContent = getFileContent(htmlFile);
const parsedHTMLImports = parseHTMLImports(htmlFile, htmlContent);
const csbPayloadFromHTMLImports = filesToCSBPayload(
parsedHTMLImports.map(i => combineRelativeParsedImportToAbsolute(htmlFile, i.originalFilepath)),
);
const csbPayloadFromHTMLImports = filesToCSBPayload(parsedHTMLImports.map(i =>
combineRelativeParsedImportToAbsolute(htmlFile, i.originalFilepath)
));
htmlCSBPayload = concatCSBPayload(htmlCSBPayload, csbPayloadFromHTMLImports);

const htmlContentWithNewImports = replaceHTMLImports(htmlContent, parsedHTMLImports);
Expand Down
1 change: 1 addition & 0 deletions docs/how-to/custom-drawer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ List of default drawer types:
'HIT_TEST_DRAWINGS',
'GRID',
'VOLUMES',
'UNDERLAY_VOLUMES_AREA',
'X_AXIS',
'Y_AXIS',
'HIGH_LOW',
Expand Down
5 changes: 0 additions & 5 deletions src/chart/__tests__/chart.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import './env';
import { createChart } from '../../index';
import { generateCandlesDataTS } from '../utils/candles-generator-ts.utils';
Expand Down
5 changes: 0 additions & 5 deletions src/chart/__tests__/env.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
/* @see https://jestjs.io/docs/29.4/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom */
Object.defineProperty(window, 'matchMedia', {
writable: true,
Expand Down
5 changes: 0 additions & 5 deletions src/chart/__tests__/model/date-time.formatter.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import '../env';
import { formatDate, getShortDays, getShortMonths } from '../../model/date-time.formatter';
import { getDefaultConfig } from '../../chart.config';
Expand Down
2 changes: 1 addition & 1 deletion src/chart/animation/canvas-animation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/animation/types/animation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/animation/types/color-alpha-animation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/animation/types/color-transition-animation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/animation/types/viewport-movement-animation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/animation/viewport-model-animation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/bootstrap.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
36 changes: 4 additions & 32 deletions src/chart/canvas/canvas-bounds-container.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down Expand Up @@ -540,40 +540,14 @@ export class CanvasBoundsContainer {
const oldPecNumber = visiblePecRatios.filter(ratio => ratio !== undefined).length;
// if ratio in undefined for a given pane it means that it's a new pane
const newPecNumber = pecRatios.filter(ratio => ratio === undefined).length;
const paneIsAdded = newPecNumber > 0;

let freeRatioForPec = 0;
let freeRatio = 0;
let ratioForOldPec = 1;
let ratioForNewPec = 0;
if (paneIsAdded) {
if (newPecNumber > 0) {
[ratioForOldPec, ratioForNewPec] = getHeightRatios(visiblePecNumber);
chartRatio *= ratioForOldPec;
}

//#region chart height ratio logic
if (this.graphsHeightRatio[CHART_UUID] === 0) {
chartRatio = 0;
}

if (this.graphsHeightRatio[CHART_UUID] !== 0) {
if (paneIsAdded) {
chartRatio = 1 * ratioForOldPec;
} else {
// pec ratio values before recalculating and new chart ratio
const currentHeightRatioValues = Object.values(this.graphsHeightRatio).reduce(
(prev, curr) => (curr += prev),
);

// chart is hidden and one of the pec is removed
// since the chart height ratio is new, the currentHeightRatioValues could be > 1, it happens if make chart visible again
if (currentHeightRatioValues < 1 && this.graphsHeightRatio[CHART_UUID] !== 0) {
chartRatio += 1 - currentHeightRatioValues;
}
}
}

//#endregion

// this means we should keep in mind only new panes
if (oldPecNumber === 0) {
chartRatio = 1 - ratioForNewPec * newPecNumber;
Expand Down Expand Up @@ -1009,15 +983,13 @@ export class CanvasBoundsContainer {
}

// paneCounter=chartHeightRatio: 0=1, 1=0.8, 2=0.6, 3=0.5, 4=0.4, 5=0.4
// ratios requirements table: https://confluence.in.devexperts.com/display/UI/Chart+Navigation#ChartNavigation-2Graphsadjustablesizes
const DEFAULT_RATIOS: Record<number, number> = {
0: 1,
1: 0.8,
2: 0.6,
3: 0.5,
4: 0.4,
5: 0.4,
6: 0.4,
5: 0.2,
};

// NOTE: pec stands for panes except main chart
Expand Down
2 changes: 1 addition & 1 deletion src/chart/canvas/canvas-chart-html.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/canvas/chart-elements.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/canvas/cursor.handler.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/canvas/layout-creator.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/canvas/y-axis-bounds.container.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
7 changes: 2 additions & 5 deletions src/chart/chart.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand All @@ -14,7 +14,6 @@ import { DrawerType } from './drawers/drawing-manager';
import { DateTimeFormatter, TimeFormatterConfig } from './model/date-time.formatter';
import { DEFAULT_MERGE_OPTIONS, merge, MergeOptions } from './utils/merge.utils';
import { DeepPartial } from './utils/object.utils';
import { Candle, defaultSortCandles } from './model/candle.model';

export const MAIN_FONT = 'Open Sans Semibold, sans-serif';

Expand Down Expand Up @@ -110,7 +109,6 @@ export const getDefaultConfig = (): FullChartConfig => ({
histogram: {
barCapSize: 1,
},
sortCandles: defaultSortCandles,
},
yAxis: {
type: 'regular',
Expand Down Expand Up @@ -578,6 +576,7 @@ export const getDefaultConfig = (): FullChartConfig => ({
'GRID',
'X_AXIS',
'Y_AXIS',
'UNDERLAY_VOLUMES_AREA',
'DYNAMIC_OBJECTS',
'WATERMARK',
'N_MAP_CHART',
Expand Down Expand Up @@ -979,8 +978,6 @@ export interface ChartConfigComponentsChart {
selectedWidth: number;
minCandlesOffset: number;
histogram: ChartConfigComponentsHistogram;
// optional because backward compability
sortCandles?: (candles: Candle[]) => Candle[];
}

export interface ChartConfigComponentsEvents {
Expand Down
5 changes: 0 additions & 5 deletions src/chart/chart.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import ChartBootstrap from './bootstrap';
import { BarType, PartialChartConfig } from './chart.config';
import { CandleSeries } from './components/chart/chart.component';
Expand Down
2 changes: 1 addition & 1 deletion src/chart/components/chart/basic-scale.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/chart/components/chart/chart-area-pan.handler.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
8 changes: 2 additions & 6 deletions src/chart/components/chart/chart-base.model.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down Expand Up @@ -50,11 +50,7 @@ export class ChartBaseModel<T extends BaseType = 'point'> {
* @param timestamp
*/
// TODO think how to make this function like candleFromX
public dataFromTimestamp(
timestamp: Timestamp,
shouldExtrapolate: boolean = true,
selectedDataPoints: DataPoint<T>[] = this.mainDataPoints,
): VisualPoint<T> {
public dataFromTimestamp(timestamp: Timestamp, shouldExtrapolate: boolean = true, selectedDataPoints: DataPoint<T>[] = this.mainDataPoints): VisualPoint<T> {
const result = searchCandleIndex(timestamp, shouldExtrapolate, selectedDataPoints, this.period);
return this.dataFromIdx(result.index);
}
Expand Down
20 changes: 9 additions & 11 deletions src/chart/components/chart/chart.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ export class ChartModel extends ChartBaseElement {
instrument: ChartInstrument = this.mainCandleSeries.instrument,
recalculateAndUpdate = true,
): CandleSeriesModel | undefined {
const preparedCandles = this.prepareCandles(candles);
const preparedCandles = prepareCandles(candles);
// set correct indexes based on main candles timestamp
const reindexCandles = this.reindexCandlesBasedOnSeries(this.mainCandleSeries.dataPoints, preparedCandles);
// ensure there are no gaps in new candles
Expand Down Expand Up @@ -270,7 +270,7 @@ export class ChartModel extends ChartBaseElement {
this.mainInstrumentChangedSubject.next(mainSeries.instrument);
}
this.rememberCurrentTimeframe();
const preparedCandles = this.prepareCandles(mainSeries.candles);
const preparedCandles = prepareCandles(mainSeries.candles);
this.mainCandleSeries.clearData();
reindexCandles(preparedCandles);
this.mainCandleSeries.dataPoints = preparedCandles;
Expand Down Expand Up @@ -364,15 +364,15 @@ export class ChartModel extends ChartBaseElement {
return;
}

const preparedCandles = this.prepareCandles(mainSeries.candles);
const preparedCandles = prepareCandles(mainSeries.candles);
const updateResult = updateCandles(this.mainCandleSeries.dataPoints, preparedCandles);
const updatedCandles = updateResult.candles;
reindexCandles(updatedCandles);
this.mainCandleSeries.dataPoints = updatedCandles;

// re-create series
secondarySeries.map(series => {
const preparedCandles = this.prepareCandles(series.candles);
const preparedCandles = prepareCandles(series.candles);
const updatedCandles = updateCandles(
this.findSecondarySeriesBySymbol(series.instrument?.symbol ?? '')?.dataPoints ?? [],
preparedCandles,
Expand Down Expand Up @@ -1170,13 +1170,6 @@ export class ChartModel extends ChartBaseElement {
this.candlesUpdatedSubject.next();
this.canvasModel.fireDraw();
}

private prepareCandles = (candles: PartialCandle[]): Candle[] => {
const prepared = candles.map(prepareCandle).filter(isCandle);
const { sortCandles } = this.config.components.chart;

return sortCandles ? sortCandles(prepared) : prepared;
};
}

export interface UpdateCandlesResult {
Expand All @@ -1185,6 +1178,11 @@ export interface UpdateCandlesResult {
candles: Candle[];
}

const sortCandles = (candles: Candle[]): Candle[] =>
candles.slice().sort((a, b) => (a.timestamp === b.timestamp ? 0 : a.timestamp > b.timestamp ? 1 : -1));

const prepareCandles = (candles: PartialCandle[]): Candle[] => sortCandles(candles.map(prepareCandle).filter(isCandle));

const findFirstNotEmptyCandle = (candles: Array<Candle>, startIdx: number, iterateStep: number): Candle | undefined => {
if (startIdx >= candles.length) {
return candles[candles.length - 1];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
17 changes: 6 additions & 11 deletions src/chart/components/chart/fake-visual-candle.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { Candle, nameDirection } from '../../model/candle.model';
import { DataSeriesPoint, VisualSeriesPoint } from '../../model/data-series.model';
import { Index, Pixel, Unit } from '../../model/scaling/viewport.model';
import VisualCandle from '../../model/visual-candle';
import { DEFAULT_PERIOD, fakeCandle, fakeDataPoint } from './fake-candles';
import { Candle, nameDirection } from "../../model/candle.model";
import { DataSeriesPoint, VisualSeriesPoint } from "../../model/data-series.model";
import { Index, Pixel, Unit } from "../../model/scaling/viewport.model";
import VisualCandle from "../../model/visual-candle";
import { DEFAULT_PERIOD, fakeCandle, fakeDataPoint } from "./fake-candles";

/**
* Generates fake candle for left and right "out of data range" zones.
Expand Down Expand Up @@ -73,4 +68,4 @@ export const fakeVisualPoint = (
x = firstCandle.centerUnit - offsetFromFirst;
}
return new VisualSeriesPoint(x, candle.close);
};
};
2 changes: 1 addition & 1 deletion src/chart/components/chart/price.formatter.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 - 2024 Devexperts Solutions IE Limited
* Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
Expand Down
Loading

0 comments on commit 031cb6e

Please sign in to comment.