From 7f58b8fcaacf6fc72f74e1c64299371e6efec13e Mon Sep 17 00:00:00 2001 From: chrisleekr Date: Sun, 26 Sep 2021 14:02:43 +1000 Subject: [PATCH] feat: update auto trigger and trading view widget (#330) --- .gitattributes | 8 + CHANGELOG.md | 5 + Gruntfile.js | 1 + README.md | 1 - app/cronjob/trailingTrade.js | 8 +- .../ensure-grid-trade-order-executed.test.js | 107 --- .../__tests__/ensure-manual-order.test.js | 88 +- .../__tests__/get-override-action.test.js | 769 ++++++++++++++++-- .../step/__tests__/handle-open-orders.test.js | 506 ++++-------- .../__tests__/remove-last-buy-price.test.js | 335 ++++---- .../step/ensure-grid-trade-order-executed.js | 83 +- .../trailingTrade/step/ensure-manual-order.js | 8 +- .../trailingTrade/step/get-override-action.js | 111 ++- .../trailingTrade/step/handle-open-orders.js | 47 +- .../step/remove-last-buy-price.js | 36 +- .../__tests__/common.test.js | 122 +++ app/cronjob/trailingTradeHelper/common.js | 79 +- .../handlers/__tests__/cancel-order.test.js | 46 +- .../__tests__/dust-transfer-execute.test.js | 46 +- .../manual-trade-all-symbols.test.js | 96 +-- .../handlers/__tests__/manual-trade.test.js | 47 +- .../__tests__/symbol-trigger-buy.test.js | 35 +- .../__tests__/symbol-trigger-sell.test.js | 38 +- .../websocket/handlers/cancel-order.js | 24 +- .../handlers/dust-transfer-execute.js | 22 +- .../handlers/manual-trade-all-symbols.js | 36 +- .../websocket/handlers/manual-trade.js | 23 +- .../websocket/handlers/symbol-trigger-buy.js | 23 +- .../websocket/handlers/symbol-trigger-sell.js | 23 +- config/custom-environment-variables.json | 19 + config/default.json | 9 +- ...1632400564167-flush-configuration-cache.js | 19 + public/css/App.css | 4 + public/css/fontawesome/all.min.css | 4 +- public/css/webfonts/fa-brands-400.eot | Bin 134288 -> 134239 bytes public/css/webfonts/fa-brands-400.svg | 82 +- public/css/webfonts/fa-brands-400.ttf | Bin 133982 -> 133933 bytes public/css/webfonts/fa-brands-400.woff | Bin 90059 -> 89987 bytes public/css/webfonts/fa-brands-400.woff2 | Bin 76763 -> 76734 bytes public/css/webfonts/fa-regular-400.eot | Bin 34031 -> 34032 bytes public/css/webfonts/fa-regular-400.svg | 4 +- public/css/webfonts/fa-regular-400.ttf | Bin 33733 -> 33734 bytes public/css/webfonts/fa-regular-400.woff | Bin 16276 -> 16276 bytes public/css/webfonts/fa-regular-400.woff2 | Bin 13275 -> 13224 bytes public/css/webfonts/fa-solid-900.eot | Bin 202959 -> 202961 bytes public/css/webfonts/fa-solid-900.svg | 4 +- public/css/webfonts/fa-solid-900.ttf | Bin 202673 -> 202675 bytes public/css/webfonts/fa-solid-900.woff | Bin 101650 -> 101646 bytes public/css/webfonts/fa-solid-900.woff2 | Bin 78196 -> 78268 bytes public/index.html | 1 + public/js/CoinWrapper.js | 3 + public/js/CoinWrapperAction.js | 25 +- public/js/CoinWrapperTradingView.js | 94 +++ public/js/ProfitLossWrapper.js | 4 + public/js/SettingIconBotOptions.js | 146 ++++ 55 files changed, 2003 insertions(+), 1188 deletions(-) create mode 100644 migrations/1632400564167-flush-configuration-cache.js create mode 100644 public/js/CoinWrapperTradingView.js diff --git a/.gitattributes b/.gitattributes index 21239b88..7e720531 100644 --- a/.gitattributes +++ b/.gitattributes @@ -24,6 +24,9 @@ RELEASENOTES text eol=lf # Declare files that will always have CRLF line endings on checkout. *.sln text eol=crlf +*.eot text eol=crlf +*.ttf text eol=crlf + # Denote all files that are truly binary and should not be modified. *.acorn binary @@ -39,3 +42,8 @@ RELEASENOTES text eol=lf *.exe binary *.jar binary *.phar binary +*.eot binary +*.otf binary +*.ttf binary +*.woff binary +*.woff2 binary diff --git a/CHANGELOG.md b/CHANGELOG.md index b6d2ea09..ca3465e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ All notable changes to this project will be documented in this file. +## [Unreleased] + +- Enhanced auto-trigger buy feature - [#316](https://github.com/chrisleekr/binance-trading-bot/issues/316) +- Added TradingView Technical Analysis - [#327](https://github.com/chrisleekr/binance-trading-bot/issues/327) + ## [0.0.79] - 2021-09-19 - Clear exchange/symbol info cache in the Redis periodically - [#284](https://github.com/chrisleekr/binance-trading-bot/issues/284) diff --git a/Gruntfile.js b/Gruntfile.js index 2d516379..890663ec 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -56,6 +56,7 @@ module.exports = grunt => { './public/dist/js/SymbolSettingIconGridSell.min.js', './public/dist/js/SymbolSettingIcon.min.js', './public/dist/js/CoinWrapperSymbol.min.js', + './public/dist/js/CoinWrapperTradingView.min.js', './public/dist/js/CoinWrapper.min.js', './public/dist/js/DustTransferIcon.min.js', './public/dist/js/ManualTradeIcon.min.js', diff --git a/README.md b/README.md index 7753188e..dde1ad78 100644 --- a/README.md +++ b/README.md @@ -370,7 +370,6 @@ Please refer [CHANGELOG.md](https://github.com/chrisleekr/binance-trading-bot/blob/master/CHANGELOG.md) to view the past changes. -- [ ] Enhance auto-trigger buy feature - [#316](https://github.com/chrisleekr/binance-trading-bot/issues/316) - [ ] Allow to execute stop-loss before buy action - [#299](https://github.com/chrisleekr/binance-trading-bot/issues/299) - [ ] Improve sell strategy with conditional stop price percentage based on the profit percentage - [#94](https://github.com/chrisleekr/binance-trading-bot/issues/94) - [ ] Add sudden drop buy strategy - [#67](https://github.com/chrisleekr/binance-trading-bot/issues/67) diff --git a/app/cronjob/trailingTrade.js b/app/cronjob/trailingTrade.js index d9bcff95..0dc31b8c 100644 --- a/app/cronjob/trailingTrade.js +++ b/app/cronjob/trailingTrade.js @@ -92,10 +92,6 @@ const execute = async logger => { stepName: 'get-symbol-info', stepFunc: getSymbolInfo }, - { - stepName: 'get-override-action', - stepFunc: getOverrideAction - }, { stepName: 'ensure-manual-order', stepFunc: ensureManualOrder @@ -116,6 +112,10 @@ const execute = async logger => { stepName: 'get-indicators', stepFunc: getIndicators }, + { + stepName: 'get-override-action', + stepFunc: getOverrideAction + }, { stepName: 'handle-open-orders', stepFunc: handleOpenOrders diff --git a/app/cronjob/trailingTrade/step/__tests__/ensure-grid-trade-order-executed.test.js b/app/cronjob/trailingTrade/step/__tests__/ensure-grid-trade-order-executed.test.js index 8569669a..63928f04 100644 --- a/app/cronjob/trailingTrade/step/__tests__/ensure-grid-trade-order-executed.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/ensure-grid-trade-order-executed.test.js @@ -60,113 +60,6 @@ describe('ensure-grid-trade-order-executed.js', () => { mockSaveGridTradeOrder = jest.fn().mockResolvedValue(true); }); - describe('when action is already determined', () => { - beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - calculateLastBuyPrice: mockCalculateLastBuyPrice, - getAPILimit: mockGetAPILimit, - isExceedAPILimit: mockIsExceedAPILimit, - disableAction: mockDisableAction, - saveOrderStats: mockSaveOrderStats - })); - - jest.mock('../../../trailingTradeHelper/configuration', () => ({ - saveSymbolGridTrade: mockSaveSymbolGridTrade - })); - - jest.mock('../../../trailingTradeHelper/order', () => ({ - getGridTradeOrder: mockGetGridTradeOrder, - deleteGridTradeOrder: mockDeleteGridTradeOrder, - saveGridTradeOrder: mockSaveGridTradeOrder - })); - - const step = require('../ensure-grid-trade-order-executed'); - - rawData = { - symbol: 'BTCUSDT', - action: 'buy', - featureToggle: { notifyOrderExecute: true, notifyDebug: true }, - symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], - buy: { - gridTrade: [ - { - triggerPercentage: 1, - stopPercentage: 1.025, - limitPercentage: 1.026, - maxPurchaseAmount: 10, - executed: false, - executedOrder: null - }, - { - triggerPercentage: 0.8, - stopPercentage: 1.025, - limitPercentage: 1.026, - maxPurchaseAmount: 10, - executed: false, - executedOrder: null - } - ] - }, - sell: { - gridTrade: [ - { - triggerPercentage: 1.03, - stopPercentage: 0.985, - limitPercentage: 0.984, - quantityPercentage: 0.8, - executed: false, - executedOrder: null - }, - { - triggerPercentage: 1.05, - stopPercentage: 0.975, - limitPercentage: 0.974, - quantityPercentage: 1, - executed: false, - executedOrder: null - } - ] - }, - system: { - checkOrderExecutePeriod: 10, - temporaryDisableActionAfterConfirmingOrder: 20 - } - } - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('does not trigger getGridTradeOrder', () => { - expect(mockGetGridTradeOrder).not.toHaveBeenCalled(); - }); - - it('does not trigger saveGridTradeOrder', () => { - expect(mockSaveGridTradeOrder).not.toHaveBeenCalled(); - }); - - it('does not trigger deleteGridTradeOrder', () => { - expect(mockDeleteGridTradeOrder).not.toHaveBeenCalled(); - }); - - it('does not trigger binance.client.getOrder', () => { - expect(binanceMock.client.getOrder).not.toHaveBeenCalled(); - }); - - it('does not trigger disableAction', () => { - expect(mockDisableAction).not.toHaveBeenCalled(); - }); - - it('does not trigger saveOrderStats', () => { - expect(mockSaveOrderStats).not.toHaveBeenCalled(); - }); - - it('returns epxected result', () => { - expect(result).toStrictEqual(rawData); - }); - }); - describe('when api limit is exceed', () => { beforeEach(async () => { mockIsExceedAPILimit = jest.fn().mockReturnValue(true); diff --git a/app/cronjob/trailingTrade/step/__tests__/ensure-manual-order.test.js b/app/cronjob/trailingTrade/step/__tests__/ensure-manual-order.test.js index 7e07f75b..d84a14bb 100644 --- a/app/cronjob/trailingTrade/step/__tests__/ensure-manual-order.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/ensure-manual-order.test.js @@ -12,6 +12,7 @@ describe('ensure-manual-order.js', () => { let mockCalculateLastBuyPrice; let mockGetAPILimit; + let mockIsExceedAPILimit; let mockGetSymbolGridTrade; let mockSaveSymbolGridTrade; @@ -40,6 +41,13 @@ describe('ensure-manual-order.js', () => { mockCalculateLastBuyPrice = jest.fn().mockResolvedValue(true); mockGetAPILimit = jest.fn().mockResolvedValue(10); + mockIsExceedAPILimit = jest.fn().mockReturnValue(false); + + jest.mock('../../../trailingTradeHelper/common', () => ({ + calculateLastBuyPrice: mockCalculateLastBuyPrice, + getAPILimit: mockGetAPILimit, + isExceedAPILimit: mockIsExceedAPILimit + })); mockGetSymbolGridTrade = jest.fn().mockResolvedValue({ buy: [ @@ -56,13 +64,79 @@ describe('ensure-manual-order.js', () => { mockSaveManualOrder = jest.fn().mockResolvedValue(true); }); - describe('when manual buy order is not available', () => { + describe('when api limit exceeded', () => { beforeEach(async () => { + mockIsExceedAPILimit = jest.fn().mockReturnValue(true); + jest.mock('../../../trailingTradeHelper/common', () => ({ calculateLastBuyPrice: mockCalculateLastBuyPrice, - getAPILimit: mockGetAPILimit + getAPILimit: mockGetAPILimit, + isExceedAPILimit: mockIsExceedAPILimit + })); + + jest.mock('../../../trailingTradeHelper/configuration', () => ({ + getSymbolGridTrade: mockGetSymbolGridTrade, + saveSymbolGridTrade: mockSaveSymbolGridTrade + })); + + jest.mock('../../../trailingTradeHelper/order', () => ({ + getManualOrders: mockGetManualOrders, + deleteManualOrder: mockDeleteManualOrder, + saveManualOrder: mockSaveManualOrder })); + const step = require('../ensure-manual-order'); + + rawData = { + symbol: 'BTCUSDT', + isLocked: false, + featureToggle: { notifyDebug: true }, + symbolConfiguration: { + system: { + checkManualOrderPeriod: 10 + } + } + }; + + result = await step.execute(loggerMock, rawData); + }); + + it('does not trigger binance.client.getOrder', () => { + expect(binanceMock.client.getOrder).not.toHaveBeenCalled(); + }); + + it('does not trigger deleteManualOrder', () => { + expect(mockDeleteManualOrder).not.toHaveBeenCalled(); + }); + + it('does not trigger saveSymbolGridTrade', () => { + expect(mockSaveSymbolGridTrade).not.toHaveBeenCalled(); + }); + + it('does not trigger saveManualOrder', () => { + expect(mockSaveManualOrder).not.toHaveBeenCalled(); + }); + + it('does not trigger calculateLastBuyPrice', () => { + expect(mockCalculateLastBuyPrice).not.toHaveBeenCalled(); + }); + + it('returns expected result', () => { + expect(result).toStrictEqual({ + symbol: 'BTCUSDT', + isLocked: false, + featureToggle: { notifyDebug: true }, + symbolConfiguration: { + system: { + checkManualOrderPeriod: 10 + } + } + }); + }); + }); + + describe('when manual buy order is not available', () => { + beforeEach(async () => { jest.mock('../../../trailingTradeHelper/configuration', () => ({ getSymbolGridTrade: mockGetSymbolGridTrade, saveSymbolGridTrade: mockSaveSymbolGridTrade @@ -213,11 +287,6 @@ describe('ensure-manual-order.js', () => { ].forEach(testData => { describe(`${testData.desc}`, () => { beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - calculateLastBuyPrice: mockCalculateLastBuyPrice, - getAPILimit: mockGetAPILimit - })); - jest.mock('../../../trailingTradeHelper/configuration', () => ({ getSymbolGridTrade: mockGetSymbolGridTrade, saveSymbolGridTrade: mockSaveSymbolGridTrade @@ -407,11 +476,6 @@ describe('ensure-manual-order.js', () => { ].forEach(testData => { describe(`${testData.desc}`, () => { beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - calculateLastBuyPrice: mockCalculateLastBuyPrice, - getAPILimit: mockGetAPILimit - })); - mockGetManualOrders = jest .fn() .mockResolvedValue(testData.cacheResults); diff --git a/app/cronjob/trailingTrade/step/__tests__/get-override-action.test.js b/app/cronjob/trailingTrade/step/__tests__/get-override-action.test.js index 3f139473..0683e0a9 100644 --- a/app/cronjob/trailingTrade/step/__tests__/get-override-action.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/get-override-action.test.js @@ -7,6 +7,8 @@ describe('get-override-action.js', () => { let mockGetOverrideDataForSymbol; let mockRemoveOverrideDataForSymbol; + let mockIsActionDisabled; + let mockSaveOverrideAction; describe('execute', () => { beforeEach(() => { @@ -14,23 +16,32 @@ describe('get-override-action.js', () => { mockGetOverrideDataForSymbol = jest.fn(); mockRemoveOverrideDataForSymbol = jest.fn(); - }); + mockIsActionDisabled = jest.fn(); + mockSaveOverrideAction = jest.fn(); - describe('when symbol is locked', () => { - beforeEach(async () => { - const { logger } = require('../../../../helpers'); + const { logger } = require('../../../../helpers'); - loggerMock = logger; + loggerMock = logger; - jest.mock('../../../trailingTradeHelper/common', () => ({ - getOverrideDataForSymbol: mockGetOverrideDataForSymbol, - removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol - })); + jest.mock('../../../trailingTradeHelper/common', () => ({ + getOverrideDataForSymbol: mockGetOverrideDataForSymbol, + removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol, + isActionDisabled: mockIsActionDisabled, + saveOverrideAction: mockSaveOverrideAction + })); + }); + describe('when symbol is locked', () => { + beforeEach(async () => { rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: true + isLocked: true, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } }; const step = require('../get-override-action'); @@ -41,26 +52,27 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'not-determined', symbol: 'BTCUSDT', - isLocked: true + isLocked: true, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } }); }); }); describe('when action is not "not-determined"', () => { beforeEach(async () => { - const { logger } = require('../../../../helpers'); - - loggerMock = logger; - - jest.mock('../../../trailingTradeHelper/common', () => ({ - getOverrideDataForSymbol: mockGetOverrideDataForSymbol, - removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol - })); - rawData = { action: 'buy-order-wait', symbol: 'BTCUSDT', - isLocked: false + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } }; const step = require('../get-override-action'); @@ -71,33 +83,36 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'buy-order-wait', symbol: 'BTCUSDT', - isLocked: false + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } }); }); }); describe('when action is "not-determined"', () => { - describe('when action is manual-trade', () => { + describe('when override data is not retrieved', () => { beforeEach(async () => { - const { logger } = require('../../../../helpers'); - - loggerMock = logger; - - mockGetOverrideDataForSymbol = jest.fn().mockResolvedValue({ - action: 'manual-trade', - order: { - some: 'data' - } - }); + mockGetOverrideDataForSymbol = jest.fn().mockResolvedValue(null); jest.mock('../../../trailingTradeHelper/common', () => ({ getOverrideDataForSymbol: mockGetOverrideDataForSymbol, - removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol + removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol, + isActionDisabled: mockIsActionDisabled, + saveOverrideAction: mockSaveOverrideAction })); rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } }; const step = require('../get-override-action'); @@ -111,46 +126,49 @@ describe('get-override-action.js', () => { ); }); - it('triggers removeOverrideDataForSymbol', () => { - expect(mockRemoveOverrideDataForSymbol).toHaveBeenCalledWith( - loggerMock, - 'BTCUSDT' - ); + it('does not trigger removeOverrideDataForSymbol', () => { + expect(mockRemoveOverrideDataForSymbol).not.toHaveBeenCalled(); }); it('retruns expected result', () => { expect(result).toStrictEqual({ - action: 'manual-trade', + action: 'not-determined', symbol: 'BTCUSDT', isLocked: false, - order: { - some: 'data' - } + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + }, + overrideData: {} }); }); }); - describe('when action is cancel-order', () => { + describe('when action is manual-trade', () => { beforeEach(async () => { - const { logger } = require('../../../../helpers'); - - loggerMock = logger; - mockGetOverrideDataForSymbol = jest.fn().mockResolvedValue({ - action: 'cancel-order', + action: 'manual-trade', order: { some: 'data' } }); jest.mock('../../../trailingTradeHelper/common', () => ({ getOverrideDataForSymbol: mockGetOverrideDataForSymbol, - removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol + removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol, + isActionDisabled: mockIsActionDisabled, + saveOverrideAction: mockSaveOverrideAction })); rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } }; const step = require('../get-override-action'); @@ -173,9 +191,20 @@ describe('get-override-action.js', () => { it('retruns expected result', () => { expect(result).toStrictEqual({ - action: 'cancel-order', + action: 'manual-trade', symbol: 'BTCUSDT', isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + }, + overrideData: { + action: 'manual-trade', + order: { + some: 'data' + } + }, order: { some: 'data' } @@ -183,24 +212,30 @@ describe('get-override-action.js', () => { }); }); - describe('when action is buy', () => { + describe('when action is cancel-order', () => { beforeEach(async () => { - const { logger } = require('../../../../helpers'); - - loggerMock = logger; - mockGetOverrideDataForSymbol = jest.fn().mockResolvedValue({ - action: 'buy' + action: 'cancel-order', + order: { + some: 'data' + } }); jest.mock('../../../trailingTradeHelper/common', () => ({ getOverrideDataForSymbol: mockGetOverrideDataForSymbol, - removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol + removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol, + isActionDisabled: mockIsActionDisabled, + saveOverrideAction: mockSaveOverrideAction })); rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } }; const step = require('../get-override-action'); @@ -223,20 +258,596 @@ describe('get-override-action.js', () => { it('retruns expected result', () => { expect(result).toStrictEqual({ - action: 'buy', + action: 'cancel-order', symbol: 'BTCUSDT', isLocked: false, - order: {} + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + }, + overrideData: { + action: 'cancel-order', + order: { + some: 'data' + } + }, + order: { + some: 'data' + } }); }); }); - describe('when action is not matching', () => { - beforeEach(async () => { - const { logger } = require('../../../../helpers'); + describe('when action is buy', () => { + describe('when action is not triggered by auto trigger', () => { + beforeEach(async () => { + mockGetOverrideDataForSymbol = jest.fn().mockResolvedValue({ + action: 'buy' + }); + jest.mock('../../../trailingTradeHelper/common', () => ({ + getOverrideDataForSymbol: mockGetOverrideDataForSymbol, + removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol, + isActionDisabled: mockIsActionDisabled, + saveOverrideAction: mockSaveOverrideAction + })); + + rawData = { + action: 'not-determined', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } + }; + + const step = require('../get-override-action'); + result = await step.execute(loggerMock, rawData); + }); - loggerMock = logger; + it('triggers getOverrideDataForSymbol', () => { + expect(mockGetOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('triggers removeOverrideDataForSymbol', () => { + expect(mockRemoveOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('retruns expected result', () => { + expect(result).toStrictEqual({ + action: 'buy', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + }, + overrideData: { + action: 'buy' + }, + order: {} + }); + }); + }); + describe('when buy action is triggered by auto trigger', () => { + beforeEach(async () => { + mockGetOverrideDataForSymbol = jest.fn().mockResolvedValue({ + action: 'buy', + order: { + some: 'data' + }, + triggeredBy: 'auto-trigger' + }); + + jest.mock('../../../trailingTradeHelper/common', () => ({ + getOverrideDataForSymbol: mockGetOverrideDataForSymbol, + removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol, + isActionDisabled: mockIsActionDisabled, + saveOverrideAction: mockSaveOverrideAction + })); + }); + + describe('when ATH Restriction is enabled', () => { + describe('when auto trigger buy condition is enabled', () => { + describe('when current price is more than ATH restriction price', () => { + beforeEach(async () => { + rawData = { + action: 'not-determined', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: true, + afterDisabledPeriod: false + } + } + } + }, + buy: { + currentPrice: 1000, + athRestrictionPrice: 900 + } + }; + + const step = require('../get-override-action'); + result = await step.execute(loggerMock, rawData); + }); + + it('triggers getOverrideDataForSymbol', () => { + expect(mockGetOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('does not trigger removeOverrideDataForSymbol', () => { + expect( + mockRemoveOverrideDataForSymbol + ).not.toHaveBeenCalled(); + }); + + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT', + { + action: 'buy', + order: { + some: 'data' + }, + actionAt: expect.any(String), + triggeredBy: 'auto-trigger' + }, + `The auto-trigger buy action needs to be re-scheduled ` + + `because the current price is higher than ATH restriction price.` + ); + }); + + it('retruns expected result', () => { + expect(result).toStrictEqual({ + action: 'not-determined', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: true, + afterDisabledPeriod: false + } + } + } + }, + buy: { + athRestrictionPrice: 900, + currentPrice: 1000 + }, + overrideData: { + action: 'buy', + order: { + some: 'data' + }, + triggeredBy: 'auto-trigger' + } + }); + }); + }); + + describe('when current price is less than ATH restriction price', () => { + beforeEach(async () => { + rawData = { + action: 'not-determined', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: true, + afterDisabledPeriod: false + } + } + } + }, + buy: { + currentPrice: 900, + athRestrictionPrice: 1000 + } + }; + + const step = require('../get-override-action'); + result = await step.execute(loggerMock, rawData); + }); + + it('triggers getOverrideDataForSymbol', () => { + expect(mockGetOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('triggers removeOverrideDataForSymbol', () => { + expect(mockRemoveOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('does not trigger saveOverrideAction', () => { + expect(mockSaveOverrideAction).not.toHaveBeenCalled(); + }); + + it('retruns expected result', () => { + expect(result).toStrictEqual({ + action: 'buy', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: true, + afterDisabledPeriod: false + } + } + } + }, + buy: { + athRestrictionPrice: 1000, + currentPrice: 900 + }, + overrideData: { + action: 'buy', + order: { + some: 'data' + }, + triggeredBy: 'auto-trigger' + }, + order: { + some: 'data' + } + }); + }); + }); + }); + + describe('when auto trigger buy condition is disabled', () => { + beforeEach(async () => { + rawData = { + action: 'not-determined', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: false, + afterDisabledPeriod: false + } + } + } + }, + buy: { + currentPrice: 1000, + athRestrictionPrice: 900 + } + }; + + const step = require('../get-override-action'); + result = await step.execute(loggerMock, rawData); + }); + + it('triggers getOverrideDataForSymbol', () => { + expect(mockGetOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('triggers removeOverrideDataForSymbol', () => { + expect(mockRemoveOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('does not trigger saveOverrideAction', () => { + expect(mockSaveOverrideAction).not.toHaveBeenCalled(); + }); + + it('retruns expected result', () => { + expect(result).toStrictEqual({ + action: 'buy', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: false, + afterDisabledPeriod: false + } + } + } + }, + buy: { + athRestrictionPrice: 900, + currentPrice: 1000 + }, + overrideData: { + action: 'buy', + order: { + some: 'data' + }, + triggeredBy: 'auto-trigger' + }, + order: { + some: 'data' + } + }); + }); + }); + }); + + describe('when the action is disabled', () => { + beforeEach(() => { + mockIsActionDisabled = jest.fn().mockResolvedValue({ + isDisabled: true, + ttl: 300, + disabledBy: 'sell order', + message: 'Disabled action after confirming the sell order.', + canResume: false, + canRemoveLastBuyPrice: false + }); + + jest.mock('../../../trailingTradeHelper/common', () => ({ + getOverrideDataForSymbol: mockGetOverrideDataForSymbol, + removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol, + isActionDisabled: mockIsActionDisabled, + saveOverrideAction: mockSaveOverrideAction + })); + }); + + describe('when after disable period condition is enabled', () => { + beforeEach(async () => { + rawData = { + action: 'not-determined', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: false, + afterDisabledPeriod: true + } + } + } + }, + buy: { + currentPrice: 1000, + athRestrictionPrice: 900 + } + }; + + const step = require('../get-override-action'); + result = await step.execute(loggerMock, rawData); + }); + + it('triggers getOverrideDataForSymbol', () => { + expect(mockGetOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('does not trigger removeOverrideDataForSymbol', () => { + expect(mockRemoveOverrideDataForSymbol).not.toHaveBeenCalled(); + }); + + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT', + { + action: 'buy', + order: { + some: 'data' + }, + actionAt: expect.any(String), + triggeredBy: 'auto-trigger' + }, + `The auto-trigger buy action needs to be re-scheduled because ` + + `the action is disabled at the moment.` + ); + }); + + it('retruns expected result', () => { + expect(result).toStrictEqual({ + action: 'not-determined', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: false, + afterDisabledPeriod: true + } + } + } + }, + buy: { + athRestrictionPrice: 900, + currentPrice: 1000 + }, + overrideData: { + action: 'buy', + order: { + some: 'data' + }, + triggeredBy: 'auto-trigger' + } + }); + }); + }); + + describe('when after disable period condition is disabled', () => { + beforeEach(async () => { + rawData = { + action: 'not-determined', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: false, + afterDisabledPeriod: false + } + } + } + }, + buy: { + currentPrice: 1000, + athRestrictionPrice: 900 + } + }; + + const step = require('../get-override-action'); + result = await step.execute(loggerMock, rawData); + }); + + it('triggers getOverrideDataForSymbol', () => { + expect(mockGetOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('triggers removeOverrideDataForSymbol', () => { + expect(mockRemoveOverrideDataForSymbol).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT' + ); + }); + + it('does not trigger saveOverrideAction', () => { + expect(mockSaveOverrideAction).not.toHaveBeenCalled(); + }); + + it('retruns expected result', () => { + expect(result).toStrictEqual({ + action: 'buy', + symbol: 'BTCUSDT', + isLocked: false, + symbolConfiguration: { + buy: { + athRestriction: { + enabled: true + } + }, + botOptions: { + autoTriggerBuy: { + triggerAfter: 20, + conditions: { + whenLessThanATHRestriction: false, + afterDisabledPeriod: false + } + } + } + }, + buy: { + athRestrictionPrice: 900, + currentPrice: 1000 + }, + overrideData: { + action: 'buy', + order: { + some: 'data' + }, + triggeredBy: 'auto-trigger' + }, + order: { + some: 'data' + } + }); + }); + }); + }); + + describe('when no need to reschedule', () => {}); + }); + }); + + describe('when action is not matching', () => { + beforeEach(async () => { mockGetOverrideDataForSymbol = jest.fn().mockResolvedValue({ action: 'something-unknown', order: { @@ -245,13 +856,20 @@ describe('get-override-action.js', () => { }); jest.mock('../../../trailingTradeHelper/common', () => ({ getOverrideDataForSymbol: mockGetOverrideDataForSymbol, - removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol + removeOverrideDataForSymbol: mockRemoveOverrideDataForSymbol, + isActionDisabled: mockIsActionDisabled, + saveOverrideAction: mockSaveOverrideAction })); rawData = { action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + } }; const step = require('../get-override-action'); @@ -273,7 +891,18 @@ describe('get-override-action.js', () => { expect(result).toStrictEqual({ action: 'not-determined', symbol: 'BTCUSDT', - isLocked: false + isLocked: false, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: 20 } + } + }, + overrideData: { + action: 'something-unknown', + order: { + some: 'data' + } + } }); }); }); diff --git a/app/cronjob/trailingTrade/step/__tests__/handle-open-orders.test.js b/app/cronjob/trailingTrade/step/__tests__/handle-open-orders.test.js index dd1de8a9..e4dffc9e 100644 --- a/app/cronjob/trailingTrade/step/__tests__/handle-open-orders.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/handle-open-orders.test.js @@ -364,15 +364,26 @@ describe('handle-open-orders.js', () => { step = require('../handle-open-orders'); }); - describe('when notifyDebug is true', () => { - beforeEach(async () => { - rawData = { - symbol: 'BTCUSDT', - isLocked: false, - featureToggle: { - notifyDebug: true - }, - action: 'not-determined', + beforeEach(async () => { + rawData = { + symbol: 'BTCUSDT', + isLocked: false, + featureToggle: { + notifyDebug: false + }, + action: 'not-determined', + openOrders: [ + { + symbol: 'BTCUSDT', + orderId: 46838, + price: '1799.58000000', + stopPrice: '1800.1000', + type: 'STOP_LOSS_LIMIT', + side: 'BUY' + } + ], + buy: { + limitPrice: 1800, openOrders: [ { symbol: 'BTCUSDT', @@ -382,165 +393,64 @@ describe('handle-open-orders.js', () => { type: 'STOP_LOSS_LIMIT', side: 'BUY' } - ], - buy: { - limitPrice: 1800, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'BUY' - } - ] - }, - sell: { - limitPrice: 1800, - openOrders: [] - } - }; - - result = await step.execute(loggerMock, rawData); - }); + ] + }, + sell: { + limitPrice: 1800, + openOrders: [] + } + }; - it('triggers cancelOrder', () => { - expect(binanceMock.client.cancelOrder).toHaveBeenCalledWith({ - symbol: 'BTCUSDT', - orderId: 46838 - }); - }); + result = await step.execute(loggerMock, rawData); + }); - it('triggers getAndCacheOpenOrdersForSymbol', () => { - expect(mockGetAndCacheOpenOrdersForSymbol).toHaveBeenCalled(); + it('triggers cancelOrder', () => { + expect(binanceMock.client.cancelOrder).toHaveBeenCalledWith({ + symbol: 'BTCUSDT', + orderId: 46838 }); + }); - it('triggers getAccountInfoFromAPI', () => { - expect(mockGetAccountInfoFromAPI).toHaveBeenCalledWith( - loggerMock - ); - }); + it('triggers getAndCacheOpenOrdersForSymbol', () => { + expect(mockGetAndCacheOpenOrdersForSymbol).toHaveBeenCalled(); + }); - it('triggers slack.sendMessage', () => { - expect(slackMock.sendMessage).toHaveBeenCalled(); - }); + it('triggers getAccountInfoFromAPI', () => { + expect(mockGetAccountInfoFromAPI).toHaveBeenCalledWith(loggerMock); + }); - it('returns expected value', () => { - expect(result).toStrictEqual({ - symbol: 'BTCUSDT', - isLocked: false, - featureToggle: { - notifyDebug: true - }, - action: 'buy-order-checking', - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46839, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'BUY' - }, - { - symbol: 'BTCUSDT', - orderId: 46841, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'SELL' - } - ], - buy: { - limitPrice: 1800, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46839, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'BUY' - } - ] - }, - sell: { limitPrice: 1800, openOrders: [] }, - accountInfo: accountInfoJSON - }); - }); + it('does not trigger slack.sendMessage', () => { + expect(slackMock.sendMessage).not.toHaveBeenCalled(); }); - describe('when notifyDebug is false', () => { - beforeEach(async () => { - rawData = { - symbol: 'BTCUSDT', - isLocked: false, - featureToggle: { - notifyDebug: false - }, - action: 'not-determined', - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'BUY' - } - ], - buy: { - limitPrice: 1800, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'BUY' - } - ] + it('returns expected value', () => { + expect(result).toStrictEqual({ + symbol: 'BTCUSDT', + isLocked: false, + featureToggle: { + notifyDebug: false + }, + action: 'buy-order-checking', + openOrders: [ + { + symbol: 'BTCUSDT', + orderId: 46839, + price: '1799.58000000', + stopPrice: '1800.1000', + type: 'STOP_LOSS_LIMIT', + side: 'BUY' }, - sell: { - limitPrice: 1800, - openOrders: [] + { + symbol: 'BTCUSDT', + orderId: 46841, + price: '1799.58000000', + stopPrice: '1800.1000', + type: 'STOP_LOSS_LIMIT', + side: 'SELL' } - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('triggers cancelOrder', () => { - expect(binanceMock.client.cancelOrder).toHaveBeenCalledWith({ - symbol: 'BTCUSDT', - orderId: 46838 - }); - }); - - it('triggers getAndCacheOpenOrdersForSymbol', () => { - expect(mockGetAndCacheOpenOrdersForSymbol).toHaveBeenCalled(); - }); - - it('triggers getAccountInfoFromAPI', () => { - expect(mockGetAccountInfoFromAPI).toHaveBeenCalledWith( - loggerMock - ); - }); - - it('does not trigger slack.sendMessage', () => { - expect(slackMock.sendMessage).not.toHaveBeenCalled(); - }); - - it('returns expected value', () => { - expect(result).toStrictEqual({ - symbol: 'BTCUSDT', - isLocked: false, - featureToggle: { - notifyDebug: false - }, - action: 'buy-order-checking', + ], + buy: { + limitPrice: 1800, openOrders: [ { symbol: 'BTCUSDT', @@ -549,32 +459,11 @@ describe('handle-open-orders.js', () => { stopPrice: '1800.1000', type: 'STOP_LOSS_LIMIT', side: 'BUY' - }, - { - symbol: 'BTCUSDT', - orderId: 46841, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'SELL' } - ], - buy: { - limitPrice: 1800, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46839, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'BUY' - } - ] - }, - sell: { limitPrice: 1800, openOrders: [] }, - accountInfo: accountInfoJSON - }); + ] + }, + sell: { limitPrice: 1800, openOrders: [] }, + accountInfo: accountInfoJSON }); }); }); @@ -827,15 +716,30 @@ describe('handle-open-orders.js', () => { step = require('../handle-open-orders'); }); - describe('when notifyDebug is true', () => { - beforeEach(async () => { - rawData = { - symbol: 'BTCUSDT', - isLocked: false, - featureToggle: { - notifyDebug: true - }, - action: 'not-determined', + beforeEach(async () => { + rawData = { + symbol: 'BTCUSDT', + isLocked: false, + featureToggle: { + notifyDebug: false + }, + action: 'not-determined', + openOrders: [ + { + symbol: 'BTCUSDT', + orderId: 46838, + price: '1799.58000000', + stopPrice: '1800.1000', + type: 'STOP_LOSS_LIMIT', + side: 'SELL' + } + ], + buy: { + limitPrice: 1800, + openOrders: [] + }, + sell: { + limitPrice: 1801, openOrders: [ { symbol: 'BTCUSDT', @@ -845,161 +749,61 @@ describe('handle-open-orders.js', () => { type: 'STOP_LOSS_LIMIT', side: 'SELL' } - ], - buy: { - limitPrice: 1800, - openOrders: [] - }, - sell: { - limitPrice: 1801, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'SELL' - } - ] - } - }; - - result = await step.execute(loggerMock, rawData); - }); + ] + } + }; - it('triggers cancelOrder', () => { - expect(binanceMock.client.cancelOrder).toHaveBeenCalledWith({ - symbol: 'BTCUSDT', - orderId: 46838 - }); - }); + result = await step.execute(loggerMock, rawData); + }); - it('triggers getAndCacheOpenOrdersForSymbol', () => { - expect(mockGetAndCacheOpenOrdersForSymbol).toHaveBeenCalled(); + it('triggers cancelOrder', () => { + expect(binanceMock.client.cancelOrder).toHaveBeenCalledWith({ + symbol: 'BTCUSDT', + orderId: 46838 }); + }); - it('triggers getAccountInfoFromAPI', () => { - expect(mockGetAccountInfoFromAPI).toHaveBeenCalled(); - }); + it('triggers getAndCacheOpenOrdersForSymbol', () => { + expect(mockGetAndCacheOpenOrdersForSymbol).toHaveBeenCalled(); + }); - it('triggers slack.sendMessage', () => { - expect(slackMock.sendMessage).toHaveBeenCalled(); - }); + it('triggers getAccountInfoFromAPI', () => { + expect(mockGetAccountInfoFromAPI).toHaveBeenCalled(); + }); - it('returns expected value', () => { - expect(result).toStrictEqual({ - symbol: 'BTCUSDT', - isLocked: false, - featureToggle: { - notifyDebug: true - }, - action: 'sell-order-checking', - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46840, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'SELL' - }, - { - symbol: 'BTCUSDT', - orderId: 46841, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'BUY' - } - ], - buy: { limitPrice: 1800, openOrders: [] }, - sell: { - limitPrice: 1801, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46840, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'SELL' - } - ] - }, - accountInfo: accountInfoJSON - }); - }); + it('does not trigger slack.sendMessage', () => { + expect(slackMock.sendMessage).not.toHaveBeenCalled(); }); - describe('when notifyDebug is false', () => { - beforeEach(async () => { - rawData = { - symbol: 'BTCUSDT', - isLocked: false, - featureToggle: { - notifyDebug: false - }, - action: 'not-determined', - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'SELL' - } - ], - buy: { - limitPrice: 1800, - openOrders: [] + it('returns expected value', () => { + expect(result).toStrictEqual({ + symbol: 'BTCUSDT', + isLocked: false, + featureToggle: { + notifyDebug: false + }, + action: 'sell-order-checking', + openOrders: [ + { + symbol: 'BTCUSDT', + orderId: 46840, + price: '1799.58000000', + stopPrice: '1800.1000', + type: 'STOP_LOSS_LIMIT', + side: 'SELL' }, - sell: { - limitPrice: 1801, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46838, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'SELL' - } - ] + { + symbol: 'BTCUSDT', + orderId: 46841, + price: '1799.58000000', + stopPrice: '1800.1000', + type: 'STOP_LOSS_LIMIT', + side: 'BUY' } - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('triggers cancelOrder', () => { - expect(binanceMock.client.cancelOrder).toHaveBeenCalledWith({ - symbol: 'BTCUSDT', - orderId: 46838 - }); - }); - - it('triggers getAndCacheOpenOrdersForSymbol', () => { - expect(mockGetAndCacheOpenOrdersForSymbol).toHaveBeenCalled(); - }); - - it('triggers getAccountInfoFromAPI', () => { - expect(mockGetAccountInfoFromAPI).toHaveBeenCalled(); - }); - - it('does not trigger slack.sendMessage', () => { - expect(slackMock.sendMessage).not.toHaveBeenCalled(); - }); - - it('returns expected value', () => { - expect(result).toStrictEqual({ - symbol: 'BTCUSDT', - isLocked: false, - featureToggle: { - notifyDebug: false - }, - action: 'sell-order-checking', + ], + buy: { limitPrice: 1800, openOrders: [] }, + sell: { + limitPrice: 1801, openOrders: [ { symbol: 'BTCUSDT', @@ -1008,32 +812,10 @@ describe('handle-open-orders.js', () => { stopPrice: '1800.1000', type: 'STOP_LOSS_LIMIT', side: 'SELL' - }, - { - symbol: 'BTCUSDT', - orderId: 46841, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'BUY' } - ], - buy: { limitPrice: 1800, openOrders: [] }, - sell: { - limitPrice: 1801, - openOrders: [ - { - symbol: 'BTCUSDT', - orderId: 46840, - price: '1799.58000000', - stopPrice: '1800.1000', - type: 'STOP_LOSS_LIMIT', - side: 'SELL' - } - ] - }, - accountInfo: accountInfoJSON - }); + ] + }, + accountInfo: accountInfoJSON }); }); }); diff --git a/app/cronjob/trailingTrade/step/__tests__/remove-last-buy-price.test.js b/app/cronjob/trailingTrade/step/__tests__/remove-last-buy-price.test.js index c580ded5..27421ef1 100644 --- a/app/cronjob/trailingTrade/step/__tests__/remove-last-buy-price.test.js +++ b/app/cronjob/trailingTrade/step/__tests__/remove-last-buy-price.test.js @@ -5,7 +5,6 @@ describe('remove-last-buy-price.js', () => { let rawData; let PubSubMock; - let cacheMock; let slackMock; let loggerMock; @@ -14,6 +13,7 @@ describe('remove-last-buy-price.js', () => { let mockIsActionDisabled; let mockRemoveLastBuyPrice; let mockSaveOrderStats; + let mockSaveOverrideAction; let mockArchiveSymbolGridTrade; let mockDeleteSymbolGridTrade; @@ -26,17 +26,14 @@ describe('remove-last-buy-price.js', () => { }); beforeEach(async () => { - const { PubSub, cache, slack, logger } = require('../../../../helpers'); + const { PubSub, slack, logger } = require('../../../../helpers'); PubSubMock = PubSub; - cacheMock = cache; slackMock = slack; loggerMock = logger; PubSubMock.publish = jest.fn().mockResolvedValue(true); slackMock.sendMessage = jest.fn().mockResolvedValue(true); - cacheMock.get = jest.fn().mockResolvedValue(null); - cacheMock.hset = jest.fn().mockResolvedValue(true); mockGetAndCacheOpenOrdersForSymbol = jest.fn().mockResolvedValue([]); mockGetAPILimit = jest.fn().mockResolvedValue(10); @@ -46,6 +43,7 @@ describe('remove-last-buy-price.js', () => { }); mockRemoveLastBuyPrice = jest.fn().mockResolvedValue(true); mockSaveOrderStats = jest.fn().mockResolvedValue(true); + mockSaveOverrideAction = jest.fn().mockResolvedValue(true); mockArchiveSymbolGridTrade = jest.fn().mockResolvedValue({ profit: 0, @@ -65,7 +63,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -84,7 +83,7 @@ describe('remove-last-buy-price.js', () => { isLocked: true, symbol: 'BTCUPUSDT', symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], + symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], buy: { lastBuyPriceRemoveThreshold: 10 } }, symbolInfo: { @@ -134,7 +133,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -153,7 +153,7 @@ describe('remove-last-buy-price.js', () => { isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], + symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], buy: { lastBuyPriceRemoveThreshold: 10 } }, symbolInfo: { @@ -203,7 +203,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -229,7 +230,7 @@ describe('remove-last-buy-price.js', () => { isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], + symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], buy: { lastBuyPriceRemoveThreshold: 10 } }, symbolInfo: { @@ -279,7 +280,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -305,7 +307,7 @@ describe('remove-last-buy-price.js', () => { isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], + symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], buy: { lastBuyPriceRemoveThreshold: 10 } }, symbolInfo: { @@ -355,7 +357,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -376,7 +379,7 @@ describe('remove-last-buy-price.js', () => { isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], + symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], buy: { lastBuyPriceRemoveThreshold: 10 } }, symbolInfo: { @@ -426,7 +429,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -447,7 +451,7 @@ describe('remove-last-buy-price.js', () => { isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], + symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], buy: { lastBuyPriceRemoveThreshold: 10 } }, symbolInfo: { @@ -513,7 +517,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -534,7 +539,7 @@ describe('remove-last-buy-price.js', () => { isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], + symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], buy: { lastBuyPriceRemoveThreshold: 10 } }, symbolInfo: { @@ -591,7 +596,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -612,7 +618,7 @@ describe('remove-last-buy-price.js', () => { isLocked: false, symbol: 'BTCUPUSDT', symbolConfiguration: { - symbols: ['BTCUSDT', 'BNBUSDT'], + symbols: ['BTCUPUSDT', 'BTCUSDT', 'BNBUSDT'], buy: { lastBuyPriceRemoveThreshold: 10 } }, symbolInfo: { @@ -656,38 +662,33 @@ describe('remove-last-buy-price.js', () => { }); describe('when cannot find open orders', () => { - describe('ALPHABTC', () => { - beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - getAndCacheOpenOrdersForSymbol: - mockGetAndCacheOpenOrdersForSymbol, - isActionDisabled: mockIsActionDisabled, - getAPILimit: mockGetAPILimit, - removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats - })); + beforeEach(() => { + jest.mock('../../../trailingTradeHelper/common', () => ({ + getAndCacheOpenOrdersForSymbol: mockGetAndCacheOpenOrdersForSymbol, + isActionDisabled: mockIsActionDisabled, + getAPILimit: mockGetAPILimit, + removeLastBuyPrice: mockRemoveLastBuyPrice, + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction + })); - mockArchiveSymbolGridTrade = jest.fn().mockResolvedValue({ + mockGetGridTradeOrder = jest.fn().mockResolvedValue(null); + + jest.mock('../../../trailingTradeHelper/order', () => ({ + getGridTradeOrder: mockGetGridTradeOrder + })); + }); + + [ + { + symbol: 'ALPHABTC', + archivedSymbolGridTradeResult: { profit: 10, profitPercentage: 0.1, totalBuyQuoteBuy: 100, totalSellQuoteQty: 110 - }); - - jest.mock('../../../trailingTradeHelper/configuration', () => ({ - archiveSymbolGridTrade: mockArchiveSymbolGridTrade, - deleteSymbolGridTrade: mockDeleteSymbolGridTrade - })); - - mockGetGridTradeOrder = jest.fn().mockResolvedValue(null); - - jest.mock('../../../trailingTradeHelper/order', () => ({ - getGridTradeOrder: mockGetGridTradeOrder - })); - - const step = require('../remove-last-buy-price'); - - rawData = { + }, + rawData: { action: 'not-determined', isLocked: false, symbol: 'ALPHABTC', @@ -719,95 +720,12 @@ describe('remove-last-buy-price.js', () => { currentPrice: 0.000038, lastBuyPrice: 0.00003179 } - }; - - result = await step.execute(loggerMock, rawData); - }); - - it('triggers removeLastBuyPrice', () => { - expect(mockRemoveLastBuyPrice).toHaveBeenCalledWith( - loggerMock, - 'ALPHABTC' - ); - }); - - it('triggers archiveSymbolGridTrade', () => { - expect(mockArchiveSymbolGridTrade).toHaveBeenCalledWith( - loggerMock, - 'ALPHABTC' - ); - }); - - it('triggers deleteSymbolGridTrade', () => { - expect(mockDeleteSymbolGridTrade).toHaveBeenCalledWith( - loggerMock, - 'ALPHABTC' - ); - }); - - it('triggers cache.set because autoTriggerBuy is enabled', () => { - expect(cacheMock.hset.mock.calls[0][0]).toStrictEqual( - 'trailing-trade-override' - ); - expect(cacheMock.hset.mock.calls[0][1]).toStrictEqual('ALPHABTC'); - const args = JSON.parse(cacheMock.hset.mock.calls[0][2]); - expect(args).toStrictEqual({ - action: 'buy', - actionAt: expect.any(String) - }); - }); - - it('triggers saveOrderStats', () => { - expect(mockSaveOrderStats).toHaveBeenCalledWith(loggerMock, [ - 'BTCUSDT', - 'BNBUSDT', - 'ALPHABTC' - ]); - }); - - it('returns expected data', () => { - expect(result).toStrictEqual({ - ...rawData, - ...{ - sell: { - currentPrice: 0.000038, - lastBuyPrice: 0.00003179, - processMessage: - 'Balance is not enough to sell. Delete last buy price.', - updatedAt: expect.any(Object) - } - } - }); - }); - }); - - describe('BTCUPUSDT', () => { - beforeEach(async () => { - jest.mock('../../../trailingTradeHelper/common', () => ({ - getAndCacheOpenOrdersForSymbol: - mockGetAndCacheOpenOrdersForSymbol, - isActionDisabled: mockIsActionDisabled, - getAPILimit: mockGetAPILimit, - removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats - })); - - mockArchiveSymbolGridTrade = jest.fn().mockResolvedValue({}); - - jest.mock('../../../trailingTradeHelper/configuration', () => ({ - archiveSymbolGridTrade: mockArchiveSymbolGridTrade, - deleteSymbolGridTrade: mockDeleteSymbolGridTrade - })); - - mockGetGridTradeOrder = jest.fn().mockResolvedValue(null); - - jest.mock('../../../trailingTradeHelper/order', () => ({ - getGridTradeOrder: mockGetGridTradeOrder - })); - - const step = require('../remove-last-buy-price'); - - rawData = { + } + }, + { + symbol: 'BTCUPUSDT', + archivedSymbolGridTradeResult: {}, + rawData: { action: 'not-determined', isLocked: false, symbol: 'BTCUPUSDT', @@ -839,56 +757,83 @@ describe('remove-last-buy-price.js', () => { currentPrice: 200, lastBuyPrice: 160 } - }; + } + } + ].forEach(test => { + describe(`${test.symbol}`, () => { + beforeEach(async () => { + mockArchiveSymbolGridTrade = jest + .fn() + .mockResolvedValue(test.archivedSymbolGridTradeResult); - result = await step.execute(loggerMock, rawData); - }); + jest.mock('../../../trailingTradeHelper/configuration', () => ({ + archiveSymbolGridTrade: mockArchiveSymbolGridTrade, + deleteSymbolGridTrade: mockDeleteSymbolGridTrade + })); - it('triggers removeLastBuyPrice', () => { - expect(mockRemoveLastBuyPrice).toHaveBeenCalledWith( - loggerMock, - 'BTCUPUSDT' - ); - }); + const step = require('../remove-last-buy-price'); - it('triggers archiveSymbolGridTrade', () => { - expect(mockArchiveSymbolGridTrade).toHaveBeenCalledWith( - loggerMock, - 'BTCUPUSDT' - ); - }); + result = await step.execute(loggerMock, test.rawData); + }); - it('triggers deleteSymbolGridTrade', () => { - expect(mockDeleteSymbolGridTrade).toHaveBeenCalledWith( - loggerMock, - 'BTCUPUSDT' - ); - }); + it('triggers removeLastBuyPrice', () => { + expect(mockRemoveLastBuyPrice).toHaveBeenCalledWith( + loggerMock, + test.symbol + ); + }); - it('does not trigger cache.set because autoTriggerBuy is disabled', () => { - expect(cacheMock.hset).not.toHaveBeenCalled(); - }); + it('triggers archiveSymbolGridTrade', () => { + expect(mockArchiveSymbolGridTrade).toHaveBeenCalledWith( + loggerMock, + test.symbol + ); + }); - it('triggers saveOrderStats', () => { - expect(mockSaveOrderStats).toHaveBeenCalledWith(loggerMock, [ - 'BTCUSDT', - 'BNBUSDT', - 'BTCUPUSDT' - ]); - }); + it('triggers deleteSymbolGridTrade', () => { + expect(mockDeleteSymbolGridTrade).toHaveBeenCalledWith( + loggerMock, + test.symbol + ); + }); - it('returns expected data', () => { - expect(result).toStrictEqual({ - ...rawData, - ...{ + if ( + test.rawData.symbolConfiguration.botOptions.autoTriggerBuy.enabled + ) { + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + loggerMock, + test.symbol, + { + action: 'buy', + actionAt: expect.any(String), + triggeredBy: 'auto-trigger' + }, + `The bot queued to trigger the grid trade for buying` + + ` after ${test.rawData.symbolConfiguration.botOptions.autoTriggerBuy.triggerAfter} minutes later.` + ); + }); + } else { + it('does not trigger saveOverrideAction', () => { + expect(mockSaveOverrideAction).not.toHaveBeenCalled(); + }); + } + + it('triggers saveOrderStats', () => { + expect(mockSaveOrderStats).toHaveBeenCalledWith( + loggerMock, + test.rawData.symbolConfiguration.symbols + ); + }); + + it('returns expected data', () => { + expect(result).toMatchObject({ sell: { - currentPrice: 200, - lastBuyPrice: 160, processMessage: 'Balance is not enough to sell. Delete last buy price.', updatedAt: expect.any(Object) } - } + }); }); }); }); @@ -909,7 +854,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); jest.mock('../../../trailingTradeHelper/configuration', () => ({ @@ -982,7 +928,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); mockArchiveSymbolGridTrade = jest.fn().mockResolvedValue({ @@ -1063,16 +1010,18 @@ describe('remove-last-buy-price.js', () => { ); }); - it('triggers cache.set because autoTriggerBuy is enabled', () => { - expect(cacheMock.hset.mock.calls[0][0]).toStrictEqual( - 'trailing-trade-override' + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + loggerMock, + 'BTCUPUSDT', + { + action: 'buy', + actionAt: expect.any(String), + triggeredBy: 'auto-trigger' + }, + `The bot queued to trigger the grid trade for buying` + + ` after 20 minutes later.` ); - expect(cacheMock.hset.mock.calls[0][1]).toStrictEqual('BTCUPUSDT'); - const args = JSON.parse(cacheMock.hset.mock.calls[0][2]); - expect(args).toStrictEqual({ - action: 'buy', - actionAt: expect.any(String) - }); }); it('triggers saveOrderStats', () => { @@ -1107,7 +1056,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); mockArchiveSymbolGridTrade = jest.fn().mockResolvedValue({ @@ -1179,8 +1129,8 @@ describe('remove-last-buy-price.js', () => { expect(mockDeleteSymbolGridTrade).not.toHaveBeenCalled(); }); - it('does not trigger cache.set', () => { - expect(cacheMock.hset).not.toHaveBeenCalled(); + it('does not trigger saveOverrideAction', () => { + expect(mockSaveOverrideAction).not.toHaveBeenCalled(); }); it('does not trigger saveOrderStats', () => { @@ -1201,7 +1151,8 @@ describe('remove-last-buy-price.js', () => { isActionDisabled: mockIsActionDisabled, getAPILimit: mockGetAPILimit, removeLastBuyPrice: mockRemoveLastBuyPrice, - saveOrderStats: mockSaveOrderStats + saveOrderStats: mockSaveOrderStats, + saveOverrideAction: mockSaveOverrideAction })); mockArchiveSymbolGridTrade = jest.fn().mockResolvedValue({ @@ -1273,8 +1224,8 @@ describe('remove-last-buy-price.js', () => { expect(mockDeleteSymbolGridTrade).not.toHaveBeenCalled(); }); - it('does not trigger cache.set', () => { - expect(cacheMock.hset).not.toHaveBeenCalled(); + it('does not trigger saveOverrideAction', () => { + expect(mockSaveOverrideAction).not.toHaveBeenCalled(); }); it('does not trigger saveOrderStats', () => { diff --git a/app/cronjob/trailingTrade/step/ensure-grid-trade-order-executed.js b/app/cronjob/trailingTrade/step/ensure-grid-trade-order-executed.js index 80471086..54d4cb5f 100644 --- a/app/cronjob/trailingTrade/step/ensure-grid-trade-order-executed.js +++ b/app/cronjob/trailingTrade/step/ensure-grid-trade-order-executed.js @@ -243,8 +243,7 @@ const execute = async (logger, rawData) => { const { symbol, - action, - featureToggle: { notifyOrderExecute, notifyDebug }, + featureToggle: { notifyOrderExecute }, symbolConfiguration: { symbols, system: { @@ -254,17 +253,8 @@ const execute = async (logger, rawData) => { } } = data; - if (action !== 'not-determined') { - logger.info( - { action }, - 'Action is already defined, do not try to ensure grid order executed.' - ); - return data; - } - if (isExceedAPILimit(logger)) { logger.info( - { action }, 'The API limit is exceed, do not try to ensure grid order executed.' ); return data; @@ -291,25 +281,7 @@ const execute = async (logger, rawData) => { await calculateLastBuyPrice(logger, symbol, lastBuyOrder); // Save grid trade to the database - const saveGridTradeResult = await saveGridTrade( - logger, - data, - lastBuyOrder - ); - - if (notifyDebug) { - slack.sendMessage( - `${symbol} BUY Grid Trade Updated Result (${moment().format( - 'HH:mm:ss.SSS' - )}): \n` + - `- Save Grid Trade Result: \`\`\`${JSON.stringify( - _.get(saveGridTradeResult, 'result', 'Not defined'), - undefined, - 2 - )}\`\`\`\n` + - `- Current API Usage: ${getAPILimit(logger)}` - ); - } + await saveGridTrade(logger, data, lastBuyOrder); // Remove grid trade last order await removeGridTradeLastOrder(logger, symbols, symbol, 'buy'); @@ -385,25 +357,11 @@ const execute = async (logger, rawData) => { await calculateLastBuyPrice(logger, symbol, orderResult); // Save grid trade to the database - const saveGridTradeResult = await saveGridTrade(logger, data, { + await saveGridTrade(logger, data, { ...lastBuyOrder, ...orderResult }); - if (notifyDebug) { - slack.sendMessage( - `${symbol} BUY Grid Trade Updated Result (${moment().format( - 'HH:mm:ss.SSS' - )}): \n` + - `- Save Grid Trade Result: \`\`\`${JSON.stringify( - _.get(saveGridTradeResult, 'result', 'Not defined'), - undefined, - 2 - )}\`\`\`\n` + - `- Current API Usage: ${getAPILimit(logger)}` - ); - } - // Remove grid trade last order await removeGridTradeLastOrder(logger, symbols, symbol, 'buy'); @@ -484,24 +442,7 @@ const execute = async (logger, rawData) => { logger.info({ lastSellOrder }, 'Order has already filled.'); // Save grid trade to the database - const saveGridTradeResult = await saveGridTrade( - logger, - data, - lastSellOrder - ); - if (notifyDebug) { - slack.sendMessage( - `${symbol} SELL Grid Trade Updated Result (${moment().format( - 'HH:mm:ss.SSS' - )}): \n` + - `- Save Grid Trade Result: \`\`\`${JSON.stringify( - _.get(saveGridTradeResult, 'result', 'Not defined'), - undefined, - 2 - )}\`\`\`\n` + - `- Current API Usage: ${getAPILimit(logger)}` - ); - } + await saveGridTrade(logger, data, lastSellOrder); // Remove grid trade last order await removeGridTradeLastOrder(logger, symbols, symbol, 'sell'); @@ -572,25 +513,11 @@ const execute = async (logger, rawData) => { logger.info({ lastSellOrder }, 'The order is filled.'); // Save grid trade to the database - const saveGridTradeResult = await saveGridTrade(logger, data, { + await saveGridTrade(logger, data, { ...lastSellOrder, ...orderResult }); - if (notifyDebug) { - slack.sendMessage( - `${symbol} SELL Grid Trade Updated Result (${moment().format( - 'HH:mm:ss.SSS' - )}): \n` + - `- Save Grid Trade Result: \`\`\`${JSON.stringify( - _.get(saveGridTradeResult, 'result', 'Not defined'), - undefined, - 2 - )}\`\`\`\n` + - `- Current API Usage: ${getAPILimit(logger)}` - ); - } - // Remove grid trade last order await removeGridTradeLastOrder(logger, symbols, symbol, 'sell'); diff --git a/app/cronjob/trailingTrade/step/ensure-manual-order.js b/app/cronjob/trailingTrade/step/ensure-manual-order.js index e194eccf..93c9c962 100644 --- a/app/cronjob/trailingTrade/step/ensure-manual-order.js +++ b/app/cronjob/trailingTrade/step/ensure-manual-order.js @@ -4,7 +4,8 @@ const _ = require('lodash'); const { PubSub, binance, slack } = require('../../../helpers'); const { calculateLastBuyPrice, - getAPILimit + getAPILimit, + isExceedAPILimit } = require('../../trailingTradeHelper/common'); const { @@ -146,6 +147,11 @@ const execute = async (logger, rawData) => { } } = data; + if (isExceedAPILimit(logger)) { + logger.info('The API limit is exceed, do not try to ensure manual order.'); + return data; + } + const manualOrders = await getManualOrders(logger, symbol); if (_.isEmpty(manualOrders) === true) { diff --git a/app/cronjob/trailingTrade/step/get-override-action.js b/app/cronjob/trailingTrade/step/get-override-action.js index 6d24cb24..1a1b8a58 100644 --- a/app/cronjob/trailingTrade/step/get-override-action.js +++ b/app/cronjob/trailingTrade/step/get-override-action.js @@ -3,9 +3,76 @@ const moment = require('moment'); const { getOverrideDataForSymbol, - removeOverrideDataForSymbol + removeOverrideDataForSymbol, + isActionDisabled, + saveOverrideAction } = require('../../trailingTradeHelper/common'); +/** + * Validate whether the auto trigger buy action needs to be rescheduled. + * + * @param {*} logger + * @param {*} data + * @returns + */ +const shouldRescheduleBuyAction = async (logger, data) => { + const { + symbol, + symbolConfiguration: { + buy: { + athRestriction: { enabled: buyATHRestrictionEnabled } + }, + botOptions: { + autoTriggerBuy: { + conditions: { whenLessThanATHRestriction, afterDisabledPeriod } + } + } + }, + buy: { currentPrice, athRestrictionPrice } + } = data; + + // If the current price is higher than the restriction price, reschedule it + if ( + buyATHRestrictionEnabled && + whenLessThanATHRestriction && + currentPrice > athRestrictionPrice + ) { + const rescheduleReason = + `The auto-trigger buy action needs to be re-scheduled ` + + `because the current price is higher than ATH restriction price.`; + logger.info( + { + buyATHRestrictionEnabled, + whenLessThanATHRestriction, + currentPrice, + athRestrictionPrice + }, + rescheduleReason + ); + return { shouldReschedule: true, rescheduleReason }; + } + + const checkDisable = await isActionDisabled(symbol); + + // If the symbol is disabled for some reason, + if (afterDisabledPeriod && checkDisable.isDisabled) { + const rescheduleReason = + `The auto-trigger buy action needs to be re-scheduled ` + + `because the action is disabled at the moment.`; + logger.info( + { + afterDisabledPeriod, + checkDisable + }, + rescheduleReason + ); + + return { shouldReschedule: true, rescheduleReason }; + } + + return { shouldReschedule: false, rescheduleReason: null }; +}; + /** * Override action * @@ -15,7 +82,16 @@ const { const execute = async (logger, rawData) => { const data = rawData; - const { action, symbol, isLocked } = data; + const { + action, + symbol, + isLocked, + symbolConfiguration: { + botOptions: { + autoTriggerBuy: { triggerAfter: autoTriggerBuyTriggerAfter } + } + } + } = data; if (isLocked) { logger.info( @@ -35,6 +111,7 @@ const execute = async (logger, rawData) => { const overrideData = await getOverrideDataForSymbol(logger, symbol); + data.overrideData = overrideData || {}; // Override action if ( (_.get(overrideData, 'action') === 'buy' || @@ -43,11 +120,39 @@ const execute = async (logger, rawData) => { _.get(overrideData, 'action') === 'cancel-order') && moment(_.get(overrideData, 'actionAt', undefined)) <= moment() ) { + // If the buy action is triggered by auto trigger + if ( + overrideData.action === 'buy' && + overrideData.triggeredBy === 'auto-trigger' + ) { + // Check whether it needs to be rescheduled. + const { shouldReschedule, rescheduleReason } = + await shouldRescheduleBuyAction(logger, data); + + // If it needs to be rescheduled + if (shouldReschedule) { + // Reschedule buy action + await saveOverrideAction( + logger, + symbol, + { + ...overrideData, + actionAt: moment() + .add(autoTriggerBuyTriggerAfter, 'minutes') + .format() + }, + rescheduleReason + ); + return data; + } + } + + // Otherwise, override current action data.action = overrideData.action; data.order = overrideData.order || {}; + // Remove override data to avoid multiple execution await removeOverrideDataForSymbol(logger, symbol); - return data; } return data; diff --git a/app/cronjob/trailingTrade/step/handle-open-orders.js b/app/cronjob/trailingTrade/step/handle-open-orders.js index 5cecea64..2638d600 100644 --- a/app/cronjob/trailingTrade/step/handle-open-orders.js +++ b/app/cronjob/trailingTrade/step/handle-open-orders.js @@ -1,12 +1,9 @@ /* eslint-disable no-await-in-loop */ -const moment = require('moment'); -const _ = require('lodash'); -const { slack, binance } = require('../../../helpers'); +const { binance } = require('../../../helpers'); const { getAndCacheOpenOrdersForSymbol, - getAccountInfoFromAPI, - getAPILimit + getAccountInfoFromAPI } = require('../../trailingTradeHelper/common'); /** @@ -53,7 +50,6 @@ const execute = async (logger, rawData) => { const { symbol, - featureToggle, action, isLocked, openOrders, @@ -111,25 +107,6 @@ const execute = async (logger, rawData) => { data.accountInfo = await getAccountInfoFromAPI(logger); data.action = 'buy-order-checking'; - - if (_.get(featureToggle, 'notifyDebug', false) === true) { - slack.sendMessage( - `${symbol} Action (${moment().format( - 'HH:mm:ss.SSS' - )}): Failed cancelling buy order\n` + - `- Message: Binance API returned an error when cancelling the buy order.` + - ` Refreshed open orders and wait for next tick.\n` + - `\`\`\`${JSON.stringify( - { - order, - openOrders: data.openOrders - }, - undefined, - 2 - )}\`\`\`\n` + - `- Current API Usage: ${getAPILimit(logger)}` - ); - } } else { // Reset buy open orders data.buy.openOrders = []; @@ -178,26 +155,6 @@ const execute = async (logger, rawData) => { data.accountInfo = await getAccountInfoFromAPI(logger); data.action = 'sell-order-checking'; - - if (_.get(featureToggle, 'notifyDebug', false) === true) { - slack.sendMessage( - `${symbol} Action (${moment().format( - 'HH:mm:ss.SSS' - )}): Failed cancelling sell order\n` + - `- Message: Binance API returned an error when cancelling the buy order.` + - ` Refreshed open orders and wait for next tick.\n` + - `\`\`\`${JSON.stringify( - { - order, - openOrders: data.openOrders, - accountInfo: data.accountInfo - }, - undefined, - 2 - )}\`\`\`\n` + - `- Current API Usage: ${getAPILimit(logger)}` - ); - } } else { // Reset sell open orders data.sell.openOrders = []; diff --git a/app/cronjob/trailingTrade/step/remove-last-buy-price.js b/app/cronjob/trailingTrade/step/remove-last-buy-price.js index 1787f50b..b3fc21b1 100644 --- a/app/cronjob/trailingTrade/step/remove-last-buy-price.js +++ b/app/cronjob/trailingTrade/step/remove-last-buy-price.js @@ -1,12 +1,13 @@ const _ = require('lodash'); const moment = require('moment'); -const { cache, slack, PubSub } = require('../../../helpers'); +const { slack, PubSub } = require('../../../helpers'); const { getAndCacheOpenOrdersForSymbol, getAPILimit, isActionDisabled, removeLastBuyPrice: removeLastBuyPriceFromDatabase, - saveOrderStats + saveOrderStats, + saveOverrideAction } = require('../../trailingTradeHelper/common'); const { archiveSymbolGridTrade, @@ -111,30 +112,17 @@ const removeLastBuyPrice = async ( await deleteSymbolGridTrade(logger, symbol); if (autoTriggerBuyEnabled) { - await cache.hset( - 'trailing-trade-override', - `${symbol}`, - JSON.stringify({ + await saveOverrideAction( + logger, + symbol, + { action: 'buy', - actionAt: moment().add(autoTriggerBuyTriggerAfter, 'minutes') - }) - ); - - slack.sendMessage( - `${symbol} Action (${moment().format( - 'HH:mm:ss.SSS' - )}): Queued buy action\n` + - `- Message: The bot queued to trigger the grid trade for buying` + - ` after ${autoTriggerBuyTriggerAfter} minutes later.\n` + - `- Current API Usage: ${getAPILimit(logger)}` - ); - - PubSub.publish('frontend-notification', { - type: 'info', - title: - `The bot queued to trigger the grid trade for buying` + + actionAt: moment().add(autoTriggerBuyTriggerAfter, 'minutes').format(), + triggeredBy: 'auto-trigger' + }, + `The bot queued to trigger the grid trade for buying` + ` after ${autoTriggerBuyTriggerAfter} minutes later.` - }); + ); } }; diff --git a/app/cronjob/trailingTradeHelper/__tests__/common.test.js b/app/cronjob/trailingTradeHelper/__tests__/common.test.js index 7b3975c6..71aaaba3 100644 --- a/app/cronjob/trailingTradeHelper/__tests__/common.test.js +++ b/app/cronjob/trailingTradeHelper/__tests__/common.test.js @@ -2121,4 +2121,126 @@ describe('common.js', () => { expect(cacheMock.hset).toHaveBeenCalledTimes(2); }); }); + + describe('saveOverrideAction', () => { + beforeEach(async () => { + const { cache, slack, PubSub, logger } = require('../../../helpers'); + + slackMock = slack; + loggerMock = logger; + PubSubMock = PubSub; + cacheMock = cache; + + cacheMock.hset = jest.fn().mockResolvedValue(true); + slackMock.sendMessage = jest.fn().mockResolvedValue(true); + PubSubMock.publish = jest.fn().mockResolvedValue(true); + + commonHelper = require('../common'); + result = await commonHelper.saveOverrideAction( + loggerMock, + 'BTCUSDT', + { + action: 'buy', + actionAt: '2021-09-22T00:20:00Z', + triggeredBy: 'auto-trigger' + }, + `The bot queued to trigger the grid trade for buying` + + ` after 20 minutes later.` + ); + }); + + it('triggers cache.hset', () => { + expect(cacheMock.hset).toHaveBeenCalledWith( + 'trailing-trade-override', + 'BTCUSDT', + JSON.stringify({ + action: 'buy', + actionAt: '2021-09-22T00:20:00Z', + triggeredBy: 'auto-trigger' + }) + ); + }); + + it('triggers slack.sendMessage', () => { + expect(slackMock.sendMessage).toHaveBeenCalledWith( + expect.stringContaining('BTCUSDT') + ); + + expect(slackMock.sendMessage).toHaveBeenCalledWith( + expect.stringContaining( + 'The bot queued to trigger the grid trade for buying' + ) + ); + }); + + it('triggers PubSub.publish', () => { + expect(PubSubMock.publish).toHaveBeenCalledWith('frontend-notification', { + type: 'info', + title: + `The bot queued to trigger the grid trade for buying` + + ` after 20 minutes later.` + }); + }); + }); + + describe('saveOverrideIndicatorAction', () => { + beforeEach(async () => { + const { cache, slack, PubSub, logger } = require('../../../helpers'); + + slackMock = slack; + loggerMock = logger; + PubSubMock = PubSub; + cacheMock = cache; + + cacheMock.hset = jest.fn().mockResolvedValue(true); + slackMock.sendMessage = jest.fn().mockResolvedValue(true); + PubSubMock.publish = jest.fn().mockResolvedValue(true); + + commonHelper = require('../common'); + result = await commonHelper.saveOverrideIndicatorAction( + loggerMock, + 'global', + { + action: 'dust-transfer', + params: { + some: 'param' + }, + actionAt: '2021-09-25T00:00:00Z', + triggeredBy: 'user' + }, + 'The dust transfer request received by the bot. Wait for executing the dust transfer.' + ); + }); + + it('triggers cache.hset', () => { + expect(cacheMock.hset).toHaveBeenCalledWith( + 'trailing-trade-indicator-override', + 'global', + JSON.stringify({ + action: 'dust-transfer', + params: { + some: 'param' + }, + actionAt: '2021-09-25T00:00:00Z', + triggeredBy: 'user' + }) + ); + }); + + it('triggers slack.sendMessage', () => { + expect(slackMock.sendMessage).toHaveBeenCalledWith( + expect.stringContaining( + 'The dust transfer request received by the bot. Wait for executing the dust transfer.' + ) + ); + }); + + it('triggers PubSub.publish', () => { + expect(PubSubMock.publish).toHaveBeenCalledWith('frontend-notification', { + type: 'info', + title: + 'The dust transfer request received by the bot. Wait for executing the dust transfer.' + }); + }); + }); }); diff --git a/app/cronjob/trailingTradeHelper/common.js b/app/cronjob/trailingTradeHelper/common.js index c0a64d7e..e6aa443e 100644 --- a/app/cronjob/trailingTradeHelper/common.js +++ b/app/cronjob/trailingTradeHelper/common.js @@ -740,12 +740,87 @@ const getNumberOfOpenTrades = async _logger => 10 ); +/** + * Save order statistics + * + * @param {*} logger + * @param {*} symbols + * @returns + */ const saveOrderStats = async (logger, symbols) => Promise.all([ saveNumberOfBuyOpenOrders(logger, symbols), saveNumberOfOpenTrades(logger, symbols) ]); +/** + * Save override action + * + * @param {*} logger + * @param {*} symbol + * @param {*} overrideData + * @param {*} overrideReason + */ +const saveOverrideAction = async ( + logger, + symbol, + overrideData, + overrideReason +) => { + await cache.hset( + 'trailing-trade-override', + `${symbol}`, + JSON.stringify(overrideData) + ); + + slack.sendMessage( + `${symbol} Action (${moment().format('HH:mm:ss.SSS')}): Queued action: ${ + overrideData.action + }\n` + + `- Message: ${overrideReason}\n` + + `- Current API Usage: ${getAPILimit(logger)}` + ); + + PubSub.publish('frontend-notification', { + type: 'info', + title: overrideReason + }); +}; + +/** + * Save override action for indicator + * + * @param {*} logger + * @param {*} symbol + * @param {*} overrideData + * @param {*} overrideReason + */ +const saveOverrideIndicatorAction = async ( + logger, + type, + overrideData, + overrideReason +) => { + await cache.hset( + 'trailing-trade-indicator-override', + type, + JSON.stringify(overrideData) + ); + + slack.sendMessage( + `Action (${moment().format('HH:mm:ss.SSS')}): Queued action: ${ + overrideData.action + }\n` + + `- Message: ${overrideReason}\n` + + `- Current API Usage: ${getAPILimit(logger)}` + ); + + PubSub.publish('frontend-notification', { + type: 'info', + title: overrideReason + }); +}; + module.exports = { cacheExchangeSymbols, getAccountInfoFromAPI, @@ -776,5 +851,7 @@ module.exports = { getNumberOfBuyOpenOrders, saveNumberOfOpenTrades, getNumberOfOpenTrades, - saveOrderStats + saveOrderStats, + saveOverrideAction, + saveOverrideIndicatorAction }; diff --git a/app/frontend/websocket/handlers/__tests__/cancel-order.test.js b/app/frontend/websocket/handlers/__tests__/cancel-order.test.js index 12c76856..99de075a 100644 --- a/app/frontend/websocket/handlers/__tests__/cancel-order.test.js +++ b/app/frontend/websocket/handlers/__tests__/cancel-order.test.js @@ -4,8 +4,8 @@ describe('cancel-order.js', () => { let mockWebSocketServerWebSocketSend; let loggerMock; - let cacheMock; - let PubSubMock; + + let mockSaveOverrideAction; beforeEach(() => { jest.clearAllMocks().resetModules(); @@ -15,17 +15,18 @@ describe('cancel-order.js', () => { mockWebSocketServer = { send: mockWebSocketServerWebSocketSend }; + + mockSaveOverrideAction = jest.fn().mockResolvedValue(true); + + jest.mock('../../../../cronjob/trailingTradeHelper/common', () => ({ + saveOverrideAction: mockSaveOverrideAction + })); }); beforeEach(async () => { - const { cache, logger, PubSub } = require('../../../../helpers'); + const { logger } = require('../../../../helpers'); - cacheMock = cache; loggerMock = logger; - PubSubMock = PubSub; - - cacheMock.hset = jest.fn().mockResolvedValue(true); - PubSubMock.publish = jest.fn().mockResolvedValue(true); const { handleCancelOrder } = require('../cancel-order'); await handleCancelOrder(loggerMock, mockWebSocketServer, { @@ -38,25 +39,18 @@ describe('cancel-order.js', () => { }); }); - it('triggers cache.hset', () => { - expect(cacheMock.hset.mock.calls[0][0]).toStrictEqual( - 'trailing-trade-override' + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT', + { + action: 'cancel-order', + order: { some: 'value' }, + actionAt: expect.any(String), + triggeredBy: 'user' + }, + 'Cancelling the order action has been received. Wait for cancelling the order.' ); - expect(cacheMock.hset.mock.calls[0][1]).toStrictEqual('BTCUSDT'); - const args = JSON.parse(cacheMock.hset.mock.calls[0][2]); - expect(args).toStrictEqual({ - action: 'cancel-order', - order: { some: 'value' }, - actionAt: expect.any(String) - }); - }); - - it('triggers PubSub.publish', () => { - expect(PubSubMock.publish).toHaveBeenCalledWith('frontend-notification', { - type: 'info', - title: - 'Cancelling the order action has been received. Wait for cancelling the order.' - }); }); it('triggers ws.send', () => { diff --git a/app/frontend/websocket/handlers/__tests__/dust-transfer-execute.test.js b/app/frontend/websocket/handlers/__tests__/dust-transfer-execute.test.js index a595406c..00fccded 100644 --- a/app/frontend/websocket/handlers/__tests__/dust-transfer-execute.test.js +++ b/app/frontend/websocket/handlers/__tests__/dust-transfer-execute.test.js @@ -4,8 +4,8 @@ describe('dust-transfer-execute.js', () => { let mockWebSocketServerWebSocketSend; let loggerMock; - let cacheMock; - let PubSubMock; + + let mockSaveOverrideIndicatorAction; beforeEach(() => { jest.clearAllMocks().resetModules(); @@ -15,17 +15,18 @@ describe('dust-transfer-execute.js', () => { mockWebSocketServer = { send: mockWebSocketServerWebSocketSend }; + + mockSaveOverrideIndicatorAction = jest.fn().mockResolvedValue(true); + + jest.mock('../../../../cronjob/trailingTradeHelper/common', () => ({ + saveOverrideIndicatorAction: mockSaveOverrideIndicatorAction + })); }); beforeEach(async () => { - const { cache, logger, PubSub } = require('../../../../helpers'); + const { logger } = require('../../../../helpers'); - cacheMock = cache; loggerMock = logger; - PubSubMock = PubSub; - - cacheMock.hset = jest.fn().mockResolvedValue(true); - PubSubMock.publish = jest.fn().mockResolvedValue(true); const { handleDustTransferExecute } = require('../dust-transfer-execute'); await handleDustTransferExecute(loggerMock, mockWebSocketServer, { @@ -35,25 +36,18 @@ describe('dust-transfer-execute.js', () => { }); }); - it('triggers cache.hset', () => { - expect(cacheMock.hset.mock.calls[0][0]).toStrictEqual( - 'trailing-trade-indicator-override' + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideIndicatorAction).toHaveBeenCalledWith( + loggerMock, + 'global', + { + action: 'dust-transfer', + params: ['TRX', 'ETH'], + actionAt: expect.any(String), + triggeredBy: 'user' + }, + 'The dust transfer request received by the bot. Wait for executing the dust transfer.' ); - expect(cacheMock.hset.mock.calls[0][1]).toStrictEqual('global'); - const args = JSON.parse(cacheMock.hset.mock.calls[0][2]); - expect(args).toStrictEqual({ - action: 'dust-transfer', - params: ['TRX', 'ETH'], - actionAt: expect.any(String) - }); - }); - - it('triggers PubSub.publish', () => { - expect(PubSubMock.publish).toHaveBeenCalledWith('frontend-notification', { - title: - 'The dust transfer request received by the bot. Wait for executing the dust transfer.', - type: 'info' - }); }); it('triggers ws.send', () => { diff --git a/app/frontend/websocket/handlers/__tests__/manual-trade-all-symbols.test.js b/app/frontend/websocket/handlers/__tests__/manual-trade-all-symbols.test.js index a4dca09a..c1b77f90 100644 --- a/app/frontend/websocket/handlers/__tests__/manual-trade-all-symbols.test.js +++ b/app/frontend/websocket/handlers/__tests__/manual-trade-all-symbols.test.js @@ -6,12 +6,11 @@ describe('manual-trade-all-symbols.js', () => { let mockWebSocketServerWebSocketSend; let loggerMock; - let cacheMock; let PubSubMock; let mockGetGlobalConfiguration; - let index; + let mockSaveOverrideAction; const orders = { side: 'buy', @@ -231,24 +230,28 @@ describe('manual-trade-all-symbols.js', () => { mockWebSocketServer = { send: mockWebSocketServerWebSocketSend }; + + mockSaveOverrideAction = jest.fn().mockResolvedValue(true); + + jest.mock('../../../../cronjob/trailingTradeHelper/common', () => ({ + saveOverrideAction: mockSaveOverrideAction + })); }); beforeEach(async () => { - const { cache, logger, PubSub } = require('../../../../helpers'); + const { logger, PubSub } = require('../../../../helpers'); - cacheMock = cache; loggerMock = logger; PubSubMock = PubSub; - cacheMock.hset = jest.fn().mockResolvedValue(true); PubSubMock.publish = jest.fn().mockResolvedValue(true); }); describe('buy', () => { beforeAll(() => { - index = 0; orders.side = 'buy'; }); + beforeEach(async () => { mockGetGlobalConfiguration = jest.fn().mockResolvedValue({ system: { placeManualOrderInterval: 5 } @@ -277,31 +280,31 @@ describe('manual-trade-all-symbols.js', () => { const quoteOrderQty = parseFloat(baseAsset.quoteOrderQty); if (quoteOrderQty > 0) { - it(`triggers cache.hset for ${symbol}`, () => { - expect(cacheMock.hset.mock.calls[index][0]).toStrictEqual( - 'trailing-trade-override' - ); - expect(cacheMock.hset.mock.calls[index][1]).toStrictEqual(symbol); - const args = JSON.parse(cacheMock.hset.mock.calls[index][2]); - expect(args).toStrictEqual({ - action: 'manual-trade', - order: { - side: 'buy', - buy: { - type: 'market', - marketType: 'total', - quoteOrderQty - } + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + loggerMock, + symbol, + { + action: 'manual-trade', + order: { + side: 'buy', + buy: { + type: 'market', + marketType: 'total', + quoteOrderQty + } + }, + actionAt: expect.any(String), + triggeredBy: 'user' }, - actionAt: expect.any(String) - }); - index += 1; + `Order for ${symbol} has been queued.` + ); }); } else { - it(`does not trigger cache.hset for ${symbol}`, () => { + it('does not trigger saveOverrideAction', () => { // Get all symbols called with cache.hset const symbols = _.reduce( - cacheMock.hset.mock.calls, + mockSaveOverrideAction.mock.calls, (newSymbols, s) => { newSymbols.push(s[1]); return newSymbols; @@ -335,7 +338,6 @@ describe('manual-trade-all-symbols.js', () => { describe('sell', () => { beforeAll(() => { - index = 0; orders.side = 'sell'; }); @@ -367,31 +369,31 @@ describe('manual-trade-all-symbols.js', () => { const marketQuantity = parseFloat(baseAsset.marketQuantity); if (marketQuantity > 0) { - it(`triggers cache.hset for ${symbol}`, () => { - expect(cacheMock.hset.mock.calls[index][0]).toStrictEqual( - 'trailing-trade-override' - ); - expect(cacheMock.hset.mock.calls[index][1]).toStrictEqual(symbol); - const args = JSON.parse(cacheMock.hset.mock.calls[index][2]); - expect(args).toStrictEqual({ - action: 'manual-trade', - order: { - side: 'sell', - sell: { - type: 'market', - marketType: 'amount', - marketQuantity - } + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + loggerMock, + symbol, + { + action: 'manual-trade', + order: { + side: 'sell', + sell: { + type: 'market', + marketType: 'amount', + marketQuantity + } + }, + actionAt: expect.any(String), + triggeredBy: 'user' }, - actionAt: expect.any(String) - }); - index += 1; + `Order for ${symbol} has been queued.` + ); }); } else { - it(`does not trigger cache.hset for ${symbol}`, () => { + it('does not trigger saveOverrideAction', () => { // Get all symbols called with cache.hset const symbols = _.reduce( - cacheMock.hset.mock.calls, + mockSaveOverrideAction.mock.calls, (newSymbols, s) => { newSymbols.push(s[1]); return newSymbols; diff --git a/app/frontend/websocket/handlers/__tests__/manual-trade.test.js b/app/frontend/websocket/handlers/__tests__/manual-trade.test.js index e311c983..b3c58cc2 100644 --- a/app/frontend/websocket/handlers/__tests__/manual-trade.test.js +++ b/app/frontend/websocket/handlers/__tests__/manual-trade.test.js @@ -4,8 +4,8 @@ describe('manual-trade.js', () => { let mockWebSocketServerWebSocketSend; let loggerMock; - let cacheMock; - let PubSubMock; + + let mockSaveOverrideAction; beforeEach(() => { jest.clearAllMocks().resetModules(); @@ -15,17 +15,18 @@ describe('manual-trade.js', () => { mockWebSocketServer = { send: mockWebSocketServerWebSocketSend }; + + mockSaveOverrideAction = jest.fn().mockResolvedValue(true); + + jest.mock('../../../../cronjob/trailingTradeHelper/common', () => ({ + saveOverrideAction: mockSaveOverrideAction + })); }); beforeEach(async () => { - const { cache, logger, PubSub } = require('../../../../helpers'); + const { logger } = require('../../../../helpers'); - cacheMock = cache; loggerMock = logger; - PubSubMock = PubSub; - - cacheMock.hset = jest.fn().mockResolvedValue(true); - PubSubMock.publish = jest.fn().mockResolvedValue(true); const { handleManualTrade } = require('../manual-trade'); await handleManualTrade(loggerMock, mockWebSocketServer, { @@ -38,24 +39,20 @@ describe('manual-trade.js', () => { }); }); - it('triggers cache.hset', () => { - expect(cacheMock.hset.mock.calls[0][0]).toStrictEqual( - 'trailing-trade-override' + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + loggerMock, + 'BTCUSDT', + { + action: 'manual-trade', + order: { + some: 'value' + }, + actionAt: expect.any(String), + triggeredBy: 'user' + }, + 'The manual order received by the bot. Wait for placing the order.' ); - expect(cacheMock.hset.mock.calls[0][1]).toStrictEqual('BTCUSDT'); - const args = JSON.parse(cacheMock.hset.mock.calls[0][2]); - expect(args).toStrictEqual({ - action: 'manual-trade', - order: { some: 'value' }, - actionAt: expect.any(String) - }); - }); - - it('triggers PubSub.publish', () => { - expect(PubSubMock.publish).toHaveBeenCalledWith('frontend-notification', { - type: 'info', - title: 'The order received by the bot. Wait for placing the order.' - }); }); it('triggers ws.send', () => { diff --git a/app/frontend/websocket/handlers/__tests__/symbol-trigger-buy.test.js b/app/frontend/websocket/handlers/__tests__/symbol-trigger-buy.test.js index 1e7be2c2..54550d9f 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-trigger-buy.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-trigger-buy.test.js @@ -4,9 +4,10 @@ describe('symbol-trigger-buy.test.js', () => { let mockWebSocketServer; let mockWebSocketServerWebSocketSend; - let mockCache; let mockLogger; + let mockSaveOverrideAction; + beforeEach(() => { jest.clearAllMocks().resetModules(); @@ -15,16 +16,19 @@ describe('symbol-trigger-buy.test.js', () => { mockWebSocketServer = { send: mockWebSocketServerWebSocketSend }; + + mockSaveOverrideAction = jest.fn().mockResolvedValue(true); + + jest.mock('../../../../cronjob/trailingTradeHelper/common', () => ({ + saveOverrideAction: mockSaveOverrideAction + })); }); describe('when symbol is provided', () => { beforeEach(async () => { - const { cache, logger } = require('../../../../helpers'); - mockCache = cache; + const { logger } = require('../../../../helpers'); mockLogger = logger; - mockCache.hset = jest.fn().mockResolvedValue(true); - const { handleSymbolTriggerBuy } = require('../symbol-trigger-buy'); await handleSymbolTriggerBuy(mockLogger, mockWebSocketServer, { data: { @@ -33,18 +37,17 @@ describe('symbol-trigger-buy.test.js', () => { }); }); - it('triggers cache.hset', () => { - expect(mockCache.hset.mock.calls[0][0]).toStrictEqual( - 'trailing-trade-override' + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + mockLogger, + 'BTCUSDT', + { + action: 'buy', + actionAt: expect.any(String), + triggeredBy: 'user' + }, + 'The buy order received by the bot. Wait for placing the order.' ); - - expect(mockCache.hset.mock.calls[0][1]).toStrictEqual('BTCUSDT'); - - const args = JSON.parse(mockCache.hset.mock.calls[0][2]); - expect(args).toStrictEqual({ - action: 'buy', - actionAt: expect.any(String) - }); }); it('triggers ws.send', () => { diff --git a/app/frontend/websocket/handlers/__tests__/symbol-trigger-sell.test.js b/app/frontend/websocket/handlers/__tests__/symbol-trigger-sell.test.js index 74cbe655..a9852bb8 100644 --- a/app/frontend/websocket/handlers/__tests__/symbol-trigger-sell.test.js +++ b/app/frontend/websocket/handlers/__tests__/symbol-trigger-sell.test.js @@ -4,10 +4,10 @@ describe('symbol-trigger-sell.test.js', () => { let mockWebSocketServer; let mockWebSocketServerWebSocketSend; - let mockCache; - let mockPubSub; let mockLogger; + let mockSaveOverrideAction; + beforeEach(() => { jest.clearAllMocks().resetModules(); @@ -16,17 +16,18 @@ describe('symbol-trigger-sell.test.js', () => { mockWebSocketServer = { send: mockWebSocketServerWebSocketSend }; + + mockSaveOverrideAction = jest.fn().mockResolvedValue(true); + + jest.mock('../../../../cronjob/trailingTradeHelper/common', () => ({ + saveOverrideAction: mockSaveOverrideAction + })); }); describe('when symbol is provided', () => { beforeEach(async () => { - const { cache, logger, PubSub } = require('../../../../helpers'); - mockCache = cache; + const { logger } = require('../../../../helpers'); mockLogger = logger; - mockPubSub = PubSub; - - mockPubSub.publish = jest.fn().mockResolvedValue(true); - mockCache.hset = jest.fn().mockResolvedValue(true); const { handleSymbolTriggerSell } = require('../symbol-trigger-sell'); await handleSymbolTriggerSell(mockLogger, mockWebSocketServer, { @@ -36,18 +37,17 @@ describe('symbol-trigger-sell.test.js', () => { }); }); - it('triggers cache.hset', () => { - expect(mockCache.hset.mock.calls[0][0]).toStrictEqual( - 'trailing-trade-override' + it('triggers saveOverrideAction', () => { + expect(mockSaveOverrideAction).toHaveBeenCalledWith( + mockLogger, + 'BTCUSDT', + { + action: 'sell', + actionAt: expect.any(String), + triggeredBy: 'user' + }, + 'The sell order received by the bot. Wait for placing the order.' ); - - expect(mockCache.hset.mock.calls[0][1]).toStrictEqual('BTCUSDT'); - - const args = JSON.parse(mockCache.hset.mock.calls[0][2]); - expect(args).toStrictEqual({ - action: 'sell', - actionAt: expect.any(String) - }); }); it('triggers ws.send', () => { diff --git a/app/frontend/websocket/handlers/cancel-order.js b/app/frontend/websocket/handlers/cancel-order.js index 5302ab2f..f1b49bac 100644 --- a/app/frontend/websocket/handlers/cancel-order.js +++ b/app/frontend/websocket/handlers/cancel-order.js @@ -1,5 +1,7 @@ const moment = require('moment'); -const { cache, PubSub } = require('../../../helpers'); +const { + saveOverrideAction +} = require('../../../cronjob/trailingTradeHelper/common'); const handleCancelOrder = async (logger, ws, payload) => { logger.info({ payload }, 'Start cancel order'); @@ -8,22 +10,18 @@ const handleCancelOrder = async (logger, ws, payload) => { data: { symbol, order } } = payload; - await cache.hset( - 'trailing-trade-override', - `${symbol}`, - JSON.stringify({ + await saveOverrideAction( + logger, + symbol, + { action: 'cancel-order', order, - actionAt: moment() - }) + actionAt: moment().format(), + triggeredBy: 'user' + }, + 'Cancelling the order action has been received. Wait for cancelling the order.' ); - PubSub.publish('frontend-notification', { - type: 'info', - title: - 'Cancelling the order action has been received. Wait for cancelling the order.' - }); - ws.send( JSON.stringify({ result: true, diff --git a/app/frontend/websocket/handlers/dust-transfer-execute.js b/app/frontend/websocket/handlers/dust-transfer-execute.js index 48738509..8755bf51 100644 --- a/app/frontend/websocket/handlers/dust-transfer-execute.js +++ b/app/frontend/websocket/handlers/dust-transfer-execute.js @@ -1,5 +1,7 @@ const moment = require('moment'); -const { cache, PubSub } = require('../../../helpers'); +const { + saveOverrideIndicatorAction +} = require('../../../cronjob/trailingTradeHelper/common'); const handleDustTransferExecute = async (logger, ws, payload) => { logger.info({ payload }, 'Start dust transfer execute'); @@ -8,22 +10,18 @@ const handleDustTransferExecute = async (logger, ws, payload) => { data: { dustTransfer } } = payload; - await cache.hset( - 'trailing-trade-indicator-override', + await saveOverrideIndicatorAction( + logger, 'global', - JSON.stringify({ + { action: 'dust-transfer', params: dustTransfer, - actionAt: moment() - }) + actionAt: moment().format(), + triggeredBy: 'user' + }, + 'The dust transfer request received by the bot. Wait for executing the dust transfer.' ); - PubSub.publish('frontend-notification', { - type: 'info', - title: - 'The dust transfer request received by the bot. Wait for executing the dust transfer.' - }); - ws.send( JSON.stringify({ result: true, diff --git a/app/frontend/websocket/handlers/manual-trade-all-symbols.js b/app/frontend/websocket/handlers/manual-trade-all-symbols.js index 6f5fb87e..cd913338 100644 --- a/app/frontend/websocket/handlers/manual-trade-all-symbols.js +++ b/app/frontend/websocket/handlers/manual-trade-all-symbols.js @@ -1,9 +1,12 @@ const _ = require('lodash'); const moment = require('moment'); -const { cache, PubSub } = require('../../../helpers'); +const { PubSub } = require('../../../helpers'); const { getGlobalConfiguration } = require('../../../cronjob/trailingTradeHelper/configuration'); +const { + saveOverrideAction +} = require('../../../cronjob/trailingTradeHelper/common'); const handleManualTradeAllSymbols = async (logger, ws, payload) => { logger.info({ payload }, 'Start manual trade all symbols'); @@ -45,19 +48,16 @@ const handleManualTradeAllSymbols = async (logger, ws, payload) => { quoteOrderQty } }, - actionAt: currentTime + actionAt: currentTime.format(), + triggeredBy: 'user' }; logger.info({ symbolOrder }, `Queueing order for ${symbol}.`); - cache.hset( - 'trailing-trade-override', - `${symbol}`, - JSON.stringify(symbolOrder) - ); - - logger.info( - { baseAsset, symbolOrder }, + saveOverrideAction( + logger, + symbol, + symbolOrder, `Order for ${symbol} has been queued.` ); @@ -87,18 +87,16 @@ const handleManualTradeAllSymbols = async (logger, ws, payload) => { marketQuantity } }, - actionAt: currentTime + actionAt: currentTime.format(), + triggeredBy: 'user' }; - logger.info({ symbolOrder }, `Queueing order for ${symbol}.`); - cache.hset( - 'trailing-trade-override', - `${symbol}`, - JSON.stringify(symbolOrder) - ); + logger.info({ symbolOrder }, `Queueing order for ${symbol}.`); - logger.info( - { baseAsset, symbolOrder }, + saveOverrideAction( + logger, + symbol, + symbolOrder, `Order for ${symbol} has been queued.` ); diff --git a/app/frontend/websocket/handlers/manual-trade.js b/app/frontend/websocket/handlers/manual-trade.js index 5b555e1a..78a31155 100644 --- a/app/frontend/websocket/handlers/manual-trade.js +++ b/app/frontend/websocket/handlers/manual-trade.js @@ -1,5 +1,7 @@ const moment = require('moment'); -const { cache, PubSub } = require('../../../helpers'); +const { + saveOverrideAction +} = require('../../../cronjob/trailingTradeHelper/common'); const handleManualTrade = async (logger, ws, payload) => { logger.info({ payload }, 'Start manual trade'); @@ -8,21 +10,18 @@ const handleManualTrade = async (logger, ws, payload) => { data: { symbol, order } } = payload; - await cache.hset( - 'trailing-trade-override', - `${symbol}`, - JSON.stringify({ + await saveOverrideAction( + logger, + symbol, + { action: 'manual-trade', order, - actionAt: moment() - }) + actionAt: moment().format(), + triggeredBy: 'user' + }, + 'The manual order received by the bot. Wait for placing the order.' ); - PubSub.publish('frontend-notification', { - type: 'info', - title: 'The order received by the bot. Wait for placing the order.' - }); - ws.send( JSON.stringify({ result: true, diff --git a/app/frontend/websocket/handlers/symbol-trigger-buy.js b/app/frontend/websocket/handlers/symbol-trigger-buy.js index c19b896f..8bd1794e 100644 --- a/app/frontend/websocket/handlers/symbol-trigger-buy.js +++ b/app/frontend/websocket/handlers/symbol-trigger-buy.js @@ -1,5 +1,7 @@ const moment = require('moment'); -const { cache, PubSub } = require('../../../helpers'); +const { + saveOverrideAction +} = require('../../../cronjob/trailingTradeHelper/common'); const handleSymbolTriggerBuy = async (logger, ws, payload) => { logger.info({ payload }, 'Start symbol trigger buy'); @@ -8,20 +10,17 @@ const handleSymbolTriggerBuy = async (logger, ws, payload) => { const { symbol } = symbolInfo; - await cache.hset( - 'trailing-trade-override', - `${symbol}`, - JSON.stringify({ + await saveOverrideAction( + logger, + symbol, + { action: 'buy', - actionAt: moment() - }) + actionAt: moment().format(), + triggeredBy: 'user' + }, + 'The buy order received by the bot. Wait for placing the order.' ); - PubSub.publish('frontend-notification', { - type: 'info', - title: 'The order received by the bot. Wait for placing the order.' - }); - ws.send(JSON.stringify({ result: true, type: 'symbol-trigger-buy-result' })); }; diff --git a/app/frontend/websocket/handlers/symbol-trigger-sell.js b/app/frontend/websocket/handlers/symbol-trigger-sell.js index 1a0daa6a..3e9c58de 100644 --- a/app/frontend/websocket/handlers/symbol-trigger-sell.js +++ b/app/frontend/websocket/handlers/symbol-trigger-sell.js @@ -1,5 +1,7 @@ const moment = require('moment'); -const { cache, PubSub } = require('../../../helpers'); +const { + saveOverrideAction +} = require('../../../cronjob/trailingTradeHelper/common'); const handleSymbolTriggerSell = async (logger, ws, payload) => { logger.info({ payload }, 'Start symbol trigger sell'); @@ -8,20 +10,17 @@ const handleSymbolTriggerSell = async (logger, ws, payload) => { const { symbol } = symbolInfo; - await cache.hset( - 'trailing-trade-override', - `${symbol}`, - JSON.stringify({ + await saveOverrideAction( + logger, + symbol, + { action: 'sell', - actionAt: moment() - }) + actionAt: moment().format(), + triggeredBy: 'user' + }, + 'The sell order received by the bot. Wait for placing the order.' ); - PubSub.publish('frontend-notification', { - type: 'info', - title: 'The order received by the bot. Wait for placing the order.' - }); - ws.send(JSON.stringify({ result: true, type: 'symbol-trigger-sell-result' })); }; diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json index 27f0ecdc..b13dec3b 100644 --- a/config/custom-environment-variables.json +++ b/config/custom-environment-variables.json @@ -129,6 +129,18 @@ "__name": "BINANCE_JOBS_TRAILING_TRADE_BOT_OPTIONS_TRIGGER_AFTER", "__description": "Set minutes to trigger buy orders for the symbol after removing the last buy price.", "__format": "number" + }, + "conditions": { + "whenLessThanATHRestriction": { + "__name": "BINANCE_JOBS_TRAILING_TRADE_BOT_OPTIONS_AUTO_TRIGGER_BY_CONDITIONS_WHEN_LESS_THAN_ATH_RESTRICTION", + "__description": "Set a boolean to reschedule the auto-buy trigger action if the price is over the ATH restriction.", + "__format": "boolean" + }, + "afterDisabledPeriod": { + "__name": "BINANCE_JOBS_TRAILING_TRADE_BOT_OPTIONS_AUTO_TRIGGER_BY_CONDITIONS_AFTER_DISABLED_PERIOD", + "__description": "Set a boolean to reschedule the auto-buy trigger action if the action is currently disabled by the stop-loss or other actions.", + "__format": "boolean" + } } }, "orderLimit": { @@ -147,6 +159,13 @@ "__description": "Set the maximum number of open trades. If set 5,, then the bot will not place a buy order when there are 5 symbols recorded with the last buy price.", "__format": "number" } + }, + "tradingView": { + "showTechnicalAnalysisWidget": { + "__name": "BINANCE_JOBS_TRAILING_TRADE_BOT_OPTIONS_TRADING_VIEW_SHOW_TECHNICAL_ANALYSIS_WIDGET", + "__description": "Set a boolean to display the TradingView technical analysis widget in the frontend.", + "__format": "boolean" + } } }, "candles": { diff --git a/config/default.json b/config/default.json index d74b4344..18723641 100644 --- a/config/default.json +++ b/config/default.json @@ -63,12 +63,19 @@ }, "autoTriggerBuy": { "enabled": false, - "triggerAfter": 20 + "triggerAfter": 20, + "conditions": { + "whenLessThanATHRestriction": true, + "afterDisabledPeriod": true + } }, "orderLimit": { "enabled": true, "maxBuyOpenOrders": 3, "maxOpenTrades": 5 + }, + "tradingView": { + "showTechnicalAnalysisWidget": true } }, "candles": { diff --git a/migrations/1632400564167-flush-configuration-cache.js b/migrations/1632400564167-flush-configuration-cache.js new file mode 100644 index 00000000..2688f610 --- /dev/null +++ b/migrations/1632400564167-flush-configuration-cache.js @@ -0,0 +1,19 @@ +const path = require('path'); +const { logger: rootLogger, cache } = require('../app/helpers'); + +module.exports.up = async () => { + const logger = rootLogger.child({ + gitHash: process.env.GIT_HASH || 'unspecified', + migration: path.basename(__filename) + }); + + logger.info('Start migration'); + + cache.hdelall('trailing-trade-configurations:*'); + + logger.info('Finish migration'); +}; + +module.exports.down = next => { + next(); +}; diff --git a/public/css/App.css b/public/css/App.css index 1d46fdf2..1981fa30 100644 --- a/public/css/App.css +++ b/public/css/App.css @@ -924,3 +924,7 @@ input[type='number'] { /** End: Trade Modal */ + +.tradingview-widget-container iframe { + overflow-y: none; +} diff --git a/public/css/fontawesome/all.min.css b/public/css/fontawesome/all.min.css index e1e271c0..ac76ff19 100644 --- a/public/css/fontawesome/all.min.css +++ b/public/css/fontawesome/all.min.css @@ -1,5 +1,5 @@ /*! - * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ -.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file +.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/public/css/webfonts/fa-brands-400.eot b/public/css/webfonts/fa-brands-400.eot index 0d3dc788670304fb007a52d24b8a03bc60caba09..325cdf3bd08cba7765d0032beccaa640525659fc 100644 GIT binary patch delta 2574 zcmZWr3se(V8ovMJIWxIQgpkN9ghVE3!Ip$1L{d!;1bv3}9?ScJqk5fVI{m%qd@IEZ*8UPJuic?*`!-SbJ4 z9w9#`f-9b)!u&a*@m+r`5<^4j&QxJVbQAw%G=|~dZB8CoxL{SSCy^_y- zRGy5G)Qb?WsU+X&pv=5P;25G1?L>eshm-G@T#RSqnRo`y#W^?|XW>lz5}txH za5|oZC*m~x0#3#g@OW&;<8UI5$8p$(E!d2WI2u2XpTquGhFM1PmSmM=rNqJBXM5S3 zte5>Kd!9YXe!(7PKV>IwWjC{p>}qxuo5fCLer9@^zcZ(pPnjmBgt0Rm6UqcJDkgxD z)Bm9#()Z~;`YL^yK1ct9UQJifdRim?Mf^bAE53oieI4te?k>h|u}nv~oN?ZGZG3gY z&V;_PU1J9la}sxrD;n2t7u!?q1@=?p?c={pVv?egS|?~Gq)zBc4oc2Wb|&vmzLzpN zr72aN+VBE;VR;&p)-=&HvGhgxiv^RMlMYYzn|v(YFMVJ7jr2zu52q}c()-fVsc5Qo z>hjE%ENRx#th?E#vmZ@cFzu8p=fTUxFJH=Sn=YN6J$>hlwi%CRZkQ#Ul{>3%cFye1 z*^ly4^OojY^9Kr^Ey$cxUnnnh79N^wnwvX!`P@tM(&lx}^Ul}K&z|p`f3{dyyl_G0 zf`*cWlEo!g7bYy6v9N04y+7?){L_-CC6`NsN=r*`y=s5W>nwJ5EK@E!R_0fhROWi{ zdiCqQ%jL^km-ns6U9ogU%Zf|o{PJcO=bEuHX_al&zKZ0EITZ(2tJjpRxllQxa&6^_ zwMlEc*D>p=)^$`xS8b~5sJi+_#v41Und-dtYu2CJaAd=+joOX&jeT!c*M!tm)RxwE zZ(3Z3>OA$P`nLKD^?h&GG?*JUG)bFkHs5hIE8n5ERBzd}<;0(lZOhp9?lwI={h{K+q7OZL z{PyhIo3?lB-h2DX_h;-s)oN-zav=9W|3S^cZg*!}!J)e!+du9-V*7;Onb7%@r^@r? zQR=Am=-Q*MM_t8Tmp)thSzEWXdvv#>`_SiQpP&6(!7UXHuG>k4zF{L0R&YVT<88gG~P-t~hwv^UzmQh(Kdv*7E+ zU!S;TxHab+@i&LRE&H~+uk<_WJLh+u-v@o)dE0Qi`Syi7i|=^dyZxh`?yVbAbuhN> z%t?hysMB&ftx#k!b6R02D3m5^JS0GjNf~2`4S4Jo1z2OEhb&N|2nkUPwD@|^jFibE zWin1cOKEZoIGHR`E+rSSN+l8uM3q6y)A&3^$Utw4T#i8~qG^%G*U6dz%LRD?IbXw< zlUIYgvX#RE845$`1fG9gdxW3sHy}o>$YOmA&GIYo0EJM?#e>;uQic-Xe?aJhIfNOoL?ZnS?C+NFKX4r+QBU%RMu9N7oWS=X^&!U4{B#*Yz{vet=cI5K z53z$@>Q&f|QqUAMoxJ6gB1M2uq%~?SoL*}*$5>;nW+SIJ>xBAfU9^a}6e^|4L}C;= ztfQ$6 z3jmbE0S^Pn7!UG!Fq-U(SQM_+hKs}i38M$js?-oRQXO_t85R~576xUTKLRiYf+~oj z$yj_IBqaflPXVT>AQc1}0o?CE5DPN7P)Lf(1`XWT1rFEgjJhWRk#EMJ7u;WXPb7*l z!$>3ygWH?JVUs`L_Gc}y#gE7@Qb5DH1_uYPfro6-Sh79Cq)$lpf0Z4k5bC0hTFx@e zO!#MfT;HMUCkVhJ)-Xy&j>Ta)VF7A&01<&|bs!PyG}a$ue_vzM)WjghauTY6nt@iH zgeRtSJkW>}#TxoFtqGjUassN2nJ(7RC{|Y8C0)|9t}LhPgz9siU9; z2@!{^C?25*MI=}V<&-MIMxjb6)P-va8TFjrLRhHhtTEvxC1LCk0ri#yAUuqOfLK$2 zFA*lkM4F=7Wf2iF2?d(r10BOPKuMnJkm}P<>Z8hq%Vz zeux_SL6ex#GYG}R7@xD4%#CmLLnxTr_x3|31;^W|AEBAzqcCb>W6RI*Q+xA6FbUdw Y2H`bH<0J_c1jibSBvgpx_rE^>1y}#%YXATM delta 2683 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 diff --git a/public/css/webfonts/fa-brands-400.svg b/public/css/webfonts/fa-brands-400.svg index 4e48a466..b9881a43 100644 --- a/public/css/webfonts/fa-brands-400.svg +++ b/public/css/webfonts/fa-brands-400.svg @@ -2,11 +2,11 @@ -Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021 +Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 By Robert Madole Copyright (c) Font Awesome - + - +d="M400 416c26.4922 0 48 -21.5078 48 -48v-352c0 -26.4922 -21.5078 -48 -48 -48h-352c-26.4922 0 -48 21.5078 -48 48v352c0 26.4922 21.5078 48 48 48h352zM336 136v160c-31.5996 -11.2002 -41.2002 -16 -59.7998 -16c-31.4004 0 -43.4004 16 -74.6006 16 +c-25.3994 0 -37.3994 -10.4004 -57.5996 -14.4004v6.40039c0 8.83105 -7.16895 16 -16 16s-16 -7.16895 -16 -16v-192c0 -8.83105 7.16895 -16 16 -16s16 7.16895 16 16v153.6c20.2002 4 32.2002 14.4004 57.5996 14.4004c31.4004 0 43.2002 -16 74.6006 -16 +c10.2002 0 17.7998 1.40039 27.7998 4.59961v-96c-10 -3.19922 -17.5996 -4.59961 -27.7998 -4.59961c-31.4004 0 -43.4004 16 -74.6006 16c-8.91309 -0.0322266 -17.5195 -1.44336 -25.5996 -4v-32c7.86035 2.58398 16.2559 4.00195 24.9756 4.00195 +c0.208008 0 0.416016 0 0.624023 -0.00195312c31.4004 0 43.2002 -16 74.6006 -16c18.5996 0 28.2002 4.7998 59.7998 16z" /> +d="M400 416c26.4922 0 48 -21.5078 48 -48v-352c0 -26.4922 -21.5078 -48 -48 -48h-352c-26.4922 0 -48 21.5078 -48 48v352c0 26.4922 21.5078 48 48 48h352zM416 16v352c0 8.83105 -7.16895 16 -16 16h-352c-8.83105 0 -16 -7.16895 -16 -16v-352 +c0 -8.83105 7.16895 -16 16 -16h352c8.83105 0 16 7.16895 16 16zM201.6 296c31.2002 0 43.2002 -16 74.6006 -16c18.5996 0 28.2002 4.7998 59.7998 16v-160c-31.5996 -11.2002 -41.2002 -16 -59.7998 -16c-31.4004 0 -43.2002 16 -74.6006 16 +c-0.208008 0.00195312 -0.415039 -0.0175781 -0.623047 -0.0175781c-8.7207 0 -17.1162 -1.39844 -24.9766 -3.98242v32c8.08008 2.55664 16.6865 3.96777 25.5996 4c31.2002 0 43.2002 -16 74.6006 -16c10.2002 0 17.7998 1.40039 27.7998 4.59961v96 +c-10 -3.19922 -17.5996 -4.59961 -27.7998 -4.59961c-31.4004 0 -43.2002 16 -74.6006 16c-25.3994 0 -37.3994 -10.4004 -57.5996 -14.4004v-153.6c0 -8.83105 -7.16895 -16 -16 -16s-16 7.16895 -16 16v192c0 8.83105 7.16895 16 16 16s16 -7.16895 16 -16v-6.40039 +c20.2002 4 32.2002 14.4004 57.5996 14.4004z" /> d="M87 -33.7998v73.5996h73.7002v-73.5996h-73.7002zM25.4004 101.4h61.5996v-61.6006h-61.5996v61.6006zM491.6 271.1c53.2002 -170.3 -73 -327.1 -235.6 -327.1v95.7998h0.299805v0.299805c101.7 0.200195 180.5 101 141.4 208 c-14.2998 39.6006 -46.1006 71.4004 -85.7998 85.7002c-107.101 38.7998 -208.101 -39.8994 -208.101 -141.7h-95.7998c0 162.2 156.9 288.7 327 235.601c74.2002 -23.2998 133.6 -82.4004 156.6 -156.601zM256.3 40.0996h-0.299805v-0.299805h-95.2998v95.6006h95.5996 v-95.3008z" /> - + @@ -2461,10 +2455,11 @@ c13.7002 9.39941 16.4004 24.3994 9.10059 31.3994c-7.2002 6.90039 -28.2002 -7 -29 c12.5996 33.0996 -3.59961 45.5 -3.59961 45.5s-23.4004 12.9004 -33.3008 -20.2002c-9.89941 -33.0996 -6.39941 -44.8994 -6.39941 -44.8994s30.7002 -13.4004 43.2998 19.5996zM442.1 188.1c0 0 15.7002 -1.09961 26.4004 14.2002s1.2998 25.5 1.2998 25.5 s-8.59961 11.1006 -19.5996 -9.09961c-11.1006 -20.1006 -8.10059 -30.6006 -8.10059 -30.6006z" /> +d="M448 400v-336c-63 -23 -82 -32 -119 -32c-63 0 -87 32 -150 32c-20 0 -36 -4 -51 -8v64c15 4 31 8 51 8c63 0 87 -32 150 -32c20 0 35 3 55 9v208c-20 -6 -35 -9 -55 -9c-63 0 -87 32 -150 32c-51 0 -75 -21 -115 -29v-307 +c0.00195312 -0.136719 0.00292969 -0.273438 0.00292969 -0.410156c0 -17.4404 -14.1602 -31.5996 -31.6006 -31.5996c-0.136719 0 -0.265625 0.0078125 -0.402344 0.00976562c-0.136719 -0.00195312 -0.273438 -0.00292969 -0.410156 -0.00292969 +c-17.4404 0 -31.5996 14.1602 -31.5996 31.6006c0 0.136719 0.0078125 0.265625 0.00976562 0.402344v384c-0.00195312 0.136719 -0.00292969 0.273438 -0.00292969 0.410156c0 17.4404 14.1602 31.5996 31.6006 31.5996 +c0.136719 0 0.265625 -0.0078125 0.402344 -0.00976562c0.136719 0.00195312 0.273438 0.00292969 0.410156 0.00292969c17.4404 0 31.5996 -14.1602 31.5996 -31.6006c0 -0.136719 -0.0078125 -0.265625 -0.00976562 -0.402344v-13c40 8 64 29 115 29c63 0 87 -32 150 -32 +c37 0 56 9 119 32z" /> +d="M14 352.208c0 52.9043 42.8877 95.792 95.793 95.792h164.368c52.9053 0 95.793 -42.8877 95.793 -95.792c0 -33.5 -17.1963 -62.9844 -43.2432 -80.1055c26.0469 -17.1211 43.2432 -46.6045 43.2432 -80.1045c0 -52.9053 -42.8877 -95.793 -95.793 -95.793h-2.08008 +c-24.8018 0 -47.4033 9.42578 -64.415 24.8906v-88.2627c0 -53.6104 -44.0088 -96.833 -97.3574 -96.833c-52.7725 0 -96.3086 42.7568 -96.3086 95.793c0 33.498 17.1943 62.9805 43.2393 80.1016c-26.0449 17.1221 -43.2393 46.6055 -43.2393 80.1035 +c0 33.5 17.1963 62.9834 43.2422 80.1045c-26.0459 17.1211 -43.2422 46.6055 -43.2422 80.1055zM176.288 256.413h-66.4951c-35.5762 0 -64.415 -28.8398 -64.415 -64.415c0 -35.4385 28.6172 -64.1924 64.0029 -64.4141 +c0.136719 0.000976562 0.274414 0.000976562 0.412109 0.000976562h66.4951v128.828zM207.666 191.998c0 -35.5752 28.8389 -64.415 64.415 -64.415h2.08008c35.5762 0 64.415 28.8398 64.415 64.415s-28.8389 64.415 -64.415 64.415h-2.08008 +c-35.5762 0 -64.415 -28.8398 -64.415 -64.415zM109.793 96.2051c-0.137695 0 -0.275391 0.000976562 -0.412109 0.000976562c-35.3857 -0.220703 -64.0029 -28.9746 -64.0029 -64.4131c0 -35.4453 29.2246 -64.415 64.9307 -64.415 +c36.2822 0 65.9795 29.4365 65.9795 65.4551v63.3721h-66.4951zM109.793 416.622c-35.5762 0 -64.415 -28.8398 -64.415 -64.4141c0 -35.5762 28.8389 -64.415 64.415 -64.415h66.4951v128.829h-66.4951zM207.666 287.793h66.4951c35.5762 0 64.415 28.8389 64.415 64.415 +c0 35.5742 -28.8389 64.4141 -64.415 64.4141h-66.4951v-128.829z" /> - + -Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021 +Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 By Robert Madole Copyright (c) Font Awesome - + ?2KLn;y^P*%Dm%rd2*vZ;d}ZKf0vg7^aMz#?MssdrJm$^F zyZM+8rw*gZzbKvKRUY_eA+5331-0)xh6g$n7(WtB2KCJdSk493QWdZtDuljl{+ PGMa4OQ~8&Z2iY_Lw3sot delta 179 zcmX@s&UCb$NrZusfq{XSp@D&!A;8To#COWkxcw7FVpyb4?(>;g;^Sa-*G`Fnp{$01 zfi=1yzqsU2rsHk~hUyy(4D72xdKtZ2A0K$NS|Fa^<|_j?6VNaQhC5}|pP=-QO^nC9 zHy`)m)L}H9e6d0qNGeo>P4=$jVKrt@V9=PXSRp;Ryi$h8m_d_)!PwYP&(z3x^889! PM&r$UEB|uxAe#jMM`t*z diff --git a/public/css/webfonts/fa-regular-400.woff b/public/css/webfonts/fa-regular-400.woff index e9f54b13d5e925602e04501415ced4bc0bc881d2..ad077c6bec782b7c15bfa4ec96ee5900faaa3ccb 100644 GIT binary patch delta 648 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 delta 199 zcmcb(k>~tIo(VQA+B?fqCpx6C8Z#&`XiPuwj7fUB*i$AMM&pSOeOaa)jXOBmh%tsm z`uaY<$&(m;m{m6!PJYNJFW34wwQQ$$JipCX25u$>5V%uT{RK+@*eu5sc%r%B)b@f? zj0(})C#o_%+s9};{p=GaX?9&xJwsDHO*w|3d Y)W~?c-BTu6M&s= -Created by FontForge 20201107 at Tue Mar 16 10:15:04 2021 +Created by FontForge 20201107 at Wed Aug 4 12:25:29 2021 By Robert Madole Copyright (c) Font Awesome - + i?JL7)58b` z23GBY{NfU(4{nJJOwU>v7!375dKtajRHBy)Z;j`-`O3h}1T>6+;jTd)jON_L7j|S_P~>j3ek+b+Y42gp6z2anZEWhlQg@osh**!p2_sUr%W2t?>_<(ryeu$u$nL^ vFlbC)@RUh<`nShSGCU>>nhXra#)f*PMkdqco-oNWnrydu!jx&ugKQT7&^SEG delta 202 zcmdnIo@e8F9uWpc1_lORh6V;^h5$FW5Z@_B;|@*~iD8kxzRz!BiI0QoCPO&}riT#> z46ND(`NbtnAKVfdn4YyTFc|8A^fG$4K2ELHSRK!A^Ob>{31}Dt!=19~FHri&CdR-M z%|R!(2c2Y8h~8eT!t`t(qw)0hkC~*|bxrjQP4$eYFMP@rF#XJ9CLUH}1_cI<=^vgl pNl*Xrm`R4mm_d_)!PwYP&(z3xy22ACSw`dSc2Afxjd_r*0079bK>Ppz diff --git a/public/css/webfonts/fa-solid-900.woff b/public/css/webfonts/fa-solid-900.woff index 83ae9943f205b26c03e9d5b8a8befdf6bc6e7787..c561838c56ed5e9eee1fa044bff6e3626e4c7d91 100644 GIT binary patch delta 777 zcmV+k1NQuqng))V1{ilwMn(Vu00001jSv70000037x)27h9r>~Bm|Z@V&0KJZ+|oZ z001@}OTw&ZXk}pl0bpzZ001BW001NeLk2BqZFG150bq;(00Za%01vRl)dLA^Z)0Hq z0c3Ol017Pt01vbU18PKVVR&!=0dAxK0018V001BaP61tRVQpmq0dB+q00IpF00k>2 zv@;%XZ*z120dUj+0310005L8C@Et~Bc${NkU|?hbg4;LJu7K#f26YTjniBv_`UVbz zO98h_0Ri-0D^rPHw8S)?-{va=HxmO0+%>3!(VYL^{NKVfmGLZ)%fZ0J0Mr2hUat(N zw{Bnoa}Iy8k;sawQpAD{YK7Q3iQ8C>GnPF~)CWL31`C!ffM?(VSg_zBSn>iKJ6E(p zv;rx%41h!H6)dct$9N)ap@uiYHp=)Q>_FkCa0xZ*xo{bE>yz*ns&-kp zf+Kq&yp2cpH{l)ZJNv@BC_8=OJ=C07_<%Vdg{yze`AT=I^nf$3s3d0#J-igQ>Gn?8 z!83doE}>^V6fWb1H4@&!k@a1;g4gz;@HSlgz3>j|_7CA*RGfzJ9(vAG;RDp2x58EC ze8CAc5?muigbPezxNA*}(c(B{Y+kG!V~G$M=P^f|=;S($E~Z8`$1OF~bEA%zVWwlo z?)ra8!7n6Jay~od`i!O%{&Gt|`D&Pkp*q#Gh@o3qvhx4>ZAM&li?4T&TibWLzUyte zg+AXdt$m)qSM2WH`U`$j&Z8n@P&nR{-lAB)>-s%UHP;LmVVXsHK2WO;S~o4M8~DGA zZ~s}mNcnl?ZK?c>_aUz;ml&Zz8ATb*F|U6;DQ?acMFNT{N{tIs#dug`1e{Gc8m{MN zm&`Hj1ZUGwEyGbGQ?bsBN_28H3sM!0^;~74QNetojMlTu$S^yAV&TzU)E zdUFf=nCZqO*`U)oXIH_hD|f8pe?8W}9pz^3;eD56qqY44CQ0jk0001ZoNZbKnB=$J HZ~-+O9ezWing)`Z1{ilwMn(Vu00001jT8V4000037x)27h2xPJBm|VjUcr$-Z+|ra z001@{*S=0@Xk}pl0bp0 zvN0ZTZ*z120dUv=0310005L8C@Et~Bc${NkU|?hbg4;LJu7Kz}Wz}Dx^bY`99SC)U zO98h_0Ri-0FMXU^wo^Nv-{va=HxmO0+$pR60;PZafAfC}(^ST@KrROZ69Z5O0JZNA zwEzGBw`yPka}Iy5E0GmdrHBO^)C#e661TA$XDoY~s1Jbp7%W(_0G@#dV8MciV95(` z>|D_X(F&y4lINSb*XP_jGXVCj*RZgBp5jQ@LJe<)ZItmr*nz@N;Sy@r3*j>A)+gZ& zRPC~G1qb$AcoR?TZ^B#Hb#{ffQFc7x9n_pyc#kZaMzj`p~Z2)*sNGN#sVQS&SQ=^(aCihT}+H>j#_GZ!f?r6cLv^aB5kq&fWaa<$+l;vA7GLiHx3=$g zeb-xe3m)Gtt$m)qSM2Wn`g49$&Z8ouUpU^D-lCY-b^V^Fnk$C$FwG)8>#Jo4t=kq> z4gBB5xBo0&r2M?{wp4z``;b?aOAOJVjG~O@nAd-v6gTIJA^}AerACFRVmvG|0?x)9 z4cBwCOXe7Mg0o4e7U8gwsaR)5B|5p92C0fhdZx0_s9-i$M(gQiWSE^_N<*uR8`9x> zF1-aSy}5;b%yeUttl#OJv#Vg)l{?b$zaHz~j&eQs@S#hx*4lmn7xC+N0001ZoNZbK LnB=$FZ~-+OzK&f- diff --git a/public/css/webfonts/fa-solid-900.woff2 b/public/css/webfonts/fa-solid-900.woff2 index dc52d954d8d7f62c82cf63236d27093764a3d046..2217164f0c05a385d7d0d83e030fdbae01e99304 100644 GIT binary patch literal 78268 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'd1Mlv9Dcqdu7tF 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 V=VGRl8m#`%cC;f?eCPlA^&g!Ko?QR{ literal 78196 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 EKZs0^EC2ui diff --git a/public/index.html b/public/index.html index ebe8a655..4f8fa67e 100644 --- a/public/index.html +++ b/public/index.html @@ -135,6 +135,7 @@ + diff --git a/public/js/CoinWrapper.js b/public/js/CoinWrapper.js index 806fd230..6079c976 100644 --- a/public/js/CoinWrapper.js +++ b/public/js/CoinWrapper.js @@ -65,12 +65,15 @@ class CoinWrapper extends React.Component { sendWebSocket={sendWebSocket} isAuthenticated={isAuthenticated} /> + + +

+ Action {overrideData.action} will be executed{' '} + {moment(overrideData.actionAt).fromNow()}, triggered by{' '} + {overrideData.triggeredBy}. +
+ + ); + } + return (
@@ -92,6 +114,7 @@ class CoinWrapperAction extends React.Component { )}
+ {renderOverrideAction} ); } diff --git a/public/js/CoinWrapperTradingView.js b/public/js/CoinWrapperTradingView.js new file mode 100644 index 00000000..afae4543 --- /dev/null +++ b/public/js/CoinWrapperTradingView.js @@ -0,0 +1,94 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react/jsx-no-undef */ +/* eslint-disable no-undef */ +class CoinWrapperTradingView extends React.Component { + constructor(props) { + super(props); + this._ref = React.createRef(); + } + + getTradingViewInterval(interval) { + switch (interval) { + case '3m': + return '5m'; + default: + return interval; + } + } + + componentDidMount() { + const { + symbolInfo: { + symbolInfo: { symbol }, + symbolConfiguration: { + candles: { interval }, + botOptions: { + tradingView: { showTechnicalAnalysisWidget } + } + } + } + } = this.props; + + if (showTechnicalAnalysisWidget === false) { + return; + } + const script = document.createElement('script'); + script.src = + 'https://s3.tradingview.com/external-embedding/embed-widget-technical-analysis.js'; + script.async = true; + script.innerHTML = + `{ + "interval": "` + + this.getTradingViewInterval(interval) + + `", + "width": "100%", + "isTransparent": true, + "height": "450", + "symbol": "BINANCE:` + + symbol + + `", + "showIntervalTabs": true, + "locale": "en", + "colorTheme": "dark" + }`; + this._ref.current.appendChild(script); + } + + render() { + const { + symbolInfo: { + symbol, + symbolConfiguration: { + botOptions: { + tradingView: { showTechnicalAnalysisWidget } + } + } + } + } = this.props; + + if (showTechnicalAnalysisWidget === false) { + return ''; + } + + return ( +
+
+
+
+ +
+
+
+ ); + } +} diff --git a/public/js/ProfitLossWrapper.js b/public/js/ProfitLossWrapper.js index f4236ad1..7606fa20 100644 --- a/public/js/ProfitLossWrapper.js +++ b/public/js/ProfitLossWrapper.js @@ -137,6 +137,10 @@ class ProfitLossWrapper extends React.Component { }); const openTradeWrappers = Object.values(totalPnL).map((pnl, index) => { + if (groupedEstimates[pnl.asset] === undefined) { + return ''; + } + const percentage = pnl.amount > 0 ? ((pnl.profit / pnl.amount) * 100).toFixed(2) : 0; return ( diff --git a/public/js/SettingIconBotOptions.js b/public/js/SettingIconBotOptions.js index 5257e8f7..665f978d 100644 --- a/public/js/SettingIconBotOptions.js +++ b/public/js/SettingIconBotOptions.js @@ -278,6 +278,89 @@ class SettingIconBotOptions extends React.Component { + +
+ Conditions: +
+
+ + + + + Re-schedule when less than ATH restriction{' '} + + + If enabled, the bot will re-schedule + the auto-buy trigger action if the + price is over the ATH restriction. + + + }> + + + + + +
+
+ + + + + Re-schedule when the action is disabled{' '} + + + If enabled, the bot will re-schedule + the auto-buy trigger action if the + action is currently disabled by the + stop-loss or other actions. + + + }> + + + + + +
@@ -427,6 +510,69 @@ class SettingIconBotOptions extends React.Component { + + + + + + Trading View + + + + +
+
+ + + + + Show Technical Analysis Widget{' '} + + + If enabled, the bot will display the + TradingView technical analysis + widget in the frontend. + + + }> + + + + + + + To apply this change, please refresh the + frontend. + +
+
+
+
+
+