diff --git a/plugins/yadacoinpool/handlers.py b/plugins/yadacoinpool/handlers.py index 4ba64fee..7d5700ce 100644 --- a/plugins/yadacoinpool/handlers.py +++ b/plugins/yadacoinpool/handlers.py @@ -30,30 +30,77 @@ async def get(self): ) -class PoolInfoHandler(BaseWebHandler): +cache = {"market_data": None} +last_refresh = time.time() + + +class MarketInfoHandler(BaseWebHandler): async def get(self): - def get_ticker(): + market_data = cache.get("market_data") + + if market_data is None or time.time() - last_refresh > 3600: + market_data = await self.fetch_market_data() + cache["market_data"] = market_data + + self.render_as_json(market_data) + + async def fetch_market_data(self): + symbols = ["YDA_USDT", "YDA_BTC"] + market_data = {} + + for symbol in symbols: + url = f"https://api.xeggex.com/api/v2/market/getbysymbol/{symbol}" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" } - return requests.get( - "https://safe.trade/api/v2/peatio/public/markets/tickers", - headers=headers, - ) - try: - if not hasattr(self.config, "ticker"): - self.config.ticker = get_ticker() - self.config.last_update = time.time() - if (time.time() - self.config.last_update) > (600 * 6): - self.config.ticker = get_ticker() - self.config.last_update = time.time() - last_btc = float(self.config.ticker.json()["ydabtc"]["ticker"]["last"]) - last_usdt = float(self.config.ticker.json()["ydausdt"]["ticker"]["last"]) - except: - last_btc = 0 - last_usdt = 0 + response = requests.get(url, headers=headers) + + if response.status_code == 200: + market_data[symbol.lower()] = { + "last_btc": float(response.json()["lastPrice"]) if symbol == "YDA_BTC" else 0, + "last_usdt": float(response.json()["lastPrice"]) if symbol == "YDA_USDT" else 0 + } + else: + market_data[symbol.lower()] = { + "last_btc": 0, + "last_usdt": 0 + } + + formatted_data = { + "last_btc": market_data["yda_btc"]["last_btc"], + "last_usdt": market_data["yda_usdt"]["last_usdt"] + } + + return formatted_data + +class PoolInfoHandler(BaseWebHandler): + async def get(self): await self.config.LatestBlock.block_checker() + latest_pool_info = await self.config.mongo.async_db.pool_info.find_one( + filter={}, + sort=[("time", -1)] + ) + + pool_hash_rate = latest_pool_info.get("pool_hash_rate", 0) + network_hash_rate = latest_pool_info.get("network_hash_rate", 0) + avg_network_hash_rate = latest_pool_info.get("avg_network_hash_rate", 0) + net_difficulty = latest_pool_info.get("net_difficulty", 0) + + twenty_four_hours_ago = time.time() - 24 * 60 * 60 + + history_query = { + "time": {"$gte": twenty_four_hours_ago}, + "pool_hash_rate": {"$exists": True} + } + + cursor = self.config.mongo.async_db.pool_info.find( + history_query, + {"_id": 0, "time": 1, "pool_hash_rate": 1} + ).sort([("time", -1)]) + + hashrate_history = await cursor.to_list(None) + pool_public_key = ( self.config.pool_public_key if hasattr(self.config, "pool_public_key") @@ -62,66 +109,16 @@ def get_ticker(): total_blocks_found = await self.config.mongo.async_db.blocks.count_documents( {"public_key": pool_public_key} ) - pool_blocks_found_list = ( - await self.config.mongo.async_db.blocks.find( - { - "public_key": pool_public_key, - }, - {"_id": 0}, - ) - .sort([("index", -1)]) - .to_list(100) - ) - expected_blocks = 144 - mining_time_interval = 600 - shares_count = await self.config.mongo.async_db.shares.count_documents( - {"time": {"$gte": time.time() - mining_time_interval}} - ) - if shares_count > 0: - pool_hash_rate = ( - shares_count * self.config.pool_diff - ) / mining_time_interval - else: - pool_hash_rate = 0 + pool_blocks_found_list = await self.config.mongo.async_db.pool_blocks.find( + {}, + {"_id": 0, "index": 1, "found_time": 1, "time": 1} + ).sort([("index", -1)]).to_list(5) + expected_blocks = 144 daily_blocks_found = await self.config.mongo.async_db.blocks.count_documents( {"time": {"$gte": time.time() - (600 * 144)}} ) - if daily_blocks_found > 0: - net_target = self.config.LatestBlock.block.target - avg_blocks_found = self.config.mongo.async_db.blocks.find( - {"time": {"$gte": time.time() - (600 * 36)}} - ) - avg_blocks_found = await avg_blocks_found.to_list(length=52) avg_block_time = daily_blocks_found / expected_blocks * 600 - if len(avg_blocks_found) > 0: - avg_net_target = 0 - for block in avg_blocks_found: - avg_net_target += int(block["target"], 16) - avg_net_target = avg_net_target / len(avg_blocks_found) - avg_net_difficulty = ( - 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - / avg_net_target - ) - net_difficulty = ( - 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - / net_target - ) - avg_network_hash_rate = ( - len(avg_blocks_found) - / 36 - * avg_net_difficulty - * 2**16 - / avg_block_time - ) - network_hash_rate = net_difficulty * 2**16 / 600 - else: - avg_network_hash_rate = 1 - net_difficulty = ( - 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - / 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - ) - network_hash_rate = 0 try: pool_perecentage = pool_hash_rate / network_hash_rate * 100 @@ -154,39 +151,61 @@ def get_ticker(): payouts = ( await self.config.mongo.async_db.share_payout.find({}, {"_id": 0}) .sort([("index", -1)]) - .to_list(100) + .to_list(50) ) + pipeline = [ + { + "$unwind": "$txn.outputs" + }, + { + "$match": { + "txn.outputs.to": {"$ne": self.config.address} + } + }, + { + "$group": { + "_id": None, + "total_payments": {"$sum": "$txn.outputs.value"} + } + } + ] + + result = await self.config.mongo.async_db.share_payout.aggregate(pipeline).to_list(1) + + total_payments = result[0]["total_payments"] if result else 0 + self.render_as_json( { "node": { - "latest_block": self.config.LatestBlock.block.to_dict(), - "health": self.config.health.to_dict(), "version": ".".join([str(x) for x in version]), }, "pool": { + "pool_diff": self.config.pool_diff, "hashes_per_second": pool_hash_rate, "miner_count": miner_count_pool_stat["value"], "worker_count": worker_count_pool_stat["value"], - "payout_scheme": "PPLNS", + "payout_scheme": self.config.payout_scheme, "pool_fee": self.config.pool_take, + "pool_address": self.config.address, "min_payout": 0, + "total_payments": total_payments, "url": getattr( self.config, "pool_url", f"{self.config.peer_host}:{self.config.stratum_pool_port}", ), "last_five_blocks": [ - {"timestamp": x["time"], "height": x["index"]} + {"timestamp": x["found_time"], "height": x["index"]} for x in pool_blocks_found_list[:5] ], "blocks_found": total_blocks_found, "fee": self.config.pool_take, - "payout_frequency": self.config.payout_frequency, + "payout_frequency": self.config.pool_payer_wait, "payouts": payouts, - "blocks": pool_blocks_found_list[:100], "pool_perecentage": pool_perecentage, "avg_block_time": avg_time, + "hashrate_history": hashrate_history, }, "network": { "height": self.config.LatestBlock.block.index, @@ -198,7 +217,6 @@ def get_ticker(): "current_hashes_per_second": network_hash_rate, "difficulty": net_difficulty, }, - "market": {"last_btc": last_btc, "last_usdt": last_usdt}, "coin": { "algo": "randomx YDA", "circulating": CHAIN.get_circulating_supply( @@ -210,7 +228,9 @@ def get_ticker(): ) + HANDLERS = [ + (r"/market-info", MarketInfoHandler), (r"/pool-info", PoolInfoHandler), (r"/", PoolStatsInterfaceHandler), ( diff --git a/plugins/yadacoinpool/static/content/blocks.html b/plugins/yadacoinpool/static/content/blocks.html new file mode 100644 index 00000000..34309754 --- /dev/null +++ b/plugins/yadacoinpool/static/content/blocks.html @@ -0,0 +1,214 @@ +
+
+
+ Dashboard Watermark +
BLOCKS FOUND
+
+
+
+
+
+ Dashboard Watermark +
LAST POOL BLOCK
+
+
+
+
+
+
+ Dashboard Watermark +
MATURITY REQUIREMENT
+
+
+
+
+
+ Dashboard Watermark +
AVARAGE LUCK
+
+
+
+
Blocks found in the last 30 days
+
+ +
+ + + + + + + + + + + +
Time FoundDifficultyHeightRewardBlock HashFinderEffortStatus
+
+ + + + + diff --git a/plugins/yadacoinpool/static/content/dashboard.html b/plugins/yadacoinpool/static/content/dashboard.html new file mode 100644 index 00000000..da11f15c --- /dev/null +++ b/plugins/yadacoinpool/static/content/dashboard.html @@ -0,0 +1,209 @@ +
+
+
+ Dashboard Watermark +
POOL HASH RATE
+
+
+
+
+
+
+ Dashboard Watermark +
BLOCKS FOUND
+
+
+
+
+
+ Dashboard Watermark +
BLOCK FOUND EVERY
+
+
+
+
+
+ Dashboard Watermark +
LAST POOL BLOCK
+
+
+
+
+
+
+ Dashboard Watermark +
NETWORK HASH RATE
+
+
+
+
+
+ Dashboard Watermark +
DIFFICULTY
+
+
+
+
+
+
+ Dashboard Watermark +
BLOCKCHAIN HEIGHT
+
+
+
+
+
+
+ Dashboard Watermark +
BLOCK REWARD
+

+
MINERS:
+
NODES:
+

+
+
+
+
+ Dashboard Watermark +
CONNECTED MINERS
+
/
+
+ +
+
+
+ Dashboard Watermark +
POOL FEE
+
+
+
+
+
+ Dashboard Watermark +
MINIMUM PAYOUT
+
+
+
+
+
+
+ Dashboard Watermark +
PAYOUT SCHEME
+
+
+
+
LAST 24H POOL HASHRATE
+ +
+ + + \ No newline at end of file diff --git a/plugins/yadacoinpool/static/content/faq.html b/plugins/yadacoinpool/static/content/faq.html new file mode 100644 index 00000000..3bca8406 --- /dev/null +++ b/plugins/yadacoinpool/static/content/faq.html @@ -0,0 +1,3 @@ +
+

will be created by Andy

+ \ No newline at end of file diff --git a/plugins/yadacoinpool/static/content/get-start.html b/plugins/yadacoinpool/static/content/get-start.html new file mode 100644 index 00000000..a3fe71fa --- /dev/null +++ b/plugins/yadacoinpool/static/content/get-start.html @@ -0,0 +1,78 @@ +
+
+
Connection Details
+
+
+

Mining Pool Address:

+

Algorithm: rx/yada

+
+
+
+
+
Mining Ports
+
+
+ + + + + + + + + + + +
PortStart DifficultyDescription
Dynamic Difficulty
+
+
+
+
+
+ Mining Application Setup + xmrigCC + SRB Miner +
+
+
+

"algo": "rx/yada",

+

"url": "",

+

"user": "YOUR_WALLET_ADDRESS.WORKER_ID@CUST_DIFF",

+

"nicehash": false,

+

"keepalive": true,

+
+
+
+
+
+ Custom Difficulty +
+
+
+

To set a custom difficulty, add its value to the address in the configuration file.

+

"user": "YOUR_WALLET_ADDRESS.WORKER_ID@CUST_DIFF", or

+

"user": "YOUR_WALLET_ADDRESS@CUST_DIFF",

+

The minimum value is 70 000

+
+
+
+ + + \ No newline at end of file diff --git a/plugins/yadacoinpool/static/content/miner-stats.html b/plugins/yadacoinpool/static/content/miner-stats.html new file mode 100644 index 00000000..437cc4ef --- /dev/null +++ b/plugins/yadacoinpool/static/content/miner-stats.html @@ -0,0 +1,341 @@ +
+
Your Stats & Payment History
+ + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+ + \ No newline at end of file diff --git a/plugins/yadacoinpool/static/content/pool-payouts.html b/plugins/yadacoinpool/static/content/pool-payouts.html new file mode 100644 index 00000000..e52046d3 --- /dev/null +++ b/plugins/yadacoinpool/static/content/pool-payouts.html @@ -0,0 +1,154 @@ +
+
+
+ Dashboard Watermark +
TOTAL PAYMANTS
+
+
+
+
+
+ Dashboard Watermark +
PAYOUT SCHEME
+
+
+
+
+
+ Dashboard Watermark +
PAYMENT INTERVAL
+
+
+
+
+
+ Dashboard Watermark +
DENOMINATION UNIT
+
1.000000 YDA
+
+
+
Pool payouts table
+ + + + + + + + + + +
Time SentTransaction IDAmountFeePayees
+
+ + + \ No newline at end of file diff --git a/plugins/yadacoinpool/static/img/accept.png b/plugins/yadacoinpool/static/img/accept.png new file mode 100644 index 00000000..21289a31 Binary files /dev/null and b/plugins/yadacoinpool/static/img/accept.png differ diff --git a/plugins/yadacoinpool/static/img/banknote.png b/plugins/yadacoinpool/static/img/banknote.png new file mode 100644 index 00000000..b6fbe615 Binary files /dev/null and b/plugins/yadacoinpool/static/img/banknote.png differ diff --git a/plugins/yadacoinpool/static/img/block-check.png b/plugins/yadacoinpool/static/img/block-check.png new file mode 100644 index 00000000..bd639446 Binary files /dev/null and b/plugins/yadacoinpool/static/img/block-check.png differ diff --git a/plugins/yadacoinpool/static/img/block-reward.png b/plugins/yadacoinpool/static/img/block-reward.png new file mode 100644 index 00000000..90a95fe5 Binary files /dev/null and b/plugins/yadacoinpool/static/img/block-reward.png differ diff --git a/plugins/yadacoinpool/static/img/block-time.png b/plugins/yadacoinpool/static/img/block-time.png new file mode 100644 index 00000000..38f643b4 Binary files /dev/null and b/plugins/yadacoinpool/static/img/block-time.png differ diff --git a/plugins/yadacoinpool/static/img/blockchain-blocks.png b/plugins/yadacoinpool/static/img/blockchain-blocks.png new file mode 100644 index 00000000..f54c5344 Binary files /dev/null and b/plugins/yadacoinpool/static/img/blockchain-blocks.png differ diff --git a/plugins/yadacoinpool/static/img/blockchain-height.png b/plugins/yadacoinpool/static/img/blockchain-height.png new file mode 100644 index 00000000..60354f54 Binary files /dev/null and b/plugins/yadacoinpool/static/img/blockchain-height.png differ diff --git a/plugins/yadacoinpool/static/img/blocks.png b/plugins/yadacoinpool/static/img/blocks.png new file mode 100644 index 00000000..ce1dba0c Binary files /dev/null and b/plugins/yadacoinpool/static/img/blocks.png differ diff --git a/plugins/yadacoinpool/static/img/connected-miners.png b/plugins/yadacoinpool/static/img/connected-miners.png new file mode 100644 index 00000000..18a234b3 Binary files /dev/null and b/plugins/yadacoinpool/static/img/connected-miners.png differ diff --git a/plugins/yadacoinpool/static/img/dashboard.png b/plugins/yadacoinpool/static/img/dashboard.png new file mode 100644 index 00000000..fbcfdfa3 Binary files /dev/null and b/plugins/yadacoinpool/static/img/dashboard.png differ diff --git a/plugins/yadacoinpool/static/img/difficulty.png b/plugins/yadacoinpool/static/img/difficulty.png new file mode 100644 index 00000000..53240567 Binary files /dev/null and b/plugins/yadacoinpool/static/img/difficulty.png differ diff --git a/plugins/yadacoinpool/static/img/discord.png b/plugins/yadacoinpool/static/img/discord.png new file mode 100644 index 00000000..f70cbc02 Binary files /dev/null and b/plugins/yadacoinpool/static/img/discord.png differ diff --git a/plugins/yadacoinpool/static/img/explorer.png b/plugins/yadacoinpool/static/img/explorer.png new file mode 100644 index 00000000..806d6cb1 Binary files /dev/null and b/plugins/yadacoinpool/static/img/explorer.png differ diff --git a/plugins/yadacoinpool/static/img/faq.png b/plugins/yadacoinpool/static/img/faq.png new file mode 100644 index 00000000..65bbed48 Binary files /dev/null and b/plugins/yadacoinpool/static/img/faq.png differ diff --git a/plugins/yadacoinpool/static/img/get_start.png b/plugins/yadacoinpool/static/img/get_start.png new file mode 100644 index 00000000..1b56fd8b Binary files /dev/null and b/plugins/yadacoinpool/static/img/get_start.png differ diff --git a/plugins/yadacoinpool/static/img/hashrate.png b/plugins/yadacoinpool/static/img/hashrate.png new file mode 100644 index 00000000..4726061c Binary files /dev/null and b/plugins/yadacoinpool/static/img/hashrate.png differ diff --git a/plugins/yadacoinpool/static/img/luck.png b/plugins/yadacoinpool/static/img/luck.png new file mode 100644 index 00000000..fef43663 Binary files /dev/null and b/plugins/yadacoinpool/static/img/luck.png differ diff --git a/plugins/yadacoinpool/static/img/miner_stats.png b/plugins/yadacoinpool/static/img/miner_stats.png new file mode 100644 index 00000000..913ccf4a Binary files /dev/null and b/plugins/yadacoinpool/static/img/miner_stats.png differ diff --git a/plugins/yadacoinpool/static/img/not_accept.png b/plugins/yadacoinpool/static/img/not_accept.png new file mode 100644 index 00000000..2b4c3568 Binary files /dev/null and b/plugins/yadacoinpool/static/img/not_accept.png differ diff --git a/plugins/yadacoinpool/static/img/payout-scheme.png b/plugins/yadacoinpool/static/img/payout-scheme.png new file mode 100644 index 00000000..ff91544f Binary files /dev/null and b/plugins/yadacoinpool/static/img/payout-scheme.png differ diff --git a/plugins/yadacoinpool/static/img/pending.png b/plugins/yadacoinpool/static/img/pending.png new file mode 100644 index 00000000..d1f93679 Binary files /dev/null and b/plugins/yadacoinpool/static/img/pending.png differ diff --git a/plugins/yadacoinpool/static/img/percent.png b/plugins/yadacoinpool/static/img/percent.png new file mode 100644 index 00000000..cc3fa11e Binary files /dev/null and b/plugins/yadacoinpool/static/img/percent.png differ diff --git a/plugins/yadacoinpool/static/img/pool-payouts.png b/plugins/yadacoinpool/static/img/pool-payouts.png new file mode 100644 index 00000000..f792c908 Binary files /dev/null and b/plugins/yadacoinpool/static/img/pool-payouts.png differ diff --git a/plugins/yadacoinpool/static/img/wallet.png b/plugins/yadacoinpool/static/img/wallet.png new file mode 100644 index 00000000..51c4d726 Binary files /dev/null and b/plugins/yadacoinpool/static/img/wallet.png differ diff --git a/plugins/yadacoinpool/static/stylesheet/styles.css b/plugins/yadacoinpool/static/stylesheet/styles.css new file mode 100644 index 00000000..6181bfa9 --- /dev/null +++ b/plugins/yadacoinpool/static/stylesheet/styles.css @@ -0,0 +1,197 @@ + \ No newline at end of file diff --git a/plugins/yadacoinpool/templates/pool-stats.html b/plugins/yadacoinpool/templates/pool-stats.html index 929d3872..a862897a 100644 --- a/plugins/yadacoinpool/templates/pool-stats.html +++ b/plugins/yadacoinpool/templates/pool-stats.html @@ -1,261 +1,266 @@ - - - - + + + + + + + + + -
-
YADA MINING POOL
-
-
-
-
POOL HASH RATE
-
-
-
-
-
-
-
BLOCKS FOUND
-
-
-
-
-
-
BLOCK FOUND EVERY
-
-
-
-
-
-
LAST BLOCK FOUND BY POOL
-
-
-
-
-
-
-
NETWORK HASH RATE
-
-
-
-
-
-
DIFFICULTY
-
-
-
-
-
-
-
BLOCKCHAIN HEIGHT
-
-
-
-
-
-
-
BLOCK REAWORD
-
YDA
-
-
-
-
-
CONNECTED MINERS / WORKERS
-
/
-
-
-
-
-
POOL FEE
-
-
+
+ -
-
-
MINIMUM PAYOUT
-
-
-
+
+
+
+
+
+
+
+
+
+
+ + +
-
-
-
PAYOUT SCHEME
-
-
+
+
by Rakni for Yadacoin 2024
-
-
- - -
-
-
-
-
HOW TO START
-
Create wallet
-
Download XMRigCC
-
XMRigCC conf.json settings:
-
"algo": "rx/yada",
-
"url": """,
-
"user": "Your wallet address.Worker ID",
-
"keepalive": true,
-
-
-
-
-
  • -
  • -
  • -
  • -
    -

    POOL BLOCKS

    - - -
    Time FoundHeightRewardBlock Hash
    -
    -

    MINER STATISTICS

    -
    - - -
    -

    MINER HASH RATE:

    -

    TOTAL HASHES SUBMITTED:

    - - -
    Time SentTXN IDAmount
    -
    - -
    - - + + - + diff --git a/static/explorer/3rdpartylicenses.txt b/static/explorer/3rdpartylicenses.txt index a35bc366..10c1925a 100644 --- a/static/explorer/3rdpartylicenses.txt +++ b/static/explorer/3rdpartylicenses.txt @@ -1,103 +1,21 @@ -core-js@2.5.7 +@angular/common MIT -Copyright (c) 2014-2018 Denis Pushkarev -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -zone.js@0.8.26 -MIT -The MIT License - -Copyright (c) 2016-2018 Google, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -style-loader@0.21.0 -MIT -Copyright JS Foundation and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -@angular/common@6.1.0 -MIT -MIT - -@angular/compiler@6.1.0 -MIT -MIT - -@angular/core@6.1.0 -MIT -MIT - -@angular/forms@6.1.0 -MIT +@angular/core MIT -@angular/http@6.1.0 -MIT +@angular/forms MIT -@angular/platform-browser-dynamic@6.1.0 -MIT +@angular/platform-browser MIT -@angular/platform-browser@6.1.0 -MIT +@angular/router MIT -rxjs@6.2.2 +rxjs Apache-2.0 -Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -298,61 +216,29 @@ Apache License WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + -tslib@1.9.3 -Apache-2.0 -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +zone.js +MIT +The MIT License -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +Copyright (c) 2010-2023 Google LLC. https://angular.io/license -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -END OF TERMS AND CONDITIONS \ No newline at end of file +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/static/explorer/assets/arrow-right.png b/static/explorer/assets/arrow-right.png new file mode 100644 index 00000000..0c5b53a1 Binary files /dev/null and b/static/explorer/assets/arrow-right.png differ diff --git a/static/explorer/assets/circulating-supply.png b/static/explorer/assets/circulating-supply.png new file mode 100644 index 00000000..bb2eed17 Binary files /dev/null and b/static/explorer/assets/circulating-supply.png differ diff --git a/static/explorer/assets/difficulty.png b/static/explorer/assets/difficulty.png new file mode 100644 index 00000000..53240567 Binary files /dev/null and b/static/explorer/assets/difficulty.png differ diff --git a/static/explorer/assets/hashrate.png b/static/explorer/assets/hashrate.png new file mode 100644 index 00000000..4726061c Binary files /dev/null and b/static/explorer/assets/hashrate.png differ diff --git a/static/explorer/assets/network-height.png b/static/explorer/assets/network-height.png new file mode 100644 index 00000000..60354f54 Binary files /dev/null and b/static/explorer/assets/network-height.png differ diff --git a/static/explorer/assets/yadalogo.png b/static/explorer/assets/yadalogo.png new file mode 100644 index 00000000..5ec79374 Binary files /dev/null and b/static/explorer/assets/yadalogo.png differ diff --git a/static/explorer/bootstrap-icons.70a9dee9e5ab72aa.woff b/static/explorer/bootstrap-icons.70a9dee9e5ab72aa.woff new file mode 100644 index 00000000..51204d27 Binary files /dev/null and b/static/explorer/bootstrap-icons.70a9dee9e5ab72aa.woff differ diff --git a/static/explorer/bootstrap-icons.bfa90bda92a84a6a.woff2 b/static/explorer/bootstrap-icons.bfa90bda92a84a6a.woff2 new file mode 100644 index 00000000..92c48302 Binary files /dev/null and b/static/explorer/bootstrap-icons.bfa90bda92a84a6a.woff2 differ diff --git a/static/explorer/bootstrap-icons.svg b/static/explorer/bootstrap-icons.svg new file mode 100644 index 00000000..b7d55a8e --- /dev/null +++ b/static/explorer/bootstrap-icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/explorer/favicon.ico b/static/explorer/favicon.ico index 8081c7ce..12a34dfb 100644 Binary files a/static/explorer/favicon.ico and b/static/explorer/favicon.ico differ diff --git a/static/explorer/index.html b/static/explorer/index.html new file mode 100644 index 00000000..bfaf3c29 --- /dev/null +++ b/static/explorer/index.html @@ -0,0 +1,16 @@ + + + + + Explorer + + + + + + + + + + + diff --git a/static/explorer/main.js b/static/explorer/main.js index 264fc77b..e689c989 100644 --- a/static/explorer/main.js +++ b/static/explorer/main.js @@ -1,359 +1 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["main"],{ - -/***/ "./src/$$_lazy_route_resource lazy recursive": -/*!**********************************************************!*\ - !*** ./src/$$_lazy_route_resource lazy namespace object ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -function webpackEmptyAsyncContext(req) { - // Here Promise.resolve().then() is used instead of new Promise() to prevent - // uncaught exception popping up in devtools - return Promise.resolve().then(function() { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - }); -} -webpackEmptyAsyncContext.keys = function() { return []; }; -webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext; -module.exports = webpackEmptyAsyncContext; -webpackEmptyAsyncContext.id = "./src/$$_lazy_route_resource lazy recursive"; - -/***/ }), - -/***/ "./src/app/app.component.css": -/*!***********************************!*\ - !*** ./src/app/app.component.css ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = "" - -/***/ }), - -/***/ "./src/app/app.component.html": -/*!************************************!*\ - !*** ./src/app/app.component.html ***! - \************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = "\n
    \n

    \n Yada Coin Explorer\n

    \n
    \n\n\n" - -/***/ }), - -/***/ "./src/app/app.component.ts": -/*!**********************************!*\ - !*** ./src/app/app.component.ts ***! - \**********************************/ -/*! exports provided: AppComponent */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppComponent", function() { return AppComponent; }); -/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; - -var AppComponent = /** @class */ (function () { - function AppComponent() { - this.title = 'explorer'; - } - AppComponent = __decorate([ - Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ - selector: 'app-root', - template: __webpack_require__(/*! ./app.component.html */ "./src/app/app.component.html"), - styles: [__webpack_require__(/*! ./app.component.css */ "./src/app/app.component.css")] - }) - ], AppComponent); - return AppComponent; -}()); - - - -/***/ }), - -/***/ "./src/app/app.module.ts": -/*!*******************************!*\ - !*** ./src/app/app.module.ts ***! - \*******************************/ -/*! exports provided: AppModule */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppModule", function() { return AppModule; }); -/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js"); -/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/fesm5/forms.js"); -/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); -/* harmony import */ var _angular_http__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/http */ "./node_modules/@angular/http/fesm5/http.js"); -/* harmony import */ var _app_component__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./app.component */ "./src/app/app.component.ts"); -/* harmony import */ var _search_form_search_form_component__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./search-form/search-form.component */ "./src/app/search-form/search-form.component.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; - - - - - - -var AppModule = /** @class */ (function () { - function AppModule() { - } - AppModule = __decorate([ - Object(_angular_core__WEBPACK_IMPORTED_MODULE_2__["NgModule"])({ - declarations: [ - _app_component__WEBPACK_IMPORTED_MODULE_4__["AppComponent"], - _search_form_search_form_component__WEBPACK_IMPORTED_MODULE_5__["SearchFormComponent"] - ], - imports: [ - _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__["BrowserModule"], - _angular_forms__WEBPACK_IMPORTED_MODULE_1__["FormsModule"], - _angular_http__WEBPACK_IMPORTED_MODULE_3__["HttpModule"] - ], - providers: [], - bootstrap: [_app_component__WEBPACK_IMPORTED_MODULE_4__["AppComponent"]] - }) - ], AppModule); - return AppModule; -}()); - - - -/***/ }), - -/***/ "./src/app/search-form/search-form.component.css": -/*!*******************************************************!*\ - !*** ./src/app/search-form/search-form.component.css ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = "" - -/***/ }), - -/***/ "./src/app/search-form/search-form.component.html": -/*!********************************************************!*\ - !*** ./src/app/search-form/search-form.component.html ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = "

    Current block height: {{current_height}}

    \n

    Coins in circulation: {{circulating}}

    \n

    Maximum supply: 21,000,000

    \n

    Network hash rate: {{hashrate}}h/s

    \n

    Difficulty: {{difficulty}}

    \n

    Hashing algorithm: RandomX Variant (rx/yada)

    \n
    \n \n \n
    \n
    Searching...
    \n
    No results
    \n

    Balance: {{balance}}

    \n
      \n
    • \n

      Failed transactions

      \n

      exception class: {{transaction.reason}}

      \n

      traceback:

      \n

      public_key: {{transaction.public_key}}

      \n

      signature: {{transaction.id}}

      \n

      hash: {{transaction.hash}}

      \n

      fee: {{transaction.fee}}

      \n

      diffie-hellman public key: {{transaction.dh_public_key}}

      \n

      relationship identifier: {{transaction.rid}}

      \n

      relationship data:

      \n
      No inputs
      \n
      0\">\n

      Inputs

      \n \n
      \n
      No outputs
      \n
      0\">\n

      Outputs

      \n \n
      \n
    • \n
    \n
      \n
    • \n

      Mempool

      \n

      public_key: {{transaction.public_key}}

      \n

      signature: {{transaction.id}}

      \n

      hash: {{transaction.hash}}

      \n

      fee: {{transaction.fee}}

      \n

      diffie-hellman public key: {{transaction.dh_public_key}}

      \n

      relationship identifier: {{transaction.rid}}

      \n

      relationship data:

      \n
      No inputs
      \n
      0\">\n

      Inputs

      \n \n
      \n
      No outputs
      \n
      0\">\n

      Outputs

      \n \n
      \n
    • \n
    \n
      \n
    • \n

      Block {{block.index}}

      \n

      version: {{block.version}}

      \n

      target: {{block.target}}

      \n

      nonce: {{block.nonce}}

      \n

      merkleRoot: {{block.merkleRoot}}

      \n

      index: {{block.index}}

      \n

      special min: {{block.special_min}}

      \n

      time: {{block.time}}

      \n

      previous hash: {{block.prevHash}}

      \n

      public_key: {{block.public_key}}

      \n

      signature: {{block.id}}

      \n

      hash: {{block.hash}}

      \n

      Transactions

      \n
        \n
      • \n

        public_key: {{transaction.public_key}}

        \n

        signature: {{transaction.id}}

        \n

        hash: {{transaction.hash}}

        \n

        fee: {{transaction.fee}}

        \n

        diffie-hellman public key: {{transaction.dh_public_key}}

        \n

        relationship identifier: {{transaction.rid}}

        \n

        relationship data:

        \n
        No inputs
        \n
        0\">\n

        Inputs

        \n \n
        \n
        No outputs
        \n
        0\">\n

        Outputs

        \n \n
        \n
      • \n
      \n
    • \n
    " - -/***/ }), - -/***/ "./src/app/search-form/search-form.component.ts": -/*!******************************************************!*\ - !*** ./src/app/search-form/search-form.component.ts ***! - \******************************************************/ -/*! exports provided: SearchFormComponent */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchFormComponent", function() { return SearchFormComponent; }); -/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); -/* harmony import */ var _angular_http__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/http */ "./node_modules/@angular/http/fesm5/http.js"); -/* harmony import */ var _search__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../search */ "./src/app/search.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - -var SearchFormComponent = /** @class */ (function () { - function SearchFormComponent(http) { - var _this = this; - this.http = http; - this.model = new _search__WEBPACK_IMPORTED_MODULE_2__["Search"](''); - this.result = []; - this.resultType = ''; - this.balance = 0; - this.searching = false; - this.submitted = false; - this.current_height = ''; - this.circulating = ''; - this.hashrate = ''; - this.difficulty = ''; - this.http.get('/api-stats') - .subscribe(function (res) { - _this.difficulty = _this.numberWithCommas(res.json()['stats']['difficulty']); - _this.hashrate = _this.numberWithCommas(res.json()['stats']['network_hash_rate']); - _this.current_height = _this.numberWithCommas(res.json()['stats']['height']); - _this.circulating = _this.numberWithCommas(res.json()['stats']['circulating']); - if (!window.location.search) { - _this.http.get('/explorer-search?term=' + _this.current_height.replace(',', '')) - .subscribe(function (res) { - _this.result = res.json().result || []; - _this.resultType = res.json().resultType; - _this.balance = res.json().balance; - _this.searching = false; - }, function (err) { - alert('something went terribly wrong!'); - }); - } - }, function (err) { - alert('something went terribly wrong!'); - }); - if (window.location.search) { - this.searching = true; - this.submitted = true; - this.http.get('/explorer-search' + window.location.search) - .subscribe(function (res) { - _this.result = res.json().result || []; - _this.resultType = res.json().resultType; - _this.balance = res.json().balance; - _this.searching = false; - }, function (err) { - alert('something went terribly wrong!'); - }); - } - } - SearchFormComponent.prototype.ngOnInit = function () { - }; - SearchFormComponent.prototype.onSubmit = function () { - var _this = this; - this.searching = true; - this.submitted = true; - this.http.get('/explorer-search?term=' + encodeURIComponent(this.model.term)) - .subscribe(function (res) { - _this.result = res.json().result || []; - _this.resultType = res.json().resultType; - _this.balance = res.json().balance; - _this.searching = false; - }, function (err) { - alert('something went terribly wrong!'); - }); - }; - SearchFormComponent.prototype.numberWithCommas = function (x) { - return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - }; - Object.defineProperty(SearchFormComponent.prototype, "diagnostic", { - // TODO: Remove this when we're done - get: function () { return JSON.stringify(this.model); }, - enumerable: true, - configurable: true - }); - SearchFormComponent = __decorate([ - Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ - selector: 'app-search-form', - template: __webpack_require__(/*! ./search-form.component.html */ "./src/app/search-form/search-form.component.html"), - styles: [__webpack_require__(/*! ./search-form.component.css */ "./src/app/search-form/search-form.component.css")] - }), - __metadata("design:paramtypes", [_angular_http__WEBPACK_IMPORTED_MODULE_1__["Http"]]) - ], SearchFormComponent); - return SearchFormComponent; -}()); - - - -/***/ }), - -/***/ "./src/app/search.ts": -/*!***************************!*\ - !*** ./src/app/search.ts ***! - \***************************/ -/*! exports provided: Search */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Search", function() { return Search; }); -var Search = /** @class */ (function () { - function Search(term) { - this.term = term; - } - return Search; -}()); - - - -/***/ }), - -/***/ "./src/environments/environment.ts": -/*!*****************************************!*\ - !*** ./src/environments/environment.ts ***! - \*****************************************/ -/*! exports provided: environment */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "environment", function() { return environment; }); -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. -var environment = { - production: false -}; -/* - * In development mode, to ignore zone related error stack frames such as - * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can - * import the following file, but please comment it out in production mode - * because it will have performance impact when throw error - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. - - -/***/ }), - -/***/ "./src/main.ts": -/*!*********************!*\ - !*** ./src/main.ts ***! - \*********************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); -/* harmony import */ var _angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/platform-browser-dynamic */ "./node_modules/@angular/platform-browser-dynamic/fesm5/platform-browser-dynamic.js"); -/* harmony import */ var _app_app_module__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app/app.module */ "./src/app/app.module.ts"); -/* harmony import */ var _environments_environment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./environments/environment */ "./src/environments/environment.ts"); - - - - -if (_environments_environment__WEBPACK_IMPORTED_MODULE_3__["environment"].production) { - Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["enableProdMode"])(); -} -Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__["platformBrowserDynamic"])().bootstrapModule(_app_app_module__WEBPACK_IMPORTED_MODULE_2__["AppModule"]) - .catch(function (err) { return console.log(err); }); - - -/***/ }), - -/***/ 0: -/*!***************************!*\ - !*** multi ./src/main.ts ***! - \***************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(/*! /media/john/4tb/home/mvogel/yadacoin/plugins/explorer/src/main.ts */"./src/main.ts"); - - -/***/ }) - -},[[0,"runtime","vendor"]]]); -//# sourceMappingURL=main.js.map \ No newline at end of file +"use strict";(self.webpackChunkexplorer=self.webpackChunkexplorer||[]).push([[179],{75:()=>{function se(e){return"function"==typeof e}function Li(e){const t=e(i=>{Error.call(i),i.stack=(new Error).stack});return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}const fr=Li(e=>function(t){e(this),this.message=t?`${t.length} errors occurred during unsubscription:\n${t.map((i,r)=>`${r+1}) ${i.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=t});function Vi(e,n){if(e){const t=e.indexOf(n);0<=t&&e.splice(t,1)}}class nt{constructor(n){this.initialTeardown=n,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let n;if(!this.closed){this.closed=!0;const{_parentage:t}=this;if(t)if(this._parentage=null,Array.isArray(t))for(const o of t)o.remove(this);else t.remove(this);const{initialTeardown:i}=this;if(se(i))try{i()}catch(o){n=o instanceof fr?o.errors:[o]}const{_finalizers:r}=this;if(r){this._finalizers=null;for(const o of r)try{hr(o)}catch(s){n=n??[],s instanceof fr?n=[...n,...s.errors]:n.push(s)}}if(n)throw new fr(n)}}add(n){var t;if(n&&n!==this)if(this.closed)hr(n);else{if(n instanceof nt){if(n.closed||n._hasParent(this))return;n._addParent(this)}(this._finalizers=null!==(t=this._finalizers)&&void 0!==t?t:[]).push(n)}}_hasParent(n){const{_parentage:t}=this;return t===n||Array.isArray(t)&&t.includes(n)}_addParent(n){const{_parentage:t}=this;this._parentage=Array.isArray(t)?(t.push(n),t):t?[t,n]:n}_removeParent(n){const{_parentage:t}=this;t===n?this._parentage=null:Array.isArray(t)&&Vi(t,n)}remove(n){const{_finalizers:t}=this;t&&Vi(t,n),n instanceof nt&&n._removeParent(this)}}nt.EMPTY=(()=>{const e=new nt;return e.closed=!0,e})();const xs=nt.EMPTY;function Al(e){return e instanceof nt||e&&"closed"in e&&se(e.remove)&&se(e.add)&&se(e.unsubscribe)}function hr(e){se(e)?e():e.unsubscribe()}const Bi={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},io={setTimeout(e,n,...t){const{delegate:i}=io;return i?.setTimeout?i.setTimeout(e,n,...t):setTimeout(e,n,...t)},clearTimeout(e){const{delegate:n}=io;return(n?.clearTimeout||clearTimeout)(e)},delegate:void 0};function $d(e){io.setTimeout(()=>{const{onUnhandledError:n}=Bi;if(!n)throw e;n(e)})}function pr(){}const Ud=As("C",void 0,void 0);function As(e,n,t){return{kind:e,value:n,error:t}}let yi=null;function ni(e){if(Bi.useDeprecatedSynchronousErrorHandling){const n=!yi;if(n&&(yi={errorThrown:!1,error:null}),e(),n){const{errorThrown:t,error:i}=yi;if(yi=null,t)throw i}}else e()}class ro extends nt{constructor(n){super(),this.isStopped=!1,n?(this.destination=n,Al(n)&&n.add(this)):this.destination=Ps}static create(n,t,i){return new bi(n,t,i)}next(n){this.isStopped?Rs(function zd(e){return As("N",e,void 0)}(n),this):this._next(n)}error(n){this.isStopped?Rs(function Gd(e){return As("E",void 0,e)}(n),this):(this.isStopped=!0,this._error(n))}complete(){this.isStopped?Rs(Ud,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(n){this.destination.next(n)}_error(n){try{this.destination.error(n)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}}const Rl=Function.prototype.bind;function oo(e,n){return Rl.call(e,n)}class Pl{constructor(n){this.partialObserver=n}next(n){const{partialObserver:t}=this;if(t.next)try{t.next(n)}catch(i){ln(i)}}error(n){const{partialObserver:t}=this;if(t.error)try{t.error(n)}catch(i){ln(i)}else ln(n)}complete(){const{partialObserver:n}=this;if(n.complete)try{n.complete()}catch(t){ln(t)}}}class bi extends ro{constructor(n,t,i){let r;if(super(),se(n)||!n)r={next:n??void 0,error:t??void 0,complete:i??void 0};else{let o;this&&Bi.useDeprecatedNextContext?(o=Object.create(n),o.unsubscribe=()=>this.unsubscribe(),r={next:n.next&&oo(n.next,o),error:n.error&&oo(n.error,o),complete:n.complete&&oo(n.complete,o)}):r=n}this.destination=new Pl(r)}}function ln(e){Bi.useDeprecatedSynchronousErrorHandling?function Wd(e){Bi.useDeprecatedSynchronousErrorHandling&&yi&&(yi.errorThrown=!0,yi.error=e)}(e):$d(e)}function Rs(e,n){const{onStoppedNotification:t}=Bi;t&&io.setTimeout(()=>t(e,n))}const Ps={closed:!0,next:pr,error:function kl(e){throw e},complete:pr},ks="function"==typeof Symbol&&Symbol.observable||"@@observable";function kn(e){return e}function Ll(e){return 0===e.length?kn:1===e.length?e[0]:function(t){return e.reduce((i,r)=>r(i),t)}}let Ce=(()=>{class e{constructor(t){t&&(this._subscribe=t)}lift(t){const i=new e;return i.source=this,i.operator=t,i}subscribe(t,i,r){const o=function Yd(e){return e&&e instanceof ro||function qd(e){return e&&se(e.next)&&se(e.error)&&se(e.complete)}(e)&&Al(e)}(t)?t:new bi(t,i,r);return ni(()=>{const{operator:s,source:a}=this;o.add(s?s.call(o,a):a?this._subscribe(o):this._trySubscribe(o))}),o}_trySubscribe(t){try{return this._subscribe(t)}catch(i){t.error(i)}}forEach(t,i){return new(i=Vl(i))((r,o)=>{const s=new bi({next:a=>{try{t(a)}catch(l){o(l),s.unsubscribe()}},error:o,complete:r});this.subscribe(s)})}_subscribe(t){var i;return null===(i=this.source)||void 0===i?void 0:i.subscribe(t)}[ks](){return this}pipe(...t){return Ll(t)(this)}toPromise(t){return new(t=Vl(t))((i,r)=>{let o;this.subscribe(s=>o=s,s=>r(s),()=>i(o))})}}return e.create=n=>new e(n),e})();function Vl(e){var n;return null!==(n=e??Bi.Promise)&&void 0!==n?n:Promise}const Zd=Li(e=>function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});let Ee=(()=>{class e extends Ce{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(t){const i=new Bl(this,this);return i.operator=t,i}_throwIfClosed(){if(this.closed)throw new Zd}next(t){ni(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(const i of this.currentObservers)i.next(t)}})}error(t){ni(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=t;const{observers:i}=this;for(;i.length;)i.shift().error(t)}})}complete(){ni(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;const{observers:t}=this;for(;t.length;)t.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var t;return(null===(t=this.observers)||void 0===t?void 0:t.length)>0}_trySubscribe(t){return this._throwIfClosed(),super._trySubscribe(t)}_subscribe(t){return this._throwIfClosed(),this._checkFinalizedStatuses(t),this._innerSubscribe(t)}_innerSubscribe(t){const{hasError:i,isStopped:r,observers:o}=this;return i||r?xs:(this.currentObservers=null,o.push(t),new nt(()=>{this.currentObservers=null,Vi(o,t)}))}_checkFinalizedStatuses(t){const{hasError:i,thrownError:r,isStopped:o}=this;i?t.error(r):o&&t.complete()}asObservable(){const t=new Ce;return t.source=this,t}}return e.create=(n,t)=>new Bl(n,t),e})();class Bl extends Ee{constructor(n,t){super(),this.destination=n,this.source=t}next(n){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===i||i.call(t,n)}error(n){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===i||i.call(t,n)}complete(){var n,t;null===(t=null===(n=this.destination)||void 0===n?void 0:n.complete)||void 0===t||t.call(n)}_subscribe(n){var t,i;return null!==(i=null===(t=this.source)||void 0===t?void 0:t.subscribe(n))&&void 0!==i?i:xs}}function Fs(e){return se(e?.lift)}function qe(e){return n=>{if(Fs(n))return n.lift(function(t){try{return e(t,this)}catch(i){this.error(i)}});throw new TypeError("Unable to lift unknown Observable type")}}function Ve(e,n,t,i,r){return new Jd(e,n,t,i,r)}class Jd extends ro{constructor(n,t,i,r,o,s){super(n),this.onFinalize=o,this.shouldUnsubscribe=s,this._next=t?function(a){try{t(a)}catch(l){n.error(l)}}:super._next,this._error=r?function(a){try{r(a)}catch(l){n.error(l)}finally{this.unsubscribe()}}:super._error,this._complete=i?function(){try{i()}catch(a){n.error(a)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var n;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){const{closed:t}=this;super.unsubscribe(),!t&&(null===(n=this.onFinalize)||void 0===n||n.call(this))}}}function ae(e,n){return qe((t,i)=>{let r=0;t.subscribe(Ve(i,o=>{i.next(e.call(n,o,r++))}))})}function Jt(e){return this instanceof Jt?(this.v=e,this):new Jt(e)}function Xt(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=function it(e){var n="function"==typeof Symbol&&Symbol.iterator,t=n&&e[n],i=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")}(e),t={},i("next"),i("throw"),i("return"),t[Symbol.asyncIterator]=function(){return this},t);function i(o){t[o]=e[o]&&function(s){return new Promise(function(a,l){!function r(o,s,a,l){Promise.resolve(l).then(function(c){o({value:c,done:a})},s)}(a,l,(s=e[o](s)).done,s.value)})}}}"function"==typeof SuppressedError&&SuppressedError;const nf=e=>e&&"number"==typeof e.length&&"function"!=typeof e;function c_(e){return se(e?.then)}function u_(e){return se(e[ks])}function d_(e){return Symbol.asyncIterator&&se(e?.[Symbol.asyncIterator])}function f_(e){return new TypeError(`You provided ${null!==e&&"object"==typeof e?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}const h_=function VM(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}();function p_(e){return se(e?.[h_])}function g_(e){return function gr(e,n,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,i=t.apply(e,n||[]),o=[];return r={},s("next"),s("throw"),s("return"),r[Symbol.asyncIterator]=function(){return this},r;function s(h){i[h]&&(r[h]=function(_){return new Promise(function(v,y){o.push([h,_,v,y])>1||a(h,_)})})}function a(h,_){try{!function l(h){h.value instanceof Jt?Promise.resolve(h.value.v).then(c,u):d(o[0][2],h)}(i[h](_))}catch(v){d(o[0][3],v)}}function c(h){a("next",h)}function u(h){a("throw",h)}function d(h,_){h(_),o.shift(),o.length&&a(o[0][0],o[0][1])}}(this,arguments,function*(){const t=e.getReader();try{for(;;){const{value:i,done:r}=yield Jt(t.read());if(r)return yield Jt(void 0);yield yield Jt(i)}}finally{t.releaseLock()}})}function m_(e){return se(e?.getReader)}function ft(e){if(e instanceof Ce)return e;if(null!=e){if(u_(e))return function BM(e){return new Ce(n=>{const t=e[ks]();if(se(t.subscribe))return t.subscribe(n);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}(e);if(nf(e))return function jM(e){return new Ce(n=>{for(let t=0;t{e.then(t=>{n.closed||(n.next(t),n.complete())},t=>n.error(t)).then(null,$d)})}(e);if(d_(e))return __(e);if(p_(e))return function $M(e){return new Ce(n=>{for(const t of e)if(n.next(t),n.closed)return;n.complete()})}(e);if(m_(e))return function UM(e){return __(g_(e))}(e)}throw f_(e)}function __(e){return new Ce(n=>{(function GM(e,n){var t,i,r,o;return function N(e,n,t,i){return new(t||(t=Promise))(function(o,s){function a(u){try{c(i.next(u))}catch(d){s(d)}}function l(u){try{c(i.throw(u))}catch(d){s(d)}}function c(u){u.done?o(u.value):function r(o){return o instanceof t?o:new t(function(s){s(o)})}(u.value).then(a,l)}c((i=i.apply(e,n||[])).next())})}(this,void 0,void 0,function*(){try{for(t=Xt(e);!(i=yield t.next()).done;)if(n.next(i.value),n.closed)return}catch(s){r={error:s}}finally{try{i&&!i.done&&(o=t.return)&&(yield o.call(t))}finally{if(r)throw r.error}}n.complete()})})(e,n).catch(t=>n.error(t))})}function Di(e,n,t,i=0,r=!1){const o=n.schedule(function(){t(),r?e.add(this.schedule(null,i)):this.unsubscribe()},i);if(e.add(o),!r)return o}function ht(e,n,t=1/0){return se(n)?ht((i,r)=>ae((o,s)=>n(i,o,r,s))(ft(e(i,r))),t):("number"==typeof n&&(t=n),qe((i,r)=>function zM(e,n,t,i,r,o,s,a){const l=[];let c=0,u=0,d=!1;const h=()=>{d&&!l.length&&!c&&n.complete()},_=y=>c{o&&n.next(y),c++;let D=!1;ft(t(y,u++)).subscribe(Ve(n,M=>{r?.(M),o?_(M):n.next(M)},()=>{D=!0},void 0,()=>{if(D)try{for(c--;l.length&&cv(M)):v(M)}h()}catch(M){n.error(M)}}))};return e.subscribe(Ve(n,_,()=>{d=!0,h()})),()=>{a?.()}}(i,r,e,t)))}function lo(e=1/0){return ht(kn,e)}const bn=new Ce(e=>e.complete());function v_(e){return e&&se(e.schedule)}function rf(e){return e[e.length-1]}function Ul(e){return se(rf(e))?e.pop():void 0}function Vs(e){return v_(rf(e))?e.pop():void 0}function y_(e,n=0){return qe((t,i)=>{t.subscribe(Ve(i,r=>Di(i,e,()=>i.next(r),n),()=>Di(i,e,()=>i.complete(),n),r=>Di(i,e,()=>i.error(r),n)))})}function b_(e,n=0){return qe((t,i)=>{i.add(e.schedule(()=>t.subscribe(i),n))})}function D_(e,n){if(!e)throw new Error("Iterable cannot be null");return new Ce(t=>{Di(t,n,()=>{const i=e[Symbol.asyncIterator]();Di(t,n,()=>{i.next().then(r=>{r.done?t.complete():t.next(r.value)})},0,!0)})})}function pt(e,n){return n?function KM(e,n){if(null!=e){if(u_(e))return function YM(e,n){return ft(e).pipe(b_(n),y_(n))}(e,n);if(nf(e))return function JM(e,n){return new Ce(t=>{let i=0;return n.schedule(function(){i===e.length?t.complete():(t.next(e[i++]),t.closed||this.schedule())})})}(e,n);if(c_(e))return function ZM(e,n){return ft(e).pipe(b_(n),y_(n))}(e,n);if(d_(e))return D_(e,n);if(p_(e))return function XM(e,n){return new Ce(t=>{let i;return Di(t,n,()=>{i=e[h_](),Di(t,n,()=>{let r,o;try{({value:r,done:o}=i.next())}catch(s){return void t.error(s)}o?t.complete():t.next(r)},0,!0)}),()=>se(i?.return)&&i.return()})}(e,n);if(m_(e))return function QM(e,n){return D_(g_(e),n)}(e,n)}throw f_(e)}(e,n):ft(e)}class Dn extends Ee{constructor(n){super(),this._value=n}get value(){return this.getValue()}_subscribe(n){const t=super._subscribe(n);return!t.closed&&n.next(this._value),t}getValue(){const{hasError:n,thrownError:t,_value:i}=this;if(n)throw t;return this._throwIfClosed(),i}next(n){super.next(this._value=n)}}function J(...e){return pt(e,Vs(e))}function C_(e={}){const{connector:n=(()=>new Ee),resetOnError:t=!0,resetOnComplete:i=!0,resetOnRefCountZero:r=!0}=e;return o=>{let s,a,l,c=0,u=!1,d=!1;const h=()=>{a?.unsubscribe(),a=void 0},_=()=>{h(),s=l=void 0,u=d=!1},v=()=>{const y=s;_(),y?.unsubscribe()};return qe((y,D)=>{c++,!d&&!u&&h();const M=l=l??n();D.add(()=>{c--,0===c&&!d&&!u&&(a=sf(v,r))}),M.subscribe(D),!s&&c>0&&(s=new bi({next:C=>M.next(C),error:C=>{d=!0,h(),a=sf(_,t,C),M.error(C)},complete:()=>{u=!0,h(),a=sf(_,i),M.complete()}}),ft(y).subscribe(s))})(o)}}function sf(e,n,...t){if(!0===n)return void e();if(!1===n)return;const i=new bi({next:()=>{i.unsubscribe(),e()}});return ft(n(...t)).subscribe(i)}function wn(e,n){return qe((t,i)=>{let r=null,o=0,s=!1;const a=()=>s&&!r&&i.complete();t.subscribe(Ve(i,l=>{r?.unsubscribe();let c=0;const u=o++;ft(e(l,u)).subscribe(r=Ve(i,d=>i.next(n?n(l,d,u,c++):d),()=>{r=null,a()}))},()=>{s=!0,a()}))})}function eI(e,n){return e===n}function xe(e){for(let n in e)if(e[n]===xe)return n;throw Error("Could not find renamed property on target object.")}function Gl(e,n){for(const t in n)n.hasOwnProperty(t)&&!e.hasOwnProperty(t)&&(e[t]=n[t])}function gt(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(gt).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return`${e.overriddenName}`;if(e.name)return`${e.name}`;const n=e.toString();if(null==n)return""+n;const t=n.indexOf("\n");return-1===t?n:n.substring(0,t)}function af(e,n){return null==e||""===e?null===n?"":n:null==n||""===n?e:e+" "+n}const tI=xe({__forward_ref__:xe});function le(e){return e.__forward_ref__=le,e.toString=function(){return gt(this())},e}function ee(e){return lf(e)?e():e}function lf(e){return"function"==typeof e&&e.hasOwnProperty(tI)&&e.__forward_ref__===le}function cf(e){return e&&!!e.\u0275providers}const T_="https://g.co/ng/security#xss";class R extends Error{constructor(n,t){super(function zl(e,n){return`NG0${Math.abs(e)}${n?": "+n:""}`}(n,t)),this.code=n}}function te(e){return"string"==typeof e?e:null==e?"":String(e)}function uf(e,n){throw new R(-201,!1)}function Cn(e,n){null==e&&function Q(e,n,t,i){throw new Error(`ASSERTION ERROR: ${e}`+(null==i?"":` [Expected=> ${t} ${i} ${n} <=Actual]`))}(n,e,null,"!=")}function B(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function ve(e){return{providers:e.providers||[],imports:e.imports||[]}}function Wl(e){return S_(e,Yl)||S_(e,M_)}function S_(e,n){return e.hasOwnProperty(n)?e[n]:null}function ql(e){return e&&(e.hasOwnProperty(df)||e.hasOwnProperty(cI))?e[df]:null}const Yl=xe({\u0275prov:xe}),df=xe({\u0275inj:xe}),M_=xe({ngInjectableDef:xe}),cI=xe({ngInjectorDef:xe});var ce=function(e){return e[e.Default=0]="Default",e[e.Host=1]="Host",e[e.Self=2]="Self",e[e.SkipSelf=4]="SkipSelf",e[e.Optional=8]="Optional",e}(ce||{});let ff;function Qt(e){const n=ff;return ff=e,n}function N_(e,n,t){const i=Wl(e);return i&&"root"==i.providedIn?void 0===i.value?i.value=i.factory():i.value:t&ce.Optional?null:void 0!==n?n:void uf(gt(e))}const Be=globalThis;class z{constructor(n,t){this._desc=n,this.ngMetadataName="InjectionToken",this.\u0275prov=void 0,"number"==typeof t?this.__NG_ELEMENT_ID__=t:void 0!==t&&(this.\u0275prov=B({token:this,providedIn:t.providedIn||"root",factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}}const Bs={},_f="__NG_DI_FLAG__",Zl="ngTempTokenPath",fI=/\n/gm,x_="__source";let co;function Hi(e){const n=co;return co=e,n}function gI(e,n=ce.Default){if(void 0===co)throw new R(-203,!1);return null===co?N_(e,void 0,n):co.get(e,n&ce.Optional?null:void 0,n)}function H(e,n=ce.Default){return(function I_(){return ff}()||gI)(ee(e),n)}function F(e,n=ce.Default){return H(e,Jl(n))}function Jl(e){return typeof e>"u"||"number"==typeof e?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function vf(e){const n=[];for(let t=0;tn){s=o-1;break}}}for(;oo?"":r[d+1].toLowerCase();const _=8&i?h:null;if(_&&-1!==k_(_,c,0)||2&i&&c!==h){if(Ln(i))return!1;s=!0}}}}else{if(!s&&!Ln(i)&&!Ln(l))return!1;if(s&&Ln(l))continue;s=!1,i=l|1&i}}return Ln(i)||s}function Ln(e){return 0==(1&e)}function wI(e,n,t,i){if(null===n)return-1;let r=0;if(i||!t){let o=!1;for(;r-1)for(t++;t0?'="'+a+'"':"")+"]"}else 8&i?r+="."+s:4&i&&(r+=" "+s);else""!==r&&!Ln(s)&&(n+=$_(o,r),r=""),i=s,o=o||!Ln(i);t++}return""!==r&&(n+=$_(o,r)),n}function kt(e){return wi(()=>{const n=G_(e),t={...n,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection===Xl.OnPush,directiveDefs:null,pipeDefs:null,dependencies:n.standalone&&e.dependencies||null,getStandaloneInjector:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||Fn.Emulated,styles:e.styles||ye,_:null,schemas:e.schemas||null,tView:null,id:""};z_(t);const i=e.dependencies;return t.directiveDefs=Kl(i,!1),t.pipeDefs=Kl(i,!0),t.id=function kI(e){let n=0;const t=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,e.consts,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery].join("|");for(const r of t)n=Math.imul(31,n)+r.charCodeAt(0)<<0;return n+=2147483648,"c"+n}(t),t})}function xI(e){return he(e)||Et(e)}function AI(e){return null!==e}function be(e){return wi(()=>({type:e.type,bootstrap:e.bootstrap||ye,declarations:e.declarations||ye,imports:e.imports||ye,exports:e.exports||ye,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null}))}function U_(e,n){if(null==e)return ii;const t={};for(const i in e)if(e.hasOwnProperty(i)){let r=e[i],o=r;Array.isArray(r)&&(o=r[1],r=r[0]),t[r]=i,n&&(n[r]=o)}return t}function L(e){return wi(()=>{const n=G_(e);return z_(n),n})}function Bt(e){return{type:e.type,name:e.name,factory:null,pure:!1!==e.pure,standalone:!0===e.standalone,onDestroy:e.type.prototype.ngOnDestroy||null}}function he(e){return e[Ql]||null}function Et(e){return e[yf]||null}function jt(e){return e[bf]||null}function un(e,n){const t=e[R_]||null;if(!t&&!0===n)throw new Error(`Type ${gt(e)} does not have '\u0275mod' property.`);return t}function G_(e){const n={};return{type:e.type,providersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:n,inputTransforms:null,inputConfig:e.inputs||ii,exportAs:e.exportAs||null,standalone:!0===e.standalone,signals:!0===e.signals,selectors:e.selectors||ye,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,findHostDirectiveDefs:null,hostDirectives:null,inputs:U_(e.inputs,n),outputs:U_(e.outputs)}}function z_(e){e.features?.forEach(n=>n(e))}function Kl(e,n){if(!e)return null;const t=n?jt:xI;return()=>("function"==typeof e?e():e).map(i=>t(i)).filter(AI)}const Qe=0,$=1,re=2,ze=3,Vn=4,Us=5,Ft=6,fo=7,rt=8,$i=9,ho=10,ne=11,Gs=12,W_=13,po=14,ot=15,zs=16,go=17,ri=18,Ws=19,q_=20,Ui=21,Ei=22,qs=23,Ys=24,ue=25,wf=1,Y_=2,oi=7,mo=9,Tt=11;function Kt(e){return Array.isArray(e)&&"object"==typeof e[wf]}function Ht(e){return Array.isArray(e)&&!0===e[wf]}function Cf(e){return 0!=(4&e.flags)}function vr(e){return e.componentOffset>-1}function tc(e){return 1==(1&e.flags)}function Bn(e){return!!e.template}function Ef(e){return 0!=(512&e[re])}function yr(e,n){return e.hasOwnProperty(Ci)?e[Ci]:null}let St=null,nc=!1;function En(e){const n=St;return St=e,n}const X_={version:0,dirty:!1,producerNode:void 0,producerLastReadVersion:void 0,producerIndexOfThis:void 0,nextProducerIndex:0,liveConsumerNode:void 0,liveConsumerIndexOfThis:void 0,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{}};function K_(e){if(!Js(e)||e.dirty){if(!e.producerMustRecompute(e)&&!nv(e))return void(e.dirty=!1);e.producerRecomputeValue(e),e.dirty=!1}}function tv(e){e.dirty=!0,function ev(e){if(void 0===e.liveConsumerNode)return;const n=nc;nc=!0;try{for(const t of e.liveConsumerNode)t.dirty||tv(t)}finally{nc=n}}(e),e.consumerMarkedDirty?.(e)}function Sf(e){return e&&(e.nextProducerIndex=0),En(e)}function Mf(e,n){if(En(n),e&&void 0!==e.producerNode&&void 0!==e.producerIndexOfThis&&void 0!==e.producerLastReadVersion){if(Js(e))for(let t=e.nextProducerIndex;te.nextProducerIndex;)e.producerNode.pop(),e.producerLastReadVersion.pop(),e.producerIndexOfThis.pop()}}function nv(e){_o(e);for(let n=0;n0}function _o(e){e.producerNode??=[],e.producerIndexOfThis??=[],e.producerLastReadVersion??=[]}let sv=null;const uv=()=>{},YI=(()=>({...X_,consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!1,consumerMarkedDirty:e=>{e.schedule(e.ref)},hasRun:!1,cleanupFn:uv}))();class ZI{constructor(n,t,i){this.previousValue=n,this.currentValue=t,this.firstChange=i}isFirstChange(){return this.firstChange}}function Mt(){return dv}function dv(e){return e.type.prototype.ngOnChanges&&(e.setInput=XI),JI}function JI(){const e=hv(this),n=e?.current;if(n){const t=e.previous;if(t===ii)e.previous=n;else for(let i in n)t[i]=n[i];e.current=null,this.ngOnChanges(n)}}function XI(e,n,t,i){const r=this.declaredInputs[t],o=hv(e)||function QI(e,n){return e[fv]=n}(e,{previous:ii,current:null}),s=o.current||(o.current={}),a=o.previous,l=a[r];s[r]=new ZI(l&&l.currentValue,n,a===ii),e[i]=n}Mt.ngInherit=!0;const fv="__ngSimpleChanges__";function hv(e){return e[fv]||null}const si=function(e,n,t){};function je(e){for(;Array.isArray(e);)e=e[Qe];return e}function rc(e,n){return je(n[e])}function en(e,n){return je(n[e.index])}function mv(e,n){return e.data[n]}function dn(e,n){const t=n[e];return Kt(t)?t:t[Qe]}function zi(e,n){return null==n?null:e[n]}function _v(e){e[go]=0}function rN(e){1024&e[re]||(e[re]|=1024,yv(e,1))}function vv(e){1024&e[re]&&(e[re]&=-1025,yv(e,-1))}function yv(e,n){let t=e[ze];if(null===t)return;t[Us]+=n;let i=t;for(t=t[ze];null!==t&&(1===n&&1===i[Us]||-1===n&&0===i[Us]);)t[Us]+=n,i=t,t=t[ze]}const K={lFrame:Ov(null),bindingsEnabled:!0,skipHydrationRootTNode:null};function wv(){return K.bindingsEnabled}function yo(){return null!==K.skipHydrationRootTNode}function O(){return K.lFrame.lView}function pe(){return K.lFrame.tView}function Ue(e){return K.lFrame.contextLView=e,e[rt]}function Ge(e){return K.lFrame.contextLView=null,e}function It(){let e=Cv();for(;null!==e&&64===e.type;)e=e.parent;return e}function Cv(){return K.lFrame.currentTNode}function ai(e,n){const t=K.lFrame;t.currentTNode=e,t.isParent=n}function Af(){return K.lFrame.isParent}function Rf(){K.lFrame.isParent=!1}function $t(){const e=K.lFrame;let n=e.bindingRootIndex;return-1===n&&(n=e.bindingRootIndex=e.tView.bindingStartIndex),n}function bo(){return K.lFrame.bindingIndex++}function Si(e){const n=K.lFrame,t=n.bindingIndex;return n.bindingIndex=n.bindingIndex+e,t}function mN(e,n){const t=K.lFrame;t.bindingIndex=t.bindingRootIndex=e,Pf(n)}function Pf(e){K.lFrame.currentDirectiveIndex=e}function Mv(){return K.lFrame.currentQueryIndex}function Ff(e){K.lFrame.currentQueryIndex=e}function vN(e){const n=e[$];return 2===n.type?n.declTNode:1===n.type?e[Ft]:null}function Iv(e,n,t){if(t&ce.SkipSelf){let r=n,o=e;for(;!(r=r.parent,null!==r||t&ce.Host||(r=vN(o),null===r||(o=o[po],10&r.type))););if(null===r)return!1;n=r,e=o}const i=K.lFrame=Nv();return i.currentTNode=n,i.lView=e,!0}function Lf(e){const n=Nv(),t=e[$];K.lFrame=n,n.currentTNode=t.firstChild,n.lView=e,n.tView=t,n.contextLView=e,n.bindingIndex=t.bindingStartIndex,n.inI18n=!1}function Nv(){const e=K.lFrame,n=null===e?null:e.child;return null===n?Ov(e):n}function Ov(e){const n={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return null!==e&&(e.child=n),n}function xv(){const e=K.lFrame;return K.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}const Av=xv;function Vf(){const e=xv();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function Ut(){return K.lFrame.selectedIndex}function br(e){K.lFrame.selectedIndex=e}function Ye(){const e=K.lFrame;return mv(e.tView,e.selectedIndex)}let Pv=!0;function oc(){return Pv}function Wi(e){Pv=e}function sc(e,n){for(let t=n.directiveStart,i=n.directiveEnd;t=i)break}else n[l]<0&&(e[go]+=65536),(a>13>16&&(3&e[re])===n&&(e[re]+=8192,Fv(a,o)):Fv(a,o)}const Do=-1;class Qs{constructor(n,t,i){this.factory=n,this.resolving=!1,this.canSeeViewProviders=t,this.injectImpl=i}}function Hf(e){return e!==Do}function Ks(e){return 32767&e}function ea(e,n){let t=function ON(e){return e>>16}(e),i=n;for(;t>0;)i=i[po],t--;return i}let $f=!0;function cc(e){const n=$f;return $f=e,n}const Lv=255,Vv=5;let xN=0;const li={};function uc(e,n){const t=Bv(e,n);if(-1!==t)return t;const i=n[$];i.firstCreatePass&&(e.injectorIndex=n.length,Uf(i.data,e),Uf(n,null),Uf(i.blueprint,null));const r=dc(e,n),o=e.injectorIndex;if(Hf(r)){const s=Ks(r),a=ea(r,n),l=a[$].data;for(let c=0;c<8;c++)n[o+c]=a[s+c]|l[s+c]}return n[o+8]=r,o}function Uf(e,n){e.push(0,0,0,0,0,0,0,0,n)}function Bv(e,n){return-1===e.injectorIndex||e.parent&&e.parent.injectorIndex===e.injectorIndex||null===n[e.injectorIndex+8]?-1:e.injectorIndex}function dc(e,n){if(e.parent&&-1!==e.parent.injectorIndex)return e.parent.injectorIndex;let t=0,i=null,r=n;for(;null!==r;){if(i=Wv(r),null===i)return Do;if(t++,r=r[po],-1!==i.injectorIndex)return i.injectorIndex|t<<16}return Do}function Gf(e,n,t){!function AN(e,n,t){let i;"string"==typeof t?i=t.charCodeAt(0)||0:t.hasOwnProperty(Hs)&&(i=t[Hs]),null==i&&(i=t[Hs]=xN++);const r=i&Lv;n.data[e+(r>>Vv)]|=1<=0?n&Lv:LN:n}(t);if("function"==typeof o){if(!Iv(n,e,i))return i&ce.Host?jv(r,0,i):Hv(n,t,i,r);try{let s;if(s=o(i),null!=s||i&ce.Optional)return s;uf()}finally{Av()}}else if("number"==typeof o){let s=null,a=Bv(e,n),l=Do,c=i&ce.Host?n[ot][Ft]:null;for((-1===a||i&ce.SkipSelf)&&(l=-1===a?dc(e,n):n[a+8],l!==Do&&zv(i,!1)?(s=n[$],a=Ks(l),n=ea(l,n)):a=-1);-1!==a;){const u=n[$];if(Gv(o,a,u.data)){const d=PN(a,n,t,s,i,c);if(d!==li)return d}l=n[a+8],l!==Do&&zv(i,n[$].data[a+8]===c)&&Gv(o,a,n)?(s=u,a=Ks(l),n=ea(l,n)):a=-1}}return r}function PN(e,n,t,i,r,o){const s=n[$],a=s.data[e+8],u=fc(a,s,t,null==i?vr(a)&&$f:i!=s&&0!=(3&a.type),r&ce.Host&&o===a);return null!==u?Dr(n,s,u,a):li}function fc(e,n,t,i,r){const o=e.providerIndexes,s=n.data,a=1048575&o,l=e.directiveStart,u=o>>20,h=r?a+u:e.directiveEnd;for(let _=i?a:a+u;_=l&&v.type===t)return _}if(r){const _=s[l];if(_&&Bn(_)&&_.type===t)return l}return null}function Dr(e,n,t,i){let r=e[t];const o=n.data;if(function MN(e){return e instanceof Qs}(r)){const s=r;s.resolving&&function nI(e,n){const t=n?`. Dependency path: ${n.join(" > ")} > ${e}`:"";throw new R(-200,`Circular dependency in DI detected for ${e}${t}`)}(function Te(e){return"function"==typeof e?e.name||e.toString():"object"==typeof e&&null!=e&&"function"==typeof e.type?e.type.name||e.type.toString():te(e)}(o[t]));const a=cc(s.canSeeViewProviders);s.resolving=!0;const c=s.injectImpl?Qt(s.injectImpl):null;Iv(e,i,ce.Default);try{r=e[t]=s.factory(void 0,o,e,i),n.firstCreatePass&&t>=i.directiveStart&&function TN(e,n,t){const{ngOnChanges:i,ngOnInit:r,ngDoCheck:o}=n.type.prototype;if(i){const s=dv(n);(t.preOrderHooks??=[]).push(e,s),(t.preOrderCheckHooks??=[]).push(e,s)}r&&(t.preOrderHooks??=[]).push(0-e,r),o&&((t.preOrderHooks??=[]).push(e,o),(t.preOrderCheckHooks??=[]).push(e,o))}(t,o[t],n)}finally{null!==c&&Qt(c),cc(a),s.resolving=!1,Av()}}return r}function Gv(e,n,t){return!!(t[n+(e>>Vv)]&1<{const n=e.prototype.constructor,t=n[Ci]||zf(n),i=Object.prototype;let r=Object.getPrototypeOf(e.prototype).constructor;for(;r&&r!==i;){const o=r[Ci]||zf(r);if(o&&o!==t)return o;r=Object.getPrototypeOf(r)}return o=>new o})}function zf(e){return lf(e)?()=>{const n=zf(ee(e));return n&&n()}:yr(e)}function Wv(e){const n=e[$],t=n.type;return 2===t?n.declTNode:1===t?e[Ft]:null}const Co="__parameters__";function To(e,n,t){return wi(()=>{const i=function Wf(e){return function(...t){if(e){const i=e(...t);for(const r in i)this[r]=i[r]}}}(n);function r(...o){if(this instanceof r)return i.apply(this,o),this;const s=new r(...o);return a.annotation=s,a;function a(l,c,u){const d=l.hasOwnProperty(Co)?l[Co]:Object.defineProperty(l,Co,{value:[]})[Co];for(;d.length<=u;)d.push(null);return(d[u]=d[u]||[]).push(s),l}}return t&&(r.prototype=Object.create(t.prototype)),r.prototype.ngMetadataName=e,r.annotationCls=r,r})}function Mo(e,n){e.forEach(t=>Array.isArray(t)?Mo(t,n):n(t))}function Yv(e,n,t){n>=e.length?e.push(t):e.splice(n,0,t)}function hc(e,n){return n>=e.length-1?e.pop():e.splice(n,1)[0]}function ia(e,n){const t=[];for(let i=0;i=0?e[1|i]=t:(i=~i,function zN(e,n,t,i){let r=e.length;if(r==n)e.push(t,i);else if(1===r)e.push(i,e[0]),e[0]=t;else{for(r--,e.push(e[r-1],e[r]);r>n;)e[r]=e[r-2],r--;e[n]=t,e[n+1]=i}}(e,i,n,t)),i}function qf(e,n){const t=Io(e,n);if(t>=0)return e[1|t]}function Io(e,n){return function Zv(e,n,t){let i=0,r=e.length>>t;for(;r!==i;){const o=i+(r-i>>1),s=e[o<n?r=o:i=o+1}return~(r<|^->||--!>|)/g,pO="\u200b$1\u200b";const Qf=new Map;let gO=0;const eh="__ngContext__";function Lt(e,n){Kt(n)?(e[eh]=n[Ws],function _O(e){Qf.set(e[Ws],e)}(n)):e[eh]=n}let th;function nh(e,n){return th(e,n)}function sa(e){const n=e[ze];return Ht(n)?n[ze]:n}function gy(e){return _y(e[Gs])}function my(e){return _y(e[Vn])}function _y(e){for(;null!==e&&!Ht(e);)e=e[Vn];return e}function xo(e,n,t,i,r){if(null!=i){let o,s=!1;Ht(i)?o=i:Kt(i)&&(s=!0,i=i[Qe]);const a=je(i);0===e&&null!==t?null==r?Dy(n,t,a):Cr(n,t,a,r||null,!0):1===e&&null!==t?Cr(n,t,a,r||null,!0):2===e?function Ic(e,n,t){const i=Sc(e,n);i&&function FO(e,n,t,i){e.removeChild(n,t,i)}(e,i,n,t)}(n,a,s):3===e&&n.destroyNode(a),null!=o&&function BO(e,n,t,i,r){const o=t[oi];o!==je(t)&&xo(n,e,i,o,r);for(let a=Tt;an.replace(hO,pO))}(n))}function Ec(e,n,t){return e.createElement(n,t)}function yy(e,n){const t=e[mo],i=t.indexOf(n);vv(n),t.splice(i,1)}function Tc(e,n){if(e.length<=Tt)return;const t=Tt+n,i=e[t];if(i){const r=i[zs];null!==r&&r!==e&&yy(r,i),n>0&&(e[t-1][Vn]=i[Vn]);const o=hc(e,Tt+n);!function IO(e,n){la(e,n,n[ne],2,null,null),n[Qe]=null,n[Ft]=null}(i[$],i);const s=o[ri];null!==s&&s.detachView(o[$]),i[ze]=null,i[Vn]=null,i[re]&=-129}return i}function rh(e,n){if(!(256&n[re])){const t=n[ne];n[qs]&&iv(n[qs]),n[Ys]&&iv(n[Ys]),t.destroyNode&&la(e,n,t,3,null,null),function xO(e){let n=e[Gs];if(!n)return oh(e[$],e);for(;n;){let t=null;if(Kt(n))t=n[Gs];else{const i=n[Tt];i&&(t=i)}if(!t){for(;n&&!n[Vn]&&n!==e;)Kt(n)&&oh(n[$],n),n=n[ze];null===n&&(n=e),Kt(n)&&oh(n[$],n),t=n&&n[Vn]}n=t}}(n)}}function oh(e,n){if(!(256&n[re])){n[re]&=-129,n[re]|=256,function kO(e,n){let t;if(null!=e&&null!=(t=e.destroyHooks))for(let i=0;i=0?i[s]():i[-s].unsubscribe(),o+=2}else t[o].call(i[t[o+1]]);null!==i&&(n[fo]=null);const r=n[Ui];if(null!==r){n[Ui]=null;for(let o=0;o-1){const{encapsulation:o}=e.data[i.directiveStart+r];if(o===Fn.None||o===Fn.Emulated)return null}return en(i,t)}}(e,n.parent,t)}function Cr(e,n,t,i,r){e.insertBefore(n,t,i,r)}function Dy(e,n,t){e.appendChild(n,t)}function wy(e,n,t,i,r){null!==i?Cr(e,n,t,i,r):Dy(e,n,t)}function Sc(e,n){return e.parentNode(n)}function Cy(e,n,t){return Ty(e,n,t)}let ah,dh,Ty=function Ey(e,n,t){return 40&e.type?en(e,t):null};function Mc(e,n,t,i){const r=sh(e,i,n),o=n[ne],a=Cy(i.parent||n[Ft],i,n);if(null!=r)if(Array.isArray(t))for(let l=0;l{t.push(s)};return Mo(n,s=>{const a=s;Ac(a,o,[],i)&&(r||=[],r.push(a))}),void 0!==r&&qy(r,o),t}function qy(e,n){for(let t=0;t{n(o,i)})}}function Ac(e,n,t,i){if(!(e=ee(e)))return!1;let r=null,o=ql(e);const s=!o&&he(e);if(o||s){if(s&&!s.standalone)return!1;r=e}else{const l=e.ngModule;if(o=ql(l),!o)return!1;r=l}const a=i.has(r);if(s){if(a)return!1;if(i.add(r),s.dependencies){const l="function"==typeof s.dependencies?s.dependencies():s.dependencies;for(const c of l)Ac(c,n,t,i)}}else{if(!o)return!1;{if(null!=o.imports&&!a){let c;i.add(r);try{Mo(o.imports,u=>{Ac(u,n,t,i)&&(c||=[],c.push(u))})}finally{}void 0!==c&&qy(c,n)}if(!a){const c=yr(r)||(()=>new r);n({provide:r,useFactory:c,deps:ye},r),n({provide:zy,useValue:r,multi:!0},r),n({provide:fa,useValue:()=>H(r),multi:!0},r)}const l=o.providers;if(null!=l&&!a){const c=e;yh(l,u=>{n(u,c)})}}}return r!==e&&void 0!==e.providers}function yh(e,n){for(let t of e)cf(t)&&(t=t.\u0275providers),Array.isArray(t)?yh(t,n):n(t)}const gx=xe({provide:String,useValue:xe});function bh(e){return null!==e&&"object"==typeof e&&gx in e}function Er(e){return"function"==typeof e}const Dh=new z("Set Injector scope."),Rc={},_x={};let wh;function Pc(){return void 0===wh&&(wh=new _h),wh}class zt{}class ko extends zt{get destroyed(){return this._destroyed}constructor(n,t,i,r){super(),this.parent=t,this.source=i,this.scopes=r,this.records=new Map,this._ngOnDestroyHooks=new Set,this._onDestroyHooks=[],this._destroyed=!1,Eh(n,s=>this.processProvider(s)),this.records.set(Gy,Fo(void 0,this)),r.has("environment")&&this.records.set(zt,Fo(void 0,this));const o=this.records.get(Dh);null!=o&&"string"==typeof o.value&&this.scopes.add(o.value),this.injectorDefTypes=new Set(this.get(zy.multi,ye,ce.Self))}destroy(){this.assertNotDestroyed(),this._destroyed=!0;try{for(const t of this._ngOnDestroyHooks)t.ngOnDestroy();const n=this._onDestroyHooks;this._onDestroyHooks=[];for(const t of n)t()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear()}}onDestroy(n){return this.assertNotDestroyed(),this._onDestroyHooks.push(n),()=>this.removeOnDestroy(n)}runInContext(n){this.assertNotDestroyed();const t=Hi(this),i=Qt(void 0);try{return n()}finally{Hi(t),Qt(i)}}get(n,t=Bs,i=ce.Default){if(this.assertNotDestroyed(),n.hasOwnProperty(P_))return n[P_](this);i=Jl(i);const o=Hi(this),s=Qt(void 0);try{if(!(i&ce.SkipSelf)){let l=this.records.get(n);if(void 0===l){const c=function wx(e){return"function"==typeof e||"object"==typeof e&&e instanceof z}(n)&&Wl(n);l=c&&this.injectableDefInScope(c)?Fo(Ch(n),Rc):null,this.records.set(n,l)}if(null!=l)return this.hydrate(n,l)}return(i&ce.Self?Pc():this.parent).get(n,t=i&ce.Optional&&t===Bs?null:t)}catch(a){if("NullInjectorError"===a.name){if((a[Zl]=a[Zl]||[]).unshift(gt(n)),o)throw a;return function _I(e,n,t,i){const r=e[Zl];throw n[x_]&&r.unshift(n[x_]),e.message=function vI(e,n,t,i=null){e=e&&"\n"===e.charAt(0)&&"\u0275"==e.charAt(1)?e.slice(2):e;let r=gt(n);if(Array.isArray(n))r=n.map(gt).join(" -> ");else if("object"==typeof n){let o=[];for(let s in n)if(n.hasOwnProperty(s)){let a=n[s];o.push(s+":"+("string"==typeof a?JSON.stringify(a):gt(a)))}r=`{${o.join(", ")}}`}return`${t}${i?"("+i+")":""}[${r}]: ${e.replace(fI,"\n ")}`}("\n"+e.message,r,t,i),e.ngTokenPath=r,e[Zl]=null,e}(a,n,"R3InjectorError",this.source)}throw a}finally{Qt(s),Hi(o)}}resolveInjectorInitializers(){const n=Hi(this),t=Qt(void 0);try{const r=this.get(fa.multi,ye,ce.Self);for(const o of r)o()}finally{Hi(n),Qt(t)}}toString(){const n=[],t=this.records;for(const i of t.keys())n.push(gt(i));return`R3Injector[${n.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new R(205,!1)}processProvider(n){let t=Er(n=ee(n))?n:ee(n&&n.provide);const i=function yx(e){return bh(e)?Fo(void 0,e.useValue):Fo(Jy(e),Rc)}(n);if(Er(n)||!0!==n.multi)this.records.get(t);else{let r=this.records.get(t);r||(r=Fo(void 0,Rc,!0),r.factory=()=>vf(r.multi),this.records.set(t,r)),t=n,r.multi.push(n)}this.records.set(t,i)}hydrate(n,t){return t.value===Rc&&(t.value=_x,t.value=t.factory()),"object"==typeof t.value&&t.value&&function Dx(e){return null!==e&&"object"==typeof e&&"function"==typeof e.ngOnDestroy}(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}injectableDefInScope(n){if(!n.providedIn)return!1;const t=ee(n.providedIn);return"string"==typeof t?"any"===t||this.scopes.has(t):this.injectorDefTypes.has(t)}removeOnDestroy(n){const t=this._onDestroyHooks.indexOf(n);-1!==t&&this._onDestroyHooks.splice(t,1)}}function Ch(e){const n=Wl(e),t=null!==n?n.factory:yr(e);if(null!==t)return t;if(e instanceof z)throw new R(204,!1);if(e instanceof Function)return function vx(e){const n=e.length;if(n>0)throw ia(n,"?"),new R(204,!1);const t=function lI(e){return e&&(e[Yl]||e[M_])||null}(e);return null!==t?()=>t.factory(e):()=>new e}(e);throw new R(204,!1)}function Jy(e,n,t){let i;if(Er(e)){const r=ee(e);return yr(r)||Ch(r)}if(bh(e))i=()=>ee(e.useValue);else if(function Zy(e){return!(!e||!e.useFactory)}(e))i=()=>e.useFactory(...vf(e.deps||[]));else if(function Yy(e){return!(!e||!e.useExisting)}(e))i=()=>H(ee(e.useExisting));else{const r=ee(e&&(e.useClass||e.provide));if(!function bx(e){return!!e.deps}(e))return yr(r)||Ch(r);i=()=>new r(...vf(e.deps))}return i}function Fo(e,n,t=!1){return{factory:e,value:n,multi:t?[]:void 0}}function Eh(e,n){for(const t of e)Array.isArray(t)?Eh(t,n):t&&cf(t)?Eh(t.\u0275providers,n):n(t)}const kc=new z("AppId",{providedIn:"root",factory:()=>Cx}),Cx="ng",Xy=new z("Platform Initializer"),Tr=new z("Platform ID",{providedIn:"platform",factory:()=>"unknown"}),Qy=new z("CSP nonce",{providedIn:"root",factory:()=>function Ro(){if(void 0!==dh)return dh;if(typeof document<"u")return document;throw new R(210,!1)}().body?.querySelector("[ngCspNonce]")?.getAttribute("ngCspNonce")||null});let Ky=(e,n,t)=>null;function Ah(e,n,t=!1){return Ky(e,n,t)}class Rx{}class n1{}class kx{resolveComponentFactory(n){throw function Px(e){const n=Error(`No component factory found for ${gt(e)}.`);return n.ngComponent=e,n}(n)}}let Hc=(()=>{class e{static#e=this.NULL=new kx}return e})();function Fx(){return Bo(It(),O())}function Bo(e,n){return new Se(en(e,n))}let Se=(()=>{class e{constructor(t){this.nativeElement=t}static#e=this.__NG_ELEMENT_ID__=Fx}return e})();function Lx(e){return e instanceof Se?e.nativeElement:e}class kh{}let hn=(()=>{class e{constructor(){this.destroyNode=null}static#e=this.__NG_ELEMENT_ID__=()=>function Vx(){const e=O(),t=dn(It().index,e);return(Kt(t)?t:e)[ne]}()}return e})(),Bx=(()=>{class e{static#e=this.\u0275prov=B({token:e,providedIn:"root",factory:()=>null})}return e})();class ga{constructor(n){this.full=n,this.major=n.split(".")[0],this.minor=n.split(".")[1],this.patch=n.split(".").slice(2).join(".")}}const jx=new ga("16.2.12"),Fh={};function a1(e,n=null,t=null,i){const r=l1(e,n,t,i);return r.resolveInjectorInitializers(),r}function l1(e,n=null,t=null,i,r=new Set){const o=[t||ye,px(e)];return i=i||("object"==typeof e?void 0:gt(e)),new ko(o,n||Pc(),i||null,r)}let Nt=(()=>{class e{static#e=this.THROW_IF_NOT_FOUND=Bs;static#t=this.NULL=new _h;static create(t,i){if(Array.isArray(t))return a1({name:""},i,t,"");{const r=t.name??"";return a1({name:r},t.parent,t.providers,r)}}static#n=this.\u0275prov=B({token:e,providedIn:"any",factory:()=>H(Gy)});static#i=this.__NG_ELEMENT_ID__=-1}return e})();function Lh(e){return e.ngOriginalError}class Ii{constructor(){this._console=console}handleError(n){const t=this._findOriginalError(n);this._console.error("ERROR",n),t&&this._console.error("ORIGINAL ERROR",t)}_findOriginalError(n){let t=n&&Lh(n);for(;t&&Lh(t);)t=Lh(t);return t||null}}function Vh(e){return n=>{setTimeout(e,void 0,n)}}const Y=class Yx extends Ee{constructor(n=!1){super(),this.__isAsync=n}emit(n){super.next(n)}subscribe(n,t,i){let r=n,o=t||(()=>null),s=i;if(n&&"object"==typeof n){const l=n;r=l.next?.bind(l),o=l.error?.bind(l),s=l.complete?.bind(l)}this.__isAsync&&(o=Vh(o),r&&(r=Vh(r)),s&&(s=Vh(s)));const a=super.subscribe({next:r,error:o,complete:s});return n instanceof nt&&n.add(a),a}};function u1(...e){}class fe{constructor({enableLongStackTrace:n=!1,shouldCoalesceEventChangeDetection:t=!1,shouldCoalesceRunChangeDetection:i=!1}){if(this.hasPendingMacrotasks=!1,this.hasPendingMicrotasks=!1,this.isStable=!0,this.onUnstable=new Y(!1),this.onMicrotaskEmpty=new Y(!1),this.onStable=new Y(!1),this.onError=new Y(!1),typeof Zone>"u")throw new R(908,!1);Zone.assertZonePatched();const r=this;r._nesting=0,r._outer=r._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(r._inner=r._inner.fork(new Zone.TaskTrackingZoneSpec)),n&&Zone.longStackTraceZoneSpec&&(r._inner=r._inner.fork(Zone.longStackTraceZoneSpec)),r.shouldCoalesceEventChangeDetection=!i&&t,r.shouldCoalesceRunChangeDetection=i,r.lastRequestAnimationFrameId=-1,r.nativeRequestAnimationFrame=function Zx(){const e="function"==typeof Be.requestAnimationFrame;let n=Be[e?"requestAnimationFrame":"setTimeout"],t=Be[e?"cancelAnimationFrame":"clearTimeout"];if(typeof Zone<"u"&&n&&t){const i=n[Zone.__symbol__("OriginalDelegate")];i&&(n=i);const r=t[Zone.__symbol__("OriginalDelegate")];r&&(t=r)}return{nativeRequestAnimationFrame:n,nativeCancelAnimationFrame:t}}().nativeRequestAnimationFrame,function Qx(e){const n=()=>{!function Xx(e){e.isCheckStableRunning||-1!==e.lastRequestAnimationFrameId||(e.lastRequestAnimationFrameId=e.nativeRequestAnimationFrame.call(Be,()=>{e.fakeTopEventTask||(e.fakeTopEventTask=Zone.root.scheduleEventTask("fakeTopEventTask",()=>{e.lastRequestAnimationFrameId=-1,jh(e),e.isCheckStableRunning=!0,Bh(e),e.isCheckStableRunning=!1},void 0,()=>{},()=>{})),e.fakeTopEventTask.invoke()}),jh(e))}(e)};e._inner=e._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(t,i,r,o,s,a)=>{if(function eA(e){return!(!Array.isArray(e)||1!==e.length)&&!0===e[0].data?.__ignore_ng_zone__}(a))return t.invokeTask(r,o,s,a);try{return d1(e),t.invokeTask(r,o,s,a)}finally{(e.shouldCoalesceEventChangeDetection&&"eventTask"===o.type||e.shouldCoalesceRunChangeDetection)&&n(),f1(e)}},onInvoke:(t,i,r,o,s,a,l)=>{try{return d1(e),t.invoke(r,o,s,a,l)}finally{e.shouldCoalesceRunChangeDetection&&n(),f1(e)}},onHasTask:(t,i,r,o)=>{t.hasTask(r,o),i===r&&("microTask"==o.change?(e._hasPendingMicrotasks=o.microTask,jh(e),Bh(e)):"macroTask"==o.change&&(e.hasPendingMacrotasks=o.macroTask))},onHandleError:(t,i,r,o)=>(t.handleError(r,o),e.runOutsideAngular(()=>e.onError.emit(o)),!1)})}(r)}static isInAngularZone(){return typeof Zone<"u"&&!0===Zone.current.get("isAngularZone")}static assertInAngularZone(){if(!fe.isInAngularZone())throw new R(909,!1)}static assertNotInAngularZone(){if(fe.isInAngularZone())throw new R(909,!1)}run(n,t,i){return this._inner.run(n,t,i)}runTask(n,t,i,r){const o=this._inner,s=o.scheduleEventTask("NgZoneEvent: "+r,n,Jx,u1,u1);try{return o.runTask(s,t,i)}finally{o.cancelTask(s)}}runGuarded(n,t,i){return this._inner.runGuarded(n,t,i)}runOutsideAngular(n){return this._outer.run(n)}}const Jx={};function Bh(e){if(0==e._nesting&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function jh(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&-1!==e.lastRequestAnimationFrameId)}function d1(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function f1(e){e._nesting--,Bh(e)}class Kx{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new Y,this.onMicrotaskEmpty=new Y,this.onStable=new Y,this.onError=new Y}run(n,t,i){return n.apply(t,i)}runGuarded(n,t,i){return n.apply(t,i)}runOutsideAngular(n){return n()}runTask(n,t,i,r){return n.apply(t,i)}}const h1=new z("",{providedIn:"root",factory:p1});function p1(){const e=F(fe);let n=!0;return function w_(...e){const n=Vs(e),t=function qM(e,n){return"number"==typeof rf(e)?e.pop():n}(e,1/0),i=e;return i.length?1===i.length?ft(i[0]):lo(t)(pt(i,n)):bn}(new Ce(r=>{n=e.isStable&&!e.hasPendingMacrotasks&&!e.hasPendingMicrotasks,e.runOutsideAngular(()=>{r.next(n),r.complete()})}),new Ce(r=>{let o;e.runOutsideAngular(()=>{o=e.onStable.subscribe(()=>{fe.assertNotInAngularZone(),queueMicrotask(()=>{!n&&!e.hasPendingMacrotasks&&!e.hasPendingMicrotasks&&(n=!0,r.next(!0))})})});const s=e.onUnstable.subscribe(()=>{fe.assertInAngularZone(),n&&(n=!1,e.runOutsideAngular(()=>{r.next(!1)}))});return()=>{o.unsubscribe(),s.unsubscribe()}}).pipe(C_()))}function Ni(e){return e instanceof Function?e():e}let Hh=(()=>{class e{constructor(){this.renderDepth=0,this.handler=null}begin(){this.handler?.validateBegin(),this.renderDepth++}end(){this.renderDepth--,0===this.renderDepth&&this.handler?.execute()}ngOnDestroy(){this.handler?.destroy(),this.handler=null}static#e=this.\u0275prov=B({token:e,providedIn:"root",factory:()=>new e})}return e})();function ma(e){for(;e;){e[re]|=64;const n=sa(e);if(Ef(e)&&!n)return e;e=n}return null}const y1=new z("",{providedIn:"root",factory:()=>!1});let Gc=null;function C1(e,n){return e[n]??S1()}function E1(e,n){const t=S1();t.producerNode?.length&&(e[n]=Gc,t.lView=e,Gc=T1())}const uA={...X_,consumerIsAlwaysLive:!0,consumerMarkedDirty:e=>{ma(e.lView)},lView:null};function T1(){return Object.create(uA)}function S1(){return Gc??=T1(),Gc}const ie={};function g(e){M1(pe(),O(),Ut()+e,!1)}function M1(e,n,t,i){if(!i)if(3==(3&n[re])){const o=e.preOrderCheckHooks;null!==o&&ac(n,o,t)}else{const o=e.preOrderHooks;null!==o&&lc(n,o,0,t)}br(t)}function b(e,n=ce.Default){const t=O();return null===t?H(e,n):$v(It(),t,ee(e),n)}function zc(e,n,t,i,r,o,s,a,l,c,u){const d=n.blueprint.slice();return d[Qe]=r,d[re]=140|i,(null!==c||e&&2048&e[re])&&(d[re]|=2048),_v(d),d[ze]=d[po]=e,d[rt]=t,d[ho]=s||e&&e[ho],d[ne]=a||e&&e[ne],d[$i]=l||e&&e[$i]||null,d[Ft]=o,d[Ws]=function mO(){return gO++}(),d[Ei]=u,d[q_]=c,d[ot]=2==n.type?e[ot]:d,d}function Uo(e,n,t,i,r){let o=e.data[n];if(null===o)o=function $h(e,n,t,i,r){const o=Cv(),s=Af(),l=e.data[n]=function vA(e,n,t,i,r,o){let s=n?n.injectorIndex:-1,a=0;return yo()&&(a|=128),{type:t,index:i,insertBeforeIndex:null,injectorIndex:s,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,propertyBindings:null,flags:a,providerIndexes:0,value:r,attrs:o,mergedAttrs:null,localNames:null,initialInputs:void 0,inputs:null,outputs:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:n,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}(0,s?o:o&&o.parent,t,n,i,r);return null===e.firstChild&&(e.firstChild=l),null!==o&&(s?null==o.child&&null!==l.parent&&(o.child=l):null===o.next&&(o.next=l,l.prev=o)),l}(e,n,t,i,r),function gN(){return K.lFrame.inI18n}()&&(o.flags|=32);else if(64&o.type){o.type=t,o.value=i,o.attrs=r;const s=function Xs(){const e=K.lFrame,n=e.currentTNode;return e.isParent?n:n.parent}();o.injectorIndex=null===s?-1:s.injectorIndex}return ai(o,!0),o}function _a(e,n,t,i){if(0===t)return-1;const r=n.length;for(let o=0;oue&&M1(e,n,ue,!1),si(a?2:0,r);const c=a?o:null,u=Sf(c);try{null!==c&&(c.dirty=!1),t(i,r)}finally{Mf(c,u)}}finally{a&&null===n[qs]&&E1(n,qs),br(s),si(a?3:1,r)}}function Uh(e,n,t){if(Cf(n)){const i=En(null);try{const o=n.directiveEnd;for(let s=n.directiveStart;snull;function A1(e,n,t,i){for(let r in e)if(e.hasOwnProperty(r)){t=null===t?{}:t;const o=e[r];null===i?R1(t,n,r,o):i.hasOwnProperty(r)&&R1(t,n,i[r],o)}return t}function R1(e,n,t,i){e.hasOwnProperty(t)?e[t].push(n,i):e[t]=[n,i]}function pn(e,n,t,i,r,o,s,a){const l=en(n,t);let u,c=n.inputs;!a&&null!=c&&(u=c[i])?(Xh(e,t,u,i,r),vr(n)&&function DA(e,n){const t=dn(n,e);16&t[re]||(t[re]|=64)}(t,n.index)):3&n.type&&(i=function bA(e){return"class"===e?"className":"for"===e?"htmlFor":"formaction"===e?"formAction":"innerHtml"===e?"innerHTML":"readonly"===e?"readOnly":"tabindex"===e?"tabIndex":e}(i),r=null!=s?s(r,n.value||"",i):r,o.setProperty(l,i,r))}function qh(e,n,t,i){if(wv()){const r=null===i?null:{"":-1},o=function MA(e,n){const t=e.directiveRegistry;let i=null,r=null;if(t)for(let o=0;o0;){const t=e[--n];if("number"==typeof t&&t<0)return t}return 0})(s)!=a&&s.push(a),s.push(t,i,o)}}(e,n,i,_a(e,t,r.hostVars,ie),r)}function ci(e,n,t,i,r,o){const s=en(e,n);!function Zh(e,n,t,i,r,o,s){if(null==o)e.removeAttribute(n,r,t);else{const a=null==s?te(o):s(o,i||"",r);e.setAttribute(n,r,a,t)}}(n[ne],s,o,e.value,t,i,r)}function RA(e,n,t,i,r,o){const s=o[n];if(null!==s)for(let a=0;a{class e{constructor(){this.all=new Set,this.queue=new Map}create(t,i,r){const o=typeof Zone>"u"?null:Zone.current,s=function qI(e,n,t){const i=Object.create(YI);t&&(i.consumerAllowSignalWrites=!0),i.fn=e,i.schedule=n;const r=s=>{i.cleanupFn=s};return i.ref={notify:()=>tv(i),run:()=>{if(i.dirty=!1,i.hasRun&&!nv(i))return;i.hasRun=!0;const s=Sf(i);try{i.cleanupFn(),i.cleanupFn=uv,i.fn(r)}finally{Mf(i,s)}},cleanup:()=>i.cleanupFn()},i.ref}(t,c=>{this.all.has(c)&&this.queue.set(c,o)},r);let a;this.all.add(s),s.notify();const l=()=>{s.cleanup(),a?.(),this.all.delete(s),this.queue.delete(s)};return a=i?.onDestroy(l),{destroy:l}}flush(){if(0!==this.queue.size)for(const[t,i]of this.queue)this.queue.delete(t),i?i.run(()=>t.run()):t.run()}get isQueueEmpty(){return 0===this.queue.size}static#e=this.\u0275prov=B({token:e,providedIn:"root",factory:()=>new e})}return e})();function qc(e,n,t){let i=t?e.styles:null,r=t?e.classes:null,o=0;if(null!==n)for(let s=0;s0){W1(e,1);const r=t.components;null!==r&&Y1(e,r,1)}}function Y1(e,n,t){for(let i=0;i-1&&(Tc(n,i),hc(t,i))}this._attachedToViewContainer=!1}rh(this._lView[$],this._lView)}onDestroy(n){!function bv(e,n){if(256==(256&e[re]))throw new R(911,!1);null===e[Ui]&&(e[Ui]=[]),e[Ui].push(n)}(this._lView,n)}markForCheck(){ma(this._cdRefInjectingView||this._lView)}detach(){this._lView[re]&=-129}reattach(){this._lView[re]|=128}detectChanges(){Yc(this._lView[$],this._lView,this.context)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new R(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null,function OO(e,n){la(e,n,n[ne],2,null,null)}(this._lView[$],this._lView)}attachToAppRef(n){if(this._attachedToViewContainer)throw new R(902,!1);this._appRef=n}}class $A extends ya{constructor(n){super(n),this._view=n}detectChanges(){const n=this._view;Yc(n[$],n,n[rt],!1)}checkNoChanges(){}get context(){return null}}class Z1 extends Hc{constructor(n){super(),this.ngModule=n}resolveComponentFactory(n){const t=he(n);return new ba(t,this.ngModule)}}function J1(e){const n=[];for(let t in e)e.hasOwnProperty(t)&&n.push({propName:e[t],templateName:t});return n}class GA{constructor(n,t){this.injector=n,this.parentInjector=t}get(n,t,i){i=Jl(i);const r=this.injector.get(n,Fh,i);return r!==Fh||t===Fh?r:this.parentInjector.get(n,t,i)}}class ba extends n1{get inputs(){const n=this.componentDef,t=n.inputTransforms,i=J1(n.inputs);if(null!==t)for(const r of i)t.hasOwnProperty(r.propName)&&(r.transform=t[r.propName]);return i}get outputs(){return J1(this.componentDef.outputs)}constructor(n,t){super(),this.componentDef=n,this.ngModule=t,this.componentType=n.type,this.selector=function II(e){return e.map(MI).join(",")}(n.selectors),this.ngContentSelectors=n.ngContentSelectors?n.ngContentSelectors:[],this.isBoundToModule=!!t}create(n,t,i,r){let o=(r=r||this.ngModule)instanceof zt?r:r?.injector;o&&null!==this.componentDef.getStandaloneInjector&&(o=this.componentDef.getStandaloneInjector(o)||o);const s=o?new GA(n,o):n,a=s.get(kh,null);if(null===a)throw new R(407,!1);const d={rendererFactory:a,sanitizer:s.get(Bx,null),effectManager:s.get(U1,null),afterRenderEventManager:s.get(Hh,null)},h=a.createRenderer(null,this.componentDef),_=this.componentDef.selectors[0][0]||"div",v=i?function hA(e,n,t,i){const o=i.get(y1,!1)||t===Fn.ShadowDom,s=e.selectRootElement(n,o);return function pA(e){x1(e)}(s),s}(h,i,this.componentDef.encapsulation,s):Ec(h,_,function UA(e){const n=e.toLowerCase();return"svg"===n?"svg":"math"===n?"math":null}(_)),M=this.componentDef.signals?4608:this.componentDef.onPush?576:528;let C=null;null!==v&&(C=Ah(v,s,!0));const P=Wh(0,null,null,1,0,null,null,null,null,null,null),k=zc(null,P,null,M,null,null,d,h,s,null,C);let G,X;Lf(k);try{const de=this.componentDef;let ge,tt=null;de.findHostDirectiveDefs?(ge=[],tt=new Map,de.findHostDirectiveDefs(de,ge,tt),ge.push(de)):ge=[de];const lt=function WA(e,n){const t=e[$],i=ue;return e[i]=n,Uo(t,i,2,"#host",null)}(k,v),Ct=function qA(e,n,t,i,r,o,s){const a=r[$];!function YA(e,n,t,i){for(const r of e)n.mergedAttrs=$s(n.mergedAttrs,r.hostAttrs);null!==n.mergedAttrs&&(qc(n,n.mergedAttrs,!0),null!==t&&xy(i,t,n))}(i,e,n,s);let l=null;null!==n&&(l=Ah(n,r[$i]));const c=o.rendererFactory.createRenderer(n,t);let u=16;t.signals?u=4096:t.onPush&&(u=64);const d=zc(r,O1(t),null,u,r[e.index],e,o,c,null,null,l);return a.firstCreatePass&&Yh(a,e,i.length-1),Wc(r,d),r[e.index]=d}(lt,v,de,ge,k,d,h);X=mv(P,ue),v&&function JA(e,n,t,i){if(i)Df(e,t,["ng-version",jx.full]);else{const{attrs:r,classes:o}=function NI(e){const n=[],t=[];let i=1,r=2;for(;i0&&Oy(e,t,o.join(" "))}}(h,de,v,i),void 0!==t&&function XA(e,n,t){const i=e.projection=[];for(let r=0;r=0;i--){const r=e[i];r.hostVars=n+=r.hostVars,r.hostAttrs=$s(r.hostAttrs,t=$s(t,r.hostAttrs))}}(i)}function Zc(e){return e===ii?{}:e===ye?[]:e}function eR(e,n){const t=e.viewQuery;e.viewQuery=t?(i,r)=>{n(i,r),t(i,r)}:n}function tR(e,n){const t=e.contentQueries;e.contentQueries=t?(i,r,o)=>{n(i,r,o),t(i,r,o)}:n}function nR(e,n){const t=e.hostBindings;e.hostBindings=t?(i,r)=>{n(i,r),t(i,r)}:n}function Jc(e){return!!Kh(e)&&(Array.isArray(e)||!(e instanceof Map)&&Symbol.iterator in e)}function Kh(e){return null!==e&&("function"==typeof e||"object"==typeof e)}function ui(e,n,t){return e[n]=t}function Vt(e,n,t){return!Object.is(e[n],t)&&(e[n]=t,!0)}function Sr(e,n,t,i){const r=Vt(e,n,t);return Vt(e,n+1,i)||r}function Ie(e,n,t,i){const r=O();return Vt(r,bo(),n)&&(pe(),ci(Ye(),r,e,n,t,i)),Ie}function zo(e,n,t,i){return Vt(e,bo(),t)?n+te(t)+i:ie}function Wo(e,n,t,i,r,o){const a=Sr(e,function Ti(){return K.lFrame.bindingIndex}(),t,r);return Si(2),a?n+te(t)+i+te(r)+o:ie}function I(e,n,t,i,r,o,s,a){const l=O(),c=pe(),u=e+ue,d=c.firstCreatePass?function SR(e,n,t,i,r,o,s,a,l){const c=n.consts,u=Uo(n,e,4,s||null,zi(c,a));qh(n,t,u,zi(c,l)),sc(n,u);const d=u.tView=Wh(2,u,i,r,o,n.directiveRegistry,n.pipeRegistry,null,n.schemas,c,null);return null!==n.queries&&(n.queries.template(n,u),d.queries=n.queries.embeddedTView(u)),u}(u,c,l,n,t,i,r,o,s):c.data[u];ai(d,!1);const h=g0(c,l,d,e);oc()&&Mc(c,l,h,d),Lt(h,l),Wc(l,l[u]=L1(h,l,h,d)),tc(d)&&Gh(c,l,d),null!=s&&zh(l,d,a)}let g0=function m0(e,n,t,i){return Wi(!0),n[ne].createComment("")};function S(e,n,t){const i=O();return Vt(i,bo(),n)&&pn(pe(),Ye(),i,e,n,i[ne],t,!1),S}function op(e,n,t,i,r){const s=r?"class":"style";Xh(e,t,n.inputs[s],s,i)}function p(e,n,t,i){const r=O(),o=pe(),s=ue+e,a=r[ne],l=o.firstCreatePass?function OR(e,n,t,i,r,o){const s=n.consts,l=Uo(n,e,2,i,zi(s,r));return qh(n,t,l,zi(s,o)),null!==l.attrs&&qc(l,l.attrs,!1),null!==l.mergedAttrs&&qc(l,l.mergedAttrs,!0),null!==n.queries&&n.queries.elementStart(n,l),l}(s,o,r,n,t,i):o.data[s],c=_0(o,r,l,a,n,e);r[s]=c;const u=tc(l);return ai(l,!0),xy(a,c,l),32!=(32&l.flags)&&oc()&&Mc(o,r,c,l),0===function sN(){return K.lFrame.elementDepthCount}()&&Lt(c,r),function aN(){K.lFrame.elementDepthCount++}(),u&&(Gh(o,r,l),Uh(o,l,r)),null!==i&&zh(r,l),p}function f(){let e=It();Af()?Rf():(e=e.parent,ai(e,!1));const n=e;(function cN(e){return K.skipHydrationRootTNode===e})(n)&&function hN(){K.skipHydrationRootTNode=null}(),function lN(){K.lFrame.elementDepthCount--}();const t=pe();return t.firstCreatePass&&(sc(t,e),Cf(e)&&t.queries.elementEnd(e)),null!=n.classesWithoutHost&&function IN(e){return 0!=(8&e.flags)}(n)&&op(t,n,O(),n.classesWithoutHost,!0),null!=n.stylesWithoutHost&&function NN(e){return 0!=(16&e.flags)}(n)&&op(t,n,O(),n.stylesWithoutHost,!1),f}function Ae(e,n,t,i){return p(e,n,t,i),f(),Ae}let _0=(e,n,t,i,r,o)=>(Wi(!0),Ec(i,r,function Rv(){return K.lFrame.currentNamespace}()));function Zi(e,n,t){const i=O(),r=pe(),o=e+ue,s=r.firstCreatePass?function RR(e,n,t,i,r){const o=n.consts,s=zi(o,i),a=Uo(n,e,8,"ng-container",s);return null!==s&&qc(a,s,!0),qh(n,t,a,zi(o,r)),null!==n.queries&&n.queries.elementStart(n,a),a}(o,r,i,n,t):r.data[o];ai(s,!0);const a=y0(r,i,s,e);return i[o]=a,oc()&&Mc(r,i,a,s),Lt(a,i),tc(s)&&(Gh(r,i,s),Uh(r,s,i)),null!=t&&zh(i,s),Zi}function Ji(){let e=It();const n=pe();return Af()?Rf():(e=e.parent,ai(e,!1)),n.firstCreatePass&&(sc(n,e),Cf(e)&&n.queries.elementEnd(e)),Ji}let y0=(e,n,t,i)=>(Wi(!0),ih(n[ne],""));function Ze(){return O()}function Sa(e){return!!e&&"function"==typeof e.then}function b0(e){return!!e&&"function"==typeof e.subscribe}function Z(e,n,t,i){const r=O(),o=pe(),s=It();return function w0(e,n,t,i,r,o,s){const a=tc(i),c=e.firstCreatePass&&j1(e),u=n[rt],d=B1(n);let h=!0;if(3&i.type||s){const y=en(i,n),D=s?s(y):y,M=d.length,C=s?k=>s(je(k[i.index])):i.index;let P=null;if(!s&&a&&(P=function FR(e,n,t,i){const r=e.cleanup;if(null!=r)for(let o=0;ol?a[l]:null}"string"==typeof s&&(o+=2)}return null}(e,n,r,i.index)),null!==P)(P.__ngLastListenerFn__||P).__ngNextListenerFn__=o,P.__ngLastListenerFn__=o,h=!1;else{o=E0(i,n,u,o,!1);const k=t.listen(D,r,o);d.push(o,k),c&&c.push(r,C,M,M+1)}}else o=E0(i,n,u,o,!1);const _=i.outputs;let v;if(h&&null!==_&&(v=_[r])){const y=v.length;if(y)for(let D=0;D-1?dn(e.index,n):n);let l=C0(n,t,i,s),c=o.__ngNextListenerFn__;for(;c;)l=C0(n,t,c,s)&&l,c=c.__ngNextListenerFn__;return r&&!1===l&&s.preventDefault(),l}}function T(e=1){return function yN(e){return(K.lFrame.contextLView=function bN(e,n){for(;e>0;)n=n[po],e--;return n}(e,K.lFrame.contextLView))[rt]}(e)}function LR(e,n){let t=null;const i=function CI(e){const n=e.attrs;if(null!=n){const t=n.indexOf(5);if(!(1&t))return n[t+1]}return null}(e);for(let r=0;r>17&32767}function sp(e){return 2|e}function Mr(e){return(131068&e)>>2}function ap(e,n){return-131069&e|n<<2}function lp(e){return 1|e}function k0(e,n,t,i,r){const o=e[t+1],s=null===n;let a=i?Xi(o):Mr(o),l=!1;for(;0!==a&&(!1===l||s);){const u=e[a+1];UR(e[a],n)&&(l=!0,e[a+1]=i?lp(u):sp(u)),a=i?Xi(u):Mr(u)}l&&(e[t+1]=i?sp(o):lp(o))}function UR(e,n){return null===e||null==n||(Array.isArray(e)?e[1]:e)===n||!(!Array.isArray(e)||"string"!=typeof n)&&Io(e,n)>=0}const _t={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function F0(e){return e.substring(_t.key,_t.keyEnd)}function L0(e,n){const t=_t.textEnd;return t===n?-1:(n=_t.keyEnd=function qR(e,n,t){for(;n32;)n++;return n}(e,_t.key=n,t),Ko(e,n,t))}function Ko(e,n,t){for(;n=0;t=L0(n,t))fn(e,F0(n),!0)}function U0(e,n){return n>=e.expandoStartIndex}function G0(e,n,t,i){const r=e.data;if(null===r[t+1]){const o=r[Ut()],s=U0(e,t);Y0(o,i)&&null===n&&!s&&(n=!1),n=function XR(e,n,t,i){const r=function kf(e){const n=K.lFrame.currentDirectiveIndex;return-1===n?null:e[n]}(e);let o=i?n.residualClasses:n.residualStyles;if(null===r)0===(i?n.classBindings:n.styleBindings)&&(t=Ma(t=cp(null,e,n,t,i),n.attrs,i),o=null);else{const s=n.directiveStylingLast;if(-1===s||e[s]!==r)if(t=cp(r,e,n,t,i),null===o){let l=function QR(e,n,t){const i=t?n.classBindings:n.styleBindings;if(0!==Mr(i))return e[Xi(i)]}(e,n,i);void 0!==l&&Array.isArray(l)&&(l=cp(null,e,n,l[1],i),l=Ma(l,n.attrs,i),function KR(e,n,t,i){e[Xi(t?n.classBindings:n.styleBindings)]=i}(e,n,i,l))}else o=function e2(e,n,t){let i;const r=n.directiveEnd;for(let o=1+n.directiveStylingLast;o0)&&(c=!0)):u=t,r)if(0!==l){const h=Xi(e[a+1]);e[i+1]=nu(h,a),0!==h&&(e[h+1]=ap(e[h+1],i)),e[a+1]=function BR(e,n){return 131071&e|n<<17}(e[a+1],i)}else e[i+1]=nu(a,0),0!==a&&(e[a+1]=ap(e[a+1],i)),a=i;else e[i+1]=nu(l,0),0===a?a=i:e[l+1]=ap(e[l+1],i),l=i;c&&(e[i+1]=sp(e[i+1])),k0(e,u,i,!0),k0(e,u,i,!1),function $R(e,n,t,i,r){const o=r?e.residualClasses:e.residualStyles;null!=o&&"string"==typeof n&&Io(o,n)>=0&&(t[i+1]=lp(t[i+1]))}(n,u,e,i,o),s=nu(a,l),o?n.classBindings=s:n.styleBindings=s}(r,o,n,t,s,i)}}function cp(e,n,t,i,r){let o=null;const s=t.directiveEnd;let a=t.directiveStylingLast;for(-1===a?a=t.directiveStart:a++;a0;){const l=e[r],c=Array.isArray(l),u=c?l[1]:l,d=null===u;let h=t[r+1];h===ie&&(h=d?ye:void 0);let _=d?qf(h,i):u===i?h:void 0;if(c&&!iu(_)&&(_=qf(l,i)),iu(_)&&(a=_,s))return a;const v=e[r+1];r=s?Xi(v):Mr(v)}if(null!==n){let l=o?n.residualClasses:n.residualStyles;null!=l&&(a=qf(l,i))}return a}function iu(e){return void 0!==e}function Y0(e,n){return 0!=(e.flags&(n?8:16))}function m(e,n=""){const t=O(),i=pe(),r=e+ue,o=i.firstCreatePass?Uo(i,r,1,n,null):i.data[r],s=Z0(i,t,o,n,e);t[r]=s,oc()&&Mc(i,t,s,o),ai(o,!1)}let Z0=(e,n,t,i,r)=>(Wi(!0),function Cc(e,n){return e.createText(n)}(n[ne],i));function A(e){return V("",e,""),A}function V(e,n,t){const i=O(),r=zo(i,e,n,t);return r!==ie&&Oi(i,Ut(),r),V}function up(e,n,t,i,r){const o=O(),s=Wo(o,e,n,t,i,r);return s!==ie&&Oi(o,Ut(),s),up}const ts="en-US";let gb=ts;function hp(e,n,t,i,r){if(e=ee(e),Array.isArray(e))for(let o=0;o>20;if(Er(e)||!e.multi){const _=new Qs(c,r,b),v=gp(l,n,r?u:u+h,d);-1===v?(Gf(uc(a,s),o,l),pp(o,e,n.length),n.push(l),a.directiveStart++,a.directiveEnd++,r&&(a.providerIndexes+=1048576),t.push(_),s.push(_)):(t[v]=_,s[v]=_)}else{const _=gp(l,n,u+h,d),v=gp(l,n,u,u+h),D=v>=0&&t[v];if(r&&!D||!r&&!(_>=0&&t[_])){Gf(uc(a,s),o,l);const M=function EP(e,n,t,i,r){const o=new Qs(e,t,b);return o.multi=[],o.index=n,o.componentProviders=0,jb(o,r,i&&!t),o}(r?CP:wP,t.length,r,i,c);!r&&D&&(t[v].providerFactory=M),pp(o,e,n.length,0),n.push(l),a.directiveStart++,a.directiveEnd++,r&&(a.providerIndexes+=1048576),t.push(M),s.push(M)}else pp(o,e,_>-1?_:v,jb(t[r?v:_],c,!r&&i));!r&&i&&D&&t[v].componentProviders++}}}function pp(e,n,t,i){const r=Er(n),o=function mx(e){return!!e.useClass}(n);if(r||o){const l=(o?ee(n.useClass):n).prototype.ngOnDestroy;if(l){const c=e.destroyHooks||(e.destroyHooks=[]);if(!r&&n.multi){const u=c.indexOf(t);-1===u?c.push(t,[i,l]):c[u+1].push(i,l)}else c.push(t,l)}}}function jb(e,n,t){return t&&e.componentProviders++,e.multi.push(n)-1}function gp(e,n,t,i){for(let r=t;r{t.providersResolver=(i,r)=>function DP(e,n,t){const i=pe();if(i.firstCreatePass){const r=Bn(e);hp(t,i.data,i.blueprint,r,!0),hp(n,i.data,i.blueprint,r,!1)}}(i,r?r(e):e,n)}}class Or{}class Hb{}class _p extends Or{constructor(n,t,i){super(),this._parent=t,this._bootstrapComponents=[],this.destroyCbs=[],this.componentFactoryResolver=new Z1(this);const r=un(n);this._bootstrapComponents=Ni(r.bootstrap),this._r3Injector=l1(n,t,[{provide:Or,useValue:this},{provide:Hc,useValue:this.componentFactoryResolver},...i],gt(n),new Set(["environment"])),this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(n)}get injector(){return this._r3Injector}destroy(){const n=this._r3Injector;!n.destroyed&&n.destroy(),this.destroyCbs.forEach(t=>t()),this.destroyCbs=null}onDestroy(n){this.destroyCbs.push(n)}}class vp extends Hb{constructor(n){super(),this.moduleType=n}create(n){return new _p(this.moduleType,n,[])}}class $b extends Or{constructor(n){super(),this.componentFactoryResolver=new Z1(this),this.instance=null;const t=new ko([...n.providers,{provide:Or,useValue:this},{provide:Hc,useValue:this.componentFactoryResolver}],n.parent||Pc(),n.debugName,new Set(["environment"]));this.injector=t,n.runEnvironmentInitializers&&t.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(n){this.injector.onDestroy(n)}}function yp(e,n,t=null){return new $b({providers:e,parent:n,debugName:t,runEnvironmentInitializers:!0}).injector}let MP=(()=>{class e{constructor(t){this._injector=t,this.cachedInjectors=new Map}getOrCreateStandaloneInjector(t){if(!t.standalone)return null;if(!this.cachedInjectors.has(t)){const i=Wy(0,t.type),r=i.length>0?yp([i],this._injector,`Standalone[${t.type.name}]`):null;this.cachedInjectors.set(t,r)}return this.cachedInjectors.get(t)}ngOnDestroy(){try{for(const t of this.cachedInjectors.values())null!==t&&t.destroy()}finally{this.cachedInjectors.clear()}}static#e=this.\u0275prov=B({token:e,providedIn:"environment",factory:()=>new e(H(zt))})}return e})();function In(e){e.getStandaloneInjector=n=>n.get(MP).getOrCreateStandaloneInjector(e)}function $n(e,n,t,i){return Zb(O(),$t(),e,n,t,i)}function ns(e,n,t,i,r,o,s,a){const l=$t()+e,c=O(),u=function Sn(e,n,t,i,r,o){const s=Sr(e,n,t,i);return Sr(e,n+2,r,o)||s}(c,l,t,i,r,o);return Vt(c,l+4,s)||u?ui(c,l+5,a?n.call(a,t,i,r,o,s):n(t,i,r,o,s)):function wa(e,n){return e[n]}(c,l+5)}function Zb(e,n,t,i,r,o){const s=n+t;return Vt(e,s,r)?ui(e,s+1,o?i.call(o,r):i(r)):function ka(e,n){const t=e[n];return t===ie?void 0:t}(e,s+1)}function lu(e,n){const t=pe();let i;const r=e+ue;t.firstCreatePass?(i=function $P(e,n){if(n)for(let t=n.length-1;t>=0;t--){const i=n[t];if(e===i.name)return i}}(n,t.pipeRegistry),t.data[r]=i,i.onDestroy&&(t.destroyHooks??=[]).push(r,i.onDestroy)):i=t.data[r];const o=i.factory||(i.factory=yr(i.type)),a=Qt(b);try{const l=cc(!1),c=o();return cc(l),function NR(e,n,t,i){t>=e.data.length&&(e.data[t]=null,e.blueprint[t]=null),n[t]=i}(t,O(),r,c),c}finally{Qt(a)}}function cu(e,n,t){const i=e+ue,r=O(),o=function vo(e,n){return e[n]}(r,i);return function Fa(e,n){return e[$].data[n].pure}(r,i)?Zb(r,$t(),n,o.transform,t,o):o.transform(t)}function qP(){return this._results[Symbol.iterator]()}class wp{static#e=Symbol.iterator;get changes(){return this._changes||(this._changes=new Y)}constructor(n=!1){this._emitDistinctChangesOnly=n,this.dirty=!0,this._results=[],this._changesDetected=!1,this._changes=null,this.length=0,this.first=void 0,this.last=void 0;const t=wp.prototype;t[Symbol.iterator]||(t[Symbol.iterator]=qP)}get(n){return this._results[n]}map(n){return this._results.map(n)}filter(n){return this._results.filter(n)}find(n){return this._results.find(n)}reduce(n,t){return this._results.reduce(n,t)}forEach(n){this._results.forEach(n)}some(n){return this._results.some(n)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(n,t){const i=this;i.dirty=!1;const r=function Tn(e){return e.flat(Number.POSITIVE_INFINITY)}(n);(this._changesDetected=!function UN(e,n,t){if(e.length!==n.length)return!1;for(let i=0;i0&&(t[r-1][Vn]=n),i{class e{static#e=this.__NG_ELEMENT_ID__=QP}return e})();const JP=Je,XP=class extends JP{constructor(n,t,i){super(),this._declarationLView=n,this._declarationTContainer=t,this.elementRef=i}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(n,t){return this.createEmbeddedViewImpl(n,t)}createEmbeddedViewImpl(n,t,i){const r=function YP(e,n,t,i){const r=n.tView,a=zc(e,r,t,4096&e[re]?4096:16,null,n,null,null,null,i?.injector??null,i?.hydrationInfo??null);a[zs]=e[n.index];const c=e[ri];return null!==c&&(a[ri]=c.createEmbeddedView(r)),Qh(r,a,t),a}(this._declarationLView,this._declarationTContainer,n,{injector:t,hydrationInfo:i});return new ya(r)}};function QP(){return uu(It(),O())}function uu(e,n){return 4&e.type?new XP(n,e,Bo(e,n)):null}let Nn=(()=>{class e{static#e=this.__NG_ELEMENT_ID__=rk}return e})();function rk(){return sD(It(),O())}const ok=Nn,rD=class extends ok{constructor(n,t,i){super(),this._lContainer=n,this._hostTNode=t,this._hostLView=i}get element(){return Bo(this._hostTNode,this._hostLView)}get injector(){return new Gt(this._hostTNode,this._hostLView)}get parentInjector(){const n=dc(this._hostTNode,this._hostLView);if(Hf(n)){const t=ea(n,this._hostLView),i=Ks(n);return new Gt(t[$].data[i+8],t)}return new Gt(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(n){const t=oD(this._lContainer);return null!==t&&t[n]||null}get length(){return this._lContainer.length-Tt}createEmbeddedView(n,t,i){let r,o;"number"==typeof i?r=i:null!=i&&(r=i.index,o=i.injector);const a=n.createEmbeddedViewImpl(t||{},o,null);return this.insertImpl(a,r,false),a}createComponent(n,t,i,r,o){const s=n&&!function na(e){return"function"==typeof e}(n);let a;if(s)a=t;else{const y=t||{};a=y.index,i=y.injector,r=y.projectableNodes,o=y.environmentInjector||y.ngModuleRef}const l=s?n:new ba(he(n)),c=i||this.parentInjector;if(!o&&null==l.ngModule){const D=(s?c:this.parentInjector).get(zt,null);D&&(o=D)}he(l.componentType??{});const _=l.create(c,r,null,o);return this.insertImpl(_.hostView,a,false),_}insert(n,t){return this.insertImpl(n,t,!1)}insertImpl(n,t,i){const r=n._lView;if(function iN(e){return Ht(e[ze])}(r)){const l=this.indexOf(n);if(-1!==l)this.detach(l);else{const c=r[ze],u=new rD(c,c[Ft],c[ze]);u.detach(u.indexOf(n))}}const s=this._adjustIndex(t),a=this._lContainer;return ZP(a,r,s,!i),n.attachToViewContainerRef(),Yv(Cp(a),s,n),n}move(n,t){return this.insert(n,t)}indexOf(n){const t=oD(this._lContainer);return null!==t?t.indexOf(n):-1}remove(n){const t=this._adjustIndex(n,-1),i=Tc(this._lContainer,t);i&&(hc(Cp(this._lContainer),t),rh(i[$],i))}detach(n){const t=this._adjustIndex(n,-1),i=Tc(this._lContainer,t);return i&&null!=hc(Cp(this._lContainer),t)?new ya(i):null}_adjustIndex(n,t=0){return n??this.length+t}};function oD(e){return e[8]}function Cp(e){return e[8]||(e[8]=[])}function sD(e,n){let t;const i=n[e.index];return Ht(i)?t=i:(t=L1(i,n,null,e),n[e.index]=t,Wc(n,t)),aD(t,n,e,i),new rD(t,e,n)}let aD=function lD(e,n,t,i){if(e[oi])return;let r;r=8&t.type?je(i):function sk(e,n){const t=e[ne],i=t.createComment(""),r=en(n,e);return Cr(t,Sc(t,r),i,function LO(e,n){return e.nextSibling(n)}(t,r),!1),i}(n,t),e[oi]=r};class Ep{constructor(n){this.queryList=n,this.matches=null}clone(){return new Ep(this.queryList)}setDirty(){this.queryList.setDirty()}}class Tp{constructor(n=[]){this.queries=n}createEmbeddedView(n){const t=n.queries;if(null!==t){const i=null!==n.contentQueries?n.contentQueries[0]:t.length,r=[];for(let o=0;o0)i.push(s[a/2]);else{const c=o[a+1],u=n[-l];for(let d=Tt;d{class e{constructor(){this.initialized=!1,this.done=!1,this.donePromise=new Promise((t,i)=>{this.resolve=t,this.reject=i}),this.appInits=F(Pp,{optional:!0})??[]}runInitializers(){if(this.initialized)return;const t=[];for(const r of this.appInits){const o=r();if(Sa(o))t.push(o);else if(b0(o)){const s=new Promise((a,l)=>{o.subscribe({complete:a,error:l})});t.push(s)}}const i=()=>{this.done=!0,this.resolve()};Promise.all(t).then(()=>{i()}).catch(r=>{this.reject(r)}),0===t.length&&i(),this.initialized=!0}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),OD=(()=>{class e{log(t){console.log(t)}warn(t){console.warn(t)}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();const Gn=new z("LocaleId",{providedIn:"root",factory:()=>F(Gn,ce.Optional|ce.SkipSelf)||function kk(){return typeof $localize<"u"&&$localize.locale||ts}()});let hu=(()=>{class e{constructor(){this.taskId=0,this.pendingTasks=new Set,this.hasPendingTasks=new Dn(!1)}add(){this.hasPendingTasks.next(!0);const t=this.taskId++;return this.pendingTasks.add(t),t}remove(t){this.pendingTasks.delete(t),0===this.pendingTasks.size&&this.hasPendingTasks.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks.next(!1)}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();class Vk{constructor(n,t){this.ngModuleFactory=n,this.componentFactories=t}}let xD=(()=>{class e{compileModuleSync(t){return new vp(t)}compileModuleAsync(t){return Promise.resolve(this.compileModuleSync(t))}compileModuleAndAllComponentsSync(t){const i=this.compileModuleSync(t),o=Ni(un(t).declarations).reduce((s,a)=>{const l=he(a);return l&&s.push(new ba(l)),s},[]);return new Vk(i,o)}compileModuleAndAllComponentsAsync(t){return Promise.resolve(this.compileModuleAndAllComponentsSync(t))}clearCache(){}clearCacheFor(t){}getModuleId(t){}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();const kD=new z(""),gu=new z("");let jp,Vp=(()=>{class e{constructor(t,i,r){this._ngZone=t,this.registry=i,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this.taskTrackingZone=null,jp||(function sF(e){jp=e}(r),r.addToWindow(i)),this._watchAngularEvents(),t.run(()=>{this.taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){this._ngZone.onUnstable.subscribe({next:()=>{this._didWork=!0,this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(()=>{this._ngZone.onStable.subscribe({next:()=>{fe.assertNotInAngularZone(),queueMicrotask(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}})})}increasePendingRequestCount(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount}decreasePendingRequestCount(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount}isStable(){return this._isZoneStable&&0===this._pendingCount&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;0!==this._callbacks.length;){let t=this._callbacks.pop();clearTimeout(t.timeoutId),t.doneCb(this._didWork)}this._didWork=!1});else{let t=this.getPendingTasks();this._callbacks=this._callbacks.filter(i=>!i.updateCb||!i.updateCb(t)||(clearTimeout(i.timeoutId),!1)),this._didWork=!0}}getPendingTasks(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(t=>({source:t.source,creationLocation:t.creationLocation,data:t.data})):[]}addCallback(t,i,r){let o=-1;i&&i>0&&(o=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==o),t(this._didWork,this.getPendingTasks())},i)),this._callbacks.push({doneCb:t,timeoutId:o,updateCb:r})}whenStable(t,i,r){if(r&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(t,i,r),this._runCallbacksIfReady()}getPendingRequestCount(){return this._pendingCount}registerApplication(t){this.registry.registerApplication(t,this)}unregisterApplication(t){this.registry.unregisterApplication(t)}findProviders(t,i,r){return[]}static#e=this.\u0275fac=function(i){return new(i||e)(H(fe),H(Bp),H(gu))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})(),Bp=(()=>{class e{constructor(){this._applications=new Map}registerApplication(t,i){this._applications.set(t,i)}unregisterApplication(t){this._applications.delete(t)}unregisterAllApplications(){this._applications.clear()}getTestability(t){return this._applications.get(t)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(t,i=!0){return jp?.findTestabilityInTree(this,t,i)??null}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})(),Qi=null;const FD=new z("AllowMultipleToken"),Hp=new z("PlatformDestroyListeners"),$p=new z("appBootstrapListener");class VD{constructor(n,t){this.name=n,this.token=t}}function jD(e,n,t=[]){const i=`Platform: ${n}`,r=new z(i);return(o=[])=>{let s=Up();if(!s||s.injector.get(FD,!1)){const a=[...t,...o,{provide:r,useValue:!0}];e?e(a):function cF(e){if(Qi&&!Qi.get(FD,!1))throw new R(400,!1);(function LD(){!function $I(e){sv=e}(()=>{throw new R(600,!1)})})(),Qi=e;const n=e.get($D);(function BD(e){e.get(Xy,null)?.forEach(t=>t())})(e)}(function HD(e=[],n){return Nt.create({name:n,providers:[{provide:Dh,useValue:"platform"},{provide:Hp,useValue:new Set([()=>Qi=null])},...e]})}(a,i))}return function dF(e){const n=Up();if(!n)throw new R(401,!1);return n}()}}function Up(){return Qi?.get($D)??null}let $D=(()=>{class e{constructor(t){this._injector=t,this._modules=[],this._destroyListeners=[],this._destroyed=!1}bootstrapModuleFactory(t,i){const r=function fF(e="zone.js",n){return"noop"===e?new Kx:"zone.js"===e?new fe(n):e}(i?.ngZone,function UD(e){return{enableLongStackTrace:!1,shouldCoalesceEventChangeDetection:e?.eventCoalescing??!1,shouldCoalesceRunChangeDetection:e?.runCoalescing??!1}}({eventCoalescing:i?.ngZoneEventCoalescing,runCoalescing:i?.ngZoneRunCoalescing}));return r.run(()=>{const o=function SP(e,n,t){return new _p(e,n,t)}(t.moduleType,this.injector,function YD(e){return[{provide:fe,useFactory:e},{provide:fa,multi:!0,useFactory:()=>{const n=F(pF,{optional:!0});return()=>n.initialize()}},{provide:qD,useFactory:hF},{provide:h1,useFactory:p1}]}(()=>r)),s=o.injector.get(Ii,null);return r.runOutsideAngular(()=>{const a=r.onError.subscribe({next:l=>{s.handleError(l)}});o.onDestroy(()=>{mu(this._modules,o),a.unsubscribe()})}),function GD(e,n,t){try{const i=t();return Sa(i)?i.catch(r=>{throw n.runOutsideAngular(()=>e.handleError(r)),r}):i}catch(i){throw n.runOutsideAngular(()=>e.handleError(i)),i}}(s,r,()=>{const a=o.injector.get(kp);return a.runInitializers(),a.donePromise.then(()=>(function mb(e){Cn(e,"Expected localeId to be defined"),"string"==typeof e&&(gb=e.toLowerCase().replace(/_/g,"-"))}(o.injector.get(Gn,ts)||ts),this._moduleDoBootstrap(o),o))})})}bootstrapModule(t,i=[]){const r=zD({},i);return function aF(e,n,t){const i=new vp(t);return Promise.resolve(i)}(0,0,t).then(o=>this.bootstrapModuleFactory(o,r))}_moduleDoBootstrap(t){const i=t.injector.get(Ki);if(t._bootstrapComponents.length>0)t._bootstrapComponents.forEach(r=>i.bootstrap(r));else{if(!t.instance.ngDoBootstrap)throw new R(-403,!1);t.instance.ngDoBootstrap(i)}this._modules.push(t)}onDestroy(t){this._destroyListeners.push(t)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new R(404,!1);this._modules.slice().forEach(i=>i.destroy()),this._destroyListeners.forEach(i=>i());const t=this._injector.get(Hp,null);t&&(t.forEach(i=>i()),t.clear()),this._destroyed=!0}get destroyed(){return this._destroyed}static#e=this.\u0275fac=function(i){return new(i||e)(H(Nt))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();function zD(e,n){return Array.isArray(n)?n.reduce(zD,e):{...e,...n}}let Ki=(()=>{class e{constructor(){this._bootstrapListeners=[],this._runningTick=!1,this._destroyed=!1,this._destroyListeners=[],this._views=[],this.internalErrorHandler=F(qD),this.zoneIsStable=F(h1),this.componentTypes=[],this.components=[],this.isStable=F(hu).hasPendingTasks.pipe(wn(t=>t?J(!1):this.zoneIsStable),function E_(e,n=kn){return e=e??eI,qe((t,i)=>{let r,o=!0;t.subscribe(Ve(i,s=>{const a=n(s);(o||!e(r,a))&&(o=!1,r=a,i.next(s))}))})}(),C_()),this._injector=F(zt)}get destroyed(){return this._destroyed}get injector(){return this._injector}bootstrap(t,i){const r=t instanceof n1;if(!this._injector.get(kp).done)throw!r&&function uo(e){const n=he(e)||Et(e)||jt(e);return null!==n&&n.standalone}(t),new R(405,!1);let s;s=r?t:this._injector.get(Hc).resolveComponentFactory(t),this.componentTypes.push(s.componentType);const a=function lF(e){return e.isBoundToModule}(s)?void 0:this._injector.get(Or),c=s.create(Nt.NULL,[],i||s.selector,a),u=c.location.nativeElement,d=c.injector.get(kD,null);return d?.registerApplication(u),c.onDestroy(()=>{this.detachView(c.hostView),mu(this.components,c),d?.unregisterApplication(u)}),this._loadComponent(c),c}tick(){if(this._runningTick)throw new R(101,!1);try{this._runningTick=!0;for(let t of this._views)t.detectChanges()}catch(t){this.internalErrorHandler(t)}finally{this._runningTick=!1}}attachView(t){const i=t;this._views.push(i),i.attachToAppRef(this)}detachView(t){const i=t;mu(this._views,i),i.detachFromAppRef()}_loadComponent(t){this.attachView(t.hostView),this.tick(),this.components.push(t);const i=this._injector.get($p,[]);i.push(...this._bootstrapListeners),i.forEach(r=>r(t))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(t=>t()),this._views.slice().forEach(t=>t.destroy())}finally{this._destroyed=!0,this._views=[],this._bootstrapListeners=[],this._destroyListeners=[]}}onDestroy(t){return this._destroyListeners.push(t),()=>mu(this._destroyListeners,t)}destroy(){if(this._destroyed)throw new R(406,!1);const t=this._injector;t.destroy&&!t.destroyed&&t.destroy()}get viewCount(){return this._views.length}warnIfDestroyed(){}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function mu(e,n){const t=e.indexOf(n);t>-1&&e.splice(t,1)}const qD=new z("",{providedIn:"root",factory:()=>F(Ii).handleError.bind(void 0)});function hF(){const e=F(fe),n=F(Ii);return t=>e.runOutsideAngular(()=>n.handleError(t))}let pF=(()=>{class e{constructor(){this.zone=F(fe),this.applicationRef=F(Ki)}initialize(){this._onMicrotaskEmptySubscription||(this._onMicrotaskEmptySubscription=this.zone.onMicrotaskEmpty.subscribe({next:()=>{this.zone.run(()=>{this.applicationRef.tick()})}}))}ngOnDestroy(){this._onMicrotaskEmptySubscription?.unsubscribe()}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();let zn=(()=>{class e{static#e=this.__NG_ELEMENT_ID__=mF}return e})();function mF(e){return function _F(e,n,t){if(vr(e)&&!t){const i=dn(e.index,n);return new ya(i,i)}return 47&e.type?new ya(n[ot],n):null}(It(),O(),16==(16&e))}class QD{constructor(){}supports(n){return Jc(n)}create(n){return new CF(n)}}const wF=(e,n)=>n;class CF{constructor(n){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=n||wF}forEachItem(n){let t;for(t=this._itHead;null!==t;t=t._next)n(t)}forEachOperation(n){let t=this._itHead,i=this._removalsHead,r=0,o=null;for(;t||i;){const s=!i||t&&t.currentIndex{s=this._trackByFn(r,a),null!==t&&Object.is(t.trackById,s)?(i&&(t=this._verifyReinsertion(t,a,s,r)),Object.is(t.item,a)||this._addIdentityChange(t,a)):(t=this._mismatch(t,a,s,r),i=!0),t=t._next,r++}),this.length=r;return this._truncate(t),this.collection=n,this.isDirty}get isDirty(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead}_reset(){if(this.isDirty){let n;for(n=this._previousItHead=this._itHead;null!==n;n=n._next)n._nextPrevious=n._next;for(n=this._additionsHead;null!==n;n=n._nextAdded)n.previousIndex=n.currentIndex;for(this._additionsHead=this._additionsTail=null,n=this._movesHead;null!==n;n=n._nextMoved)n.previousIndex=n.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(n,t,i,r){let o;return null===n?o=this._itTail:(o=n._prev,this._remove(n)),null!==(n=null===this._unlinkedRecords?null:this._unlinkedRecords.get(i,null))?(Object.is(n.item,t)||this._addIdentityChange(n,t),this._reinsertAfter(n,o,r)):null!==(n=null===this._linkedRecords?null:this._linkedRecords.get(i,r))?(Object.is(n.item,t)||this._addIdentityChange(n,t),this._moveAfter(n,o,r)):n=this._addAfter(new EF(t,i),o,r),n}_verifyReinsertion(n,t,i,r){let o=null===this._unlinkedRecords?null:this._unlinkedRecords.get(i,null);return null!==o?n=this._reinsertAfter(o,n._prev,r):n.currentIndex!=r&&(n.currentIndex=r,this._addToMoves(n,r)),n}_truncate(n){for(;null!==n;){const t=n._next;this._addToRemovals(this._unlink(n)),n=t}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(n,t,i){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(n);const r=n._prevRemoved,o=n._nextRemoved;return null===r?this._removalsHead=o:r._nextRemoved=o,null===o?this._removalsTail=r:o._prevRemoved=r,this._insertAfter(n,t,i),this._addToMoves(n,i),n}_moveAfter(n,t,i){return this._unlink(n),this._insertAfter(n,t,i),this._addToMoves(n,i),n}_addAfter(n,t,i){return this._insertAfter(n,t,i),this._additionsTail=null===this._additionsTail?this._additionsHead=n:this._additionsTail._nextAdded=n,n}_insertAfter(n,t,i){const r=null===t?this._itHead:t._next;return n._next=r,n._prev=t,null===r?this._itTail=n:r._prev=n,null===t?this._itHead=n:t._next=n,null===this._linkedRecords&&(this._linkedRecords=new KD),this._linkedRecords.put(n),n.currentIndex=i,n}_remove(n){return this._addToRemovals(this._unlink(n))}_unlink(n){null!==this._linkedRecords&&this._linkedRecords.remove(n);const t=n._prev,i=n._next;return null===t?this._itHead=i:t._next=i,null===i?this._itTail=t:i._prev=t,n}_addToMoves(n,t){return n.previousIndex===t||(this._movesTail=null===this._movesTail?this._movesHead=n:this._movesTail._nextMoved=n),n}_addToRemovals(n){return null===this._unlinkedRecords&&(this._unlinkedRecords=new KD),this._unlinkedRecords.put(n),n.currentIndex=null,n._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=n,n._prevRemoved=null):(n._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=n),n}_addIdentityChange(n,t){return n.item=t,this._identityChangesTail=null===this._identityChangesTail?this._identityChangesHead=n:this._identityChangesTail._nextIdentityChange=n,n}}class EF{constructor(n,t){this.item=n,this.trackById=t,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null}}class TF{constructor(){this._head=null,this._tail=null}add(n){null===this._head?(this._head=this._tail=n,n._nextDup=null,n._prevDup=null):(this._tail._nextDup=n,n._prevDup=this._tail,n._nextDup=null,this._tail=n)}get(n,t){let i;for(i=this._head;null!==i;i=i._nextDup)if((null===t||t<=i.currentIndex)&&Object.is(i.trackById,n))return i;return null}remove(n){const t=n._prevDup,i=n._nextDup;return null===t?this._head=i:t._nextDup=i,null===i?this._tail=t:i._prevDup=t,null===this._head}}class KD{constructor(){this.map=new Map}put(n){const t=n.trackById;let i=this.map.get(t);i||(i=new TF,this.map.set(t,i)),i.add(n)}get(n,t){const r=this.map.get(n);return r?r.get(n,t):null}remove(n){const t=n.trackById;return this.map.get(t).remove(n)&&this.map.delete(t),n}get isEmpty(){return 0===this.map.size}clear(){this.map.clear()}}function ew(e,n,t){const i=e.previousIndex;if(null===i)return i;let r=0;return t&&i{if(t&&t.key===r)this._maybeAddToChanges(t,i),this._appendAfter=t,t=t._next;else{const o=this._getOrCreateRecordForKey(r,i);t=this._insertBeforeOrAppend(t,o)}}),t){t._prev&&(t._prev._next=null),this._removalsHead=t;for(let i=t;null!==i;i=i._nextRemoved)i===this._mapHead&&(this._mapHead=null),this._records.delete(i.key),i._nextRemoved=i._next,i.previousValue=i.currentValue,i.currentValue=null,i._prev=null,i._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(n,t){if(n){const i=n._prev;return t._next=n,t._prev=i,n._prev=t,i&&(i._next=t),n===this._mapHead&&(this._mapHead=t),this._appendAfter=n,n}return this._appendAfter?(this._appendAfter._next=t,t._prev=this._appendAfter):this._mapHead=t,this._appendAfter=t,null}_getOrCreateRecordForKey(n,t){if(this._records.has(n)){const r=this._records.get(n);this._maybeAddToChanges(r,t);const o=r._prev,s=r._next;return o&&(o._next=s),s&&(s._prev=o),r._next=null,r._prev=null,r}const i=new MF(n);return this._records.set(n,i),i.currentValue=t,this._addToAdditions(i),i}_reset(){if(this.isDirty){let n;for(this._previousMapHead=this._mapHead,n=this._previousMapHead;null!==n;n=n._next)n._nextPrevious=n._next;for(n=this._changesHead;null!==n;n=n._nextChanged)n.previousValue=n.currentValue;for(n=this._additionsHead;null!=n;n=n._nextAdded)n.previousValue=n.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(n,t){Object.is(t,n.currentValue)||(n.previousValue=n.currentValue,n.currentValue=t,this._addToChanges(n))}_addToAdditions(n){null===this._additionsHead?this._additionsHead=this._additionsTail=n:(this._additionsTail._nextAdded=n,this._additionsTail=n)}_addToChanges(n){null===this._changesHead?this._changesHead=this._changesTail=n:(this._changesTail._nextChanged=n,this._changesTail=n)}_forEach(n,t){n instanceof Map?n.forEach(t):Object.keys(n).forEach(i=>t(n[i],i))}}class MF{constructor(n){this.key=n,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null}}function nw(){return new yu([new QD])}let yu=(()=>{class e{static#e=this.\u0275prov=B({token:e,providedIn:"root",factory:nw});constructor(t){this.factories=t}static create(t,i){if(null!=i){const r=i.factories.slice();t=t.concat(r)}return new e(t)}static extend(t){return{provide:e,useFactory:i=>e.create(t,i||nw()),deps:[[e,new mc,new gc]]}}find(t){const i=this.factories.find(r=>r.supports(t));if(null!=i)return i;throw new R(901,!1)}}return e})();function iw(){return new Ba([new tw])}let Ba=(()=>{class e{static#e=this.\u0275prov=B({token:e,providedIn:"root",factory:iw});constructor(t){this.factories=t}static create(t,i){if(i){const r=i.factories.slice();t=t.concat(r)}return new e(t)}static extend(t){return{provide:e,useFactory:i=>e.create(t,i||iw()),deps:[[e,new mc,new gc]]}}find(t){const i=this.factories.find(r=>r.supports(t));if(i)return i;throw new R(901,!1)}}return e})();const OF=jD(null,"core",[]);let xF=(()=>{class e{constructor(t){}static#e=this.\u0275fac=function(i){return new(i||e)(H(Ki))};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})();function Zp(e,n){const t=he(e),i=n.elementInjector||Pc();return new ba(t).create(i,n.projectableNodes,n.hostElement,n.environmentInjector)}let Jp=null;function er(){return Jp}class zF{}const ut=new z("DocumentToken");let Xp=(()=>{class e{historyGo(t){throw new Error("Not implemented")}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:function(){return F(qF)},providedIn:"platform"})}return e})();const WF=new z("Location Initialized");let qF=(()=>{class e extends Xp{constructor(){super(),this._doc=F(ut),this._location=window.location,this._history=window.history}getBaseHrefFromDOM(){return er().getBaseHref(this._doc)}onPopState(t){const i=er().getGlobalEventTarget(this._doc,"window");return i.addEventListener("popstate",t,!1),()=>i.removeEventListener("popstate",t)}onHashChange(t){const i=er().getGlobalEventTarget(this._doc,"window");return i.addEventListener("hashchange",t,!1),()=>i.removeEventListener("hashchange",t)}get href(){return this._location.href}get protocol(){return this._location.protocol}get hostname(){return this._location.hostname}get port(){return this._location.port}get pathname(){return this._location.pathname}get search(){return this._location.search}get hash(){return this._location.hash}set pathname(t){this._location.pathname=t}pushState(t,i,r){this._history.pushState(t,i,r)}replaceState(t,i,r){this._history.replaceState(t,i,r)}forward(){this._history.forward()}back(){this._history.back()}historyGo(t=0){this._history.go(t)}getState(){return this._history.state}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:function(){return new e},providedIn:"platform"})}return e})();function Qp(e,n){if(0==e.length)return n;if(0==n.length)return e;let t=0;return e.endsWith("/")&&t++,n.startsWith("/")&&t++,2==t?e+n.substring(1):1==t?e+n:e+"/"+n}function fw(e){const n=e.match(/#|\?|$/),t=n&&n.index||e.length;return e.slice(0,t-("/"===e[t-1]?1:0))+e.slice(t)}function xi(e){return e&&"?"!==e[0]?"?"+e:e}let Rr=(()=>{class e{historyGo(t){throw new Error("Not implemented")}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:function(){return F(pw)},providedIn:"root"})}return e})();const hw=new z("appBaseHref");let pw=(()=>{class e extends Rr{constructor(t,i){super(),this._platformLocation=t,this._removeListenerFns=[],this._baseHref=i??this._platformLocation.getBaseHrefFromDOM()??F(ut).location?.origin??""}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(t){this._removeListenerFns.push(this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t))}getBaseHref(){return this._baseHref}prepareExternalUrl(t){return Qp(this._baseHref,t)}path(t=!1){const i=this._platformLocation.pathname+xi(this._platformLocation.search),r=this._platformLocation.hash;return r&&t?`${i}${r}`:i}pushState(t,i,r,o){const s=this.prepareExternalUrl(r+xi(o));this._platformLocation.pushState(t,i,s)}replaceState(t,i,r,o){const s=this.prepareExternalUrl(r+xi(o));this._platformLocation.replaceState(t,i,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(t=0){this._platformLocation.historyGo?.(t)}static#e=this.\u0275fac=function(i){return new(i||e)(H(Xp),H(hw,8))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),YF=(()=>{class e extends Rr{constructor(t,i){super(),this._platformLocation=t,this._baseHref="",this._removeListenerFns=[],null!=i&&(this._baseHref=i)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(t){this._removeListenerFns.push(this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t))}getBaseHref(){return this._baseHref}path(t=!1){let i=this._platformLocation.hash;return null==i&&(i="#"),i.length>0?i.substring(1):i}prepareExternalUrl(t){const i=Qp(this._baseHref,t);return i.length>0?"#"+i:i}pushState(t,i,r,o){let s=this.prepareExternalUrl(r+xi(o));0==s.length&&(s=this._platformLocation.pathname),this._platformLocation.pushState(t,i,s)}replaceState(t,i,r,o){let s=this.prepareExternalUrl(r+xi(o));0==s.length&&(s=this._platformLocation.pathname),this._platformLocation.replaceState(t,i,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(t=0){this._platformLocation.historyGo?.(t)}static#e=this.\u0275fac=function(i){return new(i||e)(H(Xp),H(hw,8))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})(),Kp=(()=>{class e{constructor(t){this._subject=new Y,this._urlChangeListeners=[],this._urlChangeSubscription=null,this._locationStrategy=t;const i=this._locationStrategy.getBaseHref();this._basePath=function XF(e){if(new RegExp("^(https?:)?//").test(e)){const[,t]=e.split(/\/\/[^\/]+/);return t}return e}(fw(gw(i))),this._locationStrategy.onPopState(r=>{this._subject.emit({url:this.path(!0),pop:!0,state:r.state,type:r.type})})}ngOnDestroy(){this._urlChangeSubscription?.unsubscribe(),this._urlChangeListeners=[]}path(t=!1){return this.normalize(this._locationStrategy.path(t))}getState(){return this._locationStrategy.getState()}isCurrentPathEqualTo(t,i=""){return this.path()==this.normalize(t+xi(i))}normalize(t){return e.stripTrailingSlash(function JF(e,n){if(!e||!n.startsWith(e))return n;const t=n.substring(e.length);return""===t||["/",";","?","#"].includes(t[0])?t:n}(this._basePath,gw(t)))}prepareExternalUrl(t){return t&&"/"!==t[0]&&(t="/"+t),this._locationStrategy.prepareExternalUrl(t)}go(t,i="",r=null){this._locationStrategy.pushState(r,"",t,i),this._notifyUrlChangeListeners(this.prepareExternalUrl(t+xi(i)),r)}replaceState(t,i="",r=null){this._locationStrategy.replaceState(r,"",t,i),this._notifyUrlChangeListeners(this.prepareExternalUrl(t+xi(i)),r)}forward(){this._locationStrategy.forward()}back(){this._locationStrategy.back()}historyGo(t=0){this._locationStrategy.historyGo?.(t)}onUrlChange(t){return this._urlChangeListeners.push(t),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe(i=>{this._notifyUrlChangeListeners(i.url,i.state)})),()=>{const i=this._urlChangeListeners.indexOf(t);this._urlChangeListeners.splice(i,1),0===this._urlChangeListeners.length&&(this._urlChangeSubscription?.unsubscribe(),this._urlChangeSubscription=null)}}_notifyUrlChangeListeners(t="",i){this._urlChangeListeners.forEach(r=>r(t,i))}subscribe(t,i,r){return this._subject.subscribe({next:t,error:i,complete:r})}static#e=this.normalizeQueryParams=xi;static#t=this.joinWithSlash=Qp;static#n=this.stripTrailingSlash=fw;static#i=this.\u0275fac=function(i){return new(i||e)(H(Rr))};static#r=this.\u0275prov=B({token:e,factory:function(){return function ZF(){return new Kp(H(Rr))}()},providedIn:"root"})}return e})();function gw(e){return e.replace(/\/index.html$/,"")}function Sw(e,n){n=encodeURIComponent(n);for(const t of e.split(";")){const i=t.indexOf("="),[r,o]=-1==i?[t,""]:[t.slice(0,i),t.slice(i+1)];if(r.trim()===n)return decodeURIComponent(o)}return null}const ug=/\s+/,Mw=[];let xu=(()=>{class e{constructor(t,i,r,o){this._iterableDiffers=t,this._keyValueDiffers=i,this._ngEl=r,this._renderer=o,this.initialClasses=Mw,this.stateMap=new Map}set klass(t){this.initialClasses=null!=t?t.trim().split(ug):Mw}set ngClass(t){this.rawClass="string"==typeof t?t.trim().split(ug):t}ngDoCheck(){for(const i of this.initialClasses)this._updateState(i,!0);const t=this.rawClass;if(Array.isArray(t)||t instanceof Set)for(const i of t)this._updateState(i,!0);else if(null!=t)for(const i of Object.keys(t))this._updateState(i,!!t[i]);this._applyStateDiff()}_updateState(t,i){const r=this.stateMap.get(t);void 0!==r?(r.enabled!==i&&(r.changed=!0,r.enabled=i),r.touched=!0):this.stateMap.set(t,{enabled:i,changed:!0,touched:!0})}_applyStateDiff(){for(const t of this.stateMap){const i=t[0],r=t[1];r.changed?(this._toggleClass(i,r.enabled),r.changed=!1):r.touched||(r.enabled&&this._toggleClass(i,!1),this.stateMap.delete(i)),r.touched=!1}}_toggleClass(t,i){(t=t.trim()).length>0&&t.split(ug).forEach(r=>{i?this._renderer.addClass(this._ngEl.nativeElement,r):this._renderer.removeClass(this._ngEl.nativeElement,r)})}static#e=this.\u0275fac=function(i){return new(i||e)(b(yu),b(Ba),b(Se),b(hn))};static#t=this.\u0275dir=L({type:e,selectors:[["","ngClass",""]],inputs:{klass:["class","klass"],ngClass:"ngClass"},standalone:!0})}return e})();class RL{constructor(n,t,i,r){this.$implicit=n,this.ngForOf=t,this.index=i,this.count=r}get first(){return 0===this.index}get last(){return this.index===this.count-1}get even(){return this.index%2==0}get odd(){return!this.even}}let qn=(()=>{class e{set ngForOf(t){this._ngForOf=t,this._ngForOfDirty=!0}set ngForTrackBy(t){this._trackByFn=t}get ngForTrackBy(){return this._trackByFn}constructor(t,i,r){this._viewContainer=t,this._template=i,this._differs=r,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}set ngForTemplate(t){t&&(this._template=t)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;const t=this._ngForOf;!this._differ&&t&&(this._differ=this._differs.find(t).create(this.ngForTrackBy))}if(this._differ){const t=this._differ.diff(this._ngForOf);t&&this._applyChanges(t)}}_applyChanges(t){const i=this._viewContainer;t.forEachOperation((r,o,s)=>{if(null==r.previousIndex)i.createEmbeddedView(this._template,new RL(r.item,this._ngForOf,-1,-1),null===s?void 0:s);else if(null==s)i.remove(null===o?void 0:o);else if(null!==o){const a=i.get(o);i.move(a,s),Nw(a,r)}});for(let r=0,o=i.length;r{Nw(i.get(r.currentIndex),r)})}static ngTemplateContextGuard(t,i){return!0}static#e=this.\u0275fac=function(i){return new(i||e)(b(Nn),b(Je),b(yu))};static#t=this.\u0275dir=L({type:e,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"},standalone:!0})}return e})();function Nw(e,n){e.context.$implicit=n.item}let Yn=(()=>{class e{constructor(t,i){this._viewContainer=t,this._context=new PL,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=i}set ngIf(t){this._context.$implicit=this._context.ngIf=t,this._updateView()}set ngIfThen(t){Ow("ngIfThen",t),this._thenTemplateRef=t,this._thenViewRef=null,this._updateView()}set ngIfElse(t){Ow("ngIfElse",t),this._elseTemplateRef=t,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngTemplateContextGuard(t,i){return!0}static#e=this.\u0275fac=function(i){return new(i||e)(b(Nn),b(Je))};static#t=this.\u0275dir=L({type:e,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"},standalone:!0})}return e})();class PL{constructor(){this.$implicit=null,this.ngIf=null}}function Ow(e,n){if(n&&!n.createEmbeddedView)throw new Error(`${e} must be a TemplateRef, but received '${gt(n)}'.`)}let aV=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})();function Pw(e){return"server"===e}let dV=(()=>{class e{static#e=this.\u0275prov=B({token:e,providedIn:"root",factory:()=>new fV(H(ut),window)})}return e})();class fV{constructor(n,t){this.document=n,this.window=t,this.offset=()=>[0,0]}setOffset(n){this.offset=Array.isArray(n)?()=>n:n}getScrollPosition(){return this.supportsScrolling()?[this.window.pageXOffset,this.window.pageYOffset]:[0,0]}scrollToPosition(n){this.supportsScrolling()&&this.window.scrollTo(n[0],n[1])}scrollToAnchor(n){if(!this.supportsScrolling())return;const t=function hV(e,n){const t=e.getElementById(n)||e.getElementsByName(n)[0];if(t)return t;if("function"==typeof e.createTreeWalker&&e.body&&"function"==typeof e.body.attachShadow){const i=e.createTreeWalker(e.body,NodeFilter.SHOW_ELEMENT);let r=i.currentNode;for(;r;){const o=r.shadowRoot;if(o){const s=o.getElementById(n)||o.querySelector(`[name="${n}"]`);if(s)return s}r=i.nextNode()}}return null}(this.document,n);t&&(this.scrollToElement(t),t.focus())}setHistoryScrollRestoration(n){this.supportsScrolling()&&(this.window.history.scrollRestoration=n)}scrollToElement(n){const t=n.getBoundingClientRect(),i=t.left+this.window.pageXOffset,r=t.top+this.window.pageYOffset,o=this.offset();this.window.scrollTo(i-o[0],r-o[1])}supportsScrolling(){try{return!!this.window&&!!this.window.scrollTo&&"pageXOffset"in this.window}catch{return!1}}}class kw{}class FV extends zF{constructor(){super(...arguments),this.supportsDOMEvents=!0}}class _g extends FV{static makeCurrent(){!function GF(e){Jp||(Jp=e)}(new _g)}onAndCancel(n,t,i){return n.addEventListener(t,i),()=>{n.removeEventListener(t,i)}}dispatchEvent(n,t){n.dispatchEvent(t)}remove(n){n.parentNode&&n.parentNode.removeChild(n)}createElement(n,t){return(t=t||this.getDefaultDocument()).createElement(n)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(n){return n.nodeType===Node.ELEMENT_NODE}isShadowRoot(n){return n instanceof DocumentFragment}getGlobalEventTarget(n,t){return"window"===t?window:"document"===t?n:"body"===t?n.body:null}getBaseHref(n){const t=function LV(){return Ua=Ua||document.querySelector("base"),Ua?Ua.getAttribute("href"):null}();return null==t?null:function VV(e){Pu=Pu||document.createElement("a"),Pu.setAttribute("href",e);const n=Pu.pathname;return"/"===n.charAt(0)?n:`/${n}`}(t)}resetBaseElement(){Ua=null}getUserAgent(){return window.navigator.userAgent}getCookie(n){return Sw(document.cookie,n)}}let Pu,Ua=null,jV=(()=>{class e{build(){return new XMLHttpRequest}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();const vg=new z("EventManagerPlugins");let jw=(()=>{class e{constructor(t,i){this._zone=i,this._eventNameToPlugin=new Map,t.forEach(r=>{r.manager=this}),this._plugins=t.slice().reverse()}addEventListener(t,i,r){return this._findPluginFor(i).addEventListener(t,i,r)}getZone(){return this._zone}_findPluginFor(t){let i=this._eventNameToPlugin.get(t);if(i)return i;if(i=this._plugins.find(o=>o.supports(t)),!i)throw new R(5101,!1);return this._eventNameToPlugin.set(t,i),i}static#e=this.\u0275fac=function(i){return new(i||e)(H(vg),H(fe))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();class Hw{constructor(n){this._doc=n}}const yg="ng-app-id";let $w=(()=>{class e{constructor(t,i,r,o={}){this.doc=t,this.appId=i,this.nonce=r,this.platformId=o,this.styleRef=new Map,this.hostNodes=new Set,this.styleNodesInDOM=this.collectServerRenderedStyles(),this.platformIsServer=Pw(o),this.resetHostNodes()}addStyles(t){for(const i of t)1===this.changeUsageCount(i,1)&&this.onStyleAdded(i)}removeStyles(t){for(const i of t)this.changeUsageCount(i,-1)<=0&&this.onStyleRemoved(i)}ngOnDestroy(){const t=this.styleNodesInDOM;t&&(t.forEach(i=>i.remove()),t.clear());for(const i of this.getAllStyles())this.onStyleRemoved(i);this.resetHostNodes()}addHost(t){this.hostNodes.add(t);for(const i of this.getAllStyles())this.addStyleToHost(t,i)}removeHost(t){this.hostNodes.delete(t)}getAllStyles(){return this.styleRef.keys()}onStyleAdded(t){for(const i of this.hostNodes)this.addStyleToHost(i,t)}onStyleRemoved(t){const i=this.styleRef;i.get(t)?.elements?.forEach(r=>r.remove()),i.delete(t)}collectServerRenderedStyles(){const t=this.doc.head?.querySelectorAll(`style[${yg}="${this.appId}"]`);if(t?.length){const i=new Map;return t.forEach(r=>{null!=r.textContent&&i.set(r.textContent,r)}),i}return null}changeUsageCount(t,i){const r=this.styleRef;if(r.has(t)){const o=r.get(t);return o.usage+=i,o.usage}return r.set(t,{usage:i,elements:[]}),i}getStyleElement(t,i){const r=this.styleNodesInDOM,o=r?.get(i);if(o?.parentNode===t)return r.delete(i),o.removeAttribute(yg),o;{const s=this.doc.createElement("style");return this.nonce&&s.setAttribute("nonce",this.nonce),s.textContent=i,this.platformIsServer&&s.setAttribute(yg,this.appId),s}}addStyleToHost(t,i){const r=this.getStyleElement(t,i);t.appendChild(r);const o=this.styleRef,s=o.get(i)?.elements;s?s.push(r):o.set(i,{elements:[r],usage:1})}resetHostNodes(){const t=this.hostNodes;t.clear(),t.add(this.doc.head)}static#e=this.\u0275fac=function(i){return new(i||e)(H(ut),H(kc),H(Qy,8),H(Tr))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();const bg={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/",math:"http://www.w3.org/1998/MathML/"},Dg=/%COMP%/g,GV=new z("RemoveStylesOnCompDestroy",{providedIn:"root",factory:()=>!1});function Gw(e,n){return n.map(t=>t.replace(Dg,e))}let zw=(()=>{class e{constructor(t,i,r,o,s,a,l,c=null){this.eventManager=t,this.sharedStylesHost=i,this.appId=r,this.removeStylesOnCompDestroy=o,this.doc=s,this.platformId=a,this.ngZone=l,this.nonce=c,this.rendererByCompId=new Map,this.platformIsServer=Pw(a),this.defaultRenderer=new wg(t,s,l,this.platformIsServer)}createRenderer(t,i){if(!t||!i)return this.defaultRenderer;this.platformIsServer&&i.encapsulation===Fn.ShadowDom&&(i={...i,encapsulation:Fn.Emulated});const r=this.getOrCreateRenderer(t,i);return r instanceof qw?r.applyToHost(t):r instanceof Cg&&r.applyStyles(),r}getOrCreateRenderer(t,i){const r=this.rendererByCompId;let o=r.get(i.id);if(!o){const s=this.doc,a=this.ngZone,l=this.eventManager,c=this.sharedStylesHost,u=this.removeStylesOnCompDestroy,d=this.platformIsServer;switch(i.encapsulation){case Fn.Emulated:o=new qw(l,c,i,this.appId,u,s,a,d);break;case Fn.ShadowDom:return new YV(l,c,t,i,s,a,this.nonce,d);default:o=new Cg(l,c,i,u,s,a,d)}r.set(i.id,o)}return o}ngOnDestroy(){this.rendererByCompId.clear()}static#e=this.\u0275fac=function(i){return new(i||e)(H(jw),H($w),H(kc),H(GV),H(ut),H(Tr),H(fe),H(Qy))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();class wg{constructor(n,t,i,r){this.eventManager=n,this.doc=t,this.ngZone=i,this.platformIsServer=r,this.data=Object.create(null),this.destroyNode=null}destroy(){}createElement(n,t){return t?this.doc.createElementNS(bg[t]||t,n):this.doc.createElement(n)}createComment(n){return this.doc.createComment(n)}createText(n){return this.doc.createTextNode(n)}appendChild(n,t){(Ww(n)?n.content:n).appendChild(t)}insertBefore(n,t,i){n&&(Ww(n)?n.content:n).insertBefore(t,i)}removeChild(n,t){n&&n.removeChild(t)}selectRootElement(n,t){let i="string"==typeof n?this.doc.querySelector(n):n;if(!i)throw new R(-5104,!1);return t||(i.textContent=""),i}parentNode(n){return n.parentNode}nextSibling(n){return n.nextSibling}setAttribute(n,t,i,r){if(r){t=r+":"+t;const o=bg[r];o?n.setAttributeNS(o,t,i):n.setAttribute(t,i)}else n.setAttribute(t,i)}removeAttribute(n,t,i){if(i){const r=bg[i];r?n.removeAttributeNS(r,t):n.removeAttribute(`${i}:${t}`)}else n.removeAttribute(t)}addClass(n,t){n.classList.add(t)}removeClass(n,t){n.classList.remove(t)}setStyle(n,t,i,r){r&(qi.DashCase|qi.Important)?n.style.setProperty(t,i,r&qi.Important?"important":""):n.style[t]=i}removeStyle(n,t,i){i&qi.DashCase?n.style.removeProperty(t):n.style[t]=""}setProperty(n,t,i){n[t]=i}setValue(n,t){n.nodeValue=t}listen(n,t,i){if("string"==typeof n&&!(n=er().getGlobalEventTarget(this.doc,n)))throw new Error(`Unsupported event target ${n} for event ${t}`);return this.eventManager.addEventListener(n,t,this.decoratePreventDefault(i))}decoratePreventDefault(n){return t=>{if("__ngUnwrap__"===t)return n;!1===(this.platformIsServer?this.ngZone.runGuarded(()=>n(t)):n(t))&&t.preventDefault()}}}function Ww(e){return"TEMPLATE"===e.tagName&&void 0!==e.content}class YV extends wg{constructor(n,t,i,r,o,s,a,l){super(n,o,s,l),this.sharedStylesHost=t,this.hostEl=i,this.shadowRoot=i.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);const c=Gw(r.id,r.styles);for(const u of c){const d=document.createElement("style");a&&d.setAttribute("nonce",a),d.textContent=u,this.shadowRoot.appendChild(d)}}nodeOrShadowRoot(n){return n===this.hostEl?this.shadowRoot:n}appendChild(n,t){return super.appendChild(this.nodeOrShadowRoot(n),t)}insertBefore(n,t,i){return super.insertBefore(this.nodeOrShadowRoot(n),t,i)}removeChild(n,t){return super.removeChild(this.nodeOrShadowRoot(n),t)}parentNode(n){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(n)))}destroy(){this.sharedStylesHost.removeHost(this.shadowRoot)}}class Cg extends wg{constructor(n,t,i,r,o,s,a,l){super(n,o,s,a),this.sharedStylesHost=t,this.removeStylesOnCompDestroy=r,this.styles=l?Gw(l,i.styles):i.styles}applyStyles(){this.sharedStylesHost.addStyles(this.styles)}destroy(){this.removeStylesOnCompDestroy&&this.sharedStylesHost.removeStyles(this.styles)}}class qw extends Cg{constructor(n,t,i,r,o,s,a,l){const c=r+"-"+i.id;super(n,t,i,o,s,a,l,c),this.contentAttr=function zV(e){return"_ngcontent-%COMP%".replace(Dg,e)}(c),this.hostAttr=function WV(e){return"_nghost-%COMP%".replace(Dg,e)}(c)}applyToHost(n){this.applyStyles(),this.setAttribute(n,this.hostAttr,"")}createElement(n,t){const i=super.createElement(n,t);return super.setAttribute(i,this.contentAttr,""),i}}let ZV=(()=>{class e extends Hw{constructor(t){super(t)}supports(t){return!0}addEventListener(t,i,r){return t.addEventListener(i,r,!1),()=>this.removeEventListener(t,i,r)}removeEventListener(t,i,r){return t.removeEventListener(i,r)}static#e=this.\u0275fac=function(i){return new(i||e)(H(ut))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();const Yw=["alt","control","meta","shift"],JV={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},XV={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey};let QV=(()=>{class e extends Hw{constructor(t){super(t)}supports(t){return null!=e.parseEventName(t)}addEventListener(t,i,r){const o=e.parseEventName(i),s=e.eventCallback(o.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>er().onAndCancel(t,o.domEventName,s))}static parseEventName(t){const i=t.toLowerCase().split("."),r=i.shift();if(0===i.length||"keydown"!==r&&"keyup"!==r)return null;const o=e._normalizeKey(i.pop());let s="",a=i.indexOf("code");if(a>-1&&(i.splice(a,1),s="code."),Yw.forEach(c=>{const u=i.indexOf(c);u>-1&&(i.splice(u,1),s+=c+".")}),s+=o,0!=i.length||0===o.length)return null;const l={};return l.domEventName=r,l.fullKey=s,l}static matchEventFullKeyCode(t,i){let r=JV[t.key]||t.key,o="";return i.indexOf("code.")>-1&&(r=t.code,o="code."),!(null==r||!r)&&(r=r.toLowerCase()," "===r?r="space":"."===r&&(r="dot"),Yw.forEach(s=>{s!==r&&(0,XV[s])(t)&&(o+=s+".")}),o+=r,o===i)}static eventCallback(t,i,r){return o=>{e.matchEventFullKeyCode(o,t)&&r.runGuarded(()=>i(o))}}static _normalizeKey(t){return"esc"===t?"escape":t}static#e=this.\u0275fac=function(i){return new(i||e)(H(ut))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();const nB=jD(OF,"browser",[{provide:Tr,useValue:"browser"},{provide:Xy,useValue:function KV(){_g.makeCurrent()},multi:!0},{provide:ut,useFactory:function tB(){return function zO(e){dh=e}(document),document},deps:[]}]),iB=new z(""),Xw=[{provide:gu,useClass:class BV{addToWindow(n){Be.getAngularTestability=(i,r=!0)=>{const o=n.findTestabilityInTree(i,r);if(null==o)throw new R(5103,!1);return o},Be.getAllAngularTestabilities=()=>n.getAllTestabilities(),Be.getAllAngularRootElements=()=>n.getAllRootElements(),Be.frameworkStabilizers||(Be.frameworkStabilizers=[]),Be.frameworkStabilizers.push(i=>{const r=Be.getAllAngularTestabilities();let o=r.length,s=!1;const a=function(l){s=s||l,o--,0==o&&i(s)};r.forEach(l=>{l.whenStable(a)})})}findTestabilityInTree(n,t,i){return null==t?null:n.getTestability(t)??(i?er().isShadowRoot(t)?this.findTestabilityInTree(n,t.host,!0):this.findTestabilityInTree(n,t.parentElement,!0):null)}},deps:[]},{provide:kD,useClass:Vp,deps:[fe,Bp,gu]},{provide:Vp,useClass:Vp,deps:[fe,Bp,gu]}],Qw=[{provide:Dh,useValue:"root"},{provide:Ii,useFactory:function eB(){return new Ii},deps:[]},{provide:vg,useClass:ZV,multi:!0,deps:[ut,fe,Tr]},{provide:vg,useClass:QV,multi:!0,deps:[ut]},zw,$w,jw,{provide:kh,useExisting:zw},{provide:kw,useClass:jV,deps:[]},[]];let rB=(()=>{class e{constructor(t){}static withServerTransition(t){return{ngModule:e,providers:[{provide:kc,useValue:t.appId}]}}static#e=this.\u0275fac=function(i){return new(i||e)(H(iB,12))};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({providers:[...Qw,...Xw],imports:[aV,xF]})}return e})(),Kw=(()=>{class e{constructor(t){this._doc=t}getTitle(){return this._doc.title}setTitle(t){this._doc.title=t||""}static#e=this.\u0275fac=function(i){return new(i||e)(H(ut))};static#t=this.\u0275prov=B({token:e,factory:function(i){let r=null;return r=i?new i:function sB(){return new Kw(H(ut))}(),r},providedIn:"root"})}return e})();function ls(e,n){return se(n)?ht(e,n,1):ht(e,1)}function vt(e,n){return qe((t,i)=>{let r=0;t.subscribe(Ve(i,o=>e.call(n,o,r++)&&i.next(o)))})}function Ga(e){return qe((n,t)=>{try{n.subscribe(t)}finally{t.add(e)}})}typeof window<"u"&&window;class ku{}class Fu{}class pi{constructor(n){this.normalizedNames=new Map,this.lazyUpdate=null,n?"string"==typeof n?this.lazyInit=()=>{this.headers=new Map,n.split("\n").forEach(t=>{const i=t.indexOf(":");if(i>0){const r=t.slice(0,i),o=r.toLowerCase(),s=t.slice(i+1).trim();this.maybeSetNormalizedName(r,o),this.headers.has(o)?this.headers.get(o).push(s):this.headers.set(o,[s])}})}:typeof Headers<"u"&&n instanceof Headers?(this.headers=new Map,n.forEach((t,i)=>{this.setHeaderEntries(i,t)})):this.lazyInit=()=>{this.headers=new Map,Object.entries(n).forEach(([t,i])=>{this.setHeaderEntries(t,i)})}:this.headers=new Map}has(n){return this.init(),this.headers.has(n.toLowerCase())}get(n){this.init();const t=this.headers.get(n.toLowerCase());return t&&t.length>0?t[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(n){return this.init(),this.headers.get(n.toLowerCase())||null}append(n,t){return this.clone({name:n,value:t,op:"a"})}set(n,t){return this.clone({name:n,value:t,op:"s"})}delete(n,t){return this.clone({name:n,value:t,op:"d"})}maybeSetNormalizedName(n,t){this.normalizedNames.has(t)||this.normalizedNames.set(t,n)}init(){this.lazyInit&&(this.lazyInit instanceof pi?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(n=>this.applyUpdate(n)),this.lazyUpdate=null))}copyFrom(n){n.init(),Array.from(n.headers.keys()).forEach(t=>{this.headers.set(t,n.headers.get(t)),this.normalizedNames.set(t,n.normalizedNames.get(t))})}clone(n){const t=new pi;return t.lazyInit=this.lazyInit&&this.lazyInit instanceof pi?this.lazyInit:this,t.lazyUpdate=(this.lazyUpdate||[]).concat([n]),t}applyUpdate(n){const t=n.name.toLowerCase();switch(n.op){case"a":case"s":let i=n.value;if("string"==typeof i&&(i=[i]),0===i.length)return;this.maybeSetNormalizedName(n.name,t);const r=("a"===n.op?this.headers.get(t):void 0)||[];r.push(...i),this.headers.set(t,r);break;case"d":const o=n.value;if(o){let s=this.headers.get(t);if(!s)return;s=s.filter(a=>-1===o.indexOf(a)),0===s.length?(this.headers.delete(t),this.normalizedNames.delete(t)):this.headers.set(t,s)}else this.headers.delete(t),this.normalizedNames.delete(t)}}setHeaderEntries(n,t){const i=(Array.isArray(t)?t:[t]).map(o=>o.toString()),r=n.toLowerCase();this.headers.set(r,i),this.maybeSetNormalizedName(n,r)}forEach(n){this.init(),Array.from(this.normalizedNames.keys()).forEach(t=>n(this.normalizedNames.get(t),this.headers.get(t)))}}class dB{encodeKey(n){return iC(n)}encodeValue(n){return iC(n)}decodeKey(n){return decodeURIComponent(n)}decodeValue(n){return decodeURIComponent(n)}}const hB=/%(\d[a-f0-9])/gi,pB={40:"@","3A":":",24:"$","2C":",","3B":";","3D":"=","3F":"?","2F":"/"};function iC(e){return encodeURIComponent(e).replace(hB,(n,t)=>pB[t]??n)}function Lu(e){return`${e}`}class nr{constructor(n={}){if(this.updates=null,this.cloneFrom=null,this.encoder=n.encoder||new dB,n.fromString){if(n.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=function fB(e,n){const t=new Map;return e.length>0&&e.replace(/^\?/,"").split("&").forEach(r=>{const o=r.indexOf("="),[s,a]=-1==o?[n.decodeKey(r),""]:[n.decodeKey(r.slice(0,o)),n.decodeValue(r.slice(o+1))],l=t.get(s)||[];l.push(a),t.set(s,l)}),t}(n.fromString,this.encoder)}else n.fromObject?(this.map=new Map,Object.keys(n.fromObject).forEach(t=>{const i=n.fromObject[t],r=Array.isArray(i)?i.map(Lu):[Lu(i)];this.map.set(t,r)})):this.map=null}has(n){return this.init(),this.map.has(n)}get(n){this.init();const t=this.map.get(n);return t?t[0]:null}getAll(n){return this.init(),this.map.get(n)||null}keys(){return this.init(),Array.from(this.map.keys())}append(n,t){return this.clone({param:n,value:t,op:"a"})}appendAll(n){const t=[];return Object.keys(n).forEach(i=>{const r=n[i];Array.isArray(r)?r.forEach(o=>{t.push({param:i,value:o,op:"a"})}):t.push({param:i,value:r,op:"a"})}),this.clone(t)}set(n,t){return this.clone({param:n,value:t,op:"s"})}delete(n,t){return this.clone({param:n,value:t,op:"d"})}toString(){return this.init(),this.keys().map(n=>{const t=this.encoder.encodeKey(n);return this.map.get(n).map(i=>t+"="+this.encoder.encodeValue(i)).join("&")}).filter(n=>""!==n).join("&")}clone(n){const t=new nr({encoder:this.encoder});return t.cloneFrom=this.cloneFrom||this,t.updates=(this.updates||[]).concat(n),t}init(){null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(n=>this.map.set(n,this.cloneFrom.map.get(n))),this.updates.forEach(n=>{switch(n.op){case"a":case"s":const t=("a"===n.op?this.map.get(n.param):void 0)||[];t.push(Lu(n.value)),this.map.set(n.param,t);break;case"d":if(void 0===n.value){this.map.delete(n.param);break}{let i=this.map.get(n.param)||[];const r=i.indexOf(Lu(n.value));-1!==r&&i.splice(r,1),i.length>0?this.map.set(n.param,i):this.map.delete(n.param)}}}),this.cloneFrom=this.updates=null)}}class gB{constructor(){this.map=new Map}set(n,t){return this.map.set(n,t),this}get(n){return this.map.has(n)||this.map.set(n,n.defaultValue()),this.map.get(n)}delete(n){return this.map.delete(n),this}has(n){return this.map.has(n)}keys(){return this.map.keys()}}function rC(e){return typeof ArrayBuffer<"u"&&e instanceof ArrayBuffer}function oC(e){return typeof Blob<"u"&&e instanceof Blob}function sC(e){return typeof FormData<"u"&&e instanceof FormData}class za{constructor(n,t,i,r){let o;if(this.url=t,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=n.toUpperCase(),function mB(e){switch(e){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=void 0!==i?i:null,o=r):o=i,o&&(this.reportProgress=!!o.reportProgress,this.withCredentials=!!o.withCredentials,o.responseType&&(this.responseType=o.responseType),o.headers&&(this.headers=o.headers),o.context&&(this.context=o.context),o.params&&(this.params=o.params)),this.headers||(this.headers=new pi),this.context||(this.context=new gB),this.params){const s=this.params.toString();if(0===s.length)this.urlWithParams=t;else{const a=t.indexOf("?");this.urlWithParams=t+(-1===a?"?":ad.set(h,n.setHeaders[h]),l)),n.setParams&&(c=Object.keys(n.setParams).reduce((d,h)=>d.set(h,n.setParams[h]),c)),new za(t,i,o,{params:c,headers:l,context:u,reportProgress:a,responseType:r,withCredentials:s})}}var cs=function(e){return e[e.Sent=0]="Sent",e[e.UploadProgress=1]="UploadProgress",e[e.ResponseHeader=2]="ResponseHeader",e[e.DownloadProgress=3]="DownloadProgress",e[e.Response=4]="Response",e[e.User=5]="User",e}(cs||{});class Tg{constructor(n,t=200,i="OK"){this.headers=n.headers||new pi,this.status=void 0!==n.status?n.status:t,this.statusText=n.statusText||i,this.url=n.url||null,this.ok=this.status>=200&&this.status<300}}class Sg extends Tg{constructor(n={}){super(n),this.type=cs.ResponseHeader}clone(n={}){return new Sg({headers:n.headers||this.headers,status:void 0!==n.status?n.status:this.status,statusText:n.statusText||this.statusText,url:n.url||this.url||void 0})}}class us extends Tg{constructor(n={}){super(n),this.type=cs.Response,this.body=void 0!==n.body?n.body:null}clone(n={}){return new us({body:void 0!==n.body?n.body:this.body,headers:n.headers||this.headers,status:void 0!==n.status?n.status:this.status,statusText:n.statusText||this.statusText,url:n.url||this.url||void 0})}}class aC extends Tg{constructor(n){super(n,0,"Unknown Error"),this.name="HttpErrorResponse",this.ok=!1,this.message=this.status>=200&&this.status<300?`Http failure during parsing for ${n.url||"(unknown url)"}`:`Http failure response for ${n.url||"(unknown url)"}: ${n.status} ${n.statusText}`,this.error=n.error||null}}function Mg(e,n){return{body:n,headers:e.headers,context:e.context,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials}}let Wa=(()=>{class e{constructor(t){this.handler=t}request(t,i,r={}){let o;if(t instanceof za)o=t;else{let l,c;l=r.headers instanceof pi?r.headers:new pi(r.headers),r.params&&(c=r.params instanceof nr?r.params:new nr({fromObject:r.params})),o=new za(t,i,void 0!==r.body?r.body:null,{headers:l,context:r.context,params:c,reportProgress:r.reportProgress,responseType:r.responseType||"json",withCredentials:r.withCredentials})}const s=J(o).pipe(ls(l=>this.handler.handle(l)));if(t instanceof za||"events"===r.observe)return s;const a=s.pipe(vt(l=>l instanceof us));switch(r.observe||"body"){case"body":switch(o.responseType){case"arraybuffer":return a.pipe(ae(l=>{if(null!==l.body&&!(l.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return l.body}));case"blob":return a.pipe(ae(l=>{if(null!==l.body&&!(l.body instanceof Blob))throw new Error("Response is not a Blob.");return l.body}));case"text":return a.pipe(ae(l=>{if(null!==l.body&&"string"!=typeof l.body)throw new Error("Response is not a string.");return l.body}));default:return a.pipe(ae(l=>l.body))}case"response":return a;default:throw new Error(`Unreachable: unhandled observe type ${r.observe}}`)}}delete(t,i={}){return this.request("DELETE",t,i)}get(t,i={}){return this.request("GET",t,i)}head(t,i={}){return this.request("HEAD",t,i)}jsonp(t,i){return this.request("JSONP",t,{params:(new nr).append(i,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}options(t,i={}){return this.request("OPTIONS",t,i)}patch(t,i,r={}){return this.request("PATCH",t,Mg(r,i))}post(t,i,r={}){return this.request("POST",t,Mg(r,i))}put(t,i,r={}){return this.request("PUT",t,Mg(r,i))}static#e=this.\u0275fac=function(i){return new(i||e)(H(ku))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();function uC(e,n){return n(e)}function yB(e,n){return(t,i)=>n.intercept(t,{handle:r=>e(r,i)})}const DB=new z(""),qa=new z(""),dC=new z("");function wB(){let e=null;return(n,t)=>{null===e&&(e=(F(DB,{optional:!0})??[]).reduceRight(yB,uC));const i=F(hu),r=i.add();return e(n,t).pipe(Ga(()=>i.remove(r)))}}let fC=(()=>{class e extends ku{constructor(t,i){super(),this.backend=t,this.injector=i,this.chain=null,this.pendingTasks=F(hu)}handle(t){if(null===this.chain){const r=Array.from(new Set([...this.injector.get(qa),...this.injector.get(dC,[])]));this.chain=r.reduceRight((o,s)=>function bB(e,n,t){return(i,r)=>t.runInContext(()=>n(i,o=>e(o,r)))}(o,s,this.injector),uC)}const i=this.pendingTasks.add();return this.chain(t,r=>this.backend.handle(r)).pipe(Ga(()=>this.pendingTasks.remove(i)))}static#e=this.\u0275fac=function(i){return new(i||e)(H(Fu),H(zt))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();const SB=/^\)\]\}',?\n/;let pC=(()=>{class e{constructor(t){this.xhrFactory=t}handle(t){if("JSONP"===t.method)throw new R(-2800,!1);const i=this.xhrFactory;return(i.\u0275loadImpl?pt(i.\u0275loadImpl()):J(null)).pipe(wn(()=>new Ce(o=>{const s=i.build();if(s.open(t.method,t.urlWithParams),t.withCredentials&&(s.withCredentials=!0),t.headers.forEach((y,D)=>s.setRequestHeader(y,D.join(","))),t.headers.has("Accept")||s.setRequestHeader("Accept","application/json, text/plain, */*"),!t.headers.has("Content-Type")){const y=t.detectContentTypeHeader();null!==y&&s.setRequestHeader("Content-Type",y)}if(t.responseType){const y=t.responseType.toLowerCase();s.responseType="json"!==y?y:"text"}const a=t.serializeBody();let l=null;const c=()=>{if(null!==l)return l;const y=s.statusText||"OK",D=new pi(s.getAllResponseHeaders()),M=function MB(e){return"responseURL"in e&&e.responseURL?e.responseURL:/^X-Request-URL:/m.test(e.getAllResponseHeaders())?e.getResponseHeader("X-Request-URL"):null}(s)||t.url;return l=new Sg({headers:D,status:s.status,statusText:y,url:M}),l},u=()=>{let{headers:y,status:D,statusText:M,url:C}=c(),P=null;204!==D&&(P=typeof s.response>"u"?s.responseText:s.response),0===D&&(D=P?200:0);let k=D>=200&&D<300;if("json"===t.responseType&&"string"==typeof P){const G=P;P=P.replace(SB,"");try{P=""!==P?JSON.parse(P):null}catch(X){P=G,k&&(k=!1,P={error:X,text:P})}}k?(o.next(new us({body:P,headers:y,status:D,statusText:M,url:C||void 0})),o.complete()):o.error(new aC({error:P,headers:y,status:D,statusText:M,url:C||void 0}))},d=y=>{const{url:D}=c(),M=new aC({error:y,status:s.status||0,statusText:s.statusText||"Unknown Error",url:D||void 0});o.error(M)};let h=!1;const _=y=>{h||(o.next(c()),h=!0);let D={type:cs.DownloadProgress,loaded:y.loaded};y.lengthComputable&&(D.total=y.total),"text"===t.responseType&&s.responseText&&(D.partialText=s.responseText),o.next(D)},v=y=>{let D={type:cs.UploadProgress,loaded:y.loaded};y.lengthComputable&&(D.total=y.total),o.next(D)};return s.addEventListener("load",u),s.addEventListener("error",d),s.addEventListener("timeout",d),s.addEventListener("abort",d),t.reportProgress&&(s.addEventListener("progress",_),null!==a&&s.upload&&s.upload.addEventListener("progress",v)),s.send(a),o.next({type:cs.Sent}),()=>{s.removeEventListener("error",d),s.removeEventListener("abort",d),s.removeEventListener("load",u),s.removeEventListener("timeout",d),t.reportProgress&&(s.removeEventListener("progress",_),null!==a&&s.upload&&s.upload.removeEventListener("progress",v)),s.readyState!==s.DONE&&s.abort()}})))}static#e=this.\u0275fac=function(i){return new(i||e)(H(kw))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();const Ig=new z("XSRF_ENABLED"),gC=new z("XSRF_COOKIE_NAME",{providedIn:"root",factory:()=>"XSRF-TOKEN"}),mC=new z("XSRF_HEADER_NAME",{providedIn:"root",factory:()=>"X-XSRF-TOKEN"});class _C{}let OB=(()=>{class e{constructor(t,i,r){this.doc=t,this.platform=i,this.cookieName=r,this.lastCookieString="",this.lastToken=null,this.parseCount=0}getToken(){if("server"===this.platform)return null;const t=this.doc.cookie||"";return t!==this.lastCookieString&&(this.parseCount++,this.lastToken=Sw(t,this.cookieName),this.lastCookieString=t),this.lastToken}static#e=this.\u0275fac=function(i){return new(i||e)(H(ut),H(Tr),H(gC))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();function xB(e,n){const t=e.url.toLowerCase();if(!F(Ig)||"GET"===e.method||"HEAD"===e.method||t.startsWith("http://")||t.startsWith("https://"))return n(e);const i=F(_C).getToken(),r=F(mC);return null!=i&&!e.headers.has(r)&&(e=e.clone({headers:e.headers.set(r,i)})),n(e)}var ir=function(e){return e[e.Interceptors=0]="Interceptors",e[e.LegacyInterceptors=1]="LegacyInterceptors",e[e.CustomXsrfConfiguration=2]="CustomXsrfConfiguration",e[e.NoXsrfProtection=3]="NoXsrfProtection",e[e.JsonpSupport=4]="JsonpSupport",e[e.RequestsMadeViaParent=5]="RequestsMadeViaParent",e[e.Fetch=6]="Fetch",e}(ir||{});function AB(...e){const n=[Wa,pC,fC,{provide:ku,useExisting:fC},{provide:Fu,useExisting:pC},{provide:qa,useValue:xB,multi:!0},{provide:Ig,useValue:!0},{provide:_C,useClass:OB}];for(const t of e)n.push(...t.\u0275providers);return function vh(e){return{\u0275providers:e}}(n)}const vC=new z("LEGACY_INTERCEPTOR_FN");function RB(){return function Pr(e,n){return{\u0275kind:e,\u0275providers:n}}(ir.LegacyInterceptors,[{provide:vC,useFactory:wB},{provide:qa,useExisting:vC,multi:!0}])}let PB=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({providers:[AB(RB())]})}return e})();const{isArray:jB}=Array,{getPrototypeOf:HB,prototype:$B,keys:UB}=Object;function yC(e){if(1===e.length){const n=e[0];if(jB(n))return{args:n,keys:null};if(function GB(e){return e&&"object"==typeof e&&HB(e)===$B}(n)){const t=UB(n);return{args:t.map(i=>n[i]),keys:t}}}return{args:e,keys:null}}const{isArray:zB}=Array;function Ng(e){return ae(n=>function WB(e,n){return zB(n)?e(...n):e(n)}(e,n))}function bC(e,n){return e.reduce((t,i,r)=>(t[i]=n[r],t),{})}let DC=(()=>{class e{constructor(t,i){this._renderer=t,this._elementRef=i,this.onChange=r=>{},this.onTouched=()=>{}}setProperty(t,i){this._renderer.setProperty(this._elementRef.nativeElement,t,i)}registerOnTouched(t){this.onTouched=t}registerOnChange(t){this.onChange=t}setDisabledState(t){this.setProperty("disabled",t)}static#e=this.\u0275fac=function(i){return new(i||e)(b(hn),b(Se))};static#t=this.\u0275dir=L({type:e})}return e})(),kr=(()=>{class e extends DC{static#e=this.\u0275fac=function(){let t;return function(r){return(t||(t=st(e)))(r||e)}}();static#t=this.\u0275dir=L({type:e,features:[Me]})}return e})();const An=new z("NgValueAccessor"),ZB={provide:An,useExisting:le(()=>Ya),multi:!0},XB=new z("CompositionEventMode");let Ya=(()=>{class e extends DC{constructor(t,i,r){super(t,i),this._compositionMode=r,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function JB(){const e=er()?er().getUserAgent():"";return/android (\d+)/.test(e.toLowerCase())}())}writeValue(t){this.setProperty("value",t??"")}_handleInput(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)}_compositionStart(){this._composing=!0}_compositionEnd(t){this._composing=!1,this._compositionMode&&this.onChange(t)}static#e=this.\u0275fac=function(i){return new(i||e)(b(hn),b(Se),b(XB,8))};static#t=this.\u0275dir=L({type:e,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,r){1&i&&Z("input",function(s){return r._handleInput(s.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(s){return r._compositionEnd(s.target.value)})},features:[Fe([ZB]),Me]})}return e})();function rr(e){return null==e||("string"==typeof e||Array.isArray(e))&&0===e.length}const Ot=new z("NgValidators"),or=new z("NgAsyncValidators");function Bu(e){return null}function AC(e){return null!=e}function RC(e){return Sa(e)?pt(e):e}function PC(e){let n={};return e.forEach(t=>{n=null!=t?{...n,...t}:n}),0===Object.keys(n).length?null:n}function kC(e,n){return n.map(t=>t(e))}function FC(e){return e.map(n=>function KB(e){return!e.validate}(n)?n:t=>n.validate(t))}function Og(e){return null!=e?function LC(e){if(!e)return null;const n=e.filter(AC);return 0==n.length?null:function(t){return PC(kC(t,n))}}(FC(e)):null}function xg(e){return null!=e?function VC(e){if(!e)return null;const n=e.filter(AC);return 0==n.length?null:function(t){return function qB(...e){const n=Ul(e),{args:t,keys:i}=yC(e),r=new Ce(o=>{const{length:s}=t;if(!s)return void o.complete();const a=new Array(s);let l=s,c=s;for(let u=0;u{d||(d=!0,c--),a[u]=h},()=>l--,void 0,()=>{(!l||!d)&&(c||o.next(i?bC(i,a):a),o.complete())}))}});return n?r.pipe(Ng(n)):r}(kC(t,n).map(RC)).pipe(ae(PC))}}(FC(e)):null}function BC(e,n){return null===e?[n]:Array.isArray(e)?[...e,n]:[e,n]}function Ag(e){return e?Array.isArray(e)?e:[e]:[]}function ju(e,n){return Array.isArray(e)?e.includes(n):e===n}function $C(e,n){const t=Ag(n);return Ag(e).forEach(r=>{ju(t,r)||t.push(r)}),t}function UC(e,n){return Ag(n).filter(t=>!ju(e,t))}class GC{constructor(){this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_setValidators(n){this._rawValidators=n||[],this._composedValidatorFn=Og(this._rawValidators)}_setAsyncValidators(n){this._rawAsyncValidators=n||[],this._composedAsyncValidatorFn=xg(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_registerOnDestroy(n){this._onDestroyCallbacks.push(n)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(n=>n()),this._onDestroyCallbacks=[]}reset(n=void 0){this.control&&this.control.reset(n)}hasError(n,t){return!!this.control&&this.control.hasError(n,t)}getError(n,t){return this.control?this.control.getError(n,t):null}}class Yt extends GC{get formDirective(){return null}get path(){return null}}class sr extends GC{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}class zC{constructor(n){this._cd=n}get isTouched(){return!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return!!this._cd?.submitted}}let Rg=(()=>{class e extends zC{constructor(t){super(t)}static#e=this.\u0275fac=function(i){return new(i||e)(b(sr,2))};static#t=this.\u0275dir=L({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,r){2&i&&me("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},features:[Me]})}return e})(),WC=(()=>{class e extends zC{constructor(t){super(t)}static#e=this.\u0275fac=function(i){return new(i||e)(b(Yt,10))};static#t=this.\u0275dir=L({type:e,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(i,r){2&i&&me("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)("ng-submitted",r.isSubmitted)},features:[Me]})}return e})();const Za="VALID",$u="INVALID",ds="PENDING",Ja="DISABLED";function Fg(e){return(Uu(e)?e.validators:e)||null}function Lg(e,n){return(Uu(n)?n.asyncValidators:e)||null}function Uu(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}class JC{constructor(n,t){this._pendingDirty=!1,this._hasOwnPendingAsyncValidator=!1,this._pendingTouched=!1,this._onCollectionChange=()=>{},this._parent=null,this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._assignValidators(n),this._assignAsyncValidators(t)}get validator(){return this._composedValidatorFn}set validator(n){this._rawValidators=this._composedValidatorFn=n}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(n){this._rawAsyncValidators=this._composedAsyncValidatorFn=n}get parent(){return this._parent}get valid(){return this.status===Za}get invalid(){return this.status===$u}get pending(){return this.status==ds}get disabled(){return this.status===Ja}get enabled(){return this.status!==Ja}get dirty(){return!this.pristine}get untouched(){return!this.touched}get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(n){this._assignValidators(n)}setAsyncValidators(n){this._assignAsyncValidators(n)}addValidators(n){this.setValidators($C(n,this._rawValidators))}addAsyncValidators(n){this.setAsyncValidators($C(n,this._rawAsyncValidators))}removeValidators(n){this.setValidators(UC(n,this._rawValidators))}removeAsyncValidators(n){this.setAsyncValidators(UC(n,this._rawAsyncValidators))}hasValidator(n){return ju(this._rawValidators,n)}hasAsyncValidator(n){return ju(this._rawAsyncValidators,n)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(n={}){this.touched=!0,this._parent&&!n.onlySelf&&this._parent.markAsTouched(n)}markAllAsTouched(){this.markAsTouched({onlySelf:!0}),this._forEachChild(n=>n.markAllAsTouched())}markAsUntouched(n={}){this.touched=!1,this._pendingTouched=!1,this._forEachChild(t=>{t.markAsUntouched({onlySelf:!0})}),this._parent&&!n.onlySelf&&this._parent._updateTouched(n)}markAsDirty(n={}){this.pristine=!1,this._parent&&!n.onlySelf&&this._parent.markAsDirty(n)}markAsPristine(n={}){this.pristine=!0,this._pendingDirty=!1,this._forEachChild(t=>{t.markAsPristine({onlySelf:!0})}),this._parent&&!n.onlySelf&&this._parent._updatePristine(n)}markAsPending(n={}){this.status=ds,!1!==n.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!n.onlySelf&&this._parent.markAsPending(n)}disable(n={}){const t=this._parentMarkedDirty(n.onlySelf);this.status=Ja,this.errors=null,this._forEachChild(i=>{i.disable({...n,onlySelf:!0})}),this._updateValue(),!1!==n.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors({...n,skipPristineCheck:t}),this._onDisabledChange.forEach(i=>i(!0))}enable(n={}){const t=this._parentMarkedDirty(n.onlySelf);this.status=Za,this._forEachChild(i=>{i.enable({...n,onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:n.emitEvent}),this._updateAncestors({...n,skipPristineCheck:t}),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(n){this._parent&&!n.onlySelf&&(this._parent.updateValueAndValidity(n),n.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}setParent(n){this._parent=n}getRawValue(){return this.value}updateValueAndValidity(n={}){this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===Za||this.status===ds)&&this._runAsyncValidator(n.emitEvent)),!1!==n.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!n.onlySelf&&this._parent.updateValueAndValidity(n)}_updateTreeValidity(n={emitEvent:!0}){this._forEachChild(t=>t._updateTreeValidity(n)),this.updateValueAndValidity({onlySelf:!0,emitEvent:n.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?Ja:Za}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(n){if(this.asyncValidator){this.status=ds,this._hasOwnPendingAsyncValidator=!0;const t=RC(this.asyncValidator(this));this._asyncValidationSubscription=t.subscribe(i=>{this._hasOwnPendingAsyncValidator=!1,this.setErrors(i,{emitEvent:n})})}}_cancelExistingSubscription(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}setErrors(n,t={}){this.errors=n,this._updateControlsErrors(!1!==t.emitEvent)}get(n){let t=n;return null==t||(Array.isArray(t)||(t=t.split(".")),0===t.length)?null:t.reduce((i,r)=>i&&i._find(r),this)}getError(n,t){const i=t?this.get(t):this;return i&&i.errors?i.errors[n]:null}hasError(n,t){return!!this.getError(n,t)}get root(){let n=this;for(;n._parent;)n=n._parent;return n}_updateControlsErrors(n){this.status=this._calculateStatus(),n&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(n)}_initObservables(){this.valueChanges=new Y,this.statusChanges=new Y}_calculateStatus(){return this._allControlsDisabled()?Ja:this.errors?$u:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(ds)?ds:this._anyControlsHaveStatus($u)?$u:Za}_anyControlsHaveStatus(n){return this._anyControls(t=>t.status===n)}_anyControlsDirty(){return this._anyControls(n=>n.dirty)}_anyControlsTouched(){return this._anyControls(n=>n.touched)}_updatePristine(n={}){this.pristine=!this._anyControlsDirty(),this._parent&&!n.onlySelf&&this._parent._updatePristine(n)}_updateTouched(n={}){this.touched=this._anyControlsTouched(),this._parent&&!n.onlySelf&&this._parent._updateTouched(n)}_registerOnCollectionChange(n){this._onCollectionChange=n}_setUpdateStrategy(n){Uu(n)&&null!=n.updateOn&&(this._updateOn=n.updateOn)}_parentMarkedDirty(n){return!n&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}_find(n){return null}_assignValidators(n){this._rawValidators=Array.isArray(n)?n.slice():n,this._composedValidatorFn=function ij(e){return Array.isArray(e)?Og(e):e||null}(this._rawValidators)}_assignAsyncValidators(n){this._rawAsyncValidators=Array.isArray(n)?n.slice():n,this._composedAsyncValidatorFn=function rj(e){return Array.isArray(e)?xg(e):e||null}(this._rawAsyncValidators)}}class Vg extends JC{constructor(n,t,i){super(Fg(t),Lg(i,t)),this.controls=n,this._initObservables(),this._setUpdateStrategy(t),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}registerControl(n,t){return this.controls[n]?this.controls[n]:(this.controls[n]=t,t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange),t)}addControl(n,t,i={}){this.registerControl(n,t),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}removeControl(n,t={}){this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),delete this.controls[n],this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}setControl(n,t,i={}){this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),delete this.controls[n],t&&this.registerControl(n,t),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}contains(n){return this.controls.hasOwnProperty(n)&&this.controls[n].enabled}setValue(n,t={}){(function ZC(e,n,t){e._forEachChild((i,r)=>{if(void 0===t[r])throw new R(1002,"")})})(this,0,n),Object.keys(n).forEach(i=>{(function YC(e,n,t){const i=e.controls;if(!(n?Object.keys(i):i).length)throw new R(1e3,"");if(!i[t])throw new R(1001,"")})(this,!0,i),this.controls[i].setValue(n[i],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)}patchValue(n,t={}){null!=n&&(Object.keys(n).forEach(i=>{const r=this.controls[i];r&&r.patchValue(n[i],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t))}reset(n={},t={}){this._forEachChild((i,r)=>{i.reset(n?n[r]:null,{onlySelf:!0,emitEvent:t.emitEvent})}),this._updatePristine(t),this._updateTouched(t),this.updateValueAndValidity(t)}getRawValue(){return this._reduceChildren({},(n,t,i)=>(n[i]=t.getRawValue(),n))}_syncPendingControls(){let n=this._reduceChildren(!1,(t,i)=>!!i._syncPendingControls()||t);return n&&this.updateValueAndValidity({onlySelf:!0}),n}_forEachChild(n){Object.keys(this.controls).forEach(t=>{const i=this.controls[t];i&&n(i,t)})}_setUpControls(){this._forEachChild(n=>{n.setParent(this),n._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(n){for(const[t,i]of Object.entries(this.controls))if(this.contains(t)&&n(i))return!0;return!1}_reduceValue(){return this._reduceChildren({},(t,i,r)=>((i.enabled||this.disabled)&&(t[r]=i.value),t))}_reduceChildren(n,t){let i=n;return this._forEachChild((r,o)=>{i=t(i,r,o)}),i}_allControlsDisabled(){for(const n of Object.keys(this.controls))if(this.controls[n].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(n){return this.controls.hasOwnProperty(n)?this.controls[n]:null}}const Fr=new z("CallSetDisabledState",{providedIn:"root",factory:()=>Xa}),Xa="always";function Qa(e,n,t=Xa){Bg(e,n),n.valueAccessor.writeValue(e.value),(e.disabled||"always"===t)&&n.valueAccessor.setDisabledState?.(e.disabled),function aj(e,n){n.valueAccessor.registerOnChange(t=>{e._pendingValue=t,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&XC(e,n)})}(e,n),function cj(e,n){const t=(i,r)=>{n.valueAccessor.writeValue(i),r&&n.viewToModelUpdate(i)};e.registerOnChange(t),n._registerOnDestroy(()=>{e._unregisterOnChange(t)})}(e,n),function lj(e,n){n.valueAccessor.registerOnTouched(()=>{e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&XC(e,n),"submit"!==e.updateOn&&e.markAsTouched()})}(e,n),function sj(e,n){if(n.valueAccessor.setDisabledState){const t=i=>{n.valueAccessor.setDisabledState(i)};e.registerOnDisabledChange(t),n._registerOnDestroy(()=>{e._unregisterOnDisabledChange(t)})}}(e,n)}function Wu(e,n){e.forEach(t=>{t.registerOnValidatorChange&&t.registerOnValidatorChange(n)})}function Bg(e,n){const t=function jC(e){return e._rawValidators}(e);null!==n.validator?e.setValidators(BC(t,n.validator)):"function"==typeof t&&e.setValidators([t]);const i=function HC(e){return e._rawAsyncValidators}(e);null!==n.asyncValidator?e.setAsyncValidators(BC(i,n.asyncValidator)):"function"==typeof i&&e.setAsyncValidators([i]);const r=()=>e.updateValueAndValidity();Wu(n._rawValidators,r),Wu(n._rawAsyncValidators,r)}function XC(e,n){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),n.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}const pj={provide:Yt,useExisting:le(()=>Yu)},Ka=(()=>Promise.resolve())();let Yu=(()=>{class e extends Yt{constructor(t,i,r){super(),this.callSetDisabledState=r,this.submitted=!1,this._directives=new Set,this.ngSubmit=new Y,this.form=new Vg({},Og(t),xg(i))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(t){Ka.then(()=>{const i=this._findContainer(t.path);t.control=i.registerControl(t.name,t.control),Qa(t.control,t,this.callSetDisabledState),t.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(t)})}getControl(t){return this.form.get(t.path)}removeControl(t){Ka.then(()=>{const i=this._findContainer(t.path);i&&i.removeControl(t.name),this._directives.delete(t)})}addFormGroup(t){Ka.then(()=>{const i=this._findContainer(t.path),r=new Vg({});(function QC(e,n){Bg(e,n)})(r,t),i.registerControl(t.name,r),r.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(t){Ka.then(()=>{const i=this._findContainer(t.path);i&&i.removeControl(t.name)})}getFormGroup(t){return this.form.get(t.path)}updateModel(t,i){Ka.then(()=>{this.form.get(t.path).setValue(i)})}setValue(t){this.control.setValue(t)}onSubmit(t){return this.submitted=!0,function KC(e,n){e._syncPendingControls(),n.forEach(t=>{const i=t.control;"submit"===i.updateOn&&i._pendingChange&&(t.viewToModelUpdate(i._pendingValue),i._pendingChange=!1)})}(this.form,this._directives),this.ngSubmit.emit(t),"dialog"===t?.target?.method}onReset(){this.resetForm()}resetForm(t=void 0){this.form.reset(t),this.submitted=!1}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)}_findContainer(t){return t.pop(),t.length?this.form.get(t):this.form}static#e=this.\u0275fac=function(i){return new(i||e)(b(Ot,10),b(or,10),b(Fr,8))};static#t=this.\u0275dir=L({type:e,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(i,r){1&i&&Z("submit",function(s){return r.onSubmit(s)})("reset",function(){return r.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[Fe([pj]),Me]})}return e})();function eE(e,n){const t=e.indexOf(n);t>-1&&e.splice(t,1)}function tE(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e}const nE=class extends JC{constructor(n=null,t,i){super(Fg(t),Lg(i,t)),this.defaultValue=null,this._onChange=[],this._pendingChange=!1,this._applyFormState(n),this._setUpdateStrategy(t),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),Uu(t)&&(t.nonNullable||t.initialValueIsDefault)&&(this.defaultValue=tE(n)?n.value:n)}setValue(n,t={}){this.value=this._pendingValue=n,this._onChange.length&&!1!==t.emitModelToViewChange&&this._onChange.forEach(i=>i(this.value,!1!==t.emitViewToModelChange)),this.updateValueAndValidity(t)}patchValue(n,t={}){this.setValue(n,t)}reset(n=this.defaultValue,t={}){this._applyFormState(n),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1}_updateValue(){}_anyControls(n){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(n){this._onChange.push(n)}_unregisterOnChange(n){eE(this._onChange,n)}registerOnDisabledChange(n){this._onDisabledChange.push(n)}_unregisterOnDisabledChange(n){eE(this._onDisabledChange,n)}_forEachChild(n){}_syncPendingControls(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}_applyFormState(n){tE(n)?(this.value=this._pendingValue=n.value,n.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=n}},_j={provide:sr,useExisting:le(()=>Zu)},oE=(()=>Promise.resolve())();let Zu=(()=>{class e extends sr{constructor(t,i,r,o,s,a){super(),this._changeDetectorRef=s,this.callSetDisabledState=a,this.control=new nE,this._registered=!1,this.name="",this.update=new Y,this._parent=t,this._setValidators(i),this._setAsyncValidators(r),this.valueAccessor=function $g(e,n){if(!n)return null;let t,i,r;return Array.isArray(n),n.forEach(o=>{o.constructor===Ya?t=o:function fj(e){return Object.getPrototypeOf(e.constructor)===kr}(o)?i=o:r=o}),r||i||t||null}(0,o)}ngOnChanges(t){if(this._checkForErrors(),!this._registered||"name"in t){if(this._registered&&(this._checkName(),this.formDirective)){const i=t.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in t&&this._updateDisabled(t),function Hg(e,n){if(!e.hasOwnProperty("model"))return!1;const t=e.model;return!!t.isFirstChange()||!Object.is(n,t.currentValue)}(t,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(t){this.viewModel=t,this.update.emit(t)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!(!this.options||!this.options.standalone)}_setUpStandalone(){Qa(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._isStandalone()||this._checkParentType(),this._checkName()}_checkParentType(){}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()}_updateValue(t){oE.then(()=>{this.control.setValue(t,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(t){const i=t.isDisabled.currentValue,r=0!==i&&function os(e){return"boolean"==typeof e?e:null!=e&&"false"!==e}(i);oE.then(()=>{r&&!this.control.disabled?this.control.disable():!r&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(t){return this._parent?function Gu(e,n){return[...n.path,e]}(t,this._parent):[t]}static#e=this.\u0275fac=function(i){return new(i||e)(b(Yt,9),b(Ot,10),b(or,10),b(An,10),b(zn,8),b(Fr,8))};static#t=this.\u0275dir=L({type:e,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:["disabled","isDisabled"],model:["ngModel","model"],options:["ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],features:[Fe([_j]),Me,Mt]})}return e})(),sE=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275dir=L({type:e,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""]})}return e})();const vj={provide:An,useExisting:le(()=>Ug),multi:!0};let Ug=(()=>{class e extends kr{writeValue(t){this.setProperty("value",t??"")}registerOnChange(t){this.onChange=i=>{t(""==i?null:parseFloat(i))}}static#e=this.\u0275fac=function(){let t;return function(r){return(t||(t=st(e)))(r||e)}}();static#t=this.\u0275dir=L({type:e,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(i,r){1&i&&Z("input",function(s){return r.onChange(s.target.value)})("blur",function(){return r.onTouched()})},features:[Fe([vj]),Me]})}return e})(),aE=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})();const Gg=new z("NgModelWithFormControlWarning");function mE(e){return"number"==typeof e?e:parseFloat(e)}let Lr=(()=>{class e{constructor(){this._validator=Bu}ngOnChanges(t){if(this.inputName in t){const i=this.normalizeInput(t[this.inputName].currentValue);this._enabled=this.enabled(i),this._validator=this._enabled?this.createValidator(i):Bu,this._onChange&&this._onChange()}}validate(t){return this._validator(t)}registerOnValidatorChange(t){this._onChange=t}enabled(t){return null!=t}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275dir=L({type:e,features:[Mt]})}return e})();const Rj={provide:Ot,useExisting:le(()=>Jg),multi:!0};let Jg=(()=>{class e extends Lr{constructor(){super(...arguments),this.inputName="max",this.normalizeInput=t=>mE(t),this.createValidator=t=>function TC(e){return n=>{if(rr(n.value)||rr(e))return null;const t=parseFloat(n.value);return!isNaN(t)&&t>e?{max:{max:e,actual:n.value}}:null}}(t)}static#e=this.\u0275fac=function(){let t;return function(r){return(t||(t=st(e)))(r||e)}}();static#t=this.\u0275dir=L({type:e,selectors:[["input","type","number","max","","formControlName",""],["input","type","number","max","","formControl",""],["input","type","number","max","","ngModel",""]],hostVars:1,hostBindings:function(i,r){2&i&&Ie("max",r._enabled?r.max:null)},inputs:{max:"max"},features:[Fe([Rj]),Me]})}return e})();const Pj={provide:Ot,useExisting:le(()=>Xg),multi:!0};let Xg=(()=>{class e extends Lr{constructor(){super(...arguments),this.inputName="min",this.normalizeInput=t=>mE(t),this.createValidator=t=>function EC(e){return n=>{if(rr(n.value)||rr(e))return null;const t=parseFloat(n.value);return!isNaN(t)&&t{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({imports:[aE]})}return e})(),$j=(()=>{class e{static withConfig(t){return{ngModule:e,providers:[{provide:Fr,useValue:t.callSetDisabledState??Xa}]}}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({imports:[wE]})}return e})(),Uj=(()=>{class e{static withConfig(t){return{ngModule:e,providers:[{provide:Gg,useValue:t.warnOnNgModelWithFormControl??"always"},{provide:Fr,useValue:t.callSetDisabledState??Xa}]}}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({imports:[wE]})}return e})(),Ju=(()=>{class e{formatTransactionTime(t){const i=new Date(1e3*t);return"Invalid Date"===i.toString()?(console.error("Invalid Date Format:",t),"Invalid Date"):i.toLocaleDateString(void 0,{year:"numeric",month:"2-digit",day:"2-digit"})+", "+i.toLocaleTimeString()}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),Xu=(()=>{class e{getTransactionType(t){return 0===t.inputs.length&&0===t.outputs.length&&console.log("Encrypted Message"),0===t.inputs.length&&1===t.outputs.length&&0===t.outputs[0]?.value?"Message":0===t.inputs.length&&t.outputs.length>=1&&t.outputs[0]?.value>0?"Coinbase":t.inputs.length>0&&t.outputs.length>=1&&t.outputs[0]?.value>0?"Transfer":t.outputs.length>=2&&0===t.outputs[0]?.value?"Create Identity":(console.log("Unknown Transaction Type"),"Unknown Transaction Type")}isEncryptedMessageTransaction(t){return 0===t.inputs.length&&0===t.outputs.length}isMessageTransaction(t){return 0===t.inputs.length&&1===t.outputs.length&&0===t.outputs[0]?.value}isCoinbaseTransaction(t){return 0===t.inputs.length&&t.outputs.length>=1&&t.outputs[0]?.value>0}isTransferTransaction(t){return t.inputs.length>0&&t.outputs.length>=1&&t.outputs[0]?.value>0}isCreateIdentityTransaction(t){return t.outputs.length>=2&&0===t.outputs[0]?.value}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function Kg(...e){const n=Vs(e),t=Ul(e),{args:i,keys:r}=yC(e);if(0===i.length)return pt([],n);const o=new Ce(function zj(e,n,t=kn){return i=>{CE(n,()=>{const{length:r}=e,o=new Array(r);let s=r,a=r;for(let l=0;l{const c=pt(e[l],n);let u=!1;c.subscribe(Ve(i,d=>{o[l]=d,u||(u=!0,a--),a||i.next(t(o.slice()))},()=>{--s||i.complete()}))},i)},i)}}(i,n,r?s=>bC(r,s):kn));return t?o.pipe(Ng(t)):o}function CE(e,n,t){e?Di(t,e,n):n()}const Qu=Li(e=>function(){e(this),this.name="EmptyError",this.message="no elements in sequence"});function el(...e){return function Wj(){return lo(1)}()(pt(e,Vs(e)))}function EE(e){return new Ce(n=>{ft(e()).subscribe(n)})}function tl(e,n){const t=se(e)?e:()=>e,i=r=>r.error(t());return new Ce(n?r=>n.schedule(i,0,r):i)}function em(){return qe((e,n)=>{let t=null;e._refCount++;const i=Ve(n,void 0,void 0,void 0,()=>{if(!e||e._refCount<=0||0<--e._refCount)return void(t=null);const r=e._connection,o=t;t=null,r&&(!o||r===o)&&r.unsubscribe(),n.unsubscribe()});e.subscribe(i),i.closed||(t=e.connect())})}class TE extends Ce{constructor(n,t){super(),this.source=n,this.subjectFactory=t,this._subject=null,this._refCount=0,this._connection=null,Fs(n)&&(this.lift=n.lift)}_subscribe(n){return this.getSubject().subscribe(n)}getSubject(){const n=this._subject;return(!n||n.isStopped)&&(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;const{_connection:n}=this;this._subject=this._connection=null,n?.unsubscribe()}connect(){let n=this._connection;if(!n){n=this._connection=new nt;const t=this.getSubject();n.add(this.source.subscribe(Ve(t,void 0,()=>{this._teardown(),t.complete()},i=>{this._teardown(),t.error(i)},()=>this._teardown()))),n.closed&&(this._connection=null,n=nt.EMPTY)}return n}refCount(){return em()(this)}}function xt(e){return e<=0?()=>bn:qe((n,t)=>{let i=0;n.subscribe(Ve(t,r=>{++i<=e&&(t.next(r),e<=i&&t.complete())}))})}function Ku(e){return qe((n,t)=>{let i=!1;n.subscribe(Ve(t,r=>{i=!0,t.next(r)},()=>{i||t.next(e),t.complete()}))})}function ME(e=qj){return qe((n,t)=>{let i=!1;n.subscribe(Ve(t,r=>{i=!0,t.next(r)},()=>i?t.complete():t.error(e())))})}function qj(){return new Qu}function Vr(e,n){const t=arguments.length>=2;return i=>i.pipe(e?vt((r,o)=>e(r,o,i)):kn,xt(1),t?Ku(n):ME(()=>new Qu))}function wt(e,n,t){const i=se(e)||n||t?{next:e,error:n,complete:t}:e;return i?qe((r,o)=>{var s;null===(s=i.subscribe)||void 0===s||s.call(i);let a=!0;r.subscribe(Ve(o,l=>{var c;null===(c=i.next)||void 0===c||c.call(i,l),o.next(l)},()=>{var l;a=!1,null===(l=i.complete)||void 0===l||l.call(i),o.complete()},l=>{var c;a=!1,null===(c=i.error)||void 0===c||c.call(i,l),o.error(l)},()=>{var l,c;a&&(null===(l=i.unsubscribe)||void 0===l||l.call(i)),null===(c=i.finalize)||void 0===c||c.call(i)}))}):kn}function Br(e){return qe((n,t)=>{let o,i=null,r=!1;i=n.subscribe(Ve(t,void 0,void 0,s=>{o=ft(e(s,Br(e)(n))),i?(i.unsubscribe(),i=null,o.subscribe(t)):r=!0})),r&&(i.unsubscribe(),i=null,o.subscribe(t))})}function tm(e){return e<=0?()=>bn:qe((n,t)=>{let i=[];n.subscribe(Ve(t,r=>{i.push(r),e{for(const r of i)t.next(r);t.complete()},void 0,()=>{i=null}))})}function et(e){return qe((n,t)=>{ft(e).subscribe(Ve(t,()=>t.complete(),pr)),!t.closed&&n.subscribe(t)})}const oe="primary",nl=Symbol("RouteTitle");class Xj{constructor(n){this.params=n||{}}has(n){return Object.prototype.hasOwnProperty.call(this.params,n)}get(n){if(this.has(n)){const t=this.params[n];return Array.isArray(t)?t[0]:t}return null}getAll(n){if(this.has(n)){const t=this.params[n];return Array.isArray(t)?t:[t]}return[]}get keys(){return Object.keys(this.params)}}function fs(e){return new Xj(e)}function Qj(e,n,t){const i=t.path.split("/");if(i.length>e.length||"full"===t.pathMatch&&(n.hasChildren()||i.lengthi[o]===r)}return e===n}function OE(e){return e.length>0?e[e.length-1]:null}function ar(e){return function Gj(e){return!!e&&(e instanceof Ce||se(e.lift)&&se(e.subscribe))}(e)?e:Sa(e)?pt(Promise.resolve(e)):J(e)}const e3={exact:function RE(e,n,t){if(!jr(e.segments,n.segments)||!ed(e.segments,n.segments,t)||e.numberOfChildren!==n.numberOfChildren)return!1;for(const i in n.children)if(!e.children[i]||!RE(e.children[i],n.children[i],t))return!1;return!0},subset:PE},xE={exact:function t3(e,n){return gi(e,n)},subset:function n3(e,n){return Object.keys(n).length<=Object.keys(e).length&&Object.keys(n).every(t=>NE(e[t],n[t]))},ignored:()=>!0};function AE(e,n,t){return e3[t.paths](e.root,n.root,t.matrixParams)&&xE[t.queryParams](e.queryParams,n.queryParams)&&!("exact"===t.fragment&&e.fragment!==n.fragment)}function PE(e,n,t){return kE(e,n,n.segments,t)}function kE(e,n,t,i){if(e.segments.length>t.length){const r=e.segments.slice(0,t.length);return!(!jr(r,t)||n.hasChildren()||!ed(r,t,i))}if(e.segments.length===t.length){if(!jr(e.segments,t)||!ed(e.segments,t,i))return!1;for(const r in n.children)if(!e.children[r]||!PE(e.children[r],n.children[r],i))return!1;return!0}{const r=t.slice(0,e.segments.length),o=t.slice(e.segments.length);return!!(jr(e.segments,r)&&ed(e.segments,r,i)&&e.children[oe])&&kE(e.children[oe],n,o,i)}}function ed(e,n,t){return n.every((i,r)=>xE[t](e[r].parameters,i.parameters))}class hs{constructor(n=new ke([],{}),t={},i=null){this.root=n,this.queryParams=t,this.fragment=i}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=fs(this.queryParams)),this._queryParamMap}toString(){return o3.serialize(this)}}class ke{constructor(n,t){this.segments=n,this.children=t,this.parent=null,Object.values(t).forEach(i=>i.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return td(this)}}class il{constructor(n,t){this.path=n,this.parameters=t}get parameterMap(){return this._parameterMap||(this._parameterMap=fs(this.parameters)),this._parameterMap}toString(){return VE(this)}}function jr(e,n){return e.length===n.length&&e.every((t,i)=>t.path===n[i].path)}let rl=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:function(){return new nm},providedIn:"root"})}return e})();class nm{parse(n){const t=new m3(n);return new hs(t.parseRootSegment(),t.parseQueryParams(),t.parseFragment())}serialize(n){const t=`/${ol(n.root,!0)}`,i=function l3(e){const n=Object.keys(e).map(t=>{const i=e[t];return Array.isArray(i)?i.map(r=>`${nd(t)}=${nd(r)}`).join("&"):`${nd(t)}=${nd(i)}`}).filter(t=>!!t);return n.length?`?${n.join("&")}`:""}(n.queryParams);return`${t}${i}${"string"==typeof n.fragment?`#${function s3(e){return encodeURI(e)}(n.fragment)}`:""}`}}const o3=new nm;function td(e){return e.segments.map(n=>VE(n)).join("/")}function ol(e,n){if(!e.hasChildren())return td(e);if(n){const t=e.children[oe]?ol(e.children[oe],!1):"",i=[];return Object.entries(e.children).forEach(([r,o])=>{r!==oe&&i.push(`${r}:${ol(o,!1)}`)}),i.length>0?`${t}(${i.join("//")})`:t}{const t=function r3(e,n){let t=[];return Object.entries(e.children).forEach(([i,r])=>{i===oe&&(t=t.concat(n(r,i)))}),Object.entries(e.children).forEach(([i,r])=>{i!==oe&&(t=t.concat(n(r,i)))}),t}(e,(i,r)=>r===oe?[ol(e.children[oe],!1)]:[`${r}:${ol(i,!1)}`]);return 1===Object.keys(e.children).length&&null!=e.children[oe]?`${td(e)}/${t[0]}`:`${td(e)}/(${t.join("//")})`}}function FE(e){return encodeURIComponent(e).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function nd(e){return FE(e).replace(/%3B/gi,";")}function im(e){return FE(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function id(e){return decodeURIComponent(e)}function LE(e){return id(e.replace(/\+/g,"%20"))}function VE(e){return`${im(e.path)}${function a3(e){return Object.keys(e).map(n=>`;${im(n)}=${im(e[n])}`).join("")}(e.parameters)}`}const c3=/^[^\/()?;#]+/;function rm(e){const n=e.match(c3);return n?n[0]:""}const u3=/^[^\/()?;=#]+/,f3=/^[^=?&#]+/,p3=/^[^&#]+/;class m3{constructor(n){this.url=n,this.remaining=n}parseRootSegment(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new ke([],{}):new ke([],this.parseChildren())}parseQueryParams(){const n={};if(this.consumeOptional("?"))do{this.parseQueryParam(n)}while(this.consumeOptional("&"));return n}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(){if(""===this.remaining)return{};this.consumeOptional("/");const n=[];for(this.peekStartsWith("(")||n.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),n.push(this.parseSegment());let t={};this.peekStartsWith("/(")&&(this.capture("/"),t=this.parseParens(!0));let i={};return this.peekStartsWith("(")&&(i=this.parseParens(!1)),(n.length>0||Object.keys(t).length>0)&&(i[oe]=new ke(n,t)),i}parseSegment(){const n=rm(this.remaining);if(""===n&&this.peekStartsWith(";"))throw new R(4009,!1);return this.capture(n),new il(id(n),this.parseMatrixParams())}parseMatrixParams(){const n={};for(;this.consumeOptional(";");)this.parseParam(n);return n}parseParam(n){const t=function d3(e){const n=e.match(u3);return n?n[0]:""}(this.remaining);if(!t)return;this.capture(t);let i="";if(this.consumeOptional("=")){const r=rm(this.remaining);r&&(i=r,this.capture(i))}n[id(t)]=id(i)}parseQueryParam(n){const t=function h3(e){const n=e.match(f3);return n?n[0]:""}(this.remaining);if(!t)return;this.capture(t);let i="";if(this.consumeOptional("=")){const s=function g3(e){const n=e.match(p3);return n?n[0]:""}(this.remaining);s&&(i=s,this.capture(i))}const r=LE(t),o=LE(i);if(n.hasOwnProperty(r)){let s=n[r];Array.isArray(s)||(s=[s],n[r]=s),s.push(o)}else n[r]=o}parseParens(n){const t={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){const i=rm(this.remaining),r=this.remaining[i.length];if("/"!==r&&")"!==r&&";"!==r)throw new R(4010,!1);let o;i.indexOf(":")>-1?(o=i.slice(0,i.indexOf(":")),this.capture(o),this.capture(":")):n&&(o=oe);const s=this.parseChildren();t[o]=1===Object.keys(s).length?s[oe]:new ke([],s),this.consumeOptional("//")}return t}peekStartsWith(n){return this.remaining.startsWith(n)}consumeOptional(n){return!!this.peekStartsWith(n)&&(this.remaining=this.remaining.substring(n.length),!0)}capture(n){if(!this.consumeOptional(n))throw new R(4011,!1)}}function BE(e){return e.segments.length>0?new ke([],{[oe]:e}):e}function jE(e){const n={};for(const i of Object.keys(e.children)){const o=jE(e.children[i]);if(i===oe&&0===o.segments.length&&o.hasChildren())for(const[s,a]of Object.entries(o.children))n[s]=a;else(o.segments.length>0||o.hasChildren())&&(n[i]=o)}return function _3(e){if(1===e.numberOfChildren&&e.children[oe]){const n=e.children[oe];return new ke(e.segments.concat(n.segments),n.children)}return e}(new ke(e.segments,n))}function Hr(e){return e instanceof hs}function HE(e){let n;const r=BE(function t(o){const s={};for(const l of o.children){const c=t(l);s[l.outlet]=c}const a=new ke(o.url,s);return o===e&&(n=a),a}(e.root));return n??r}function $E(e,n,t,i){let r=e;for(;r.parent;)r=r.parent;if(0===n.length)return om(r,r,r,t,i);const o=function y3(e){if("string"==typeof e[0]&&1===e.length&&"/"===e[0])return new GE(!0,0,e);let n=0,t=!1;const i=e.reduce((r,o,s)=>{if("object"==typeof o&&null!=o){if(o.outlets){const a={};return Object.entries(o.outlets).forEach(([l,c])=>{a[l]="string"==typeof c?c.split("/"):c}),[...r,{outlets:a}]}if(o.segmentPath)return[...r,o.segmentPath]}return"string"!=typeof o?[...r,o]:0===s?(o.split("/").forEach((a,l)=>{0==l&&"."===a||(0==l&&""===a?t=!0:".."===a?n++:""!=a&&r.push(a))}),r):[...r,o]},[]);return new GE(t,n,i)}(n);if(o.toRoot())return om(r,r,new ke([],{}),t,i);const s=function b3(e,n,t){if(e.isAbsolute)return new od(n,!0,0);if(!t)return new od(n,!1,NaN);if(null===t.parent)return new od(t,!0,0);const i=rd(e.commands[0])?0:1;return function D3(e,n,t){let i=e,r=n,o=t;for(;o>r;){if(o-=r,i=i.parent,!i)throw new R(4005,!1);r=i.segments.length}return new od(i,!1,r-o)}(t,t.segments.length-1+i,e.numberOfDoubleDots)}(o,r,e),a=s.processChildren?al(s.segmentGroup,s.index,o.commands):zE(s.segmentGroup,s.index,o.commands);return om(r,s.segmentGroup,a,t,i)}function rd(e){return"object"==typeof e&&null!=e&&!e.outlets&&!e.segmentPath}function sl(e){return"object"==typeof e&&null!=e&&e.outlets}function om(e,n,t,i,r){let s,o={};i&&Object.entries(i).forEach(([l,c])=>{o[l]=Array.isArray(c)?c.map(u=>`${u}`):`${c}`}),s=e===n?t:UE(e,n,t);const a=BE(jE(s));return new hs(a,o,r)}function UE(e,n,t){const i={};return Object.entries(e.children).forEach(([r,o])=>{i[r]=o===n?t:UE(o,n,t)}),new ke(e.segments,i)}class GE{constructor(n,t,i){if(this.isAbsolute=n,this.numberOfDoubleDots=t,this.commands=i,n&&i.length>0&&rd(i[0]))throw new R(4003,!1);const r=i.find(sl);if(r&&r!==OE(i))throw new R(4004,!1)}toRoot(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}class od{constructor(n,t,i){this.segmentGroup=n,this.processChildren=t,this.index=i}}function zE(e,n,t){if(e||(e=new ke([],{})),0===e.segments.length&&e.hasChildren())return al(e,n,t);const i=function C3(e,n,t){let i=0,r=n;const o={match:!1,pathIndex:0,commandIndex:0};for(;r=t.length)return o;const s=e.segments[r],a=t[i];if(sl(a))break;const l=`${a}`,c=i0&&void 0===l)break;if(l&&c&&"object"==typeof c&&void 0===c.outlets){if(!qE(l,c,s))return o;i+=2}else{if(!qE(l,{},s))return o;i++}r++}return{match:!0,pathIndex:r,commandIndex:i}}(e,n,t),r=t.slice(i.commandIndex);if(i.match&&i.pathIndexo!==oe)&&e.children[oe]&&1===e.numberOfChildren&&0===e.children[oe].segments.length){const o=al(e.children[oe],n,t);return new ke(e.segments,o.children)}return Object.entries(i).forEach(([o,s])=>{"string"==typeof s&&(s=[s]),null!==s&&(r[o]=zE(e.children[o],n,s))}),Object.entries(e.children).forEach(([o,s])=>{void 0===i[o]&&(r[o]=s)}),new ke(e.segments,r)}}function sm(e,n,t){const i=e.segments.slice(0,n);let r=0;for(;r{"string"==typeof i&&(i=[i]),null!==i&&(n[t]=sm(new ke([],{}),0,i))}),n}function WE(e){const n={};return Object.entries(e).forEach(([t,i])=>n[t]=`${i}`),n}function qE(e,n,t){return e==t.path&&gi(n,t.parameters)}const ll="imperative";class mi{constructor(n,t){this.id=n,this.url=t}}class sd extends mi{constructor(n,t,i="imperative",r=null){super(n,t),this.type=0,this.navigationTrigger=i,this.restoredState=r}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}}class lr extends mi{constructor(n,t,i){super(n,t),this.urlAfterRedirects=i,this.type=1}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}}class cl extends mi{constructor(n,t,i,r){super(n,t),this.reason=i,this.code=r,this.type=2}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}}class ps extends mi{constructor(n,t,i,r){super(n,t),this.reason=i,this.code=r,this.type=16}}class ad extends mi{constructor(n,t,i,r){super(n,t),this.error=i,this.target=r,this.type=3}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}}class YE extends mi{constructor(n,t,i,r){super(n,t),this.urlAfterRedirects=i,this.state=r,this.type=4}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class T3 extends mi{constructor(n,t,i,r){super(n,t),this.urlAfterRedirects=i,this.state=r,this.type=7}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class S3 extends mi{constructor(n,t,i,r,o){super(n,t),this.urlAfterRedirects=i,this.state=r,this.shouldActivate=o,this.type=8}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}}class M3 extends mi{constructor(n,t,i,r){super(n,t),this.urlAfterRedirects=i,this.state=r,this.type=5}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class I3 extends mi{constructor(n,t,i,r){super(n,t),this.urlAfterRedirects=i,this.state=r,this.type=6}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class N3{constructor(n){this.route=n,this.type=9}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}}class O3{constructor(n){this.route=n,this.type=10}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}}class x3{constructor(n){this.snapshot=n,this.type=11}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class A3{constructor(n){this.snapshot=n,this.type=12}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class R3{constructor(n){this.snapshot=n,this.type=13}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class P3{constructor(n){this.snapshot=n,this.type=14}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class ZE{constructor(n,t,i){this.routerEvent=n,this.position=t,this.anchor=i,this.type=15}toString(){return`Scroll(anchor: '${this.anchor}', position: '${this.position?`${this.position[0]}, ${this.position[1]}`:null}')`}}class am{}class lm{constructor(n){this.url=n}}class k3{constructor(){this.outlet=null,this.route=null,this.injector=null,this.children=new ul,this.attachRef=null}}let ul=(()=>{class e{constructor(){this.contexts=new Map}onChildOutletCreated(t,i){const r=this.getOrCreateContext(t);r.outlet=i,this.contexts.set(t,r)}onChildOutletDestroyed(t){const i=this.getContext(t);i&&(i.outlet=null,i.attachRef=null)}onOutletDeactivated(){const t=this.contexts;return this.contexts=new Map,t}onOutletReAttached(t){this.contexts=t}getOrCreateContext(t){let i=this.getContext(t);return i||(i=new k3,this.contexts.set(t,i)),i}getContext(t){return this.contexts.get(t)||null}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();class JE{constructor(n){this._root=n}get root(){return this._root.value}parent(n){const t=this.pathFromRoot(n);return t.length>1?t[t.length-2]:null}children(n){const t=cm(n,this._root);return t?t.children.map(i=>i.value):[]}firstChild(n){const t=cm(n,this._root);return t&&t.children.length>0?t.children[0].value:null}siblings(n){const t=um(n,this._root);return t.length<2?[]:t[t.length-2].children.map(r=>r.value).filter(r=>r!==n)}pathFromRoot(n){return um(n,this._root).map(t=>t.value)}}function cm(e,n){if(e===n.value)return n;for(const t of n.children){const i=cm(e,t);if(i)return i}return null}function um(e,n){if(e===n.value)return[n];for(const t of n.children){const i=um(e,t);if(i.length)return i.unshift(n),i}return[]}class Pi{constructor(n,t){this.value=n,this.children=t}toString(){return`TreeNode(${this.value})`}}function gs(e){const n={};return e&&e.children.forEach(t=>n[t.value.outlet]=t),n}class XE extends JE{constructor(n,t){super(n),this.snapshot=t,dm(this,n)}toString(){return this.snapshot.toString()}}function QE(e,n){const t=function F3(e,n){const s=new ld([],{},{},"",{},oe,n,null,{});return new eT("",new Pi(s,[]))}(0,n),i=new Dn([new il("",{})]),r=new Dn({}),o=new Dn({}),s=new Dn({}),a=new Dn(""),l=new $r(i,r,s,a,o,oe,n,t.root);return l.snapshot=t.root,new XE(new Pi(l,[]),t)}class $r{constructor(n,t,i,r,o,s,a,l){this.urlSubject=n,this.paramsSubject=t,this.queryParamsSubject=i,this.fragmentSubject=r,this.dataSubject=o,this.outlet=s,this.component=a,this._futureSnapshot=l,this.title=this.dataSubject?.pipe(ae(c=>c[nl]))??J(void 0),this.url=n,this.params=t,this.queryParams=i,this.fragment=r,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=this.params.pipe(ae(n=>fs(n)))),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe(ae(n=>fs(n)))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}}function KE(e,n="emptyOnly"){const t=e.pathFromRoot;let i=0;if("always"!==n)for(i=t.length-1;i>=1;){const r=t[i],o=t[i-1];if(r.routeConfig&&""===r.routeConfig.path)i--;else{if(o.component)break;i--}}return function L3(e){return e.reduce((n,t)=>({params:{...n.params,...t.params},data:{...n.data,...t.data},resolve:{...t.data,...n.resolve,...t.routeConfig?.data,...t._resolvedData}}),{params:{},data:{},resolve:{}})}(t.slice(i))}class ld{get title(){return this.data?.[nl]}constructor(n,t,i,r,o,s,a,l,c){this.url=n,this.params=t,this.queryParams=i,this.fragment=r,this.data=o,this.outlet=s,this.component=a,this.routeConfig=l,this._resolve=c}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=fs(this.params)),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=fs(this.queryParams)),this._queryParamMap}toString(){return`Route(url:'${this.url.map(i=>i.toString()).join("/")}', path:'${this.routeConfig?this.routeConfig.path:""}')`}}class eT extends JE{constructor(n,t){super(t),this.url=n,dm(this,t)}toString(){return tT(this._root)}}function dm(e,n){n.value._routerState=e,n.children.forEach(t=>dm(e,t))}function tT(e){const n=e.children.length>0?` { ${e.children.map(tT).join(", ")} } `:"";return`${e.value}${n}`}function fm(e){if(e.snapshot){const n=e.snapshot,t=e._futureSnapshot;e.snapshot=t,gi(n.queryParams,t.queryParams)||e.queryParamsSubject.next(t.queryParams),n.fragment!==t.fragment&&e.fragmentSubject.next(t.fragment),gi(n.params,t.params)||e.paramsSubject.next(t.params),function Kj(e,n){if(e.length!==n.length)return!1;for(let t=0;tgi(t.parameters,n[i].parameters))}(e.url,n.url);return t&&!(!e.parent!=!n.parent)&&(!e.parent||hm(e.parent,n.parent))}let nT=(()=>{class e{constructor(){this.activated=null,this._activatedRoute=null,this.name=oe,this.activateEvents=new Y,this.deactivateEvents=new Y,this.attachEvents=new Y,this.detachEvents=new Y,this.parentContexts=F(ul),this.location=F(Nn),this.changeDetector=F(zn),this.environmentInjector=F(zt),this.inputBinder=F(cd,{optional:!0}),this.supportsBindingToComponentInputs=!0}get activatedComponentRef(){return this.activated}ngOnChanges(t){if(t.name){const{firstChange:i,previousValue:r}=t.name;if(i)return;this.isTrackedInParentContexts(r)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(r)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(t){return this.parentContexts.getContext(t)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;const t=this.parentContexts.getContext(this.name);t?.route&&(t.attachRef?this.attach(t.attachRef,t.route):this.activateWith(t.route,t.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new R(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new R(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new R(4012,!1);this.location.detach();const t=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(t.instance),t}attach(t,i){this.activated=t,this._activatedRoute=i,this.location.insert(t.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(t.instance)}deactivate(){if(this.activated){const t=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(t)}}activateWith(t,i){if(this.isActivated)throw new R(4013,!1);this._activatedRoute=t;const r=this.location,s=t.snapshot.component,a=this.parentContexts.getOrCreateContext(this.name).children,l=new V3(t,a,r.injector);this.activated=r.createComponent(s,{index:r.length,injector:l,environmentInjector:i??this.environmentInjector}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275dir=L({type:e,selectors:[["router-outlet"]],inputs:{name:"name"},outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],standalone:!0,features:[Mt]})}return e})();class V3{constructor(n,t,i){this.route=n,this.childContexts=t,this.parent=i}get(n,t){return n===$r?this.route:n===ul?this.childContexts:this.parent.get(n,t)}}const cd=new z("");let iT=(()=>{class e{constructor(){this.outletDataSubscriptions=new Map}bindActivatedRouteToOutletComponent(t){this.unsubscribeFromRouteData(t),this.subscribeToRouteData(t)}unsubscribeFromRouteData(t){this.outletDataSubscriptions.get(t)?.unsubscribe(),this.outletDataSubscriptions.delete(t)}subscribeToRouteData(t){const{activatedRoute:i}=t,r=Kg([i.queryParams,i.params,i.data]).pipe(wn(([o,s,a],l)=>(a={...o,...s,...a},0===l?J(a):Promise.resolve(a)))).subscribe(o=>{if(!t.isActivated||!t.activatedComponentRef||t.activatedRoute!==i||null===i.component)return void this.unsubscribeFromRouteData(t);const s=function UF(e){const n=he(e);if(!n)return null;const t=new ba(n);return{get selector(){return t.selector},get type(){return t.componentType},get inputs(){return t.inputs},get outputs(){return t.outputs},get ngContentSelectors(){return t.ngContentSelectors},get isStandalone(){return n.standalone},get isSignal(){return n.signals}}}(i.component);if(s)for(const{templateName:a}of s.inputs)t.activatedComponentRef.setInput(a,o[a]);else this.unsubscribeFromRouteData(t)});this.outletDataSubscriptions.set(t,r)}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();function dl(e,n,t){if(t&&e.shouldReuseRoute(n.value,t.value.snapshot)){const i=t.value;i._futureSnapshot=n.value;const r=function j3(e,n,t){return n.children.map(i=>{for(const r of t.children)if(e.shouldReuseRoute(i.value,r.value.snapshot))return dl(e,i,r);return dl(e,i)})}(e,n,t);return new Pi(i,r)}{if(e.shouldAttach(n.value)){const o=e.retrieve(n.value);if(null!==o){const s=o.route;return s.value._futureSnapshot=n.value,s.children=n.children.map(a=>dl(e,a)),s}}const i=function H3(e){return new $r(new Dn(e.url),new Dn(e.params),new Dn(e.queryParams),new Dn(e.fragment),new Dn(e.data),e.outlet,e.component,e)}(n.value),r=n.children.map(o=>dl(e,o));return new Pi(i,r)}}const pm="ngNavigationCancelingError";function rT(e,n){const{redirectTo:t,navigationBehaviorOptions:i}=Hr(n)?{redirectTo:n,navigationBehaviorOptions:void 0}:n,r=oT(!1,0,n);return r.url=t,r.navigationBehaviorOptions=i,r}function oT(e,n,t){const i=new Error("NavigationCancelingError: "+(e||""));return i[pm]=!0,i.cancellationCode=n,t&&(i.url=t),i}function sT(e){return e&&e[pm]}let aT=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275cmp=kt({type:e,selectors:[["ng-component"]],standalone:!0,features:[In],decls:1,vars:0,template:function(i,r){1&i&&Ae(0,"router-outlet")},dependencies:[nT],encapsulation:2})}return e})();function gm(e){const n=e.children&&e.children.map(gm),t=n?{...e,children:n}:{...e};return!t.component&&!t.loadComponent&&(n||t.loadChildren)&&t.outlet&&t.outlet!==oe&&(t.component=aT),t}function Jn(e){return e.outlet||oe}function fl(e){if(!e)return null;if(e.routeConfig?._injector)return e.routeConfig._injector;for(let n=e.parent;n;n=n.parent){const t=n.routeConfig;if(t?._loadedInjector)return t._loadedInjector;if(t?._injector)return t._injector}return null}class Z3{constructor(n,t,i,r,o){this.routeReuseStrategy=n,this.futureState=t,this.currState=i,this.forwardEvent=r,this.inputBindingEnabled=o}activate(n){const t=this.futureState._root,i=this.currState?this.currState._root:null;this.deactivateChildRoutes(t,i,n),fm(this.futureState.root),this.activateChildRoutes(t,i,n)}deactivateChildRoutes(n,t,i){const r=gs(t);n.children.forEach(o=>{const s=o.value.outlet;this.deactivateRoutes(o,r[s],i),delete r[s]}),Object.values(r).forEach(o=>{this.deactivateRouteAndItsChildren(o,i)})}deactivateRoutes(n,t,i){const r=n.value,o=t?t.value:null;if(r===o)if(r.component){const s=i.getContext(r.outlet);s&&this.deactivateChildRoutes(n,t,s.children)}else this.deactivateChildRoutes(n,t,i);else o&&this.deactivateRouteAndItsChildren(t,i)}deactivateRouteAndItsChildren(n,t){n.value.component&&this.routeReuseStrategy.shouldDetach(n.value.snapshot)?this.detachAndStoreRouteSubtree(n,t):this.deactivateRouteAndOutlet(n,t)}detachAndStoreRouteSubtree(n,t){const i=t.getContext(n.value.outlet),r=i&&n.value.component?i.children:t,o=gs(n);for(const s of Object.keys(o))this.deactivateRouteAndItsChildren(o[s],r);if(i&&i.outlet){const s=i.outlet.detach(),a=i.children.onOutletDeactivated();this.routeReuseStrategy.store(n.value.snapshot,{componentRef:s,route:n,contexts:a})}}deactivateRouteAndOutlet(n,t){const i=t.getContext(n.value.outlet),r=i&&n.value.component?i.children:t,o=gs(n);for(const s of Object.keys(o))this.deactivateRouteAndItsChildren(o[s],r);i&&(i.outlet&&(i.outlet.deactivate(),i.children.onOutletDeactivated()),i.attachRef=null,i.route=null)}activateChildRoutes(n,t,i){const r=gs(t);n.children.forEach(o=>{this.activateRoutes(o,r[o.value.outlet],i),this.forwardEvent(new P3(o.value.snapshot))}),n.children.length&&this.forwardEvent(new A3(n.value.snapshot))}activateRoutes(n,t,i){const r=n.value,o=t?t.value:null;if(fm(r),r===o)if(r.component){const s=i.getOrCreateContext(r.outlet);this.activateChildRoutes(n,t,s.children)}else this.activateChildRoutes(n,t,i);else if(r.component){const s=i.getOrCreateContext(r.outlet);if(this.routeReuseStrategy.shouldAttach(r.snapshot)){const a=this.routeReuseStrategy.retrieve(r.snapshot);this.routeReuseStrategy.store(r.snapshot,null),s.children.onOutletReAttached(a.contexts),s.attachRef=a.componentRef,s.route=a.route.value,s.outlet&&s.outlet.attach(a.componentRef,a.route.value),fm(a.route.value),this.activateChildRoutes(n,null,s.children)}else{const a=fl(r.snapshot);s.attachRef=null,s.route=r,s.injector=a,s.outlet&&s.outlet.activateWith(r,s.injector),this.activateChildRoutes(n,null,s.children)}}else this.activateChildRoutes(n,null,i)}}class lT{constructor(n){this.path=n,this.route=this.path[this.path.length-1]}}class ud{constructor(n,t){this.component=n,this.route=t}}function J3(e,n,t){const i=e._root;return hl(i,n?n._root:null,t,[i.value])}function ms(e,n){const t=Symbol(),i=n.get(e,t);return i===t?"function"!=typeof e||function aI(e){return null!==Wl(e)}(e)?n.get(e):e:i}function hl(e,n,t,i,r={canDeactivateChecks:[],canActivateChecks:[]}){const o=gs(n);return e.children.forEach(s=>{(function Q3(e,n,t,i,r={canDeactivateChecks:[],canActivateChecks:[]}){const o=e.value,s=n?n.value:null,a=t?t.getContext(e.value.outlet):null;if(s&&o.routeConfig===s.routeConfig){const l=function K3(e,n,t){if("function"==typeof t)return t(e,n);switch(t){case"pathParamsChange":return!jr(e.url,n.url);case"pathParamsOrQueryParamsChange":return!jr(e.url,n.url)||!gi(e.queryParams,n.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!hm(e,n)||!gi(e.queryParams,n.queryParams);default:return!hm(e,n)}}(s,o,o.routeConfig.runGuardsAndResolvers);l?r.canActivateChecks.push(new lT(i)):(o.data=s.data,o._resolvedData=s._resolvedData),hl(e,n,o.component?a?a.children:null:t,i,r),l&&a&&a.outlet&&a.outlet.isActivated&&r.canDeactivateChecks.push(new ud(a.outlet.component,s))}else s&&pl(n,a,r),r.canActivateChecks.push(new lT(i)),hl(e,null,o.component?a?a.children:null:t,i,r)})(s,o[s.value.outlet],t,i.concat([s.value]),r),delete o[s.value.outlet]}),Object.entries(o).forEach(([s,a])=>pl(a,t.getContext(s),r)),r}function pl(e,n,t){const i=gs(e),r=e.value;Object.entries(i).forEach(([o,s])=>{pl(s,r.component?n?n.children.getContext(o):null:n,t)}),t.canDeactivateChecks.push(new ud(r.component&&n&&n.outlet&&n.outlet.isActivated?n.outlet.component:null,r))}function gl(e){return"function"==typeof e}function cT(e){return e instanceof Qu||"EmptyError"===e?.name}const dd=Symbol("INITIAL_VALUE");function _s(){return wn(e=>Kg(e.map(n=>n.pipe(xt(1),function SE(...e){const n=Vs(e);return qe((t,i)=>{(n?el(e,t,n):el(e,t)).subscribe(i)})}(dd)))).pipe(ae(n=>{for(const t of n)if(!0!==t){if(t===dd)return dd;if(!1===t||t instanceof hs)return t}return!0}),vt(n=>n!==dd),xt(1)))}function uT(e){return function Fl(...e){return Ll(e)}(wt(n=>{if(Hr(n))throw rT(0,n)}),ae(n=>!0===n))}class fd{constructor(n){this.segmentGroup=n||null}}class dT{constructor(n){this.urlTree=n}}function vs(e){return tl(new fd(e))}function fT(e){return tl(new dT(e))}class yH{constructor(n,t){this.urlSerializer=n,this.urlTree=t}noMatchError(n){return new R(4002,!1)}lineralizeSegments(n,t){let i=[],r=t.root;for(;;){if(i=i.concat(r.segments),0===r.numberOfChildren)return J(i);if(r.numberOfChildren>1||!r.children[oe])return tl(new R(4e3,!1));r=r.children[oe]}}applyRedirectCommands(n,t,i){return this.applyRedirectCreateUrlTree(t,this.urlSerializer.parse(t),n,i)}applyRedirectCreateUrlTree(n,t,i,r){const o=this.createSegmentGroup(n,t.root,i,r);return new hs(o,this.createQueryParams(t.queryParams,this.urlTree.queryParams),t.fragment)}createQueryParams(n,t){const i={};return Object.entries(n).forEach(([r,o])=>{if("string"==typeof o&&o.startsWith(":")){const a=o.substring(1);i[r]=t[a]}else i[r]=o}),i}createSegmentGroup(n,t,i,r){const o=this.createSegments(n,t.segments,i,r);let s={};return Object.entries(t.children).forEach(([a,l])=>{s[a]=this.createSegmentGroup(n,l,i,r)}),new ke(o,s)}createSegments(n,t,i,r){return t.map(o=>o.path.startsWith(":")?this.findPosParam(n,o,r):this.findOrReturn(o,i))}findPosParam(n,t,i){const r=i[t.path.substring(1)];if(!r)throw new R(4001,!1);return r}findOrReturn(n,t){let i=0;for(const r of t){if(r.path===n.path)return t.splice(i),r;i++}return n}}const mm={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function bH(e,n,t,i,r){const o=_m(e,n,t);return o.matched?(i=function U3(e,n){return e.providers&&!e._injector&&(e._injector=yp(e.providers,n,`Route: ${e.path}`)),e._injector??n}(n,i),function mH(e,n,t,i){const r=n.canMatch;return r&&0!==r.length?J(r.map(s=>{const a=ms(s,e);return ar(function oH(e){return e&&gl(e.canMatch)}(a)?a.canMatch(n,t):e.runInContext(()=>a(n,t)))})).pipe(_s(),uT()):J(!0)}(i,n,t).pipe(ae(s=>!0===s?o:{...mm}))):J(o)}function _m(e,n,t){if(""===n.path)return"full"===n.pathMatch&&(e.hasChildren()||t.length>0)?{...mm}:{matched:!0,consumedSegments:[],remainingSegments:t,parameters:{},positionalParamSegments:{}};const r=(n.matcher||Qj)(t,e,n);if(!r)return{...mm};const o={};Object.entries(r.posParams??{}).forEach(([a,l])=>{o[a]=l.path});const s=r.consumed.length>0?{...o,...r.consumed[r.consumed.length-1].parameters}:o;return{matched:!0,consumedSegments:r.consumed,remainingSegments:t.slice(r.consumed.length),parameters:s,positionalParamSegments:r.posParams??{}}}function hT(e,n,t,i){return t.length>0&&function CH(e,n,t){return t.some(i=>hd(e,n,i)&&Jn(i)!==oe)}(e,t,i)?{segmentGroup:new ke(n,wH(i,new ke(t,e.children))),slicedSegments:[]}:0===t.length&&function EH(e,n,t){return t.some(i=>hd(e,n,i))}(e,t,i)?{segmentGroup:new ke(e.segments,DH(e,0,t,i,e.children)),slicedSegments:t}:{segmentGroup:new ke(e.segments,e.children),slicedSegments:t}}function DH(e,n,t,i,r){const o={};for(const s of i)if(hd(e,t,s)&&!r[Jn(s)]){const a=new ke([],{});o[Jn(s)]=a}return{...r,...o}}function wH(e,n){const t={};t[oe]=n;for(const i of e)if(""===i.path&&Jn(i)!==oe){const r=new ke([],{});t[Jn(i)]=r}return t}function hd(e,n,t){return(!(e.hasChildren()||n.length>0)||"full"!==t.pathMatch)&&""===t.path}class IH{constructor(n,t,i,r,o,s,a){this.injector=n,this.configLoader=t,this.rootComponentType=i,this.config=r,this.urlTree=o,this.paramsInheritanceStrategy=s,this.urlSerializer=a,this.allowRedirects=!0,this.applyRedirects=new yH(this.urlSerializer,this.urlTree)}noMatchError(n){return new R(4002,!1)}recognize(){const n=hT(this.urlTree.root,[],[],this.config).segmentGroup;return this.processSegmentGroup(this.injector,this.config,n,oe).pipe(Br(t=>{if(t instanceof dT)return this.allowRedirects=!1,this.urlTree=t.urlTree,this.match(t.urlTree);throw t instanceof fd?this.noMatchError(t):t}),ae(t=>{const i=new ld([],Object.freeze({}),Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,{},oe,this.rootComponentType,null,{}),r=new Pi(i,t),o=new eT("",r),s=function v3(e,n,t=null,i=null){return $E(HE(e),n,t,i)}(i,[],this.urlTree.queryParams,this.urlTree.fragment);return s.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(s),this.inheritParamsAndData(o._root),{state:o,tree:s}}))}match(n){return this.processSegmentGroup(this.injector,this.config,n.root,oe).pipe(Br(i=>{throw i instanceof fd?this.noMatchError(i):i}))}inheritParamsAndData(n){const t=n.value,i=KE(t,this.paramsInheritanceStrategy);t.params=Object.freeze(i.params),t.data=Object.freeze(i.data),n.children.forEach(r=>this.inheritParamsAndData(r))}processSegmentGroup(n,t,i,r){return 0===i.segments.length&&i.hasChildren()?this.processChildren(n,t,i):this.processSegment(n,t,i,i.segments,r,!0)}processChildren(n,t,i){const r=[];for(const o of Object.keys(i.children))"primary"===o?r.unshift(o):r.push(o);return pt(r).pipe(ls(o=>{const s=i.children[o],a=function q3(e,n){const t=e.filter(i=>Jn(i)===n);return t.push(...e.filter(i=>Jn(i)!==n)),t}(t,o);return this.processSegmentGroup(n,a,s,o)}),function Zj(e,n){return qe(function Yj(e,n,t,i,r){return(o,s)=>{let a=t,l=n,c=0;o.subscribe(Ve(s,u=>{const d=c++;l=a?e(l,u,d):(a=!0,u),i&&s.next(l)},r&&(()=>{a&&s.next(l),s.complete()})))}}(e,n,arguments.length>=2,!0))}((o,s)=>(o.push(...s),o)),Ku(null),function Jj(e,n){const t=arguments.length>=2;return i=>i.pipe(e?vt((r,o)=>e(r,o,i)):kn,tm(1),t?Ku(n):ME(()=>new Qu))}(),ht(o=>{if(null===o)return vs(i);const s=pT(o);return function NH(e){e.sort((n,t)=>n.value.outlet===oe?-1:t.value.outlet===oe?1:n.value.outlet.localeCompare(t.value.outlet))}(s),J(s)}))}processSegment(n,t,i,r,o,s){return pt(t).pipe(ls(a=>this.processSegmentAgainstRoute(a._injector??n,t,a,i,r,o,s).pipe(Br(l=>{if(l instanceof fd)return J(null);throw l}))),Vr(a=>!!a),Br(a=>{if(cT(a))return function SH(e,n,t){return 0===n.length&&!e.children[t]}(i,r,o)?J([]):vs(i);throw a}))}processSegmentAgainstRoute(n,t,i,r,o,s,a){return function TH(e,n,t,i){return!!(Jn(e)===i||i!==oe&&hd(n,t,e))&&("**"===e.path||_m(n,e,t).matched)}(i,r,o,s)?void 0===i.redirectTo?this.matchSegmentAgainstRoute(n,r,i,o,s,a):a&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(n,r,t,i,o,s):vs(r):vs(r)}expandSegmentAgainstRouteUsingRedirect(n,t,i,r,o,s){return"**"===r.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(n,i,r,s):this.expandRegularSegmentAgainstRouteUsingRedirect(n,t,i,r,o,s)}expandWildCardWithParamsAgainstRouteUsingRedirect(n,t,i,r){const o=this.applyRedirects.applyRedirectCommands([],i.redirectTo,{});return i.redirectTo.startsWith("/")?fT(o):this.applyRedirects.lineralizeSegments(i,o).pipe(ht(s=>{const a=new ke(s,{});return this.processSegment(n,t,a,s,r,!1)}))}expandRegularSegmentAgainstRouteUsingRedirect(n,t,i,r,o,s){const{matched:a,consumedSegments:l,remainingSegments:c,positionalParamSegments:u}=_m(t,r,o);if(!a)return vs(t);const d=this.applyRedirects.applyRedirectCommands(l,r.redirectTo,u);return r.redirectTo.startsWith("/")?fT(d):this.applyRedirects.lineralizeSegments(r,d).pipe(ht(h=>this.processSegment(n,i,t,h.concat(c),s,!1)))}matchSegmentAgainstRoute(n,t,i,r,o,s){let a;if("**"===i.path){const l=r.length>0?OE(r).parameters:{};a=J({snapshot:new ld(r,l,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,gT(i),Jn(i),i.component??i._loadedComponent??null,i,mT(i)),consumedSegments:[],remainingSegments:[]}),t.children={}}else a=bH(t,i,r,n).pipe(ae(({matched:l,consumedSegments:c,remainingSegments:u,parameters:d})=>l?{snapshot:new ld(c,d,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,gT(i),Jn(i),i.component??i._loadedComponent??null,i,mT(i)),consumedSegments:c,remainingSegments:u}:null));return a.pipe(wn(l=>null===l?vs(t):this.getChildConfig(n=i._injector??n,i,r).pipe(wn(({routes:c})=>{const u=i._loadedInjector??n,{snapshot:d,consumedSegments:h,remainingSegments:_}=l,{segmentGroup:v,slicedSegments:y}=hT(t,h,_,c);if(0===y.length&&v.hasChildren())return this.processChildren(u,c,v).pipe(ae(M=>null===M?null:[new Pi(d,M)]));if(0===c.length&&0===y.length)return J([new Pi(d,[])]);const D=Jn(i)===o;return this.processSegment(u,c,v,y,D?oe:o,!0).pipe(ae(M=>[new Pi(d,M)]))}))))}getChildConfig(n,t,i){return t.children?J({routes:t.children,injector:n}):t.loadChildren?void 0!==t._loadedRoutes?J({routes:t._loadedRoutes,injector:t._loadedInjector}):function gH(e,n,t,i){const r=n.canLoad;return void 0===r||0===r.length?J(!0):J(r.map(s=>{const a=ms(s,e);return ar(function tH(e){return e&&gl(e.canLoad)}(a)?a.canLoad(n,t):e.runInContext(()=>a(n,t)))})).pipe(_s(),uT())}(n,t,i).pipe(ht(r=>r?this.configLoader.loadChildren(n,t).pipe(wt(o=>{t._loadedRoutes=o.routes,t._loadedInjector=o.injector})):function vH(e){return tl(oT(!1,3))}())):J({routes:[],injector:n})}}function OH(e){const n=e.value.routeConfig;return n&&""===n.path}function pT(e){const n=[],t=new Set;for(const i of e){if(!OH(i)){n.push(i);continue}const r=n.find(o=>i.value.routeConfig===o.value.routeConfig);void 0!==r?(r.children.push(...i.children),t.add(r)):n.push(i)}for(const i of t){const r=pT(i.children);n.push(new Pi(i.value,r))}return n.filter(i=>!t.has(i))}function gT(e){return e.data||{}}function mT(e){return e.resolve||{}}function AH(e,n){return ht(t=>{const{targetSnapshot:i,guards:{canActivateChecks:r}}=t;if(!r.length)return J(t);let o=0;return pt(r).pipe(ls(s=>function RH(e,n,t,i){const r=e.routeConfig,o=e._resolve;return void 0!==r?.title&&!_T(r)&&(o[nl]=r.title),function PH(e,n,t,i){const r=function kH(e){return[...Object.keys(e),...Object.getOwnPropertySymbols(e)]}(e);if(0===r.length)return J({});const o={};return pt(r).pipe(ht(s=>function FH(e,n,t,i){const r=fl(n)??i,o=ms(e,r);return ar(o.resolve?o.resolve(n,t):r.runInContext(()=>o(n,t)))}(e[s],n,t,i).pipe(Vr(),wt(a=>{o[s]=a}))),tm(1),function IE(e){return ae(()=>e)}(o),Br(s=>cT(s)?bn:tl(s)))}(o,e,n,i).pipe(ae(s=>(e._resolvedData=s,e.data=KE(e,t).resolve,r&&_T(r)&&(e.data[nl]=r.title),null)))}(s.route,i,e,n)),wt(()=>o++),tm(1),ht(s=>o===r.length?J(t):bn))})}function _T(e){return"string"==typeof e.title||null===e.title}function vm(e){return wn(n=>{const t=e(n);return t?pt(t).pipe(ae(()=>n)):J(n)})}const ys=new z("ROUTES");let ym=(()=>{class e{constructor(){this.componentLoaders=new WeakMap,this.childrenLoaders=new WeakMap,this.compiler=F(xD)}loadComponent(t){if(this.componentLoaders.get(t))return this.componentLoaders.get(t);if(t._loadedComponent)return J(t._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(t);const i=ar(t.loadComponent()).pipe(ae(vT),wt(o=>{this.onLoadEndListener&&this.onLoadEndListener(t),t._loadedComponent=o}),Ga(()=>{this.componentLoaders.delete(t)})),r=new TE(i,()=>new Ee).pipe(em());return this.componentLoaders.set(t,r),r}loadChildren(t,i){if(this.childrenLoaders.get(i))return this.childrenLoaders.get(i);if(i._loadedRoutes)return J({routes:i._loadedRoutes,injector:i._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(i);const o=function LH(e,n,t,i){return ar(e.loadChildren()).pipe(ae(vT),ht(r=>r instanceof Hb||Array.isArray(r)?J(r):pt(n.compileModuleAsync(r))),ae(r=>{i&&i(e);let o,s,a=!1;return Array.isArray(r)?(s=r,!0):(o=r.create(t).injector,s=o.get(ys,[],{optional:!0,self:!0}).flat()),{routes:s.map(gm),injector:o}}))}(i,this.compiler,t,this.onLoadEndListener).pipe(Ga(()=>{this.childrenLoaders.delete(i)})),s=new TE(o,()=>new Ee).pipe(em());return this.childrenLoaders.set(i,s),s}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function vT(e){return function VH(e){return e&&"object"==typeof e&&"default"in e}(e)?e.default:e}let pd=(()=>{class e{get hasRequestedNavigation(){return 0!==this.navigationId}constructor(){this.currentNavigation=null,this.currentTransition=null,this.lastSuccessfulNavigation=null,this.events=new Ee,this.transitionAbortSubject=new Ee,this.configLoader=F(ym),this.environmentInjector=F(zt),this.urlSerializer=F(rl),this.rootContexts=F(ul),this.inputBindingEnabled=null!==F(cd,{optional:!0}),this.navigationId=0,this.afterPreactivation=()=>J(void 0),this.rootComponentType=null,this.configLoader.onLoadEndListener=r=>this.events.next(new O3(r)),this.configLoader.onLoadStartListener=r=>this.events.next(new N3(r))}complete(){this.transitions?.complete()}handleNavigationRequest(t){const i=++this.navigationId;this.transitions?.next({...this.transitions.value,...t,id:i})}setupNavigations(t,i,r){return this.transitions=new Dn({id:0,currentUrlTree:i,currentRawUrl:i,currentBrowserUrl:i,extractedUrl:t.urlHandlingStrategy.extract(i),urlAfterRedirects:t.urlHandlingStrategy.extract(i),rawUrl:i,extras:{},resolve:null,reject:null,promise:Promise.resolve(!0),source:ll,restoredState:null,currentSnapshot:r.snapshot,targetSnapshot:null,currentRouterState:r,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null}),this.transitions.pipe(vt(o=>0!==o.id),ae(o=>({...o,extractedUrl:t.urlHandlingStrategy.extract(o.rawUrl)})),wn(o=>{this.currentTransition=o;let s=!1,a=!1;return J(o).pipe(wt(l=>{this.currentNavigation={id:l.id,initialUrl:l.rawUrl,extractedUrl:l.extractedUrl,trigger:l.source,extras:l.extras,previousNavigation:this.lastSuccessfulNavigation?{...this.lastSuccessfulNavigation,previousNavigation:null}:null}}),wn(l=>{const c=l.currentBrowserUrl.toString(),u=!t.navigated||l.extractedUrl.toString()!==c||c!==l.currentUrlTree.toString();if(!u&&"reload"!==(l.extras.onSameUrlNavigation??t.onSameUrlNavigation)){const h="";return this.events.next(new ps(l.id,this.urlSerializer.serialize(l.rawUrl),h,0)),l.resolve(null),bn}if(t.urlHandlingStrategy.shouldProcessUrl(l.rawUrl))return J(l).pipe(wn(h=>{const _=this.transitions?.getValue();return this.events.next(new sd(h.id,this.urlSerializer.serialize(h.extractedUrl),h.source,h.restoredState)),_!==this.transitions?.getValue()?bn:Promise.resolve(h)}),function xH(e,n,t,i,r,o){return ht(s=>function MH(e,n,t,i,r,o,s="emptyOnly"){return new IH(e,n,t,i,r,s,o).recognize()}(e,n,t,i,s.extractedUrl,r,o).pipe(ae(({state:a,tree:l})=>({...s,targetSnapshot:a,urlAfterRedirects:l}))))}(this.environmentInjector,this.configLoader,this.rootComponentType,t.config,this.urlSerializer,t.paramsInheritanceStrategy),wt(h=>{o.targetSnapshot=h.targetSnapshot,o.urlAfterRedirects=h.urlAfterRedirects,this.currentNavigation={...this.currentNavigation,finalUrl:h.urlAfterRedirects};const _=new YE(h.id,this.urlSerializer.serialize(h.extractedUrl),this.urlSerializer.serialize(h.urlAfterRedirects),h.targetSnapshot);this.events.next(_)}));if(u&&t.urlHandlingStrategy.shouldProcessUrl(l.currentRawUrl)){const{id:h,extractedUrl:_,source:v,restoredState:y,extras:D}=l,M=new sd(h,this.urlSerializer.serialize(_),v,y);this.events.next(M);const C=QE(0,this.rootComponentType).snapshot;return this.currentTransition=o={...l,targetSnapshot:C,urlAfterRedirects:_,extras:{...D,skipLocationChange:!1,replaceUrl:!1}},J(o)}{const h="";return this.events.next(new ps(l.id,this.urlSerializer.serialize(l.extractedUrl),h,1)),l.resolve(null),bn}}),wt(l=>{const c=new T3(l.id,this.urlSerializer.serialize(l.extractedUrl),this.urlSerializer.serialize(l.urlAfterRedirects),l.targetSnapshot);this.events.next(c)}),ae(l=>(this.currentTransition=o={...l,guards:J3(l.targetSnapshot,l.currentSnapshot,this.rootContexts)},o)),function aH(e,n){return ht(t=>{const{targetSnapshot:i,currentSnapshot:r,guards:{canActivateChecks:o,canDeactivateChecks:s}}=t;return 0===s.length&&0===o.length?J({...t,guardsResult:!0}):function lH(e,n,t,i){return pt(e).pipe(ht(r=>function pH(e,n,t,i,r){const o=n&&n.routeConfig?n.routeConfig.canDeactivate:null;return o&&0!==o.length?J(o.map(a=>{const l=fl(n)??r,c=ms(a,l);return ar(function rH(e){return e&&gl(e.canDeactivate)}(c)?c.canDeactivate(e,n,t,i):l.runInContext(()=>c(e,n,t,i))).pipe(Vr())})).pipe(_s()):J(!0)}(r.component,r.route,t,n,i)),Vr(r=>!0!==r,!0))}(s,i,r,e).pipe(ht(a=>a&&function eH(e){return"boolean"==typeof e}(a)?function cH(e,n,t,i){return pt(n).pipe(ls(r=>el(function dH(e,n){return null!==e&&n&&n(new x3(e)),J(!0)}(r.route.parent,i),function uH(e,n){return null!==e&&n&&n(new R3(e)),J(!0)}(r.route,i),function hH(e,n,t){const i=n[n.length-1],o=n.slice(0,n.length-1).reverse().map(s=>function X3(e){const n=e.routeConfig?e.routeConfig.canActivateChild:null;return n&&0!==n.length?{node:e,guards:n}:null}(s)).filter(s=>null!==s).map(s=>EE(()=>J(s.guards.map(l=>{const c=fl(s.node)??t,u=ms(l,c);return ar(function iH(e){return e&&gl(e.canActivateChild)}(u)?u.canActivateChild(i,e):c.runInContext(()=>u(i,e))).pipe(Vr())})).pipe(_s())));return J(o).pipe(_s())}(e,r.path,t),function fH(e,n,t){const i=n.routeConfig?n.routeConfig.canActivate:null;if(!i||0===i.length)return J(!0);const r=i.map(o=>EE(()=>{const s=fl(n)??t,a=ms(o,s);return ar(function nH(e){return e&&gl(e.canActivate)}(a)?a.canActivate(n,e):s.runInContext(()=>a(n,e))).pipe(Vr())}));return J(r).pipe(_s())}(e,r.route,t))),Vr(r=>!0!==r,!0))}(i,o,e,n):J(a)),ae(a=>({...t,guardsResult:a})))})}(this.environmentInjector,l=>this.events.next(l)),wt(l=>{if(o.guardsResult=l.guardsResult,Hr(l.guardsResult))throw rT(0,l.guardsResult);const c=new S3(l.id,this.urlSerializer.serialize(l.extractedUrl),this.urlSerializer.serialize(l.urlAfterRedirects),l.targetSnapshot,!!l.guardsResult);this.events.next(c)}),vt(l=>!!l.guardsResult||(this.cancelNavigationTransition(l,"",3),!1)),vm(l=>{if(l.guards.canActivateChecks.length)return J(l).pipe(wt(c=>{const u=new M3(c.id,this.urlSerializer.serialize(c.extractedUrl),this.urlSerializer.serialize(c.urlAfterRedirects),c.targetSnapshot);this.events.next(u)}),wn(c=>{let u=!1;return J(c).pipe(AH(t.paramsInheritanceStrategy,this.environmentInjector),wt({next:()=>u=!0,complete:()=>{u||this.cancelNavigationTransition(c,"",2)}}))}),wt(c=>{const u=new I3(c.id,this.urlSerializer.serialize(c.extractedUrl),this.urlSerializer.serialize(c.urlAfterRedirects),c.targetSnapshot);this.events.next(u)}))}),vm(l=>{const c=u=>{const d=[];u.routeConfig?.loadComponent&&!u.routeConfig._loadedComponent&&d.push(this.configLoader.loadComponent(u.routeConfig).pipe(wt(h=>{u.component=h}),ae(()=>{})));for(const h of u.children)d.push(...c(h));return d};return Kg(c(l.targetSnapshot.root)).pipe(Ku(),xt(1))}),vm(()=>this.afterPreactivation()),ae(l=>{const c=function B3(e,n,t){const i=dl(e,n._root,t?t._root:void 0);return new XE(i,n)}(t.routeReuseStrategy,l.targetSnapshot,l.currentRouterState);return this.currentTransition=o={...l,targetRouterState:c},o}),wt(()=>{this.events.next(new am)}),((e,n,t,i)=>ae(r=>(new Z3(n,r.targetRouterState,r.currentRouterState,t,i).activate(e),r)))(this.rootContexts,t.routeReuseStrategy,l=>this.events.next(l),this.inputBindingEnabled),xt(1),wt({next:l=>{s=!0,this.lastSuccessfulNavigation=this.currentNavigation,this.events.next(new lr(l.id,this.urlSerializer.serialize(l.extractedUrl),this.urlSerializer.serialize(l.urlAfterRedirects))),t.titleStrategy?.updateTitle(l.targetRouterState.snapshot),l.resolve(!0)},complete:()=>{s=!0}}),et(this.transitionAbortSubject.pipe(wt(l=>{throw l}))),Ga(()=>{s||a||this.cancelNavigationTransition(o,"",1),this.currentNavigation?.id===o.id&&(this.currentNavigation=null)}),Br(l=>{if(a=!0,sT(l))this.events.next(new cl(o.id,this.urlSerializer.serialize(o.extractedUrl),l.message,l.cancellationCode)),function $3(e){return sT(e)&&Hr(e.url)}(l)?this.events.next(new lm(l.url)):o.resolve(!1);else{this.events.next(new ad(o.id,this.urlSerializer.serialize(o.extractedUrl),l,o.targetSnapshot??void 0));try{o.resolve(t.errorHandler(l))}catch(c){o.reject(c)}}return bn}))}))}cancelNavigationTransition(t,i,r){const o=new cl(t.id,this.urlSerializer.serialize(t.extractedUrl),i,r);this.events.next(o),t.resolve(!1)}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function yT(e){return e!==ll}let bT=(()=>{class e{buildTitle(t){let i,r=t.root;for(;void 0!==r;)i=this.getResolvedTitleForRoute(r)??i,r=r.children.find(o=>o.outlet===oe);return i}getResolvedTitleForRoute(t){return t.data[nl]}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:function(){return F(BH)},providedIn:"root"})}return e})(),BH=(()=>{class e extends bT{constructor(t){super(),this.title=t}updateTitle(t){const i=this.buildTitle(t);void 0!==i&&this.title.setTitle(i)}static#e=this.\u0275fac=function(i){return new(i||e)(H(Kw))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),jH=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:function(){return F($H)},providedIn:"root"})}return e})();class HH{shouldDetach(n){return!1}store(n,t){}shouldAttach(n){return!1}retrieve(n){return null}shouldReuseRoute(n,t){return n.routeConfig===t.routeConfig}}let $H=(()=>{class e extends HH{static#e=this.\u0275fac=function(){let t;return function(r){return(t||(t=st(e)))(r||e)}}();static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();const gd=new z("",{providedIn:"root",factory:()=>({})});let UH=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:function(){return F(GH)},providedIn:"root"})}return e})(),GH=(()=>{class e{shouldProcessUrl(t){return!0}extract(t){return t}merge(t,i){return t}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var ml=function(e){return e[e.COMPLETE=0]="COMPLETE",e[e.FAILED=1]="FAILED",e[e.REDIRECTING=2]="REDIRECTING",e}(ml||{});function DT(e,n){e.events.pipe(vt(t=>t instanceof lr||t instanceof cl||t instanceof ad||t instanceof ps),ae(t=>t instanceof lr||t instanceof ps?ml.COMPLETE:t instanceof cl&&(0===t.code||1===t.code)?ml.REDIRECTING:ml.FAILED),vt(t=>t!==ml.REDIRECTING),xt(1)).subscribe(()=>{n()})}function zH(e){throw e}function WH(e,n,t){return n.parse("/")}const qH={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},YH={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};let Rn=(()=>{class e{get navigationId(){return this.navigationTransitions.navigationId}get browserPageId(){return"computed"!==this.canceledNavigationResolution?this.currentPageId:this.location.getState()?.\u0275routerPageId??this.currentPageId}get events(){return this._events}constructor(){this.disposed=!1,this.currentPageId=0,this.console=F(OD),this.isNgZoneEnabled=!1,this._events=new Ee,this.options=F(gd,{optional:!0})||{},this.pendingTasks=F(hu),this.errorHandler=this.options.errorHandler||zH,this.malformedUriErrorHandler=this.options.malformedUriErrorHandler||WH,this.navigated=!1,this.lastSuccessfulId=-1,this.urlHandlingStrategy=F(UH),this.routeReuseStrategy=F(jH),this.titleStrategy=F(bT),this.onSameUrlNavigation=this.options.onSameUrlNavigation||"ignore",this.paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||"emptyOnly",this.urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred",this.canceledNavigationResolution=this.options.canceledNavigationResolution||"replace",this.config=F(ys,{optional:!0})?.flat()??[],this.navigationTransitions=F(pd),this.urlSerializer=F(rl),this.location=F(Kp),this.componentInputBindingEnabled=!!F(cd,{optional:!0}),this.eventsSubscription=new nt,this.isNgZoneEnabled=F(fe)instanceof fe&&fe.isInAngularZone(),this.resetConfig(this.config),this.currentUrlTree=new hs,this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.routerState=QE(0,null),this.navigationTransitions.setupNavigations(this,this.currentUrlTree,this.routerState).subscribe(t=>{this.lastSuccessfulId=t.id,this.currentPageId=this.browserPageId},t=>{this.console.warn(`Unhandled Navigation Error: ${t}`)}),this.subscribeToNavigationEvents()}subscribeToNavigationEvents(){const t=this.navigationTransitions.events.subscribe(i=>{try{const{currentTransition:r}=this.navigationTransitions;if(null===r)return void(wT(i)&&this._events.next(i));if(i instanceof sd)yT(r.source)&&(this.browserUrlTree=r.extractedUrl);else if(i instanceof ps)this.rawUrlTree=r.rawUrl;else if(i instanceof YE){if("eager"===this.urlUpdateStrategy){if(!r.extras.skipLocationChange){const o=this.urlHandlingStrategy.merge(r.urlAfterRedirects,r.rawUrl);this.setBrowserUrl(o,r)}this.browserUrlTree=r.urlAfterRedirects}}else if(i instanceof am)this.currentUrlTree=r.urlAfterRedirects,this.rawUrlTree=this.urlHandlingStrategy.merge(r.urlAfterRedirects,r.rawUrl),this.routerState=r.targetRouterState,"deferred"===this.urlUpdateStrategy&&(r.extras.skipLocationChange||this.setBrowserUrl(this.rawUrlTree,r),this.browserUrlTree=r.urlAfterRedirects);else if(i instanceof cl)0!==i.code&&1!==i.code&&(this.navigated=!0),(3===i.code||2===i.code)&&this.restoreHistory(r);else if(i instanceof lm){const o=this.urlHandlingStrategy.merge(i.url,r.currentRawUrl),s={skipLocationChange:r.extras.skipLocationChange,replaceUrl:"eager"===this.urlUpdateStrategy||yT(r.source)};this.scheduleNavigation(o,ll,null,s,{resolve:r.resolve,reject:r.reject,promise:r.promise})}i instanceof ad&&this.restoreHistory(r,!0),i instanceof lr&&(this.navigated=!0),wT(i)&&this._events.next(i)}catch(r){this.navigationTransitions.transitionAbortSubject.next(r)}});this.eventsSubscription.add(t)}resetRootComponentType(t){this.routerState.root.component=t,this.navigationTransitions.rootComponentType=t}initialNavigation(){if(this.setUpLocationChangeListener(),!this.navigationTransitions.hasRequestedNavigation){const t=this.location.getState();this.navigateToSyncWithBrowser(this.location.path(!0),ll,t)}}setUpLocationChangeListener(){this.locationSubscription||(this.locationSubscription=this.location.subscribe(t=>{const i="popstate"===t.type?"popstate":"hashchange";"popstate"===i&&setTimeout(()=>{this.navigateToSyncWithBrowser(t.url,i,t.state)},0)}))}navigateToSyncWithBrowser(t,i,r){const o={replaceUrl:!0},s=r?.navigationId?r:null;if(r){const l={...r};delete l.navigationId,delete l.\u0275routerPageId,0!==Object.keys(l).length&&(o.state=l)}const a=this.parseUrl(t);this.scheduleNavigation(a,i,s,o)}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return this.navigationTransitions.currentNavigation}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(t){this.config=t.map(gm),this.navigated=!1,this.lastSuccessfulId=-1}ngOnDestroy(){this.dispose()}dispose(){this.navigationTransitions.complete(),this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=void 0),this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(t,i={}){const{relativeTo:r,queryParams:o,fragment:s,queryParamsHandling:a,preserveFragment:l}=i,c=l?this.currentUrlTree.fragment:s;let d,u=null;switch(a){case"merge":u={...this.currentUrlTree.queryParams,...o};break;case"preserve":u=this.currentUrlTree.queryParams;break;default:u=o||null}null!==u&&(u=this.removeEmptyProps(u));try{d=HE(r?r.snapshot:this.routerState.snapshot.root)}catch{("string"!=typeof t[0]||!t[0].startsWith("/"))&&(t=[]),d=this.currentUrlTree.root}return $E(d,t,u,c??null)}navigateByUrl(t,i={skipLocationChange:!1}){const r=Hr(t)?t:this.parseUrl(t),o=this.urlHandlingStrategy.merge(r,this.rawUrlTree);return this.scheduleNavigation(o,ll,null,i)}navigate(t,i={skipLocationChange:!1}){return function ZH(e){for(let n=0;n{const o=t[r];return null!=o&&(i[r]=o),i},{})}scheduleNavigation(t,i,r,o,s){if(this.disposed)return Promise.resolve(!1);let a,l,c;s?(a=s.resolve,l=s.reject,c=s.promise):c=new Promise((d,h)=>{a=d,l=h});const u=this.pendingTasks.add();return DT(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(u))}),this.navigationTransitions.handleNavigationRequest({source:i,restoredState:r,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,currentBrowserUrl:this.browserUrlTree,rawUrl:t,extras:o,resolve:a,reject:l,promise:c,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),c.catch(d=>Promise.reject(d))}setBrowserUrl(t,i){const r=this.urlSerializer.serialize(t);if(this.location.isCurrentPathEqualTo(r)||i.extras.replaceUrl){const s={...i.extras.state,...this.generateNgRouterState(i.id,this.browserPageId)};this.location.replaceState(r,"",s)}else{const o={...i.extras.state,...this.generateNgRouterState(i.id,this.browserPageId+1)};this.location.go(r,"",o)}}restoreHistory(t,i=!1){if("computed"===this.canceledNavigationResolution){const o=this.currentPageId-this.browserPageId;0!==o?this.location.historyGo(o):this.currentUrlTree===this.getCurrentNavigation()?.finalUrl&&0===o&&(this.resetState(t),this.browserUrlTree=t.currentUrlTree,this.resetUrlToCurrentUrlTree())}else"replace"===this.canceledNavigationResolution&&(i&&this.resetState(t),this.resetUrlToCurrentUrlTree())}resetState(t){this.routerState=t.currentRouterState,this.currentUrlTree=t.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,t.rawUrl)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.rawUrlTree),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(t,i){return"computed"===this.canceledNavigationResolution?{navigationId:t,\u0275routerPageId:i}:{navigationId:t}}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function wT(e){return!(e instanceof am||e instanceof lm)}class CT{}let QH=(()=>{class e{constructor(t,i,r,o,s){this.router=t,this.injector=r,this.preloadingStrategy=o,this.loader=s}setUpPreloading(){this.subscription=this.router.events.pipe(vt(t=>t instanceof lr),ls(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription&&this.subscription.unsubscribe()}processRoutes(t,i){const r=[];for(const o of i){o.providers&&!o._injector&&(o._injector=yp(o.providers,t,`Route: ${o.path}`));const s=o._injector??t,a=o._loadedInjector??s;(o.loadChildren&&!o._loadedRoutes&&void 0===o.canLoad||o.loadComponent&&!o._loadedComponent)&&r.push(this.preloadConfig(s,o)),(o.children||o._loadedRoutes)&&r.push(this.processRoutes(a,o.children??o._loadedRoutes))}return pt(r).pipe(lo())}preloadConfig(t,i){return this.preloadingStrategy.preload(i,()=>{let r;r=i.loadChildren&&void 0===i.canLoad?this.loader.loadChildren(t,i):J(null);const o=r.pipe(ht(s=>null===s?J(void 0):(i._loadedRoutes=s.routes,i._loadedInjector=s.injector,this.processRoutes(s.injector??t,s.routes))));return i.loadComponent&&!i._loadedComponent?pt([o,this.loader.loadComponent(i)]).pipe(lo()):o})}static#e=this.\u0275fac=function(i){return new(i||e)(H(Rn),H(xD),H(zt),H(CT),H(ym))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();const Dm=new z("");let ET=(()=>{class e{constructor(t,i,r,o,s={}){this.urlSerializer=t,this.transitions=i,this.viewportScroller=r,this.zone=o,this.options=s,this.lastId=0,this.lastSource="imperative",this.restoredId=0,this.store={},s.scrollPositionRestoration=s.scrollPositionRestoration||"disabled",s.anchorScrolling=s.anchorScrolling||"disabled"}init(){"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(t=>{t instanceof sd?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=t.navigationTrigger,this.restoredId=t.restoredState?t.restoredState.navigationId:0):t instanceof lr?(this.lastId=t.id,this.scheduleScrollEvent(t,this.urlSerializer.parse(t.urlAfterRedirects).fragment)):t instanceof ps&&0===t.code&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(t,this.urlSerializer.parse(t.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(t=>{t instanceof ZE&&(t.position?"top"===this.options.scrollPositionRestoration?this.viewportScroller.scrollToPosition([0,0]):"enabled"===this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition(t.position):t.anchor&&"enabled"===this.options.anchorScrolling?this.viewportScroller.scrollToAnchor(t.anchor):"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition([0,0]))})}scheduleScrollEvent(t,i){this.zone.runOutsideAngular(()=>{setTimeout(()=>{this.zone.run(()=>{this.transitions.events.next(new ZE(t,"popstate"===this.lastSource?this.store[this.restoredId]:null,i))})},0)})}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static#e=this.\u0275fac=function(i){!function I1(){throw new Error("invalid")}()};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac})}return e})();function ki(e,n){return{\u0275kind:e,\u0275providers:n}}function ST(){const e=F(Nt);return n=>{const t=e.get(Ki);if(n!==t.components[0])return;const i=e.get(Rn),r=e.get(MT);1===e.get(wm)&&i.initialNavigation(),e.get(IT,null,ce.Optional)?.setUpPreloading(),e.get(Dm,null,ce.Optional)?.init(),i.resetRootComponentType(t.componentTypes[0]),r.closed||(r.next(),r.complete(),r.unsubscribe())}}const MT=new z("",{factory:()=>new Ee}),wm=new z("",{providedIn:"root",factory:()=>1}),IT=new z("");function n$(e){return ki(0,[{provide:IT,useExisting:QH},{provide:CT,useExisting:e}])}const NT=new z("ROUTER_FORROOT_GUARD"),r$=[Kp,{provide:rl,useClass:nm},Rn,ul,{provide:$r,useFactory:function TT(e){return e.routerState.root},deps:[Rn]},ym,[]];function o$(){return new VD("Router",Rn)}let OT=(()=>{class e{constructor(t){}static forRoot(t,i){return{ngModule:e,providers:[r$,[],{provide:ys,multi:!0,useValue:t},{provide:NT,useFactory:c$,deps:[[Rn,new gc,new mc]]},{provide:gd,useValue:i||{}},i?.useHash?{provide:Rr,useClass:YF}:{provide:Rr,useClass:pw},{provide:Dm,useFactory:()=>{const e=F(dV),n=F(fe),t=F(gd),i=F(pd),r=F(rl);return t.scrollOffset&&e.setOffset(t.scrollOffset),new ET(r,i,e,n,t)}},i?.preloadingStrategy?n$(i.preloadingStrategy).\u0275providers:[],{provide:VD,multi:!0,useFactory:o$},i?.initialNavigation?u$(i):[],i?.bindToComponentInputs?ki(8,[iT,{provide:cd,useExisting:iT}]).\u0275providers:[],[{provide:xT,useFactory:ST},{provide:$p,multi:!0,useExisting:xT}]]}}static forChild(t){return{ngModule:e,providers:[{provide:ys,multi:!0,useValue:t}]}}static#e=this.\u0275fac=function(i){return new(i||e)(H(NT,8))};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})();function c$(e){return"guarded"}function u$(e){return["disabled"===e.initialNavigation?ki(3,[{provide:Pp,multi:!0,useFactory:()=>{const n=F(Rn);return()=>{n.setUpLocationChangeListener()}}},{provide:wm,useValue:2}]).\u0275providers:[],"enabledBlocking"===e.initialNavigation?ki(2,[{provide:wm,useValue:0},{provide:Pp,multi:!0,deps:[Nt],useFactory:n=>{const t=n.get(WF,Promise.resolve());return()=>t.then(()=>new Promise(i=>{const r=n.get(Rn),o=n.get(MT);DT(r,()=>{i(!0)}),n.get(pd).afterPreactivation=()=>(i(!0),o.closed?J(void 0):o),r.initialNavigation()}))}}]).\u0275providers:[]]}const xT=new z("");class AT{constructor(n={}){this.term=n.term||""}}function f$(e,n){if(1&e&&(p(0,"li")(1,"a",12),m(2),f()()),2&e){const t=n.$implicit;g(1),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id)}}function h$(e,n){if(1&e&&(p(0,"div",25)(1,"ul"),I(2,f$,3,2,"li",4),f()()),2&e){const t=T(3).$implicit;g(2),S("ngForOf",t.inputs)}}function p$(e,n){if(1&e&&(p(0,"div")(1,"div",26)(2,"p",21)(3,"a",12),m(4),f(),p(5,"button",22),m(6),f()()()()),2&e){const t=n.$implicit;g(3),U("href","/explorer?term=",t.to,"",W),g(1),A(t.to),g(2),V("",t.value.toFixed(6)," YDA")}}function g$(e,n){if(1&e){const t=Ze();p(0,"div")(1,"div",11)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",12),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",12),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Fee: "),f(),m(15),f(),p(16,"div",13)(17,"div",14)(18,"p")(19,"strong"),m(20,"Inputs:"),f(),m(21),f(),p(22,"div",15)(23,"button",16),Z("click",function(){return Ue(t),Ge(T(3).toggleAccordion("inputsAccordion"))}),m(24,"Show Inputs"),f(),I(25,h$,3,1,"div",17),f(),p(26,"p")(27,"strong"),m(28,"Outputs:"),f(),m(29),f()()(),p(30,"div",18)(31,"div",19)(32,"div",20)(33,"p",21)(34,"a",12),m(35),f(),p(36,"button",22),m(37),f()()()(),p(38,"div",23),Ae(39,"img",24),f(),p(40,"div",19),I(41,p$,7,3,"div",4),f()()()()}if(2&e){const t=T(2).$implicit,i=T();g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V("",t.fee," YDA"),g(6),V(" ",t.inputs.length,""),g(4),S("ngIf","inputsAccordion"===i.showAccordion),g(4),V(" ",t.outputs.length,""),g(5),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to),g(2),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function m$(e,n){if(1&e&&(p(0,"div")(1,"div",11)(2,"p",27)(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",12),m(6),f()(),p(7,"p",27)(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",12),m(11),f()(),p(12,"p",27)(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",28)(17,"h4",29),m(18,"Relationship DATA:"),f(),p(19,"textarea",30),m(20),f()(),p(21,"div",31)(22,"div",26)(23,"button",32),m(24,"Newly created Address"),f(),p(25,"p",33)(26,"a",12),m(27),f()()()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship),g(6),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to)}}function _$(e,n){if(1&e&&(p(0,"div")(1,"div",11)(2,"p",27)(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",12),m(6),f()(),p(7,"p",27)(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",12),m(11),f()(),p(12,"p",27)(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",28)(17,"h4",29),m(18,"Relationship DATA:"),f(),p(19,"textarea",30),m(20),f()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship)}}function v$(e,n){if(1&e&&(p(0,"div")(1,"div",11)(2,"p",27)(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",12),m(6),f()(),p(7,"p",27)(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",12),m(11),f()(),p(12,"p",27)(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",28)(17,"h4",29),m(18,"Relationship DATA:"),f(),p(19,"textarea",30),m(20),f()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship)}}function y$(e,n){if(1&e&&(p(0,"tr",8)(1,"td",9),I(2,g$,42,12,"div",10),I(3,m$,28,8,"div",10),I(4,_$,21,6,"div",10),I(5,v$,21,6,"div",10),f()()),2&e){const t=T().$implicit,i=T();g(2),S("ngIf",i.transactionUtilsService.isTransferTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCreateIdentityTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isEncryptedMessageTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isMessageTransaction(t))}}const b$=function(e,n,t,i,r){return{coinbase:e,transfer:n,"create-identity":t,"encrypted-message":i,message:r}};function D$(e,n){if(1&e){const t=Ze();Zi(0),p(1,"tr",5),Z("click",function(){const o=Ue(t).$implicit;return Ge(T().toggleDetails(o))}),p(2,"td"),m(3),f(),p(4,"td",3),m(5),f(),p(6,"td"),m(7),f(),p(8,"td")(9,"button",6),m(10),f()()(),I(11,y$,6,4,"tr",7),Ji()}if(2&e){const t=n.$implicit,i=T();g(3),A(i.dateFormatService.formatTransactionTime(t.time)),g(2),A(t.hash),g(2),up("",t.inputs.length," / ",t.outputs.length,""),g(2),S("ngClass",ns(7,b$,i.transactionUtilsService.isCoinbaseTransaction(t),i.transactionUtilsService.isTransferTransaction(t),i.transactionUtilsService.isCreateIdentityTransaction(t),i.transactionUtilsService.isEncryptedMessageTransaction(t),i.transactionUtilsService.isMessageTransaction(t))),g(1),V(" ",i.transactionUtilsService.getTransactionType(t)," "),g(1),S("ngIf",i.expandedTransaction&&i.expandedTransaction.id===t.id)}}let RT=(()=>{class e{constructor(t,i,r){this.httpClient=t,this.dateFormatService=i,this.transactionUtilsService=r,this.mempoolData=[],this.expandedTransaction=null,this.showAccordion=null}ngOnInit(){this.httpClient.get("/explorer-mempool").subscribe(t=>{this.mempoolData=t.result||[]},t=>{console.error("Error fetching mempool data:",t)})}toggleDetails(t){this.expandedTransaction=this.expandedTransaction===t?null:t}toggleAccordion(t){this.showAccordion=this.showAccordion===t?null:t}getTotalValue(t){return t.reduce((i,r)=>i+r.value,0)}static#e=this.\u0275fac=function(i){return new(i||e)(b(Wa),b(Ju),b(Xu))};static#t=this.\u0275cmp=kt({type:e,selectors:[["app-mempool"]],decls:16,vars:1,consts:[[2,"text-transform","uppercase","margin","10px","margin-top","20px"],[1,"blocks-container"],[1,"blocks-table"],[1,"hash-column"],[4,"ngFor","ngForOf"],[3,"click"],[1,"transaction-type-button",3,"ngClass"],["class","expanded-row",4,"ngIf"],[1,"expanded-row"],["colspan","4"],[4,"ngIf"],[1,"transaction-details"],[3,"href"],[1,"row"],[1,"col-md-12"],[1,"input-section",2,"width","100%","display","inline-block","margin-top","5px"],[1,"accordion",3,"click"],["class","panel",4,"ngIf"],[1,"row","in-section",2,"margin-top","5px"],[1,"col-md-5"],[1,"transfer-in-info-box"],[2,"margin-left","10px"],[1,"transaction-value-button"],[1,"col-md-2","text-center"],["src","yadacoinstatic/explorer/assets/arrow-right.png","alt","Arrow Right",1,"arrow-icon"],[1,"panel"],[1,"transfer-out-info-box"],[1,"col-12"],[1,"relationship-data-box"],[2,"text-transform","uppercase","margin","10px"],["rows","4","readonly","",2,"width","98%"],[1,"in-section","col-md-5",2,"margin-top","5px"],[1,"transaction-type-button","create-identity"],[2,"margin-left","15px"]],template:function(i,r){1&i&&(p(0,"h2",0),m(1,"Mempool"),f(),p(2,"div",1)(3,"table",2)(4,"thead")(5,"tr")(6,"th"),m(7,"Time"),f(),p(8,"th",3),m(9,"Transaction Hash"),f(),p(10,"th"),m(11,"in/out"),f(),p(12,"th"),m(13,"Type"),f()()(),p(14,"tbody"),I(15,D$,12,13,"ng-container",4),f()()()),2&i&&(g(15),S("ngForOf",r.mempoolData))},dependencies:[xu,qn,Yn]})}return e})();function w$(e,n){1&e&&(p(0,"div",9)(1,"strong"),m(2,"Loading..."),f()())}function C$(e,n){if(1&e&&(p(0,"div",10)(1,"strong"),m(2,"Your Balance:"),f(),m(3),f()),2&e){const t=T();g(3),V(" ",t.balance," ")}}let PT=(()=>{class e{constructor(t){this.httpClient=t,this.address="",this.balance=0,this.loading=!1}getBalance(){this.address&&(this.loading=!0,this.httpClient.get(`/explorer-get-balance?address=${this.address}`).subscribe(t=>{this.balance=t.balance,this.loading=!1},t=>{alert("Something went wrong while fetching the balance."),this.loading=!1}))}static#e=this.\u0275fac=function(i){return new(i||e)(b(Wa))};static#t=this.\u0275cmp=kt({type:e,selectors:[["app-address-balance"]],decls:15,vars:5,consts:[[1,"button",2,"text-transform","uppercase","margin","10px","margin-top","20px"],[1,"address-balance-container"],["for","addressInput"],[2,"display","flex"],["id","addressInput","type","text",1,"search-container",3,"ngModel","ngModelChange"],[1,"button","btn-success",3,"disabled","click"],[2,"margin-top","10px"],["class","loading-message",4,"ngIf"],["class","result",4,"ngIf"],[1,"loading-message"],[1,"result"]],template:function(i,r){1&i&&(p(0,"h2",0),m(1,"Address Balance"),f(),p(2,"div",1)(3,"label",2),m(4,"Enter Your Wallet Address:"),f(),p(5,"div",3)(6,"input",4),Z("ngModelChange",function(s){return r.address=s}),f(),p(7,"button",5),Z("click",function(){return r.getBalance()}),m(8,"Get balance"),f()(),p(9,"div",6)(10,"strong"),m(11,"Your Address:"),f(),m(12),f(),I(13,w$,3,0,"div",7),I(14,C$,4,1,"div",8),f()),2&i&&(g(6),S("ngModel",r.address),g(1),S("disabled",r.loading),g(5),V(" ",r.address," "),g(1),S("ngIf",r.loading),g(1),S("ngIf",!r.loading&&null!==r.balance))},dependencies:[Yn,Ya,Rg,Zu],styles:[".address-balance-container[_ngcontent-%COMP%]{margin:10px;padding:20px;background-color:#424242;border-radius:5px;color:#fff}label[_ngcontent-%COMP%]{display:block;margin-bottom:10px}input[_ngcontent-%COMP%]{flex:1;padding:10px;margin-bottom:10px;margin-right:10px}button.btn-success[_ngcontent-%COMP%]{background-color:green;color:#fff;padding:8px 20px;border:none;cursor:pointer;transition:background .3s ease;border-radius:5px;height:40px}.loading-message[_ngcontent-%COMP%], .result[_ngcontent-%COMP%]{margin-top:10px}"]})}return e})();function E$(e,n){if(1&e&&(p(0,"li")(1,"a",11),m(2),f()()),2&e){const t=n.$implicit;g(1),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id)}}function T$(e,n){if(1&e&&(p(0,"div",27)(1,"ul"),I(2,E$,3,2,"li",4),f()()),2&e){const t=T(3).$implicit;g(2),S("ngForOf",t.inputs)}}function S$(e,n){if(1&e&&(p(0,"div")(1,"div",28)(2,"p",22)(3,"a",11),m(4),f(),p(5,"button",23),m(6),f()()()()),2&e){const t=n.$implicit;g(3),U("href","/explorer?term=",t.to,"",W),g(1),A(t.to),g(2),V("",t.value.toFixed(6)," YDA")}}function M$(e,n){if(1&e){const t=Ze();p(0,"div")(1,"div",15)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",11),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",11),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Fee: "),f(),m(15),f(),p(16,"p")(17,"strong"),m(18,"Inputs:"),f(),m(19),f(),p(20,"div",16)(21,"button",17),Z("click",function(){return Ue(t),Ge(T(5).toggleAccordion("inputsAccordion"))}),m(22,"Show Inputs"),f(),I(23,T$,3,1,"div",18),f(),p(24,"p")(25,"strong"),m(26,"Outputs:"),f(),m(27),f(),p(28,"div",19)(29,"div",20)(30,"div",21)(31,"p",22)(32,"a",11),m(33),f(),p(34,"button",23),m(35),f()()()(),p(36,"div",24),Ae(37,"img",25),f(),p(38,"div",26),I(39,S$,7,3,"div",4),f()()()()}if(2&e){const t=T(2).$implicit,i=T(3);g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.fee," YDA"),g(4),V(" ",t.inputs.length,""),g(4),S("ngIf","inputsAccordion"===i.showAccordion),g(4),V(" ",t.outputs.length,""),g(5),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to),g(2),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function I$(e,n){if(1&e&&(p(0,"div"),I(1,M$,40,12,"div",14),f()),2&e){const t=T().index,i=T(2).index,r=T();g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}function N$(e,n){if(1&e&&(p(0,"div")(1,"div",28)(2,"p",22)(3,"a",11),m(4),f(),p(5,"button",23),m(6),f()()()()),2&e){const t=n.$implicit;g(3),U("href","/explorer?term=",t.to,"",W),g(1),A(t.to),g(2),V("",t.value.toFixed(6)," YDA")}}function O$(e,n){if(1&e&&(p(0,"div")(1,"div",15)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",11),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",11),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Outputs:"),f(),m(15),f(),p(16,"div",19)(17,"div",20)(18,"div",21)(19,"p",22),m(20," (Newly Generated Coins) "),p(21,"button",23),m(22),f()()()(),p(23,"div",24),Ae(24,"img",25),f(),p(25,"div",26),I(26,N$,7,3,"div",4),f()()()()),2&e){const t=T(2).$implicit,i=T(3);g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.outputs.length,""),g(7),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function x$(e,n){if(1&e&&(p(0,"div"),I(1,O$,27,7,"div",14),f()),2&e){const t=T().index,i=T(2).index,r=T();g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}function A$(e,n){if(1&e&&(p(0,"div")(1,"div",15)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",11),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",11),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",29)(17,"h4",30),m(18,"Relationship DATA:"),f(),p(19,"textarea",31),m(20),f()(),p(21,"div",20)(22,"div",28)(23,"button",32),m(24,"Newly created Address"),f(),p(25,"p",33)(26,"a",11),m(27),f()()()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship),g(6),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to)}}function R$(e,n){if(1&e&&(p(0,"div"),I(1,A$,28,8,"div",14),f()),2&e){const t=T().index,i=T(2).index,r=T();g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}function P$(e,n){if(1&e&&(p(0,"div")(1,"div",15)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",11),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",11),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",29)(17,"h4",30),m(18,"Relationship DATA:"),f(),p(19,"textarea",31),m(20),f()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship)}}function k$(e,n){if(1&e&&(p(0,"div"),I(1,P$,21,6,"div",14),f()),2&e){const t=T().index,i=T(2).index,r=T();g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}function F$(e,n){if(1&e&&(p(0,"div")(1,"div",15)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",11),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",11),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",29)(17,"h4",30),m(18,"Relationship DATA:"),f(),p(19,"textarea",31),m(20),f()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship)}}function L$(e,n){if(1&e&&(p(0,"div"),I(1,F$,21,6,"div",14),f()),2&e){const t=T().index,i=T(2).index,r=T();g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}const V$=function(e,n,t,i,r){return{coinbase:e,transfer:n,"create-identity":t,"encrypted-message":i,message:r}};function B$(e,n){if(1&e){const t=Ze();p(0,"li")(1,"button",13),Z("click",function(){const o=Ue(t).index,s=T(2).index;return Ge(T().showTransactionDetails(s,o))}),m(2),f(),I(3,I$,2,1,"div",14),I(4,x$,2,1,"div",14),I(5,R$,2,1,"div",14),I(6,k$,2,1,"div",14),I(7,L$,2,1,"div",14),f()}if(2&e){const t=n.$implicit,i=T(3);g(1),S("ngClass",ns(7,V$,i.transactionUtilsService.isCoinbaseTransaction(t),i.transactionUtilsService.isTransferTransaction(t),i.transactionUtilsService.isCreateIdentityTransaction(t),i.transactionUtilsService.isEncryptedMessageTransaction(t),i.transactionUtilsService.isMessageTransaction(t))),g(1),V(" ",i.transactionUtilsService.getTransactionType(t)," "),g(1),S("ngIf",i.transactionUtilsService.isTransferTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCoinbaseTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCreateIdentityTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isEncryptedMessageTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isMessageTransaction(t))}}function j$(e,n){if(1&e&&(p(0,"tr",7)(1,"td",8)(2,"div",9)(3,"h2",10),m(4,"Block Details"),f(),p(5,"p")(6,"strong"),m(7,"Index: "),f(),p(8,"a",11),m(9),f()(),p(10,"p")(11,"strong"),m(12,"Time:"),f(),m(13),f(),p(14,"p")(15,"strong"),m(16,"Hash: "),f(),p(17,"a",11),m(18),f()(),p(19,"p")(20,"strong"),m(21,"Previous Hash: "),f(),p(22,"a",11),m(23),f()(),p(24,"p")(25,"strong"),m(26,"Nonce:"),f(),m(27),f(),p(28,"p")(29,"strong"),m(30,"Target:"),f(),m(31),f(),p(32,"p")(33,"strong"),m(34,"ID: "),f(),p(35,"a",11),m(36),f()(),p(37,"h3",12),m(38,"Transactions"),f(),p(39,"ul"),I(40,B$,8,13,"li",4),f()()()()),2&e){const t=T().$implicit,i=T();g(8),U("href","/explorer?term=",t.index,"",W),g(1),A(t.index),g(4),V(" ",i.dateFormatService.formatTransactionTime(t.time),""),g(4),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.prevHash,"",W),g(1),A(t.prevHash),g(4),V(" ",t.nonce,""),g(4),V(" ",t.target,""),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),S("ngForOf",t.transactions)}}function H$(e,n){if(1&e){const t=Ze();Zi(0),p(1,"tr",5),Z("click",function(){const o=Ue(t).$implicit;return Ge(T().toggleDetails(o))}),p(2,"td"),m(3),f(),p(4,"td"),m(5),f(),p(6,"td"),m(7),f(),p(8,"td",3),m(9),f(),p(10,"td"),m(11),f()(),I(12,j$,41,12,"tr",6),Ji()}if(2&e){const t=n.$implicit,i=T();g(3),A(t.index),g(2),A(i.dateFormatService.formatTransactionTime(t.time)),g(2),A(i.calculateAge(t.time)),g(2),A(t.hash),g(2),A(t.transactions.length),g(1),S("ngIf",t.expanded)}}let $$=(()=>{class e{constructor(t,i,r){this.httpClient=t,this.dateFormatService=i,this.transactionUtilsService=r,this.blocks=[],this.showBlockTransactions=!1,this.showBlockTransactionDetails=[],this.searching=!1,this.showAccordion=null}ngOnInit(){this.loadLatestBlocks()}loadLatestBlocks(){this.httpClient.get("/explorer-latest").subscribe(t=>{this.blocks=t.result||[],this.searching=!1},t=>{console.error("Error fetching latest blocks:",t),alert("Something went wrong while fetching latest blocks!")})}showBlockDetails(t){console.log("Clicked block:",t),this.selectedBlock=t}toggleDetails(t){if(t.expanded)t.expanded=!1;else{this.blocks.forEach(r=>r.expanded=!1),t.expanded=!0;const i=this.blocks.indexOf(t);this.showBlockTransactionDetails[i]=[],this.selectedBlock=t}}showTransactions(){this.showBlockTransactions=!this.showBlockTransactions,this.showBlockTransactionDetails=[]}showTransactionDetails(t,i){console.log("Clicked transaction:",t,i),this.showBlockTransactionDetails[t][i]=!this.showBlockTransactionDetails[t][i]}numberWithCommas(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}formatHashrate(t){return t<1e3?`${t.toFixed(0)} h/s`:t<1e6?`${(t/1e3).toFixed(2)} kh/s`:`${(t/1e6).toFixed(2)} mh/s`}calculateAge(t){const i=(new Date).getTime(),r=new Date(1e3*t).getTime();console.log("Current Time:",new Date(i)),console.log("Block Time:",new Date(r));const o=i-r,s=Math.floor(o/6e4);return console.log("Difference:",o),console.log("Age in Minutes:",s),s<60?`${s} minutes ago`:`${Math.floor(s/60)} hours ago`}getTotalValue(t){return t.reduce((i,r)=>i+r.value,0)}toggleAccordion(t){this.showAccordion=this.showAccordion===t?null:t}static#e=this.\u0275fac=function(i){return new(i||e)(b(Wa),b(Ju),b(Xu))};static#t=this.\u0275cmp=kt({type:e,selectors:[["app-latest-blocks"]],decls:18,vars:1,consts:[[2,"text-transform","uppercase","margin","10px","margin-top","20px"],[1,"blocks-container"],[1,"blocks-table"],[1,"hash-column"],[4,"ngFor","ngForOf"],[3,"click"],["class","expanded-row",4,"ngIf"],[1,"expanded-row"],["colspan","5"],[2,"word-break","break-word"],[2,"text-transform","uppercase","margin","20px","margin-top","10px"],[3,"href"],[2,"text-transform","uppercase","margin","20px","margin-top","20px"],[1,"transaction-type-button",3,"ngClass","click"],[4,"ngIf"],[1,"transaction-details"],[1,"input-section",2,"margin-top","5px"],[1,"accordion",3,"click"],["class","panel",4,"ngIf"],[1,"row","in-section"],[1,"in-section","col-md-5",2,"margin-top","5px"],[1,"transfer-in-info-box"],[2,"margin-left","10px"],[1,"transaction-value-button"],[1,"col-md-2","text-center"],["src","yadacoinstatic/explorer/assets/arrow-right.png","alt","Arrow Right",1,"arrow-icon"],[1,"out-section","col-md-5",2,"margin-top","5px"],[1,"panel"],[1,"transfer-out-info-box"],[1,"relationship-data-box"],[2,"text-transform","uppercase","margin","10px"],["rows","4","readonly","",2,"width","98%"],[1,"transaction-type-button","create-identity"],[2,"margin-left","15px"]],template:function(i,r){1&i&&(p(0,"h2",0),m(1,"Latest 10 Blocks"),f(),p(2,"div",1)(3,"table",2)(4,"thead")(5,"tr")(6,"th"),m(7,"Index"),f(),p(8,"th"),m(9,"Time"),f(),p(10,"th"),m(11,"Age"),f(),p(12,"th",3),m(13,"Hash"),f(),p(14,"th"),m(15,"Transactions"),f()()(),p(16,"tbody"),I(17,H$,13,6,"ng-container",4),f()()()),2&i&&(g(17),S("ngForOf",r.blocks))},dependencies:[xu,qn,Yn]})}return e})(),U$=(()=>{class e{transform(t){return"string"==typeof t?t.replace(/,/g," "):t.toString().replace(/,/g," ")}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275pipe=Bt({name:"replaceComma",type:e,pure:!0})}return e})();function G$(e,n){1&e&&(p(0,"div")(1,"h1",24),m(2,"This is the alpha version of the Yadacoin block explorer."),f(),p(3,"h1",24),m(4,"Most functions should be operational. Please feel free to report any bugs or provide suggestions."),f(),p(5,"h1",24),m(6,"Thank you!"),f()())}function z$(e,n){1&e&&(Zi(0),p(1,"div",25)(2,"h2",26),m(3,"No results for searched phrase"),f()(),Ji())}function W$(e,n){1&e&&(p(0,"a",37),Ae(1,"i",38),m(2," Previous Block "),f()),2&e&&U("href","/explorer?term=",T().$implicit.index-1,"",W)}function q$(e,n){1&e&&(p(0,"a",39),m(1," Next Block "),Ae(2,"i",40),f()),2&e&&U("href","/explorer?term=",T().$implicit.index+1,"",W)}function Y$(e,n){if(1&e&&(p(0,"li")(1,"a",35),m(2),f()()),2&e){const t=n.$implicit;g(1),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id)}}function Z$(e,n){if(1&e&&(p(0,"div",55)(1,"ul"),I(2,Y$,3,2,"li",30),f()()),2&e){const t=T(3).$implicit;g(2),S("ngForOf",t.inputs)}}function J$(e,n){if(1&e&&(p(0,"div")(1,"div",56)(2,"p",51)(3,"a",35),m(4),f(),p(5,"button",52),m(6),f()()()()),2&e){const t=n.$implicit;g(3),U("href","/explorer?term=",t.to,"",W),g(1),A(t.to),g(2),V("",t.value.toFixed(6)," YDA")}}function X$(e,n){if(1&e){const t=Ze();p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",35),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",35),m(11),f()(),p(12,"div",15)(13,"div",44)(14,"p")(15,"strong"),m(16,"Inputs:"),f(),m(17),f(),p(18,"div",45)(19,"button",46),Z("click",function(){return Ue(t),Ge(T(6).toggleAccordion("inputsAccordion"))}),m(20,"Show Inputs"),f(),I(21,Z$,3,1,"div",47),f(),p(22,"p")(23,"strong"),m(24,"Outputs:"),f(),m(25),f()()(),p(26,"div",48)(27,"div",49)(28,"div",50)(29,"p",51)(30,"a",35),m(31),f(),p(32,"button",52),m(33),f()()()(),p(34,"div",53),Ae(35,"img",54),f(),p(36,"div",49),I(37,J$,7,3,"div",30),f()()()()}if(2&e){const t=T(2).$implicit,i=T(4);g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(6),V(" ",t.inputs.length,""),g(4),S("ngIf","inputsAccordion"===i.showAccordion),g(4),V(" ",t.outputs.length,""),g(5),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to),g(2),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function Q$(e,n){if(1&e&&(p(0,"div"),I(1,X$,38,11,"div",22),f()),2&e){const t=T().index,i=T().index,r=T(3);g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}function K$(e,n){if(1&e&&(p(0,"div")(1,"div",56)(2,"p",51)(3,"a",35),m(4),f(),p(5,"button",52),m(6),f()()()()),2&e){const t=n.$implicit;g(3),U("href","/explorer?term=",t.to,"",W),g(1),A(t.to),g(2),V("",t.value.toFixed(6)," YDA")}}function e4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",35),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",35),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Outputs:"),f(),m(15),f(),p(16,"div",48)(17,"div",49)(18,"div",50)(19,"p",51),m(20," (Newly Generated Coins) "),p(21,"button",52),m(22),f()()()(),p(23,"div",53),Ae(24,"img",54),f(),p(25,"div",49),I(26,K$,7,3,"div",30),f()()()()),2&e){const t=T(2).$implicit,i=T(4);g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.outputs.length,""),g(7),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function t4(e,n){if(1&e&&(p(0,"div"),I(1,e4,27,7,"div",22),f()),2&e){const t=T().index,i=T().index,r=T(3);g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}function n4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",35),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",35),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",57)(17,"h4",58),m(18,"Relationship DATA:"),f(),p(19,"textarea",59),m(20),f()(),p(21,"div",48)(22,"div",60)(23,"div",56)(24,"button",61),m(25,"Newly created Address"),f(),p(26,"p",62)(27,"a",35),m(28),f()()()()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship),g(7),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to)}}function i4(e,n){if(1&e&&(p(0,"div"),I(1,n4,29,8,"div",22),f()),2&e){const t=T().index,i=T().index,r=T(3);g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}function r4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",35),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",35),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",57)(17,"h4",58),m(18,"Relationship DATA:"),f(),p(19,"textarea",59),m(20),f()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship)}}function o4(e,n){if(1&e&&(p(0,"div"),I(1,r4,21,6,"div",22),f()),2&e){const t=T().index,i=T().index,r=T(3);g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}function s4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Transaction Hash: "),f(),p(5,"a",35),m(6),f()(),p(7,"p")(8,"strong"),m(9,"Transaction ID: "),f(),p(10,"a",35),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Relationship Identifier:"),f(),m(15),f(),p(16,"div",57)(17,"h4",58),m(18,"Relationship DATA:"),f(),p(19,"textarea",59),m(20),f()()()()),2&e){const t=T(2).$implicit;g(5),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",t.rid,""),g(5),A(t.relationship)}}function a4(e,n){if(1&e&&(p(0,"div"),I(1,s4,21,6,"div",22),f()),2&e){const t=T().index,i=T().index,r=T(3);g(1),S("ngIf",null==r.showBlockTransactionDetails||null==r.showBlockTransactionDetails[i]?null:r.showBlockTransactionDetails[i][t])}}const Cm=function(e,n,t,i,r){return{coinbase:e,transfer:n,"create-identity":t,"encrypted-message":i,message:r}};function l4(e,n){if(1&e){const t=Ze();p(0,"li")(1,"div",41)(2,"button",42),Z("click",function(){const o=Ue(t).index,s=T().index;return Ge(T(3).showTransactionDetails(s,o))}),m(3),f(),I(4,Q$,2,1,"div",22),I(5,t4,2,1,"div",22),I(6,i4,2,1,"div",22),I(7,o4,2,1,"div",22),I(8,a4,2,1,"div",22),f()()}if(2&e){const t=n.$implicit,i=T(4);g(2),S("ngClass",ns(7,Cm,i.transactionUtilsService.isCoinbaseTransaction(t),i.transactionUtilsService.isTransferTransaction(t),i.transactionUtilsService.isCreateIdentityTransaction(t),i.transactionUtilsService.isEncryptedMessageTransaction(t),i.transactionUtilsService.isMessageTransaction(t))),g(1),V(" ",i.transactionUtilsService.getTransactionType(t)," "),g(1),S("ngIf",i.transactionUtilsService.isTransferTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCoinbaseTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCreateIdentityTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isEncryptedMessageTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isMessageTransaction(t))}}function c4(e,n){if(1&e&&(p(0,"li")(1,"div",31),I(2,W$,3,1,"a",32),I(3,q$,3,1,"a",33),f(),p(4,"div",25)(5,"h2",34),m(6,"Block Details"),f(),p(7,"p")(8,"strong"),m(9,"Index: "),f(),p(10,"a",35),m(11),f()(),p(12,"p")(13,"strong"),m(14,"Time:"),f(),m(15),f(),p(16,"p")(17,"strong"),m(18,"Hash: "),f(),p(19,"a",35),m(20),f()(),p(21,"p")(22,"strong"),m(23,"Previous Hash: "),f(),p(24,"a",35),m(25),f()(),p(26,"p")(27,"strong"),m(28,"Nonce:"),f(),m(29),f(),p(30,"p")(31,"strong"),m(32,"Target:"),f(),m(33),f(),p(34,"p")(35,"strong"),m(36,"ID: "),f(),p(37,"a",35),m(38),f()(),p(39,"h3",36),m(40,"Transactions"),f(),p(41,"ul"),I(42,l4,9,13,"li",30),f()()()),2&e){const t=n.$implicit,i=T(3);g(2),S("ngIf",0!==t.index),g(1),S("ngIf",t.index!==i.current_height),g(7),U("href","/explorer?term=",t.index,"",W),g(1),A(t.index),g(4),V(" ",t.time,""),g(4),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.prevHash,"",W),g(1),A(t.prevHash),g(4),V(" ",t.nonce,""),g(4),V(" ",t.target,""),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),S("ngForOf",t.transactions)}}function u4(e,n){if(1&e&&(p(0,"div")(1,"div",25)(2,"h3",27),m(3),f(),p(4,"h2",28),m(5),f()(),p(6,"ul",29),I(7,c4,43,14,"li",30),f()()),2&e){const t=T(2);g(3),V(" search result for ","block_height"===t.resultType?"block index":"block_hash"===t.resultType?"block hash":"block_id"===t.resultType?"block id":"",": "),g(2),V(" ","block_height"===t.resultType?t.result[0].index:"block_hash"===t.resultType?t.result[0].hash:"block_id"===t.resultType?t.result[0].id:""," "),g(2),S("ngForOf",t.result)}}const bs=function(e){return{"searched-item":e}};function d4(e,n){if(1&e&&(p(0,"li")(1,"a",71),m(2),f()()),2&e){const t=n.$implicit,i=T(7);g(1),U("href","/explorer?term=",t.id,"",W),S("ngClass",$n(3,bs,i.isSearchedItem(t.id))),g(1),A(t.id)}}function f4(e,n){if(1&e&&(p(0,"div",55)(1,"ul"),I(2,d4,3,5,"li",30),f()()),2&e){const t=T(3).$implicit;g(2),S("ngForOf",t.inputs)}}function h4(e,n){if(1&e&&(p(0,"div")(1,"div",56)(2,"p",51)(3,"a",35),m(4),f(),p(5,"button",52),m(6),f()()()()),2&e){const t=n.$implicit;g(3),U("href","/explorer?term=",t.to,"",W),g(1),A(t.to),g(2),V("",t.value.toFixed(6)," YDA")}}function p4(e,n){if(1&e){const t=Ze();p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Inputs:"),f(),m(5),f(),p(6,"div",72)(7,"button",46),Z("click",function(){return Ue(t),Ge(T(5).toggleAccordion("inputsAccordion"))}),m(8,"Show Inputs"),f(),I(9,f4,3,1,"div",47),f(),p(10,"p")(11,"strong"),m(12,"Outputs:"),f(),m(13),f(),p(14,"div",73)(15,"div",49)(16,"div",50)(17,"p",51)(18,"a",35),m(19),f(),p(20,"button",52),m(21),f()()()(),p(22,"div",53),Ae(23,"img",54),f(),p(24,"div",49),I(25,h4,7,3,"div",30),f()()()()}if(2&e){const t=T(2).$implicit,i=T(3);g(5),V(" ",t.inputs.length,""),g(4),S("ngIf","inputsAccordion"===i.showAccordion),g(4),V(" ",t.outputs.length,""),g(5),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to),g(2),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function g4(e,n){if(1&e&&(p(0,"div")(1,"div",56)(2,"p",51)(3,"a",35),m(4),f(),p(5,"button",52),m(6),f()()()()),2&e){const t=n.$implicit;g(3),U("href","/explorer?term=",t.to,"",W),g(1),A(t.to),g(2),V("",t.value.toFixed(6)," YDA")}}function m4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Outputs:"),f(),m(5),f(),p(6,"div",73)(7,"div",49)(8,"div",50)(9,"p",51),m(10," (Newly Generated Coins) "),p(11,"button",52),m(12),f()()()(),p(13,"div",53),Ae(14,"img",54),f(),p(15,"div",49),I(16,g4,7,3,"div",30),f()()()()),2&e){const t=T(2).$implicit,i=T(3);g(5),V(" ",t.outputs.length,""),g(7),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function _4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Relationship Identifier:"),f(),m(5),f(),p(6,"div",57)(7,"h4",58),m(8,"Relationship DATA:"),f(),p(9,"textarea",59),m(10),f()(),p(11,"div",73)(12,"div",60)(13,"div",56)(14,"button",74),m(15,"Newly created Address"),f(),p(16,"p",62)(17,"a",35),m(18),f()()()()()()()),2&e){const t=T(2).$implicit;g(5),V(" ",t.rid,""),g(5),A(t.relationship),g(7),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to)}}function v4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Relationship Identifier:"),f(),m(5),f(),p(6,"div",57)(7,"h4",58),m(8,"Relationship DATA:"),f(),p(9,"textarea",59),m(10),f()()()()),2&e){const t=T(2).$implicit;g(5),V(" ",t.rid,""),g(5),A(t.relationship)}}function y4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Relationship Identifier:"),f(),m(5),f(),p(6,"div",57)(7,"h4",58),m(8,"Relationship DATA:"),f(),p(9,"textarea",59),m(10),f()()()()),2&e){const t=T(2).$implicit;g(5),V(" ",t.rid,""),g(5),A(t.relationship)}}function b4(e,n){if(1&e&&(p(0,"tr",68)(1,"td",69)(2,"div")(3,"h3",70),m(4,"included in the block"),f(),p(5,"p")(6,"strong"),m(7,"Index: "),f(),p(8,"a",35),m(9),f()(),p(10,"p")(11,"strong"),m(12,"Hash: "),f(),p(13,"a",35),m(14),f()(),p(15,"div",43)(16,"p")(17,"strong"),m(18,"Transaction Hash: "),f(),p(19,"a",71),m(20),f()(),p(21,"p")(22,"strong"),m(23,"Transaction ID: "),f(),p(24,"a",71),m(25),f()(),p(26,"p")(27,"strong"),m(28,"Time: "),f(),m(29),f(),p(30,"p")(31,"strong"),m(32,"Fee: "),f(),m(33),f(),I(34,p4,26,7,"div",22),I(35,m4,17,3,"div",22),I(36,_4,19,4,"div",22),I(37,v4,11,2,"div",22),I(38,y4,11,2,"div",22),f()()()()),2&e){const t=T().$implicit,i=T(3);g(8),U("href","/explorer?term=",t.blockIndex,"",W),g(1),A(t.blockIndex),g(4),U("href","/explorer?term=",t.blockHash,"",W),g(1),A(t.blockHash),g(5),U("href","/explorer?term=",t.hash,"",W),S("ngClass",$n(17,bs,i.isSearchedItem(t.hash))),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),S("ngClass",$n(19,bs,i.isSearchedItem(t.id))),g(1),A(t.id),g(4),V(" ",i.dateFormatService.formatTransactionTime(t.time),""),g(4),V(" ",t.fee," YDA"),g(1),S("ngIf",i.transactionUtilsService.isTransferTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCoinbaseTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCreateIdentityTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isEncryptedMessageTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isMessageTransaction(t))}}function D4(e,n){if(1&e){const t=Ze();Zi(0),p(1,"tr",65),Z("click",function(){const o=Ue(t).$implicit;return Ge(T(3).toggleDetails(o))}),p(2,"td"),m(3),f(),p(4,"td",64),m(5),f(),p(6,"td"),m(7),f(),p(8,"td"),m(9),f(),p(10,"td")(11,"button",66),m(12),f()()(),I(13,b4,39,21,"tr",67),Ji()}if(2&e){const t=n.$implicit,i=T(3);g(3),A(i.dateFormatService.formatTransactionTime(t.time)),g(2),A(t.hash),g(2),A(t.inputs.length),g(2),A(t.outputs.length),g(2),S("ngClass",ns(7,Cm,i.transactionUtilsService.isCoinbaseTransaction(t),i.transactionUtilsService.isTransferTransaction(t),i.transactionUtilsService.isCreateIdentityTransaction(t),i.transactionUtilsService.isEncryptedMessageTransaction(t),i.transactionUtilsService.isMessageTransaction(t))),g(1),V(" ",i.transactionUtilsService.getTransactionType(t)," "),g(1),S("ngIf",t.expanded)}}function w4(e,n){if(1&e&&(p(0,"div")(1,"div",25)(2,"h3",27),m(3),f(),p(4,"h2",28),m(5),f()(),p(6,"div",25)(7,"table",63)(8,"thead")(9,"tr")(10,"th"),m(11,"Time"),f(),p(12,"th",64),m(13,"Hash"),f(),p(14,"th"),m(15,"Inputs"),f(),p(16,"th"),m(17,"Outputs"),f(),p(18,"th"),m(19,"Type"),f()()(),p(20,"tbody"),I(21,D4,14,13,"ng-container",30),f()()()()),2&e){const t=T(2);g(3),V(" search result for ","txn_id"===t.resultType?"transaction id":"txn_hash"===t.resultType?"transaction hash":"",": "),g(2),V(" ",t.searchedId," "),g(16),S("ngForOf",t.result)}}function C4(e,n){if(1&e&&(p(0,"li")(1,"a",35),m(2),f()()),2&e){const t=n.$implicit;g(1),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id)}}function E4(e,n){if(1&e&&(p(0,"div",55)(1,"ul"),I(2,C4,3,2,"li",30),f()()),2&e){const t=T(2).$implicit;g(2),S("ngForOf",t.inputs)}}function T4(e,n){if(1&e&&(p(0,"div")(1,"div",56)(2,"p",51)(3,"a",71),m(4),f(),p(5,"button",52),m(6),f()()()()),2&e){const t=n.$implicit,i=T(7);g(3),U("href","/explorer?term=",t.to,"",W),S("ngClass",$n(4,bs,i.isSearchedItem(t.to))),g(1),V(" ",t.to," "),g(2),V("",t.value.toFixed(6)," YDA")}}function S4(e,n){if(1&e){const t=Ze();p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Inputs:"),f(),m(5),f(),p(6,"div",72)(7,"button",46),Z("click",function(){return Ue(t),Ge(T(6).toggleAccordion("inputsAccordion"))}),m(8,"Show Inputs"),f(),I(9,E4,3,1,"div",47),f(),p(10,"p")(11,"strong"),m(12,"Outputs:"),f(),m(13),f(),p(14,"div",73)(15,"div",49)(16,"div",50)(17,"p",51)(18,"a",71),m(19),f(),p(20,"button",52),m(21),f()()()(),p(22,"div",53),Ae(23,"img",54),f(),p(24,"div",49),I(25,T4,7,6,"div",30),f()()()()}if(2&e){const t=T().$implicit,i=T(5);g(5),V(" ",t.inputs.length,""),g(4),S("ngIf","inputsAccordion"===i.showAccordion),g(4),V(" ",t.outputs.length,""),g(5),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),S("ngClass",$n(8,bs,i.isSearchedItem(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to))),g(1),V(" ",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to," "),g(2),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function M4(e,n){if(1&e&&(p(0,"div")(1,"div",56)(2,"p",51)(3,"a",71),m(4),f(),p(5,"button",52),m(6),f()()()()),2&e){const t=n.$implicit,i=T(7);g(3),U("href","/explorer?term=",t.to,"",W),S("ngClass",$n(4,bs,i.isSearchedItem(t.to))),g(1),V(" ",t.to," "),g(2),V("",t.value.toFixed(6)," YDA")}}function I4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Outputs:"),f(),m(5),f(),p(6,"div",73)(7,"div",49)(8,"div",50)(9,"p",51),m(10," (Newly Generated Coins) "),p(11,"button",52),m(12),f()()()(),p(13,"div",53),Ae(14,"img",54),f(),p(15,"div",49),I(16,M4,7,6,"div",30),f()()()()),2&e){const t=T().$implicit,i=T(5);g(5),V(" ",t.outputs.length,""),g(7),V("",i.getTotalValue(t.outputs).toFixed(6)," YDA"),g(4),S("ngForOf",t.outputs)}}function N4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Relationship Identifier:"),f(),m(5),f(),p(6,"div",57)(7,"h4",58),m(8,"Relationship DATA:"),f(),p(9,"textarea",59),m(10),f()(),p(11,"div",73)(12,"div",82)(13,"div",56)(14,"button",74),m(15,"Newly created Address"),f(),p(16,"p",62)(17,"a",35),m(18),f()()()()()()()),2&e){const t=T().$implicit;g(5),V(" ",t.rid,""),g(5),A(t.relationship),g(7),U("href","/explorer?term=",null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to,"",W),g(1),A(null==t.outputs.slice(-1)[0]?null:t.outputs.slice(-1)[0].to)}}function O4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Relationship Identifier:"),f(),m(5),f(),p(6,"div",57)(7,"h4",58),m(8,"Relationship DATA:"),f(),p(9,"textarea",59),m(10),f()()()()),2&e){const t=T().$implicit;g(5),V(" ",t.rid,""),g(5),A(t.relationship)}}function x4(e,n){if(1&e&&(p(0,"div")(1,"div",43)(2,"p")(3,"strong"),m(4,"Relationship Identifier:"),f(),m(5),f(),p(6,"div",57)(7,"h4",58),m(8,"Relationship DATA:"),f(),p(9,"textarea",59),m(10),f()()()()),2&e){const t=T().$implicit;g(5),V(" ",t.rid,""),g(5),A(t.relationship)}}function A4(e,n){if(1&e&&(p(0,"div",43)(1,"p")(2,"strong"),m(3,"Transaction Hash: "),f(),p(4,"a",35),m(5),f()(),p(6,"p")(7,"strong"),m(8,"Transaction ID: "),f(),p(9,"a",35),m(10),f()(),p(11,"p")(12,"strong"),m(13,"Time: "),f(),m(14),f(),p(15,"p")(16,"strong"),m(17,"Fee: "),f(),m(18),f(),I(19,S4,26,10,"div",22),I(20,I4,17,3,"div",22),I(21,N4,19,4,"div",22),I(22,O4,11,2,"div",22),I(23,x4,11,2,"div",22),f()),2&e){const t=n.$implicit,i=T(5);g(4),U("href","/explorer?term=",t.hash,"",W),g(1),A(t.hash),g(4),U("href","/explorer?term=",t.id,"",W),g(1),A(t.id),g(4),V(" ",i.dateFormatService.formatTransactionTime(t.time),""),g(4),V(" ",t.fee," YDA"),g(1),S("ngIf",i.transactionUtilsService.isTransferTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCoinbaseTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isCreateIdentityTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isEncryptedMessageTransaction(t)),g(1),S("ngIf",i.transactionUtilsService.isMessageTransaction(t))}}function R4(e,n){if(1&e&&(p(0,"tr",68)(1,"td",80)(2,"h2",34),m(3,"Transactions in Block "),p(4,"a",35),m(5),f()(),I(6,A4,24,11,"div",81),f()()),2&e){const t=T().$implicit;g(4),U("href","/explorer?term=",t.index,"",W),g(1),A(t.index),g(1),S("ngForOf",t.transactions)}}function P4(e,n){if(1&e){const t=Ze();Zi(0),p(1,"tr",65),Z("click",function(){const o=Ue(t).$implicit;return Ge(T(3).toggleDetails(o))}),p(2,"td"),m(3),f(),p(4,"td"),m(5),f(),p(6,"td",64),m(7),f(),p(8,"td")(9,"button",66),m(10),f()()(),I(11,R4,7,3,"tr",67),Ji()}if(2&e){const t=n.$implicit,i=T(3);g(3),A(t.index),g(2),A(i.dateFormatService.formatTransactionTime(t.time)),g(2),A(t.hash),g(2),S("ngClass",ns(6,Cm,i.transactionUtilsService.isCoinbaseTransaction(t.transactions[0]),i.transactionUtilsService.isTransferTransaction(t.transactions[0]),i.transactionUtilsService.isCreateIdentityTransaction(t.transactions[0]),i.transactionUtilsService.isEncryptedMessageTransaction(t.transactions[0]),i.transactionUtilsService.isMessageTransaction(t.transactions[0]))),g(1),V(" ",i.transactionUtilsService.getTransactionType(t.transactions[0])," "),g(1),S("ngIf",t.expanded)}}function k4(e,n){if(1&e){const t=Ze();p(0,"li",83)(1,"a",84),Z("click",function(){const o=Ue(t).$implicit;return Ge(T(3).changePage(o))}),m(2),f()()}if(2&e){const t=n.$implicit;me("active",t===T(3).currentPage),g(2),A(t)}}function F4(e,n){if(1&e){const t=Ze();p(0,"div")(1,"div",25)(2,"h3",27),m(3),f(),p(4,"h2",28),m(5),f()(),p(6,"div",25)(7,"table",63)(8,"thead")(9,"tr")(10,"th"),m(11,"Block Index"),f(),p(12,"th"),m(13,"Time"),f(),p(14,"th",64),m(15,"Hash"),f(),p(16,"th"),m(17,"Type"),f()()(),p(18,"tbody"),I(19,P4,12,12,"ng-container",30),f()(),p(20,"ul",75),I(21,k4,3,3,"li",76),f(),p(22,"div",77)(23,"input",78),Z("ngModelChange",function(r){return Ue(t),Ge(T(2).targetPage=r)}),f(),p(24,"button",79),Z("click",function(){return Ue(t),Ge(T(2).goToPage())}),m(25,"Go"),f()()()()}if(2&e){const t=T(2);g(3),V(" Search result for ","txn_outputs_to"===t.resultType?"transaction outputs to":"",": "),g(2),V(" ",t.searchedId," "),g(14),S("ngForOf",t.paginatedResult),g(2),S("ngForOf",t.visiblePages),g(2),tu("max",t.calculateTotalPages.length),S("ngModel",t.targetPage)}}function L4(e,n){if(1&e&&(p(0,"div"),I(1,z$,4,0,"ng-container",22),I(2,u4,8,3,"div",22),I(3,w4,22,3,"div",22),I(4,F4,26,6,"div",22),f()),2&e){const t=T();g(1),S("ngIf",!t.result||t.result&&0===t.result.length),g(1),S("ngIf",("block_height"===t.resultType||"block_hash"===t.resultType||"block_id"===t.resultType)&&t.result&&t.result.length>0),g(1),S("ngIf",("txn_id"===t.resultType||"txn_hash"===t.resultType)&&t.result&&t.result.length>0),g(1),S("ngIf","txn_outputs_to"===t.resultType&&t.result&&t.result.length>0)}}function V4(e,n){1&e&&Ae(0,"app-latest-blocks")}function B4(e,n){1&e&&Ae(0,"app-address-balance")}function j4(e,n){1&e&&Ae(0,"app-mempool")}let kT=(()=>{class e{constructor(t,i,r,o){this.httpClient=t,this.route=i,this.dateFormatService=r,this.transactionUtilsService=o,this.title="explorer",this.model=new AT,this.result=[],this.searchedId="",this.searchedHash="",this.blocks=[],this.showBlockTransactions=!1,this.showBlockTransactionDetails=[[]],this.resultType="",this.balance=0,this.searching=!1,this.submitted=!1,this.current_height="",this.circulating="",this.hashrate="",this.difficulty="",this.selectedOption="Main Page",this.showAccordion=null,this.isCollapsed=!0,this.paginatedResult=[],this.currentPage=1,this.itemsPerPage=10,this.maxVisiblePages=10,this.visiblePages=[],this.prevResultLength=0,this.prevCurrentPage=0,this.targetPage=1,this.isCalculatingTotalPages=!1,this.httpClient.get("/api-stats").subscribe(s=>{this.difficulty=this.numberWithCommas(s.stats.difficulty),this.hashrate=this.formatHashrate(s.stats.network_hash_rate),this.current_height=this.numberWithCommas(s.stats.height),this.circulating=this.numberWithCommas(s.stats.circulating)},s=>{console.error("Error fetching API stats:",s),alert("Something went wrong while fetching API stats!")}),this.route.queryParams.subscribe(s=>{const a=s.term;a&&(this.model=new AT({term:a}),this.onSubmit(),this.selectedOption="SearchResults")}),window.location.search&&(this.searching=!0,this.submitted=!0,this.httpClient.get("/explorer-search"+window.location.search).subscribe(s=>{this.result=s.result||[],this.resultType=s.resultType,this.balance=s.balance,this.searchedId=s.searchedId,this.searchedHash=s.searchedHash,this.searching=!1,this.selectedOption="SearchResults",this.paginate(),this.updateVisiblePages()},s=>{console.error("Error fetching explorer search:",s),alert("Something went wrong while fetching explorer search results!")}))}ngOnInit(){}onSubmit(){this.searching=!0,this.submitted=!0;const i=`/explorer-search?term=${encodeURIComponent(this.model.term)}`;this.httpClient.get(i).subscribe(r=>{this.result=r.result||[],this.resultType=r.resultType,this.balance=r.balance,this.searchedId=r.searchedId,this.searchedHash=r.searchedHash,this.searching=!1,this.selectedOption="SearchResults",this.paginate(),this.updateVisiblePages(),this.selectedOption="SearchResults"},r=>{console.error("Error fetching explorer search:",r),alert("Something went wrong while fetching explorer search results!"),this.searching=!1})}showBlockDetails(t){console.log("Clicked block:",t),this.selectedBlock=t}toggleAccordion(t){this.showAccordion=this.showAccordion===t?null:t}toggleDetails(t){if(t.expanded)t.expanded=!1;else{this.blocks.forEach(r=>r.expanded=!1),t.expanded=!0;const i=this.blocks.indexOf(t);this.showBlockTransactionDetails[i]=this.showBlockTransactionDetails[i]||[],this.selectedBlock=t}}showTransactions(){this.showBlockTransactions=!this.showBlockTransactions,this.showBlockTransactionDetails=[]}showTransactionDetails(t,i){console.log("Clicked transaction:",t,i),this.showBlockTransactionDetails[t]||(this.showBlockTransactionDetails[t]=[]),this.showBlockTransactionDetails[t][i]=!this.showBlockTransactionDetails[t][i]}numberWithCommas(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}formatHashrate(t){return t<1e3?`${t.toFixed(0)} h/s`:t<1e6?`${(t/1e3).toFixed(2)} kh/s`:`${(t/1e6).toFixed(2)} mh/s`}calculateAge(t){const i=(new Date).getTime(),r=new Date(1e3*t).getTime();console.log("Current Time:",new Date(i)),console.log("Block Time:",new Date(r));const o=i-r,s=Math.floor(o/6e4);return console.log("Difference:",o),console.log("Age in Minutes:",s),s<60?`${s} minutes ago`:`${Math.floor(s/60)} hours ago`}getTotalValue(t){return t.reduce((i,r)=>i+r.value,0)}selectOption(t){this.selectedOption=t}logButtonClick(){console.log("Button clicked!")}isSearchedItem(t){return t.toLowerCase()===this.searchedId.toLowerCase()}paginate(){const t=(this.currentPage-1)*this.itemsPerPage;this.paginatedResult=this.result.slice(t,t+this.itemsPerPage)}changePage(t){this.currentPage=+t,this.paginate(),(this.result.length!==this.prevResultLength||this.currentPage!==this.prevCurrentPage)&&(this.updateVisiblePages(),this.prevResultLength=this.result.length,this.prevCurrentPage=this.currentPage)}get calculateTotalPages(){const t=Math.ceil(this.result.length/this.itemsPerPage);return Array.from({length:t},(i,r)=>r+1)}updateVisiblePages(){console.log("Entering updateVisiblePages");const t=this.calculateTotalPages.length;let i=[1];if(t<=this.maxVisiblePages)i=i.concat(this.calculateTotalPages.slice(1));else{const r=Math.floor((this.maxVisiblePages-3)/2);let o=Math.max(2,this.currentPage-r),s=Math.min(o+this.maxVisiblePages-4,t-1);s===t-1&&(o=Math.max(2,t-this.maxVisiblePages+3)),o>2&&i.push("..."),i=i.concat(Array.from({length:s-o+1},(a,l)=>o+l)),s=1&&this.targetPage<=this.calculateTotalPages.length&&(this.changePage(this.targetPage),this.targetPage=this.currentPage)}static#e=this.\u0275fac=function(i){return new(i||e)(b(Wa),b($r),b(Ju),b(Xu))};static#t=this.\u0275cmp=kt({type:e,selectors:[["app-root"]],decls:67,vars:16,consts:[[1,"content"],[1,"navbar","navbar-expand-lg","navbar-dark","bg-dark"],["src","yadacoinstatic/explorer/assets/yadalogo.png","alt","Yadacoin Logo",1,"logo"],["href","#",1,"navbar-brand",3,"click"],["type","button","data-toggle","collapse","data-target","#navbarNav","aria-controls","navbarNav","aria-expanded","false","aria-label","Toggle navigation",1,"navbar-toggler",3,"click"],[1,"navbar-toggler-icon"],["id","navbarNav",1,"collapse","navbar-collapse"],[1,"navbar-nav"],[1,"nav-item"],["href","#",1,"nav-link",3,"click"],[1,"form-inline","ml-auto",3,"ngSubmit"],["searchForm","ngForm"],["name","term","placeholder","Wallet address, Transaction Id, Block height, Block hash...",1,"form-control",3,"ngModel","ngModelChange"],["type","submit",1,"btn","btn-success"],[1,"container-fluid"],[1,"row"],[1,"col-12","col-md-6","col-lg-3"],[1,"result-box"],["src","yadacoinstatic/explorer/assets/network-height.png","alt","Network Height",1,"watermark"],["src","yadacoinstatic/explorer/assets/hashrate.png","alt","Network Hashrate",1,"watermark"],["src","yadacoinstatic/explorer/assets/difficulty.png","alt","Network Difficulty",1,"watermark"],["src","yadacoinstatic/explorer/assets/circulating-supply.png","alt","Circulating Supply",1,"watermark"],[4,"ngIf"],[1,"footer","fixed-bottom"],[2,"text-transform","uppercase","margin","20px","margin-top","25px","text-align","center"],[1,"blocks-container"],[2,"text-transform","uppercase","margin","20px","margin-top","25px","color","red"],[2,"text-transform","uppercase","margin","20px","margin-top","25px"],[2,"margin","20px","margin-top","10px","word-break","break-word"],[2,"list-style-type","none","padding","0","margin","0"],[4,"ngFor","ngForOf"],[1,"block-details"],["class","previous-button",3,"href",4,"ngIf"],["class","next-button",3,"href",4,"ngIf"],[2,"text-transform","uppercase","margin","20px","margin-top","10px"],[3,"href"],[2,"text-transform","uppercase","margin","20px","margin-top","20px"],[1,"previous-button",3,"href"],[1,"bi","bi-arrow-left"],[1,"next-button",3,"href"],[1,"bi","bi-arrow-right"],[1,"transaction-container"],[1,"transaction-type-button",3,"ngClass","click"],[1,"transaction-details"],[1,"col-md-12"],[1,"input-section",2,"width","100%","display","inline-block","margin-top","5px"],[1,"accordion",3,"click"],["class","panel",4,"ngIf"],[1,"row","in-section",2,"margin-top","5px"],[1,"col-md-5"],[1,"transfer-in-info-box"],[2,"margin-left","10px"],[1,"transaction-value-button"],[1,"col-md-2","text-center"],["src","yadacoinstatic/explorer/assets/arrow-right.png","alt","Arrow Right",1,"arrow-icon"],[1,"panel"],[1,"transfer-out-info-box"],[1,"relationship-data-box"],[2,"text-transform","uppercase","margin","10px"],["rows","4","readonly","",2,"width","98%"],[1,"col-md-6"],[1,"transaction-type-button","create-identity"],[2,"margin-left","15px"],[1,"blocks-table"],[1,"hash-column"],[3,"click"],[1,"transaction-type-button",3,"ngClass"],["class","expanded-row",4,"ngIf"],[1,"expanded-row"],["colspan","5"],[2,"text-transform","uppercase","margin-top","10px"],[3,"ngClass","href"],[1,"input-section"],[1,"row","in-section"],[1,"transaction-type-button","create-identity",2,"margin-bottom","10px","margin-left","10px"],[1,"pagination"],["class","page-item",3,"active",4,"ngFor","ngForOf"],[1,"page-input"],["type","number","placeholder","Go to page","min","1",3,"ngModel","max","ngModelChange"],[1,"go-button",3,"click"],["colspan","4"],["class","transaction-details",4,"ngFor","ngForOf"],[1,"col-md-4"],[1,"page-item"],[1,"page-link",3,"click"]],template:function(i,r){1&i&&(p(0,"body")(1,"div",0)(2,"nav",1),Ae(3,"img",2),p(4,"a",3),Z("click",function(){return r.selectOption("Main Page")}),m(5,"Yadacoin Explorer"),f(),p(6,"button",4),Z("click",function(){return r.logButtonClick()}),Ae(7,"span",5),f(),p(8,"div",6)(9,"ul",7)(10,"li",8)(11,"a",9),Z("click",function(){return r.selectOption("Latest Blocks")}),m(12,"Latest Blocks"),f()(),p(13,"li",8)(14,"a",9),Z("click",function(){return r.selectOption("Mempool")}),m(15,"Mempool"),f()(),p(16,"li",8)(17,"a",9),Z("click",function(){return r.selectOption("Address Balance")}),m(18,"Address Balance"),f()()(),p(19,"form",10,11),Z("ngSubmit",function(){return r.onSubmit()}),p(21,"input",12),Z("ngModelChange",function(s){return r.model.term=s}),f(),p(22,"button",13),m(23,"Search"),f()()()(),p(24,"div",14)(25,"div",15)(26,"div",16)(27,"div",17),Ae(28,"img",18),p(29,"h5"),m(30,"Network Height"),f(),p(31,"h3"),m(32),lu(33,"replaceComma"),f()()(),p(34,"div",16)(35,"div",17),Ae(36,"img",19),p(37,"h5"),m(38,"Network Hashrate"),f(),p(39,"h3"),m(40),f()()(),p(41,"div",16)(42,"div",17),Ae(43,"img",20),p(44,"h5"),m(45,"Network Difficulty"),f(),p(46,"h3"),m(47),lu(48,"replaceComma"),f()()(),p(49,"div",16)(50,"div",17),Ae(51,"img",21),p(52,"h5"),m(53,"Circulating Supply"),f(),p(54,"h3"),m(55),lu(56,"replaceComma"),f()()()()(),I(57,G$,7,0,"div",22),I(58,L4,5,4,"div",22),I(59,V4,1,0,"app-latest-blocks",22),I(60,B4,1,0,"app-address-balance",22),I(61,j4,1,0,"app-mempool",22),f(),p(62,"footer",23)(63,"p"),m(64,"YdaCoin Explorer v0.2.0 dev | by Rakni for YadaCoin 2024"),f(),p(65,"p"),m(66,"Donation Address YADA: 1Hx9hETwiuwFnXQ715bMBTahcjgF6DNhHL"),f()()()),2&i&&(g(21),S("ngModel",r.model.term),g(11),A(cu(33,10,r.current_height)),g(8),A(r.hashrate),g(7),A(cu(48,12,r.difficulty)),g(8),V("",cu(56,14,r.circulating)," YDA"),g(2),S("ngIf","Main Page"===r.selectedOption),g(1),S("ngIf","SearchResults"===r.selectedOption),g(1),S("ngIf","Latest Blocks"===r.selectedOption),g(1),S("ngIf","Address Balance"===r.selectedOption),g(1),S("ngIf","Mempool"===r.selectedOption))},dependencies:[xu,qn,Yn,sE,Ya,Ug,Rg,WC,Xg,Jg,Zu,Yu,RT,PT,$$,U$],styles:["body[_ngcontent-%COMP%]{background-color:silver;margin:30px 5%;color:#303030}.content[_ngcontent-%COMP%]{margin-bottom:5%}.logo[_ngcontent-%COMP%]{width:50px;height:auto;margin-right:10px;margin-left:10px}.form-inline[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;margin-left:10px;margin-top:5px}.form-control[_ngcontent-%COMP%]{flex:1}.btn[_ngcontent-%COMP%]{margin-left:10px;margin-right:20px}.navbar-nav[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .nav-link[_ngcontent-%COMP%]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#fff}.navbar-nav[_ngcontent-%COMP%]{margin-left:auto}.navbar-nav[_ngcontent-%COMP%] .nav-link[_ngcontent-%COMP%]{padding:.5rem 1rem}.navbar-nav[_ngcontent-%COMP%] .nav-link[_ngcontent-%COMP%]:hover{background-color:#ffffff1a}.navbar-toggler[_ngcontent-%COMP%]{margin-right:15px}.result-box[_ngcontent-%COMP%]{padding:10px;margin-right:10px;margin-top:20px;border-radius:5px;color:#fff;text-align:left;position:relative;background-color:#343a40}.result-box[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], .result-box[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:10px;text-transform:uppercase;position:relative;z-index:1}.result-box[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:24px;font-weight:700}.watermark[_ngcontent-%COMP%]{width:auto;height:95%;object-fit:contain;position:absolute;top:0;right:0;z-index:0}.footer[_ngcontent-%COMP%]{background-color:#1f2428;color:#fff;padding:2px;text-align:center;position:fixed;bottom:0;font-size:12px}.pagination[_ngcontent-%COMP%]{margin-top:20px;cursor:pointer}.go-button[_ngcontent-%COMP%]{margin-left:5px;border:none;border-radius:3px;cursor:pointer;opacity:.7;transition:background-color .3s;background-color:#1e87cf}.footer[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:2px 0}"]})}return e})();const H4=[{path:"",component:kT},{path:"mempool",component:RT},{path:"address-balance",component:PT},{path:"**",redirectTo:"/"}];let $4=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({imports:[OT.forRoot(H4),OT]})}return e})();const U4=["addListener","removeListener"],G4=["addEventListener","removeEventListener"],z4=["on","off"];function At(e,n,t,i){if(se(t)&&(i=t,t=void 0),i)return At(e,n,t).pipe(Ng(i));const[r,o]=function Y4(e){return se(e.addEventListener)&&se(e.removeEventListener)}(e)?G4.map(s=>a=>e[s](n,a,t)):function W4(e){return se(e.addListener)&&se(e.removeListener)}(e)?U4.map(FT(e,n)):function q4(e){return se(e.on)&&se(e.off)}(e)?z4.map(FT(e,n)):[];if(!r&&nf(e))return ht(s=>At(s,n,t))(ft(e));if(!r)throw new TypeError("Invalid event target");return new Ce(s=>{const a=(...l)=>s.next(1o(a)})}function FT(e,n){return t=>i=>e[t](n,i)}class Z4 extends nt{constructor(n,t){super()}schedule(n,t=0){return this}}const md={setInterval(e,n,...t){const{delegate:i}=md;return i?.setInterval?i.setInterval(e,n,...t):setInterval(e,n,...t)},clearInterval(e){const{delegate:n}=md;return(n?.clearInterval||clearInterval)(e)},delegate:void 0},LT={now:()=>(LT.delegate||Date).now(),delegate:void 0};class _l{constructor(n,t=_l.now){this.schedulerActionCtor=n,this.now=t}schedule(n,t=0,i){return new this.schedulerActionCtor(this,n).schedule(i,t)}}_l.now=LT.now;const Q4=new class X4 extends _l{constructor(n,t=_l.now){super(n,t),this.actions=[],this._active=!1}flush(n){const{actions:t}=this;if(this._active)return void t.push(n);let i;this._active=!0;do{if(i=n.execute(n.state,n.delay))break}while(n=t.shift());if(this._active=!1,i){for(;n=t.shift();)n.unsubscribe();throw i}}}(class J4 extends Z4{constructor(n,t){super(n,t),this.scheduler=n,this.work=t,this.pending=!1}schedule(n,t=0){var i;if(this.closed)return this;this.state=n;const r=this.id,o=this.scheduler;return null!=r&&(this.id=this.recycleAsyncId(o,r,t)),this.pending=!0,this.delay=t,this.id=null!==(i=this.id)&&void 0!==i?i:this.requestAsyncId(o,this.id,t),this}requestAsyncId(n,t,i=0){return md.setInterval(n.flush.bind(n,this),i)}recycleAsyncId(n,t,i=0){if(null!=i&&this.delay===i&&!1===this.pending)return t;null!=t&&md.clearInterval(t)}execute(n,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;const i=this._execute(n,t);if(i)return i;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}_execute(n,t){let r,i=!1;try{this.work(n)}catch(o){i=!0,r=o||new Error("Scheduled action threw falsy error")}if(i)return this.unsubscribe(),r}unsubscribe(){if(!this.closed){const{id:n,scheduler:t}=this,{actions:i}=t;this.work=this.state=this.scheduler=null,this.pending=!1,Vi(i,this),null!=n&&(this.id=this.recycleAsyncId(t,n,null)),this.delay=null,super.unsubscribe()}}});const{isArray:e5}=Array;function jT(e){return 1===e.length&&e5(e[0])?e[0]:e}function Em(...e){const n=Ul(e),t=jT(e);return t.length?new Ce(i=>{let r=t.map(()=>[]),o=t.map(()=>!1);i.add(()=>{r=o=null});for(let s=0;!i.closed&&s{if(r[s].push(a),r.every(l=>l.length)){const l=r.map(c=>c.shift());i.next(n?n(...l):l),r.some((c,u)=>!c.length&&o[u])&&i.complete()}},()=>{o[s]=!0,!r[s].length&&i.complete()}));return()=>{r=o=null}}):bn}function Tm(...e){const n=Ul(e);return qe((t,i)=>{const r=e.length,o=new Array(r);let s=e.map(()=>!1),a=!1;for(let l=0;l{o[l]=c,!a&&!s[l]&&(s[l]=!0,(a=s.every(kn))&&(s=null))},pr));t.subscribe(Ve(i,l=>{if(a){const c=[l,...o];i.next(n?n(...c):c)}}))})}Math,Math,Math;const A8=["*"],lU=["dialog"];function zr(e){return"string"==typeof e}function Wr(e){return null!=e}function Ss(e){return(e||document.body).getBoundingClientRect()}const yS={animation:!0,transitionTimerDelayMs:5},eG=()=>{},{transitionTimerDelayMs:tG}=yS,Tl=new Map,an=(e,n,t,i)=>{let r=i.context||{};const o=Tl.get(n);if(o)switch(i.runningTransition){case"continue":return bn;case"stop":e.run(()=>o.transition$.complete()),r=Object.assign(o.context,r),Tl.delete(n)}const s=t(n,i.animation,r)||eG;if(!i.animation||"none"===window.getComputedStyle(n).transitionProperty)return e.run(()=>s()),J(void 0).pipe(function QU(e){return n=>new Ce(t=>n.subscribe({next:s=>e.run(()=>t.next(s)),error:s=>e.run(()=>t.error(s)),complete:()=>e.run(()=>t.complete())}))}(e));const a=new Ee,l=new Ee,c=a.pipe(function n5(...e){return n=>el(n,J(...e))}(!0));Tl.set(n,{transition$:a,complete:()=>{l.next(),l.complete()},context:r});const u=function KU(e){const{transitionDelay:n,transitionDuration:t}=window.getComputedStyle(e);return 1e3*(parseFloat(n)+parseFloat(t))}(n);return e.runOutsideAngular(()=>{const d=At(n,"transitionend").pipe(et(c),vt(({target:_})=>_===n));(function HT(...e){return 1===(e=jT(e)).length?ft(e[0]):new Ce(function t5(e){return n=>{let t=[];for(let i=0;t&&!n.closed&&i{if(t){for(let o=0;o{let o=function K4(e){return e instanceof Date&&!isNaN(e)}(e)?+e-t.now():e;o<0&&(o=0);let s=0;return t.schedule(function(){r.closed||(r.next(s++),0<=i?this.schedule(void 0,i):r.complete())},o)})}(u+tG).pipe(et(c)),d,l).pipe(et(c)).subscribe(()=>{Tl.delete(n),e.run(()=>{s(),a.next(),a.complete()})})}),a.asObservable()};let Ed=(()=>{class e{constructor(){this.animation=yS.animation}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),IS=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),NS=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),AS=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),zm=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})();var Le=function(e){return e[e.Tab=9]="Tab",e[e.Enter=13]="Enter",e[e.Escape=27]="Escape",e[e.Space=32]="Space",e[e.PageUp=33]="PageUp",e[e.PageDown=34]="PageDown",e[e.End=35]="End",e[e.Home=36]="Home",e[e.ArrowLeft=37]="ArrowLeft",e[e.ArrowUp=38]="ArrowUp",e[e.ArrowRight=39]="ArrowRight",e[e.ArrowDown=40]="ArrowDown",e}(Le||{});typeof navigator<"u"&&navigator.userAgent&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||/Macintosh/.test(navigator.userAgent)&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2||/Android/.test(navigator.userAgent));const BS=["a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])","[contenteditable]",'[tabindex]:not([tabindex="-1"])'].join(", ");function jS(e){const n=Array.from(e.querySelectorAll(BS)).filter(t=>-1!==t.tabIndex);return[n[0],n[n.length-1]]}new Date(1882,10,12),new Date(2174,10,25);let KS=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),nM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})();class Xr{constructor(n,t,i){this.nodes=n,this.viewRef=t,this.componentRef=i}}let e6=(()=>{class e{constructor(t,i){this._el=t,this._zone=i}ngOnInit(){this._zone.onStable.asObservable().pipe(xt(1)).subscribe(()=>{an(this._zone,this._el.nativeElement,(t,i)=>{i&&Ss(t),t.classList.add("show")},{animation:this.animation,runningTransition:"continue"})})}hide(){return an(this._zone,this._el.nativeElement,({classList:t})=>t.remove("show"),{animation:this.animation,runningTransition:"stop"})}static#e=this.\u0275fac=function(i){return new(i||e)(b(Se),b(fe))};static#t=this.\u0275cmp=kt({type:e,selectors:[["ngb-modal-backdrop"]],hostAttrs:[2,"z-index","1055"],hostVars:6,hostBindings:function(i,r){2&i&&(Ir("modal-backdrop"+(r.backdropClass?" "+r.backdropClass:"")),me("show",!r.animation)("fade",r.animation))},inputs:{animation:"animation",backdropClass:"backdropClass"},standalone:!0,features:[In],decls:0,vars:0,template:function(i,r){},encapsulation:2})}return e})();class iM{update(n){}close(n){}dismiss(n){}}const t6=["animation","ariaLabelledBy","ariaDescribedBy","backdrop","centered","fullscreen","keyboard","scrollable","size","windowClass","modalDialogClass"],n6=["animation","backdropClass"];class i6{_applyWindowOptions(n,t){t6.forEach(i=>{Wr(t[i])&&(n[i]=t[i])})}_applyBackdropOptions(n,t){n6.forEach(i=>{Wr(t[i])&&(n[i]=t[i])})}update(n){this._applyWindowOptions(this._windowCmptRef.instance,n),this._backdropCmptRef&&this._backdropCmptRef.instance&&this._applyBackdropOptions(this._backdropCmptRef.instance,n)}get componentInstance(){if(this._contentRef&&this._contentRef.componentRef)return this._contentRef.componentRef.instance}get closed(){return this._closed.asObservable().pipe(et(this._hidden))}get dismissed(){return this._dismissed.asObservable().pipe(et(this._hidden))}get hidden(){return this._hidden.asObservable()}get shown(){return this._windowCmptRef.instance.shown.asObservable()}constructor(n,t,i,r){this._windowCmptRef=n,this._contentRef=t,this._backdropCmptRef=i,this._beforeDismiss=r,this._closed=new Ee,this._dismissed=new Ee,this._hidden=new Ee,n.instance.dismissEvent.subscribe(o=>{this.dismiss(o)}),this.result=new Promise((o,s)=>{this._resolve=o,this._reject=s}),this.result.then(null,()=>{})}close(n){this._windowCmptRef&&(this._closed.next(n),this._resolve(n),this._removeModalElements())}_dismiss(n){this._dismissed.next(n),this._reject(n),this._removeModalElements()}dismiss(n){if(this._windowCmptRef)if(this._beforeDismiss){const t=this._beforeDismiss();!function mS(e){return e&&e.then}(t)?!1!==t&&this._dismiss(n):t.then(i=>{!1!==i&&this._dismiss(n)},()=>{})}else this._dismiss(n)}_removeModalElements(){const n=this._windowCmptRef.instance.hide(),t=this._backdropCmptRef?this._backdropCmptRef.instance.hide():J(void 0);n.subscribe(()=>{const{nativeElement:i}=this._windowCmptRef.location;i.parentNode.removeChild(i),this._windowCmptRef.destroy(),this._contentRef&&this._contentRef.viewRef&&this._contentRef.viewRef.destroy(),this._windowCmptRef=null,this._contentRef=null}),t.subscribe(()=>{if(this._backdropCmptRef){const{nativeElement:i}=this._backdropCmptRef.location;i.parentNode.removeChild(i),this._backdropCmptRef.destroy(),this._backdropCmptRef=null}}),Em(n,t).subscribe(()=>{this._hidden.next(),this._hidden.complete()})}}var e_=function(e){return e[e.BACKDROP_CLICK=0]="BACKDROP_CLICK",e[e.ESC=1]="ESC",e}(e_||{});let r6=(()=>{class e{constructor(t,i,r){this._document=t,this._elRef=i,this._zone=r,this._closed$=new Ee,this._elWithFocus=null,this.backdrop=!0,this.keyboard=!0,this.dismissEvent=new Y,this.shown=new Ee,this.hidden=new Ee}get fullscreenClass(){return!0===this.fullscreen?" modal-fullscreen":zr(this.fullscreen)?` modal-fullscreen-${this.fullscreen}-down`:""}dismiss(t){this.dismissEvent.emit(t)}ngOnInit(){this._elWithFocus=this._document.activeElement,this._zone.onStable.asObservable().pipe(xt(1)).subscribe(()=>{this._show()})}ngOnDestroy(){this._disableEventHandling()}hide(){const{nativeElement:t}=this._elRef,i={animation:this.animation,runningTransition:"stop"},s=Em(an(this._zone,t,()=>t.classList.remove("show"),i),an(this._zone,this._dialogEl.nativeElement,()=>{},i));return s.subscribe(()=>{this.hidden.next(),this.hidden.complete()}),this._disableEventHandling(),this._restoreFocus(),s}_show(){const t={animation:this.animation,runningTransition:"continue"};Em(an(this._zone,this._elRef.nativeElement,(o,s)=>{s&&Ss(o),o.classList.add("show")},t),an(this._zone,this._dialogEl.nativeElement,()=>{},t)).subscribe(()=>{this.shown.next(),this.shown.complete()}),this._enableEventHandling(),this._setFocus()}_enableEventHandling(){const{nativeElement:t}=this._elRef;this._zone.runOutsideAngular(()=>{At(t,"keydown").pipe(et(this._closed$),vt(r=>r.which===Le.Escape)).subscribe(r=>{this.keyboard?requestAnimationFrame(()=>{r.defaultPrevented||this._zone.run(()=>this.dismiss(e_.ESC))}):"static"===this.backdrop&&this._bumpBackdrop()});let i=!1;At(this._dialogEl.nativeElement,"mousedown").pipe(et(this._closed$),wt(()=>i=!1),wn(()=>At(t,"mouseup").pipe(et(this._closed$),xt(1))),vt(({target:r})=>t===r)).subscribe(()=>{i=!0}),At(t,"click").pipe(et(this._closed$)).subscribe(({target:r})=>{t===r&&("static"===this.backdrop?this._bumpBackdrop():!0===this.backdrop&&!i&&this._zone.run(()=>this.dismiss(e_.BACKDROP_CLICK))),i=!1})})}_disableEventHandling(){this._closed$.next()}_setFocus(){const{nativeElement:t}=this._elRef;if(!t.contains(document.activeElement)){const i=t.querySelector("[ngbAutofocus]"),r=jS(t)[0];(i||r||t).focus()}}_restoreFocus(){const t=this._document.body,i=this._elWithFocus;let r;r=i&&i.focus&&t.contains(i)?i:t,this._zone.runOutsideAngular(()=>{setTimeout(()=>r.focus()),this._elWithFocus=null})}_bumpBackdrop(){"static"===this.backdrop&&an(this._zone,this._elRef.nativeElement,({classList:t})=>(t.add("modal-static"),()=>t.remove("modal-static")),{animation:this.animation,runningTransition:"continue"})}static#e=this.\u0275fac=function(i){return new(i||e)(b(ut),b(Se),b(fe))};static#t=this.\u0275cmp=kt({type:e,selectors:[["ngb-modal-window"]],viewQuery:function(i,r){if(1&i&&xr(lU,7),2&i){let o;Re(o=function Pe(){return function hk(e,n){return e[ri].queries[n].queryList}(O(),Mv())}())&&(r._dialogEl=o.first)}},hostAttrs:["role","dialog","tabindex","-1"],hostVars:7,hostBindings:function(i,r){2&i&&(Ie("aria-modal",!0)("aria-labelledby",r.ariaLabelledBy)("aria-describedby",r.ariaDescribedBy),Ir("modal d-block"+(r.windowClass?" "+r.windowClass:"")),me("fade",r.animation))},inputs:{animation:"animation",ariaLabelledBy:"ariaLabelledBy",ariaDescribedBy:"ariaDescribedBy",backdrop:"backdrop",centered:"centered",fullscreen:"fullscreen",keyboard:"keyboard",scrollable:"scrollable",size:"size",windowClass:"windowClass",modalDialogClass:"modalDialogClass"},outputs:{dismissEvent:"dismiss"},standalone:!0,features:[In],ngContentSelectors:A8,decls:4,vars:2,consts:[["role","document"],["dialog",""],[1,"modal-content"]],template:function(i,r){1&i&&(function T0(e){const n=O()[ot][Ft];if(!n.projection){const i=n.projection=ia(e?e.length:1,null),r=i.slice();let o=n.child;for(;null!==o;){const s=e?LR(o,e):0;null!==s&&(r[s]?r[s].projectionNext=o:i[s]=o,r[s]=o),o=o.next}}}(),p(0,"div",0,1)(2,"div",2),function S0(e,n=0,t){const i=O(),r=pe(),o=Uo(r,ue+e,16,null,t||null);null===o.projection&&(o.projection=n),Rf(),(!i[Ei]||yo())&&32!=(32&o.flags)&&function VO(e,n,t){Ny(n[ne],0,n,t,sh(e,t,n),Cy(t.parent||n[Ft],t,n))}(r,i,o)}(3),f()()),2&i&&Ir("modal-dialog"+(r.size?" modal-"+r.size:"")+(r.centered?" modal-dialog-centered":"")+r.fullscreenClass+(r.scrollable?" modal-dialog-scrollable":"")+(r.modalDialogClass?" "+r.modalDialogClass:""))},styles:["ngb-modal-window .component-host-scrollable{display:flex;flex-direction:column;overflow:hidden}\n"],encapsulation:2})}return e})(),o6=(()=>{class e{constructor(t){this._document=t}hide(){const t=Math.abs(window.innerWidth-this._document.documentElement.clientWidth),i=this._document.body,r=i.style,{overflow:o,paddingRight:s}=r;if(t>0){const a=parseFloat(window.getComputedStyle(i).paddingRight);r.paddingRight=`${a+t}px`}return r.overflow="hidden",()=>{t>0&&(r.paddingRight=s),r.overflow=o}}static#e=this.\u0275fac=function(i){return new(i||e)(H(ut))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),s6=(()=>{class e{constructor(t,i,r,o,s,a,l){this._applicationRef=t,this._injector=i,this._environmentInjector=r,this._document=o,this._scrollBar=s,this._rendererFactory=a,this._ngZone=l,this._activeWindowCmptHasChanged=new Ee,this._ariaHiddenValues=new Map,this._scrollBarRestoreFn=null,this._modalRefs=[],this._windowCmpts=[],this._activeInstances=new Y,this._activeWindowCmptHasChanged.subscribe(()=>{if(this._windowCmpts.length){const c=this._windowCmpts[this._windowCmpts.length-1];((e,n,t,i=!1)=>{e.runOutsideAngular(()=>{const r=At(n,"focusin").pipe(et(t),ae(o=>o.target));At(n,"keydown").pipe(et(t),vt(o=>o.which===Le.Tab),Tm(r)).subscribe(([o,s])=>{const[a,l]=jS(n);(s===a||s===n)&&o.shiftKey&&(l.focus(),o.preventDefault()),s===l&&!o.shiftKey&&(a.focus(),o.preventDefault())}),i&&At(n,"click").pipe(et(t),Tm(r),ae(o=>o[1])).subscribe(o=>o.focus())})})(this._ngZone,c.location.nativeElement,this._activeWindowCmptHasChanged),this._revertAriaHidden(),this._setAriaHidden(c.location.nativeElement)}})}_restoreScrollBar(){const t=this._scrollBarRestoreFn;t&&(this._scrollBarRestoreFn=null,t())}_hideScrollBar(){this._scrollBarRestoreFn||(this._scrollBarRestoreFn=this._scrollBar.hide())}open(t,i,r){const o=r.container instanceof HTMLElement?r.container:Wr(r.container)?this._document.querySelector(r.container):this._document.body,s=this._rendererFactory.createRenderer(null,null);if(!o)throw new Error(`The specified modal container "${r.container||"body"}" was not found in the DOM.`);this._hideScrollBar();const a=new iM,l=(t=r.injector||t).get(zt,null)||this._environmentInjector,c=this._getContentRef(t,l,i,a,r);let u=!1!==r.backdrop?this._attachBackdrop(o):void 0,d=this._attachWindowComponent(o,c.nodes),h=new i6(d,c,u,r.beforeDismiss);return this._registerModalRef(h),this._registerWindowCmpt(d),h.hidden.pipe(xt(1)).subscribe(()=>Promise.resolve(!0).then(()=>{this._modalRefs.length||(s.removeClass(this._document.body,"modal-open"),this._restoreScrollBar(),this._revertAriaHidden())})),a.close=_=>{h.close(_)},a.dismiss=_=>{h.dismiss(_)},a.update=_=>{h.update(_)},h.update(r),1===this._modalRefs.length&&s.addClass(this._document.body,"modal-open"),u&&u.instance&&u.changeDetectorRef.detectChanges(),d.changeDetectorRef.detectChanges(),h}get activeInstances(){return this._activeInstances}dismissAll(t){this._modalRefs.forEach(i=>i.dismiss(t))}hasOpenModals(){return this._modalRefs.length>0}_attachBackdrop(t){let i=Zp(e6,{environmentInjector:this._applicationRef.injector,elementInjector:this._injector});return this._applicationRef.attachView(i.hostView),t.appendChild(i.location.nativeElement),i}_attachWindowComponent(t,i){let r=Zp(r6,{environmentInjector:this._applicationRef.injector,elementInjector:this._injector,projectableNodes:i});return this._applicationRef.attachView(r.hostView),t.appendChild(r.location.nativeElement),r}_getContentRef(t,i,r,o,s){return r?r instanceof Je?this._createFromTemplateRef(r,o):zr(r)?this._createFromString(r):this._createFromComponent(t,i,r,o,s):new Xr([])}_createFromTemplateRef(t,i){const o=t.createEmbeddedView({$implicit:i,close(s){i.close(s)},dismiss(s){i.dismiss(s)}});return this._applicationRef.attachView(o),new Xr([o.rootNodes],o)}_createFromString(t){const i=this._document.createTextNode(`${t}`);return new Xr([[i]])}_createFromComponent(t,i,r,o,s){const l=Zp(r,{environmentInjector:i,elementInjector:Nt.create({providers:[{provide:iM,useValue:o}],parent:t})}),c=l.location.nativeElement;return s.scrollable&&c.classList.add("component-host-scrollable"),this._applicationRef.attachView(l.hostView),new Xr([[c]],l.hostView,l)}_setAriaHidden(t){const i=t.parentElement;i&&t!==this._document.body&&(Array.from(i.children).forEach(r=>{r!==t&&"SCRIPT"!==r.nodeName&&(this._ariaHiddenValues.set(r,r.getAttribute("aria-hidden")),r.setAttribute("aria-hidden","true"))}),this._setAriaHidden(i))}_revertAriaHidden(){this._ariaHiddenValues.forEach((t,i)=>{t?i.setAttribute("aria-hidden",t):i.removeAttribute("aria-hidden")}),this._ariaHiddenValues.clear()}_registerModalRef(t){const i=()=>{const r=this._modalRefs.indexOf(t);r>-1&&(this._modalRefs.splice(r,1),this._activeInstances.emit(this._modalRefs))};this._modalRefs.push(t),this._activeInstances.emit(this._modalRefs),t.result.then(i,i)}_registerWindowCmpt(t){this._windowCmpts.push(t),this._activeWindowCmptHasChanged.next(),t.onDestroy(()=>{const i=this._windowCmpts.indexOf(t);i>-1&&(this._windowCmpts.splice(i,1),this._activeWindowCmptHasChanged.next())})}static#e=this.\u0275fac=function(i){return new(i||e)(H(Ki),H(Nt),H(zt),H(ut),H(o6),H(kh),H(fe))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),a6=(()=>{class e{constructor(t){this._ngbConfig=t,this.backdrop=!0,this.fullscreen=!1,this.keyboard=!0}get animation(){return void 0===this._animation?this._ngbConfig.animation:this._animation}set animation(t){this._animation=t}static#e=this.\u0275fac=function(i){return new(i||e)(H(Ed))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),l6=(()=>{class e{constructor(t,i,r){this._injector=t,this._modalStack=i,this._config=r}open(t,i={}){const r={...this._config,animation:this._config.animation,...i};return this._modalStack.open(this._injector,t,r)}get activeInstances(){return this._modalStack.activeInstances}dismissAll(t){this._modalStack.dismissAll(t)}hasOpenModals(){return this._modalStack.hasOpenModals()}static#e=this.\u0275fac=function(i){return new(i||e)(H(Nt),H(s6),H(a6))};static#t=this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),rM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({providers:[l6]})}return e})(),aM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),gM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),mM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),_M=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),vM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),yM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),bM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),DM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),wM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})();new z("live announcer delay",{providedIn:"root",factory:function C6(){return 100}});let CM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})(),EM=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({})}return e})();const T6=[IS,NS,AS,zm,KS,nM,rM,aM,EM,gM,mM,_M,vM,yM,bM,DM,wM,CM];let S6=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e});static#n=this.\u0275inj=ve({imports:[T6,IS,NS,AS,zm,KS,nM,rM,aM,EM,gM,mM,_M,vM,yM,bM,DM,wM,CM]})}return e})(),M6=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=be({type:e,bootstrap:[kT]});static#n=this.\u0275inj=ve({providers:[Ju,Xu],imports:[rB,PB,$j,$4,Uj,S6,zm]})}return e})();nB().bootstrapModule(M6).catch(e=>console.error(e))},614:()=>{const se=":";const $l=function(E,...w){if($l.translate){const x=$l.translate(E,w);E=x[0],w=x[1]}let N=Qd(E[0],E.raw[0]);for(let x=1;x{var Li=Vi=>se(se.s=Vi);Li(614),Li(75)}]); \ No newline at end of file diff --git a/static/explorer/polyfills.js b/static/explorer/polyfills.js index a8bbd235..799a8e30 100644 --- a/static/explorer/polyfills.js +++ b/static/explorer/polyfills.js @@ -1,5482 +1 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["polyfills"],{ - -/***/ "./node_modules/core-js/es7/reflect.js": -/*!*********************************************!*\ - !*** ./node_modules/core-js/es7/reflect.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(/*! ../modules/es7.reflect.define-metadata */ "./node_modules/core-js/modules/es7.reflect.define-metadata.js"); -__webpack_require__(/*! ../modules/es7.reflect.delete-metadata */ "./node_modules/core-js/modules/es7.reflect.delete-metadata.js"); -__webpack_require__(/*! ../modules/es7.reflect.get-metadata */ "./node_modules/core-js/modules/es7.reflect.get-metadata.js"); -__webpack_require__(/*! ../modules/es7.reflect.get-metadata-keys */ "./node_modules/core-js/modules/es7.reflect.get-metadata-keys.js"); -__webpack_require__(/*! ../modules/es7.reflect.get-own-metadata */ "./node_modules/core-js/modules/es7.reflect.get-own-metadata.js"); -__webpack_require__(/*! ../modules/es7.reflect.get-own-metadata-keys */ "./node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js"); -__webpack_require__(/*! ../modules/es7.reflect.has-metadata */ "./node_modules/core-js/modules/es7.reflect.has-metadata.js"); -__webpack_require__(/*! ../modules/es7.reflect.has-own-metadata */ "./node_modules/core-js/modules/es7.reflect.has-own-metadata.js"); -__webpack_require__(/*! ../modules/es7.reflect.metadata */ "./node_modules/core-js/modules/es7.reflect.metadata.js"); -module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Reflect; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_a-function.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_a-function.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (it) { - if (typeof it != 'function') throw TypeError(it + ' is not a function!'); - return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_an-instance.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_an-instance.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (it, Constructor, name, forbiddenField) { - if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { - throw TypeError(name + ': incorrect invocation!'); - } return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_an-object.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_an-object.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -module.exports = function (it) { - if (!isObject(it)) throw TypeError(it + ' is not an object!'); - return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_array-from-iterable.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/modules/_array-from-iterable.js ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); - -module.exports = function (iter, ITERATOR) { - var result = []; - forOf(iter, false, result.push, result, ITERATOR); - return result; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_array-includes.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/modules/_array-includes.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// false -> Array#indexOf -// true -> Array#includes -var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); -var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); -var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); -module.exports = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIObject($this); - var length = toLength(O.length); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) if (IS_INCLUDES || index in O) { - if (O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_array-methods.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/modules/_array-methods.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 0 -> Array#forEach -// 1 -> Array#map -// 2 -> Array#filter -// 3 -> Array#some -// 4 -> Array#every -// 5 -> Array#find -// 6 -> Array#findIndex -var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); -var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); -var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); -var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); -var asc = __webpack_require__(/*! ./_array-species-create */ "./node_modules/core-js/modules/_array-species-create.js"); -module.exports = function (TYPE, $create) { - var IS_MAP = TYPE == 1; - var IS_FILTER = TYPE == 2; - var IS_SOME = TYPE == 3; - var IS_EVERY = TYPE == 4; - var IS_FIND_INDEX = TYPE == 6; - var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; - var create = $create || asc; - return function ($this, callbackfn, that) { - var O = toObject($this); - var self = IObject(O); - var f = ctx(callbackfn, that, 3); - var length = toLength(self.length); - var index = 0; - var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; - var val, res; - for (;length > index; index++) if (NO_HOLES || index in self) { - val = self[index]; - res = f(val, index, O); - if (TYPE) { - if (IS_MAP) result[index] = res; // map - else if (res) switch (TYPE) { - case 3: return true; // some - case 5: return val; // find - case 6: return index; // findIndex - case 2: result.push(val); // filter - } else if (IS_EVERY) return false; // every - } - } - return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; - }; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_array-species-constructor.js": -/*!********************************************************************!*\ - !*** ./node_modules/core-js/modules/_array-species-constructor.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js"); -var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); - -module.exports = function (original) { - var C; - if (isArray(original)) { - C = original.constructor; - // cross-realm fallback - if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; - if (isObject(C)) { - C = C[SPECIES]; - if (C === null) C = undefined; - } - } return C === undefined ? Array : C; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_array-species-create.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js/modules/_array-species-create.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 9.4.2.3 ArraySpeciesCreate(originalArray, length) -var speciesConstructor = __webpack_require__(/*! ./_array-species-constructor */ "./node_modules/core-js/modules/_array-species-constructor.js"); - -module.exports = function (original, length) { - return new (speciesConstructor(original))(length); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_classof.js": -/*!**************************************************!*\ - !*** ./node_modules/core-js/modules/_classof.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// getting tag from 19.1.3.6 Object.prototype.toString() -var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); -var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag'); -// ES3 wrong here -var ARG = cof(function () { return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (e) { /* empty */ } -}; - -module.exports = function (it) { - var O, T, B; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T - // builtinTag case - : ARG ? cof(O) - // ES3 arguments fallback - : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_cof.js": -/*!**********************************************!*\ - !*** ./node_modules/core-js/modules/_cof.js ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = function (it) { - return toString.call(it).slice(8, -1); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_collection-strong.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/modules/_collection-strong.js ***! - \************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; -var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); -var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); -var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); -var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); -var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); -var $iterDefine = __webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js"); -var step = __webpack_require__(/*! ./_iter-step */ "./node_modules/core-js/modules/_iter-step.js"); -var setSpecies = __webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js"); -var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); -var fastKey = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").fastKey; -var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); -var SIZE = DESCRIPTORS ? '_s' : 'size'; - -var getEntry = function (that, key) { - // fast case - var index = fastKey(key); - var entry; - if (index !== 'F') return that._i[index]; - // frozen object case - for (entry = that._f; entry; entry = entry.n) { - if (entry.k == key) return entry; - } -}; - -module.exports = { - getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { - var C = wrapper(function (that, iterable) { - anInstance(that, C, NAME, '_i'); - that._t = NAME; // collection type - that._i = create(null); // index - that._f = undefined; // first entry - that._l = undefined; // last entry - that[SIZE] = 0; // size - if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); - }); - redefineAll(C.prototype, { - // 23.1.3.1 Map.prototype.clear() - // 23.2.3.2 Set.prototype.clear() - clear: function clear() { - for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { - entry.r = true; - if (entry.p) entry.p = entry.p.n = undefined; - delete data[entry.i]; - } - that._f = that._l = undefined; - that[SIZE] = 0; - }, - // 23.1.3.3 Map.prototype.delete(key) - // 23.2.3.4 Set.prototype.delete(value) - 'delete': function (key) { - var that = validate(this, NAME); - var entry = getEntry(that, key); - if (entry) { - var next = entry.n; - var prev = entry.p; - delete that._i[entry.i]; - entry.r = true; - if (prev) prev.n = next; - if (next) next.p = prev; - if (that._f == entry) that._f = next; - if (that._l == entry) that._l = prev; - that[SIZE]--; - } return !!entry; - }, - // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) - // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) - forEach: function forEach(callbackfn /* , that = undefined */) { - validate(this, NAME); - var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); - var entry; - while (entry = entry ? entry.n : this._f) { - f(entry.v, entry.k, this); - // revert to the last existing entry - while (entry && entry.r) entry = entry.p; - } - }, - // 23.1.3.7 Map.prototype.has(key) - // 23.2.3.7 Set.prototype.has(value) - has: function has(key) { - return !!getEntry(validate(this, NAME), key); - } - }); - if (DESCRIPTORS) dP(C.prototype, 'size', { - get: function () { - return validate(this, NAME)[SIZE]; - } - }); - return C; - }, - def: function (that, key, value) { - var entry = getEntry(that, key); - var prev, index; - // change existing entry - if (entry) { - entry.v = value; - // create new entry - } else { - that._l = entry = { - i: index = fastKey(key, true), // <- index - k: key, // <- key - v: value, // <- value - p: prev = that._l, // <- previous entry - n: undefined, // <- next entry - r: false // <- removed - }; - if (!that._f) that._f = entry; - if (prev) prev.n = entry; - that[SIZE]++; - // add to index - if (index !== 'F') that._i[index] = entry; - } return that; - }, - getEntry: getEntry, - setStrong: function (C, NAME, IS_MAP) { - // add .keys, .values, .entries, [@@iterator] - // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 - $iterDefine(C, NAME, function (iterated, kind) { - this._t = validate(iterated, NAME); // target - this._k = kind; // kind - this._l = undefined; // previous - }, function () { - var that = this; - var kind = that._k; - var entry = that._l; - // revert to the last existing entry - while (entry && entry.r) entry = entry.p; - // get next entry - if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { - // or finish the iteration - that._t = undefined; - return step(1); - } - // return step by kind - if (kind == 'keys') return step(0, entry.k); - if (kind == 'values') return step(0, entry.v); - return step(0, [entry.k, entry.v]); - }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); - - // add [@@species], 23.1.2.2, 23.2.2.2 - setSpecies(NAME); - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_collection-weak.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/modules/_collection-weak.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); -var getWeak = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").getWeak; -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); -var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); -var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js"); -var $has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); -var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); -var arrayFind = createArrayMethod(5); -var arrayFindIndex = createArrayMethod(6); -var id = 0; - -// fallback for uncaught frozen keys -var uncaughtFrozenStore = function (that) { - return that._l || (that._l = new UncaughtFrozenStore()); -}; -var UncaughtFrozenStore = function () { - this.a = []; -}; -var findUncaughtFrozen = function (store, key) { - return arrayFind(store.a, function (it) { - return it[0] === key; - }); -}; -UncaughtFrozenStore.prototype = { - get: function (key) { - var entry = findUncaughtFrozen(this, key); - if (entry) return entry[1]; - }, - has: function (key) { - return !!findUncaughtFrozen(this, key); - }, - set: function (key, value) { - var entry = findUncaughtFrozen(this, key); - if (entry) entry[1] = value; - else this.a.push([key, value]); - }, - 'delete': function (key) { - var index = arrayFindIndex(this.a, function (it) { - return it[0] === key; - }); - if (~index) this.a.splice(index, 1); - return !!~index; - } -}; - -module.exports = { - getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { - var C = wrapper(function (that, iterable) { - anInstance(that, C, NAME, '_i'); - that._t = NAME; // collection type - that._i = id++; // collection id - that._l = undefined; // leak store for uncaught frozen objects - if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); - }); - redefineAll(C.prototype, { - // 23.3.3.2 WeakMap.prototype.delete(key) - // 23.4.3.3 WeakSet.prototype.delete(value) - 'delete': function (key) { - if (!isObject(key)) return false; - var data = getWeak(key); - if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key); - return data && $has(data, this._i) && delete data[this._i]; - }, - // 23.3.3.4 WeakMap.prototype.has(key) - // 23.4.3.4 WeakSet.prototype.has(value) - has: function has(key) { - if (!isObject(key)) return false; - var data = getWeak(key); - if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key); - return data && $has(data, this._i); - } - }); - return C; - }, - def: function (that, key, value) { - var data = getWeak(anObject(key), true); - if (data === true) uncaughtFrozenStore(that).set(key, value); - else data[that._i] = value; - return that; - }, - ufstore: uncaughtFrozenStore -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_collection.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_collection.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); -var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); -var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); -var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); -var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js"); -var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); -var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); -var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js"); -var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); -var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); - -module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { - var Base = global[NAME]; - var C = Base; - var ADDER = IS_MAP ? 'set' : 'add'; - var proto = C && C.prototype; - var O = {}; - var fixMethod = function (KEY) { - var fn = proto[KEY]; - redefine(proto, KEY, - KEY == 'delete' ? function (a) { - return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); - } : KEY == 'has' ? function has(a) { - return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); - } : KEY == 'get' ? function get(a) { - return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); - } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; } - : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; } - ); - }; - if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { - new C().entries().next(); - }))) { - // create collection constructor - C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); - redefineAll(C.prototype, methods); - meta.NEED = true; - } else { - var instance = new C(); - // early implementations not supports chaining - var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; - // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false - var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); - // most early implementations doesn't supports iterables, most modern - not close it correctly - var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new - // for early implementations -0 and +0 not the same - var BUGGY_ZERO = !IS_WEAK && fails(function () { - // V8 ~ Chromium 42- fails only with 5+ elements - var $instance = new C(); - var index = 5; - while (index--) $instance[ADDER](index, index); - return !$instance.has(-0); - }); - if (!ACCEPT_ITERABLES) { - C = wrapper(function (target, iterable) { - anInstance(target, C, NAME); - var that = inheritIfRequired(new Base(), target, C); - if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); - return that; - }); - C.prototype = proto; - proto.constructor = C; - } - if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { - fixMethod('delete'); - fixMethod('has'); - IS_MAP && fixMethod('get'); - } - if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); - // weak collections should not contains .clear method - if (IS_WEAK && proto.clear) delete proto.clear; - } - - setToStringTag(C, NAME); - - O[NAME] = C; - $export($export.G + $export.W + $export.F * (C != Base), O); - - if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); - - return C; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_core.js": -/*!***********************************************!*\ - !*** ./node_modules/core-js/modules/_core.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var core = module.exports = { version: '2.5.7' }; -if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_ctx.js": -/*!**********************************************!*\ - !*** ./node_modules/core-js/modules/_ctx.js ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// optional / simple context binding -var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); -module.exports = function (fn, that, length) { - aFunction(fn); - if (that === undefined) return fn; - switch (length) { - case 1: return function (a) { - return fn.call(that, a); - }; - case 2: return function (a, b) { - return fn.call(that, a, b); - }; - case 3: return function (a, b, c) { - return fn.call(that, a, b, c); - }; - } - return function (/* ...args */) { - return fn.apply(that, arguments); - }; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_defined.js": -/*!**************************************************!*\ - !*** ./node_modules/core-js/modules/_defined.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_descriptors.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_descriptors.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// Thank's IE8 for his funny defineProperty -module.exports = !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { - return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_dom-create.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_dom-create.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -var document = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").document; -// typeof document.createElement is 'object' in old IE -var is = isObject(document) && isObject(document.createElement); -module.exports = function (it) { - return is ? document.createElement(it) : {}; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_enum-bug-keys.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/modules/_enum-bug-keys.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_export.js": -/*!*************************************************!*\ - !*** ./node_modules/core-js/modules/_export.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); -var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); -var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); -var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); -var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); -var PROTOTYPE = 'prototype'; - -var $export = function (type, name, source) { - var IS_FORCED = type & $export.F; - var IS_GLOBAL = type & $export.G; - var IS_STATIC = type & $export.S; - var IS_PROTO = type & $export.P; - var IS_BIND = type & $export.B; - var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]; - var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); - var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); - var key, own, out, exp; - if (IS_GLOBAL) source = name; - for (key in source) { - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - // export native or passed - out = (own ? target : source)[key]; - // bind timers to global for call from export context - exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // extend global - if (target) redefine(target, key, out, type & $export.U); - // export - if (exports[key] != out) hide(exports, key, exp); - if (IS_PROTO && expProto[key] != out) expProto[key] = out; - } -}; -global.core = core; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_fails.js": -/*!************************************************!*\ - !*** ./node_modules/core-js/modules/_fails.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (exec) { - try { - return !!exec(); - } catch (e) { - return true; - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_for-of.js": -/*!*************************************************!*\ - !*** ./node_modules/core-js/modules/_for-of.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); -var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/core-js/modules/_iter-call.js"); -var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/core-js/modules/_is-array-iter.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); -var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/core-js/modules/core.get-iterator-method.js"); -var BREAK = {}; -var RETURN = {}; -var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { - var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); - var f = ctx(fn, that, entries ? 2 : 1); - var index = 0; - var length, step, iterator, result; - if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); - // fast case for arrays with default iterator - if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { - result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); - if (result === BREAK || result === RETURN) return result; - } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { - result = call(iterator, f, step.value, entries); - if (result === BREAK || result === RETURN) return result; - } -}; -exports.BREAK = BREAK; -exports.RETURN = RETURN; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_global.js": -/*!*************************************************!*\ - !*** ./node_modules/core-js/modules/_global.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self - // eslint-disable-next-line no-new-func - : Function('return this')(); -if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_has.js": -/*!**********************************************!*\ - !*** ./node_modules/core-js/modules/_has.js ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var hasOwnProperty = {}.hasOwnProperty; -module.exports = function (it, key) { - return hasOwnProperty.call(it, key); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_hide.js": -/*!***********************************************!*\ - !*** ./node_modules/core-js/modules/_hide.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); -var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); -module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? function (object, key, value) { - return dP.f(object, key, createDesc(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_html.js": -/*!***********************************************!*\ - !*** ./node_modules/core-js/modules/_html.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var document = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").document; -module.exports = document && document.documentElement; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_ie8-dom-define.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/modules/_ie8-dom-define.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { - return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js")('div'), 'a', { get: function () { return 7; } }).a != 7; -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_inherit-if-required.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/modules/_inherit-if-required.js ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -var setPrototypeOf = __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js").set; -module.exports = function (that, target, C) { - var S = target.constructor; - var P; - if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { - setPrototypeOf(that, P); - } return that; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_iobject.js": -/*!**************************************************!*\ - !*** ./node_modules/core-js/modules/_iobject.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); -// eslint-disable-next-line no-prototype-builtins -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { - return cof(it) == 'String' ? it.split('') : Object(it); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_is-array-iter.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/modules/_is-array-iter.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// check on default Array iterator -var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); -var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); -var ArrayProto = Array.prototype; - -module.exports = function (it) { - return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_is-array.js": -/*!***************************************************!*\ - !*** ./node_modules/core-js/modules/_is-array.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.2.2 IsArray(argument) -var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); -module.exports = Array.isArray || function isArray(arg) { - return cof(arg) == 'Array'; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_is-object.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_is-object.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (it) { - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_iter-call.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_iter-call.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// call something on iterator step with safe closing on error -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -module.exports = function (iterator, fn, value, entries) { - try { - return entries ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch (e) { - var ret = iterator['return']; - if (ret !== undefined) anObject(ret.call(iterator)); - throw e; - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_iter-create.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_iter-create.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); -var descriptor = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); -var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); -var IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -__webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(IteratorPrototype, __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'), function () { return this; }); - -module.exports = function (Constructor, NAME, next) { - Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); - setToStringTag(Constructor, NAME + ' Iterator'); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_iter-define.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_iter-define.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); -var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); -var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); -var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); -var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); -var $iterCreate = __webpack_require__(/*! ./_iter-create */ "./node_modules/core-js/modules/_iter-create.js"); -var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); -var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); -var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); -var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` -var FF_ITERATOR = '@@iterator'; -var KEYS = 'keys'; -var VALUES = 'values'; - -var returnThis = function () { return this; }; - -module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { - $iterCreate(Constructor, NAME, next); - var getMethod = function (kind) { - if (!BUGGY && kind in proto) return proto[kind]; - switch (kind) { - case KEYS: return function keys() { return new Constructor(this, kind); }; - case VALUES: return function values() { return new Constructor(this, kind); }; - } return function entries() { return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator'; - var DEF_VALUES = DEFAULT == VALUES; - var VALUES_BUG = false; - var proto = Base.prototype; - var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; - var $default = $native || getMethod(DEFAULT); - var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; - var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; - var methods, key, IteratorPrototype; - // Fix native - if ($anyNative) { - IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); - if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { - // Set @@toStringTag to native iterators - setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); - } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if (DEF_VALUES && $native && $native.name !== VALUES) { - VALUES_BUG = true; - $default = function values() { return $native.call(this); }; - } - // Define iterator - if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { - hide(proto, ITERATOR, $default); - } - // Plug for library - Iterators[NAME] = $default; - Iterators[TAG] = returnThis; - if (DEFAULT) { - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if (FORCED) for (key in methods) { - if (!(key in proto)) redefine(proto, key, methods[key]); - } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_iter-detect.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_iter-detect.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); -var SAFE_CLOSING = false; - -try { - var riter = [7][ITERATOR](); - riter['return'] = function () { SAFE_CLOSING = true; }; - // eslint-disable-next-line no-throw-literal - Array.from(riter, function () { throw 2; }); -} catch (e) { /* empty */ } - -module.exports = function (exec, skipClosing) { - if (!skipClosing && !SAFE_CLOSING) return false; - var safe = false; - try { - var arr = [7]; - var iter = arr[ITERATOR](); - iter.next = function () { return { done: safe = true }; }; - arr[ITERATOR] = function () { return iter; }; - exec(arr); - } catch (e) { /* empty */ } - return safe; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_iter-step.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_iter-step.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (done, value) { - return { value: value, done: !!done }; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_iterators.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_iterators.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = {}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_library.js": -/*!**************************************************!*\ - !*** ./node_modules/core-js/modules/_library.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = false; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_meta.js": -/*!***********************************************!*\ - !*** ./node_modules/core-js/modules/_meta.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var META = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js")('meta'); -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); -var setDesc = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; -var id = 0; -var isExtensible = Object.isExtensible || function () { - return true; -}; -var FREEZE = !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { - return isExtensible(Object.preventExtensions({})); -}); -var setMeta = function (it) { - setDesc(it, META, { value: { - i: 'O' + ++id, // object ID - w: {} // weak collections IDs - } }); -}; -var fastKey = function (it, create) { - // return primitive with prefix - if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; - if (!has(it, META)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return 'F'; - // not necessary to add metadata - if (!create) return 'E'; - // add missing metadata - setMeta(it); - // return object ID - } return it[META].i; -}; -var getWeak = function (it, create) { - if (!has(it, META)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return true; - // not necessary to add metadata - if (!create) return false; - // add missing metadata - setMeta(it); - // return hash weak collections IDs - } return it[META].w; -}; -// add metadata on freeze-family methods calling -var onFreeze = function (it) { - if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); - return it; -}; -var meta = module.exports = { - KEY: META, - NEED: false, - fastKey: fastKey, - getWeak: getWeak, - onFreeze: onFreeze -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_metadata.js": -/*!***************************************************!*\ - !*** ./node_modules/core-js/modules/_metadata.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var Map = __webpack_require__(/*! ./es6.map */ "./node_modules/core-js/modules/es6.map.js"); -var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); -var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('metadata'); -var store = shared.store || (shared.store = new (__webpack_require__(/*! ./es6.weak-map */ "./node_modules/core-js/modules/es6.weak-map.js"))()); - -var getOrCreateMetadataMap = function (target, targetKey, create) { - var targetMetadata = store.get(target); - if (!targetMetadata) { - if (!create) return undefined; - store.set(target, targetMetadata = new Map()); - } - var keyMetadata = targetMetadata.get(targetKey); - if (!keyMetadata) { - if (!create) return undefined; - targetMetadata.set(targetKey, keyMetadata = new Map()); - } return keyMetadata; -}; -var ordinaryHasOwnMetadata = function (MetadataKey, O, P) { - var metadataMap = getOrCreateMetadataMap(O, P, false); - return metadataMap === undefined ? false : metadataMap.has(MetadataKey); -}; -var ordinaryGetOwnMetadata = function (MetadataKey, O, P) { - var metadataMap = getOrCreateMetadataMap(O, P, false); - return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey); -}; -var ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) { - getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue); -}; -var ordinaryOwnMetadataKeys = function (target, targetKey) { - var metadataMap = getOrCreateMetadataMap(target, targetKey, false); - var keys = []; - if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); }); - return keys; -}; -var toMetaKey = function (it) { - return it === undefined || typeof it == 'symbol' ? it : String(it); -}; -var exp = function (O) { - $export($export.S, 'Reflect', O); -}; - -module.exports = { - store: store, - map: getOrCreateMetadataMap, - has: ordinaryHasOwnMetadata, - get: ordinaryGetOwnMetadata, - set: ordinaryDefineOwnMetadata, - keys: ordinaryOwnMetadataKeys, - key: toMetaKey, - exp: exp -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-assign.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/modules/_object-assign.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// 19.1.2.1 Object.assign(target, source, ...) -var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); -var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); -var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); -var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); -var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); -var $assign = Object.assign; - -// should work with symbols and should have deterministic property order (V8 bug) -module.exports = !$assign || __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { - var A = {}; - var B = {}; - // eslint-disable-next-line no-undef - var S = Symbol(); - var K = 'abcdefghijklmnopqrst'; - A[S] = 7; - K.split('').forEach(function (k) { B[k] = k; }); - return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; -}) ? function assign(target, source) { // eslint-disable-line no-unused-vars - var T = toObject(target); - var aLen = arguments.length; - var index = 1; - var getSymbols = gOPS.f; - var isEnum = pIE.f; - while (aLen > index) { - var S = IObject(arguments[index++]); - var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); - var length = keys.length; - var j = 0; - var key; - while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; - } return T; -} : $assign; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-create.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/modules/_object-create.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var dPs = __webpack_require__(/*! ./_object-dps */ "./node_modules/core-js/modules/_object-dps.js"); -var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js"); -var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); -var Empty = function () { /* empty */ }; -var PROTOTYPE = 'prototype'; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = __webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js")('iframe'); - var i = enumBugKeys.length; - var lt = '<'; - var gt = '>'; - var iframeDocument; - iframe.style.display = 'none'; - __webpack_require__(/*! ./_html */ "./node_modules/core-js/modules/_html.js").appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; - return createDict(); -}; - -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - Empty[PROTOTYPE] = anObject(O); - result = new Empty(); - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : dPs(result, Properties); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-dp.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_object-dp.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/core-js/modules/_ie8-dom-define.js"); -var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); -var dP = Object.defineProperty; - -exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? Object.defineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return dP(O, P, Attributes); - } catch (e) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-dps.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_object-dps.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); - -module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var keys = getKeys(Properties); - var length = keys.length; - var i = 0; - var P; - while (length > i) dP.f(O, P = keys[i++], Properties[P]); - return O; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-gopd.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_object-gopd.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); -var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); -var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); -var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); -var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); -var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/core-js/modules/_ie8-dom-define.js"); -var gOPD = Object.getOwnPropertyDescriptor; - -exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? gOPD : function getOwnPropertyDescriptor(O, P) { - O = toIObject(O); - P = toPrimitive(P, true); - if (IE8_DOM_DEFINE) try { - return gOPD(O, P); - } catch (e) { /* empty */ } - if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-gops.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_object-gops.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -exports.f = Object.getOwnPropertySymbols; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-gpo.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_object-gpo.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) -var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); -var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); -var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); -var ObjectProto = Object.prototype; - -module.exports = Object.getPrototypeOf || function (O) { - O = toObject(O); - if (has(O, IE_PROTO)) return O[IE_PROTO]; - if (typeof O.constructor == 'function' && O instanceof O.constructor) { - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-keys-internal.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js/modules/_object-keys-internal.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); -var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); -var arrayIndexOf = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js")(false); -var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); - -module.exports = function (object, names) { - var O = toIObject(object); - var i = 0; - var result = []; - var key; - for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (has(O, key = names[i++])) { - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-keys.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_object-keys.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/core-js/modules/_object-keys-internal.js"); -var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js"); - -module.exports = Object.keys || function keys(O) { - return $keys(O, enumBugKeys); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_object-pie.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_object-pie.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -exports.f = {}.propertyIsEnumerable; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_property-desc.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/modules/_property-desc.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_redefine-all.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/modules/_redefine-all.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); -module.exports = function (target, src, safe) { - for (var key in src) redefine(target, key, src[key], safe); - return target; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_redefine.js": -/*!***************************************************!*\ - !*** ./node_modules/core-js/modules/_redefine.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); -var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); -var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); -var SRC = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js")('src'); -var TO_STRING = 'toString'; -var $toString = Function[TO_STRING]; -var TPL = ('' + $toString).split(TO_STRING); - -__webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js").inspectSource = function (it) { - return $toString.call(it); -}; - -(module.exports = function (O, key, val, safe) { - var isFunction = typeof val == 'function'; - if (isFunction) has(val, 'name') || hide(val, 'name', key); - if (O[key] === val) return; - if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); - if (O === global) { - O[key] = val; - } else if (!safe) { - delete O[key]; - hide(O, key, val); - } else if (O[key]) { - O[key] = val; - } else { - hide(O, key, val); - } -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -})(Function.prototype, TO_STRING, function toString() { - return typeof this == 'function' && this[SRC] || $toString.call(this); -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_set-proto.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_set-proto.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// Works with __proto__ only. Old v8 can't work with null proto objects. -/* eslint-disable no-proto */ -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var check = function (O, proto) { - anObject(O); - if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); -}; -module.exports = { - set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line - function (test, buggy, set) { - try { - set = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js")(Function.call, __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f(Object.prototype, '__proto__').set, 2); - set(test, []); - buggy = !(test instanceof Array); - } catch (e) { buggy = true; } - return function setPrototypeOf(O, proto) { - check(O, proto); - if (buggy) O.__proto__ = proto; - else set(O, proto); - return O; - }; - }({}, false) : undefined), - check: check -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_set-species.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/_set-species.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); -var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); -var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); -var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); - -module.exports = function (KEY) { - var C = global[KEY]; - if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { - configurable: true, - get: function () { return this; } - }); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_set-to-string-tag.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/modules/_set-to-string-tag.js ***! - \************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var def = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; -var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); -var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag'); - -module.exports = function (it, tag, stat) { - if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_shared-key.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_shared-key.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('keys'); -var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); -module.exports = function (key) { - return shared[key] || (shared[key] = uid(key)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_shared.js": -/*!*************************************************!*\ - !*** ./node_modules/core-js/modules/_shared.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); -var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || (global[SHARED] = {}); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: core.version, - mode: __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js") ? 'pure' : 'global', - copyright: '© 2018 Denis Pushkarev (zloirock.ru)' -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_to-absolute-index.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/modules/_to-absolute-index.js ***! - \************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); -var max = Math.max; -var min = Math.min; -module.exports = function (index, length) { - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_to-integer.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_to-integer.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// 7.1.4 ToInteger -var ceil = Math.ceil; -var floor = Math.floor; -module.exports = function (it) { - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_to-iobject.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/modules/_to-iobject.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); -var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); -module.exports = function (it) { - return IObject(defined(it)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_to-length.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_to-length.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.15 ToLength -var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); -var min = Math.min; -module.exports = function (it) { - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_to-object.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/_to-object.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.13 ToObject(argument) -var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); -module.exports = function (it) { - return Object(defined(it)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_to-primitive.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/modules/_to-primitive.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function (it, S) { - if (!isObject(it)) return it; - var fn, val; - if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; - if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; - if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; - throw TypeError("Can't convert object to primitive value"); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_uid.js": -/*!**********************************************!*\ - !*** ./node_modules/core-js/modules/_uid.js ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var id = 0; -var px = Math.random(); -module.exports = function (key) { - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_validate-collection.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/modules/_validate-collection.js ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -module.exports = function (it, TYPE) { - if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); - return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/_wks.js": -/*!**********************************************!*\ - !*** ./node_modules/core-js/modules/_wks.js ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var store = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('wks'); -var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); -var Symbol = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Symbol; -var USE_SYMBOL = typeof Symbol == 'function'; - -var $exports = module.exports = function (name) { - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - -$exports.store = store; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/core.get-iterator-method.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js/modules/core.get-iterator-method.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); -var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); -var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); -module.exports = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js").getIteratorMethod = function (it) { - if (it != undefined) return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es6.map.js": -/*!*************************************************!*\ - !*** ./node_modules/core-js/modules/es6.map.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var strong = __webpack_require__(/*! ./_collection-strong */ "./node_modules/core-js/modules/_collection-strong.js"); -var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); -var MAP = 'Map'; - -// 23.1 Map Objects -module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(MAP, function (get) { - return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; -}, { - // 23.1.3.6 Map.prototype.get(key) - get: function get(key) { - var entry = strong.getEntry(validate(this, MAP), key); - return entry && entry.v; - }, - // 23.1.3.9 Map.prototype.set(key, value) - set: function set(key, value) { - return strong.def(validate(this, MAP), key === 0 ? 0 : key, value); - } -}, strong, true); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es6.set.js": -/*!*************************************************!*\ - !*** ./node_modules/core-js/modules/es6.set.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var strong = __webpack_require__(/*! ./_collection-strong */ "./node_modules/core-js/modules/_collection-strong.js"); -var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); -var SET = 'Set'; - -// 23.2 Set Objects -module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(SET, function (get) { - return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; -}, { - // 23.2.3.1 Set.prototype.add(value) - add: function add(value) { - return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value); - } -}, strong); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es6.weak-map.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/modules/es6.weak-map.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var each = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(0); -var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); -var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js"); -var assign = __webpack_require__(/*! ./_object-assign */ "./node_modules/core-js/modules/_object-assign.js"); -var weak = __webpack_require__(/*! ./_collection-weak */ "./node_modules/core-js/modules/_collection-weak.js"); -var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); -var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); -var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); -var WEAK_MAP = 'WeakMap'; -var getWeak = meta.getWeak; -var isExtensible = Object.isExtensible; -var uncaughtFrozenStore = weak.ufstore; -var tmp = {}; -var InternalMap; - -var wrapper = function (get) { - return function WeakMap() { - return get(this, arguments.length > 0 ? arguments[0] : undefined); - }; -}; - -var methods = { - // 23.3.3.3 WeakMap.prototype.get(key) - get: function get(key) { - if (isObject(key)) { - var data = getWeak(key); - if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key); - return data ? data[this._i] : undefined; - } - }, - // 23.3.3.5 WeakMap.prototype.set(key, value) - set: function set(key, value) { - return weak.def(validate(this, WEAK_MAP), key, value); - } -}; - -// 23.3 WeakMap Objects -var $WeakMap = module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(WEAK_MAP, wrapper, methods, weak, true, true); - -// IE11 WeakMap frozen keys fix -if (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) { - InternalMap = weak.getConstructor(wrapper, WEAK_MAP); - assign(InternalMap.prototype, methods); - meta.NEED = true; - each(['delete', 'has', 'get', 'set'], function (key) { - var proto = $WeakMap.prototype; - var method = proto[key]; - redefine(proto, key, function (a, b) { - // store frozen objects on internal weakmap shim - if (isObject(a) && !isExtensible(a)) { - if (!this._f) this._f = new InternalMap(); - var result = this._f[key](a, b); - return key == 'set' ? this : result; - // store all the rest on native weakmap - } return method.call(this, a, b); - }); - }); -} - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.define-metadata.js": -/*!*********************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.define-metadata.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var toMetaKey = metadata.key; -var ordinaryDefineOwnMetadata = metadata.set; - -metadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) { - ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey)); -} }); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.delete-metadata.js": -/*!*********************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.delete-metadata.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var toMetaKey = metadata.key; -var getOrCreateMetadataMap = metadata.map; -var store = metadata.store; - -metadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) { - var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]); - var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false); - if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false; - if (metadataMap.size) return true; - var targetMetadata = store.get(target); - targetMetadata['delete'](targetKey); - return !!targetMetadata.size || store['delete'](target); -} }); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.get-metadata-keys.js": -/*!***********************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.get-metadata-keys.js ***! - \***********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var Set = __webpack_require__(/*! ./es6.set */ "./node_modules/core-js/modules/es6.set.js"); -var from = __webpack_require__(/*! ./_array-from-iterable */ "./node_modules/core-js/modules/_array-from-iterable.js"); -var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); -var ordinaryOwnMetadataKeys = metadata.keys; -var toMetaKey = metadata.key; - -var ordinaryMetadataKeys = function (O, P) { - var oKeys = ordinaryOwnMetadataKeys(O, P); - var parent = getPrototypeOf(O); - if (parent === null) return oKeys; - var pKeys = ordinaryMetadataKeys(parent, P); - return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys; -}; - -metadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey */) { - return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1])); -} }); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.get-metadata.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.get-metadata.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); -var ordinaryHasOwnMetadata = metadata.has; -var ordinaryGetOwnMetadata = metadata.get; -var toMetaKey = metadata.key; - -var ordinaryGetMetadata = function (MetadataKey, O, P) { - var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P); - if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P); - var parent = getPrototypeOf(O); - return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined; -}; - -metadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , targetKey */) { - return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2])); -} }); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js": -/*!***************************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js ***! - \***************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var ordinaryOwnMetadataKeys = metadata.keys; -var toMetaKey = metadata.key; - -metadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) { - return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1])); -} }); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.get-own-metadata.js": -/*!**********************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.get-own-metadata.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var ordinaryGetOwnMetadata = metadata.get; -var toMetaKey = metadata.key; - -metadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) { - return ordinaryGetOwnMetadata(metadataKey, anObject(target) - , arguments.length < 3 ? undefined : toMetaKey(arguments[2])); -} }); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.has-metadata.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.has-metadata.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); -var ordinaryHasOwnMetadata = metadata.has; -var toMetaKey = metadata.key; - -var ordinaryHasMetadata = function (MetadataKey, O, P) { - var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P); - if (hasOwn) return true; - var parent = getPrototypeOf(O); - return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false; -}; - -metadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) { - return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2])); -} }); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.has-own-metadata.js": -/*!**********************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.has-own-metadata.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var ordinaryHasOwnMetadata = metadata.has; -var toMetaKey = metadata.key; - -metadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) { - return ordinaryHasOwnMetadata(metadataKey, anObject(target) - , arguments.length < 3 ? undefined : toMetaKey(arguments[2])); -} }); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es7.reflect.metadata.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/modules/es7.reflect.metadata.js ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var $metadata = __webpack_require__(/*! ./_metadata */ "./node_modules/core-js/modules/_metadata.js"); -var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); -var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); -var toMetaKey = $metadata.key; -var ordinaryDefineOwnMetadata = $metadata.set; - -$metadata.exp({ metadata: function metadata(metadataKey, metadataValue) { - return function decorator(target, targetKey) { - ordinaryDefineOwnMetadata( - metadataKey, metadataValue, - (targetKey !== undefined ? anObject : aFunction)(target), - toMetaKey(targetKey) - ); - }; -} }); - - -/***/ }), - -/***/ "./node_modules/zone.js/dist/zone.js": -/*!*******************************************!*\ - !*** ./node_modules/zone.js/dist/zone.js ***! - \*******************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -/** -* @license -* Copyright Google Inc. All Rights Reserved. -* -* Use of this source code is governed by an MIT-style license that can be -* found in the LICENSE file at https://angular.io/license -*/ -(function (global, factory) { - true ? factory() : - undefined; -}(this, (function () { 'use strict'; - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -var Zone$1 = (function (global) { - var FUNCTION = 'function'; - var performance = global['performance']; - function mark(name) { - performance && performance['mark'] && performance['mark'](name); - } - function performanceMeasure(name, label) { - performance && performance['measure'] && performance['measure'](name, label); - } - mark('Zone'); - if (global['Zone']) { - throw new Error('Zone already loaded.'); - } - var Zone = /** @class */ (function () { - function Zone(parent, zoneSpec) { - this._properties = null; - this._parent = parent; - this._name = zoneSpec ? zoneSpec.name || 'unnamed' : ''; - this._properties = zoneSpec && zoneSpec.properties || {}; - this._zoneDelegate = - new ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec); - } - Zone.assertZonePatched = function () { - if (global['Promise'] !== patches['ZoneAwarePromise']) { - throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' + - 'has been overwritten.\n' + - 'Most likely cause is that a Promise polyfill has been loaded ' + - 'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' + - 'If you must load one, do so before loading zone.js.)'); - } - }; - Object.defineProperty(Zone, "root", { - get: function () { - var zone = Zone.current; - while (zone.parent) { - zone = zone.parent; - } - return zone; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Zone, "current", { - get: function () { - return _currentZoneFrame.zone; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Zone, "currentTask", { - get: function () { - return _currentTask; - }, - enumerable: true, - configurable: true - }); - Zone.__load_patch = function (name, fn) { - if (patches.hasOwnProperty(name)) { - throw Error('Already loaded patch: ' + name); - } - else if (!global['__Zone_disable_' + name]) { - var perfName = 'Zone:' + name; - mark(perfName); - patches[name] = fn(global, Zone, _api); - performanceMeasure(perfName, perfName); - } - }; - Object.defineProperty(Zone.prototype, "parent", { - get: function () { - return this._parent; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Zone.prototype, "name", { - get: function () { - return this._name; - }, - enumerable: true, - configurable: true - }); - Zone.prototype.get = function (key) { - var zone = this.getZoneWith(key); - if (zone) - return zone._properties[key]; - }; - Zone.prototype.getZoneWith = function (key) { - var current = this; - while (current) { - if (current._properties.hasOwnProperty(key)) { - return current; - } - current = current._parent; - } - return null; - }; - Zone.prototype.fork = function (zoneSpec) { - if (!zoneSpec) - throw new Error('ZoneSpec required!'); - return this._zoneDelegate.fork(this, zoneSpec); - }; - Zone.prototype.wrap = function (callback, source) { - if (typeof callback !== FUNCTION) { - throw new Error('Expecting function got: ' + callback); - } - var _callback = this._zoneDelegate.intercept(this, callback, source); - var zone = this; - return function () { - return zone.runGuarded(_callback, this, arguments, source); - }; - }; - Zone.prototype.run = function (callback, applyThis, applyArgs, source) { - if (applyThis === void 0) { applyThis = undefined; } - if (applyArgs === void 0) { applyArgs = null; } - if (source === void 0) { source = null; } - _currentZoneFrame = { parent: _currentZoneFrame, zone: this }; - try { - return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source); - } - finally { - _currentZoneFrame = _currentZoneFrame.parent; - } - }; - Zone.prototype.runGuarded = function (callback, applyThis, applyArgs, source) { - if (applyThis === void 0) { applyThis = null; } - if (applyArgs === void 0) { applyArgs = null; } - if (source === void 0) { source = null; } - _currentZoneFrame = { parent: _currentZoneFrame, zone: this }; - try { - try { - return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source); - } - catch (error) { - if (this._zoneDelegate.handleError(this, error)) { - throw error; - } - } - } - finally { - _currentZoneFrame = _currentZoneFrame.parent; - } - }; - Zone.prototype.runTask = function (task, applyThis, applyArgs) { - if (task.zone != this) { - throw new Error('A task can only be run in the zone of creation! (Creation: ' + - (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')'); - } - // https://github.com/angular/zone.js/issues/778, sometimes eventTask - // will run in notScheduled(canceled) state, we should not try to - // run such kind of task but just return - // we have to define an variable here, if not - // typescript compiler will complain below - var isNotScheduled = task.state === notScheduled; - if (isNotScheduled && task.type === eventTask) { - return; - } - var reEntryGuard = task.state != running; - reEntryGuard && task._transitionTo(running, scheduled); - task.runCount++; - var previousTask = _currentTask; - _currentTask = task; - _currentZoneFrame = { parent: _currentZoneFrame, zone: this }; - try { - if (task.type == macroTask && task.data && !task.data.isPeriodic) { - task.cancelFn = null; - } - try { - return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs); - } - catch (error) { - if (this._zoneDelegate.handleError(this, error)) { - throw error; - } - } - } - finally { - // if the task's state is notScheduled or unknown, then it has already been cancelled - // we should not reset the state to scheduled - if (task.state !== notScheduled && task.state !== unknown) { - if (task.type == eventTask || (task.data && task.data.isPeriodic)) { - reEntryGuard && task._transitionTo(scheduled, running); - } - else { - task.runCount = 0; - this._updateTaskCount(task, -1); - reEntryGuard && - task._transitionTo(notScheduled, running, notScheduled); - } - } - _currentZoneFrame = _currentZoneFrame.parent; - _currentTask = previousTask; - } - }; - Zone.prototype.scheduleTask = function (task) { - if (task.zone && task.zone !== this) { - // check if the task was rescheduled, the newZone - // should not be the children of the original zone - var newZone = this; - while (newZone) { - if (newZone === task.zone) { - throw Error("can not reschedule task to " + this - .name + " which is descendants of the original zone " + task.zone.name); - } - newZone = newZone.parent; - } - } - task._transitionTo(scheduling, notScheduled); - var zoneDelegates = []; - task._zoneDelegates = zoneDelegates; - task._zone = this; - try { - task = this._zoneDelegate.scheduleTask(this, task); - } - catch (err) { - // should set task's state to unknown when scheduleTask throw error - // because the err may from reschedule, so the fromState maybe notScheduled - task._transitionTo(unknown, scheduling, notScheduled); - // TODO: @JiaLiPassion, should we check the result from handleError? - this._zoneDelegate.handleError(this, err); - throw err; - } - if (task._zoneDelegates === zoneDelegates) { - // we have to check because internally the delegate can reschedule the task. - this._updateTaskCount(task, 1); - } - if (task.state == scheduling) { - task._transitionTo(scheduled, scheduling); - } - return task; - }; - Zone.prototype.scheduleMicroTask = function (source, callback, data, customSchedule) { - return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, null)); - }; - Zone.prototype.scheduleMacroTask = function (source, callback, data, customSchedule, customCancel) { - return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel)); - }; - Zone.prototype.scheduleEventTask = function (source, callback, data, customSchedule, customCancel) { - return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel)); - }; - Zone.prototype.cancelTask = function (task) { - if (task.zone != this) - throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' + - (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')'); - task._transitionTo(canceling, scheduled, running); - try { - this._zoneDelegate.cancelTask(this, task); - } - catch (err) { - // if error occurs when cancelTask, transit the state to unknown - task._transitionTo(unknown, canceling); - this._zoneDelegate.handleError(this, err); - throw err; - } - this._updateTaskCount(task, -1); - task._transitionTo(notScheduled, canceling); - task.runCount = 0; - return task; - }; - Zone.prototype._updateTaskCount = function (task, count) { - var zoneDelegates = task._zoneDelegates; - if (count == -1) { - task._zoneDelegates = null; - } - for (var i = 0; i < zoneDelegates.length; i++) { - zoneDelegates[i]._updateTaskCount(task.type, count); - } - }; - Zone.__symbol__ = __symbol__; - return Zone; - }()); - var DELEGATE_ZS = { - name: '', - onHasTask: function (delegate, _, target, hasTaskState) { - return delegate.hasTask(target, hasTaskState); - }, - onScheduleTask: function (delegate, _, target, task) { - return delegate.scheduleTask(target, task); - }, - onInvokeTask: function (delegate, _, target, task, applyThis, applyArgs) { return delegate.invokeTask(target, task, applyThis, applyArgs); }, - onCancelTask: function (delegate, _, target, task) { - return delegate.cancelTask(target, task); - } - }; - var ZoneDelegate = /** @class */ (function () { - function ZoneDelegate(zone, parentDelegate, zoneSpec) { - this._taskCounts = { 'microTask': 0, 'macroTask': 0, 'eventTask': 0 }; - this.zone = zone; - this._parentDelegate = parentDelegate; - this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS); - this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt); - this._forkCurrZone = zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate.zone); - this._interceptZS = - zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS); - this._interceptDlgt = - zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt); - this._interceptCurrZone = - zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate.zone); - this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS); - this._invokeDlgt = - zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt); - this._invokeCurrZone = zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate.zone); - this._handleErrorZS = - zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS); - this._handleErrorDlgt = - zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt); - this._handleErrorCurrZone = - zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate.zone); - this._scheduleTaskZS = - zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS); - this._scheduleTaskDlgt = - zoneSpec && (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt); - this._scheduleTaskCurrZone = - zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate.zone); - this._invokeTaskZS = - zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS); - this._invokeTaskDlgt = - zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt); - this._invokeTaskCurrZone = - zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate.zone); - this._cancelTaskZS = - zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS); - this._cancelTaskDlgt = - zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt); - this._cancelTaskCurrZone = - zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate.zone); - this._hasTaskZS = null; - this._hasTaskDlgt = null; - this._hasTaskDlgtOwner = null; - this._hasTaskCurrZone = null; - var zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask; - var parentHasTask = parentDelegate && parentDelegate._hasTaskZS; - if (zoneSpecHasTask || parentHasTask) { - // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such - // a case all task related interceptors must go through this ZD. We can't short circuit it. - this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS; - this._hasTaskDlgt = parentDelegate; - this._hasTaskDlgtOwner = this; - this._hasTaskCurrZone = zone; - if (!zoneSpec.onScheduleTask) { - this._scheduleTaskZS = DELEGATE_ZS; - this._scheduleTaskDlgt = parentDelegate; - this._scheduleTaskCurrZone = this.zone; - } - if (!zoneSpec.onInvokeTask) { - this._invokeTaskZS = DELEGATE_ZS; - this._invokeTaskDlgt = parentDelegate; - this._invokeTaskCurrZone = this.zone; - } - if (!zoneSpec.onCancelTask) { - this._cancelTaskZS = DELEGATE_ZS; - this._cancelTaskDlgt = parentDelegate; - this._cancelTaskCurrZone = this.zone; - } - } - } - ZoneDelegate.prototype.fork = function (targetZone, zoneSpec) { - return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) : - new Zone(targetZone, zoneSpec); - }; - ZoneDelegate.prototype.intercept = function (targetZone, callback, source) { - return this._interceptZS ? - this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) : - callback; - }; - ZoneDelegate.prototype.invoke = function (targetZone, callback, applyThis, applyArgs, source) { - return this._invokeZS ? - this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) : - callback.apply(applyThis, applyArgs); - }; - ZoneDelegate.prototype.handleError = function (targetZone, error) { - return this._handleErrorZS ? - this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) : - true; - }; - ZoneDelegate.prototype.scheduleTask = function (targetZone, task) { - var returnTask = task; - if (this._scheduleTaskZS) { - if (this._hasTaskZS) { - returnTask._zoneDelegates.push(this._hasTaskDlgtOwner); - } - returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task); - if (!returnTask) - returnTask = task; - } - else { - if (task.scheduleFn) { - task.scheduleFn(task); - } - else if (task.type == microTask) { - scheduleMicroTask(task); - } - else { - throw new Error('Task is missing scheduleFn.'); - } - } - return returnTask; - }; - ZoneDelegate.prototype.invokeTask = function (targetZone, task, applyThis, applyArgs) { - return this._invokeTaskZS ? - this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) : - task.callback.apply(applyThis, applyArgs); - }; - ZoneDelegate.prototype.cancelTask = function (targetZone, task) { - var value; - if (this._cancelTaskZS) { - value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task); - } - else { - if (!task.cancelFn) { - throw Error('Task is not cancelable'); - } - value = task.cancelFn(task); - } - return value; - }; - ZoneDelegate.prototype.hasTask = function (targetZone, isEmpty) { - // hasTask should not throw error so other ZoneDelegate - // can still trigger hasTask callback - try { - return this._hasTaskZS && - this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty); - } - catch (err) { - this.handleError(targetZone, err); - } - }; - ZoneDelegate.prototype._updateTaskCount = function (type, count) { - var counts = this._taskCounts; - var prev = counts[type]; - var next = counts[type] = prev + count; - if (next < 0) { - throw new Error('More tasks executed then were scheduled.'); - } - if (prev == 0 || next == 0) { - var isEmpty = { - microTask: counts['microTask'] > 0, - macroTask: counts['macroTask'] > 0, - eventTask: counts['eventTask'] > 0, - change: type - }; - this.hasTask(this.zone, isEmpty); - } - }; - return ZoneDelegate; - }()); - var ZoneTask = /** @class */ (function () { - function ZoneTask(type, source, callback, options, scheduleFn, cancelFn) { - this._zone = null; - this.runCount = 0; - this._zoneDelegates = null; - this._state = 'notScheduled'; - this.type = type; - this.source = source; - this.data = options; - this.scheduleFn = scheduleFn; - this.cancelFn = cancelFn; - this.callback = callback; - var self = this; - // TODO: @JiaLiPassion options should have interface - if (type === eventTask && options && options.useG) { - this.invoke = ZoneTask.invokeTask; - } - else { - this.invoke = function () { - return ZoneTask.invokeTask.call(global, self, this, arguments); - }; - } - } - ZoneTask.invokeTask = function (task, target, args) { - if (!task) { - task = this; - } - _numberOfNestedTaskFrames++; - try { - task.runCount++; - return task.zone.runTask(task, target, args); - } - finally { - if (_numberOfNestedTaskFrames == 1) { - drainMicroTaskQueue(); - } - _numberOfNestedTaskFrames--; - } - }; - Object.defineProperty(ZoneTask.prototype, "zone", { - get: function () { - return this._zone; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(ZoneTask.prototype, "state", { - get: function () { - return this._state; - }, - enumerable: true, - configurable: true - }); - ZoneTask.prototype.cancelScheduleRequest = function () { - this._transitionTo(notScheduled, scheduling); - }; - ZoneTask.prototype._transitionTo = function (toState, fromState1, fromState2) { - if (this._state === fromState1 || this._state === fromState2) { - this._state = toState; - if (toState == notScheduled) { - this._zoneDelegates = null; - } - } - else { - throw new Error(this.type + " '" + this.source + "': can not transition to '" + toState + "', expecting state '" + fromState1 + "'" + (fromState2 ? - ' or \'' + fromState2 + '\'' : - '') + ", was '" + this._state + "'."); - } - }; - ZoneTask.prototype.toString = function () { - if (this.data && typeof this.data.handleId !== 'undefined') { - return this.data.handleId; - } - else { - return Object.prototype.toString.call(this); - } - }; - // add toJSON method to prevent cyclic error when - // call JSON.stringify(zoneTask) - ZoneTask.prototype.toJSON = function () { - return { - type: this.type, - state: this.state, - source: this.source, - zone: this.zone.name, - runCount: this.runCount - }; - }; - return ZoneTask; - }()); - ////////////////////////////////////////////////////// - ////////////////////////////////////////////////////// - /// MICROTASK QUEUE - ////////////////////////////////////////////////////// - ////////////////////////////////////////////////////// - var symbolSetTimeout = __symbol__('setTimeout'); - var symbolPromise = __symbol__('Promise'); - var symbolThen = __symbol__('then'); - var _microTaskQueue = []; - var _isDrainingMicrotaskQueue = false; - var nativeMicroTaskQueuePromise; - function scheduleMicroTask(task) { - // if we are not running in any task, and there has not been anything scheduled - // we must bootstrap the initial task creation by manually scheduling the drain - if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) { - // We are not running in Task, so we need to kickstart the microtask queue. - if (!nativeMicroTaskQueuePromise) { - if (global[symbolPromise]) { - nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0); - } - } - if (nativeMicroTaskQueuePromise) { - nativeMicroTaskQueuePromise[symbolThen](drainMicroTaskQueue); - } - else { - global[symbolSetTimeout](drainMicroTaskQueue, 0); - } - } - task && _microTaskQueue.push(task); - } - function drainMicroTaskQueue() { - if (!_isDrainingMicrotaskQueue) { - _isDrainingMicrotaskQueue = true; - while (_microTaskQueue.length) { - var queue = _microTaskQueue; - _microTaskQueue = []; - for (var i = 0; i < queue.length; i++) { - var task = queue[i]; - try { - task.zone.runTask(task, null, null); - } - catch (error) { - _api.onUnhandledError(error); - } - } - } - _api.microtaskDrainDone(); - _isDrainingMicrotaskQueue = false; - } - } - ////////////////////////////////////////////////////// - ////////////////////////////////////////////////////// - /// BOOTSTRAP - ////////////////////////////////////////////////////// - ////////////////////////////////////////////////////// - var NO_ZONE = { name: 'NO ZONE' }; - var notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown'; - var microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask'; - var patches = {}; - var _api = { - symbol: __symbol__, - currentZoneFrame: function () { return _currentZoneFrame; }, - onUnhandledError: noop, - microtaskDrainDone: noop, - scheduleMicroTask: scheduleMicroTask, - showUncaughtError: function () { return !Zone[__symbol__('ignoreConsoleErrorUncaughtError')]; }, - patchEventTarget: function () { return []; }, - patchOnProperties: noop, - patchMethod: function () { return noop; }, - bindArguments: function () { return null; }, - setNativePromise: function (NativePromise) { - // sometimes NativePromise.resolve static function - // is not ready yet, (such as core-js/es6.promise) - // so we need to check here. - if (NativePromise && typeof NativePromise.resolve === FUNCTION) { - nativeMicroTaskQueuePromise = NativePromise.resolve(0); - } - }, - }; - var _currentZoneFrame = { parent: null, zone: new Zone(null, null) }; - var _currentTask = null; - var _numberOfNestedTaskFrames = 0; - function noop() { } - function __symbol__(name) { - return '__zone_symbol__' + name; - } - performanceMeasure('Zone', 'Zone'); - return global['Zone'] = Zone; -})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global); - -Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) { - var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - var ObjectDefineProperty = Object.defineProperty; - function readableObjectToString(obj) { - if (obj && obj.toString === Object.prototype.toString) { - var className = obj.constructor && obj.constructor.name; - return (className ? className : '') + ': ' + JSON.stringify(obj); - } - return obj ? obj.toString() : Object.prototype.toString.call(obj); - } - var __symbol__ = api.symbol; - var _uncaughtPromiseErrors = []; - var symbolPromise = __symbol__('Promise'); - var symbolThen = __symbol__('then'); - var creationTrace = '__creationTrace__'; - api.onUnhandledError = function (e) { - if (api.showUncaughtError()) { - var rejection = e && e.rejection; - if (rejection) { - console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined); - } - else { - console.error(e); - } - } - }; - api.microtaskDrainDone = function () { - while (_uncaughtPromiseErrors.length) { - var _loop_1 = function () { - var uncaughtPromiseError = _uncaughtPromiseErrors.shift(); - try { - uncaughtPromiseError.zone.runGuarded(function () { - throw uncaughtPromiseError; - }); - } - catch (error) { - handleUnhandledRejection(error); - } - }; - while (_uncaughtPromiseErrors.length) { - _loop_1(); - } - } - }; - var UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler'); - function handleUnhandledRejection(e) { - api.onUnhandledError(e); - try { - var handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL]; - if (handler && typeof handler === 'function') { - handler.call(this, e); - } - } - catch (err) { - } - } - function isThenable(value) { - return value && value.then; - } - function forwardResolution(value) { - return value; - } - function forwardRejection(rejection) { - return ZoneAwarePromise.reject(rejection); - } - var symbolState = __symbol__('state'); - var symbolValue = __symbol__('value'); - var symbolFinally = __symbol__('finally'); - var symbolParentPromiseValue = __symbol__('parentPromiseValue'); - var symbolParentPromiseState = __symbol__('parentPromiseState'); - var source = 'Promise.then'; - var UNRESOLVED = null; - var RESOLVED = true; - var REJECTED = false; - var REJECTED_NO_CATCH = 0; - function makeResolver(promise, state) { - return function (v) { - try { - resolvePromise(promise, state, v); - } - catch (err) { - resolvePromise(promise, false, err); - } - // Do not return value or you will break the Promise spec. - }; - } - var once = function () { - var wasCalled = false; - return function wrapper(wrappedFunction) { - return function () { - if (wasCalled) { - return; - } - wasCalled = true; - wrappedFunction.apply(null, arguments); - }; - }; - }; - var TYPE_ERROR = 'Promise resolved with itself'; - var CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace'); - // Promise Resolution - function resolvePromise(promise, state, value) { - var onceWrapper = once(); - if (promise === value) { - throw new TypeError(TYPE_ERROR); - } - if (promise[symbolState] === UNRESOLVED) { - // should only get value.then once based on promise spec. - var then = null; - try { - if (typeof value === 'object' || typeof value === 'function') { - then = value && value.then; - } - } - catch (err) { - onceWrapper(function () { - resolvePromise(promise, false, err); - })(); - return promise; - } - // if (value instanceof ZoneAwarePromise) { - if (state !== REJECTED && value instanceof ZoneAwarePromise && - value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) && - value[symbolState] !== UNRESOLVED) { - clearRejectedNoCatch(value); - resolvePromise(promise, value[symbolState], value[symbolValue]); - } - else if (state !== REJECTED && typeof then === 'function') { - try { - then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false))); - } - catch (err) { - onceWrapper(function () { - resolvePromise(promise, false, err); - })(); - } - } - else { - promise[symbolState] = state; - var queue = promise[symbolValue]; - promise[symbolValue] = value; - if (promise[symbolFinally] === symbolFinally) { - // the promise is generated by Promise.prototype.finally - if (state === RESOLVED) { - // the state is resolved, should ignore the value - // and use parent promise value - promise[symbolState] = promise[symbolParentPromiseState]; - promise[symbolValue] = promise[symbolParentPromiseValue]; - } - } - // record task information in value when error occurs, so we can - // do some additional work such as render longStackTrace - if (state === REJECTED && value instanceof Error) { - // check if longStackTraceZone is here - var trace = Zone.currentTask && Zone.currentTask.data && - Zone.currentTask.data[creationTrace]; - if (trace) { - // only keep the long stack trace into error when in longStackTraceZone - ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, { configurable: true, enumerable: false, writable: true, value: trace }); - } - } - for (var i = 0; i < queue.length;) { - scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]); - } - if (queue.length == 0 && state == REJECTED) { - promise[symbolState] = REJECTED_NO_CATCH; - try { - // try to print more readable error log - throw new Error('Uncaught (in promise): ' + readableObjectToString(value) + - (value && value.stack ? '\n' + value.stack : '')); - } - catch (err) { - var error_1 = err; - error_1.rejection = value; - error_1.promise = promise; - error_1.zone = Zone.current; - error_1.task = Zone.currentTask; - _uncaughtPromiseErrors.push(error_1); - api.scheduleMicroTask(); // to make sure that it is running - } - } - } - } - // Resolving an already resolved promise is a noop. - return promise; - } - var REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler'); - function clearRejectedNoCatch(promise) { - if (promise[symbolState] === REJECTED_NO_CATCH) { - // if the promise is rejected no catch status - // and queue.length > 0, means there is a error handler - // here to handle the rejected promise, we should trigger - // windows.rejectionhandled eventHandler or nodejs rejectionHandled - // eventHandler - try { - var handler = Zone[REJECTION_HANDLED_HANDLER]; - if (handler && typeof handler === 'function') { - handler.call(this, { rejection: promise[symbolValue], promise: promise }); - } - } - catch (err) { - } - promise[symbolState] = REJECTED; - for (var i = 0; i < _uncaughtPromiseErrors.length; i++) { - if (promise === _uncaughtPromiseErrors[i].promise) { - _uncaughtPromiseErrors.splice(i, 1); - } - } - } - } - function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) { - clearRejectedNoCatch(promise); - var promiseState = promise[symbolState]; - var delegate = promiseState ? - (typeof onFulfilled === 'function') ? onFulfilled : forwardResolution : - (typeof onRejected === 'function') ? onRejected : forwardRejection; - zone.scheduleMicroTask(source, function () { - try { - var parentPromiseValue = promise[symbolValue]; - var isFinallyPromise = chainPromise && symbolFinally === chainPromise[symbolFinally]; - if (isFinallyPromise) { - // if the promise is generated from finally call, keep parent promise's state and value - chainPromise[symbolParentPromiseValue] = parentPromiseValue; - chainPromise[symbolParentPromiseState] = promiseState; - } - // should not pass value to finally callback - var value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ? [] : [parentPromiseValue]); - resolvePromise(chainPromise, true, value); - } - catch (error) { - // if error occurs, should always return this error - resolvePromise(chainPromise, false, error); - } - }, chainPromise); - } - var ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }'; - var ZoneAwarePromise = /** @class */ (function () { - function ZoneAwarePromise(executor) { - var promise = this; - if (!(promise instanceof ZoneAwarePromise)) { - throw new Error('Must be an instanceof Promise.'); - } - promise[symbolState] = UNRESOLVED; - promise[symbolValue] = []; // queue; - try { - executor && executor(makeResolver(promise, RESOLVED), makeResolver(promise, REJECTED)); - } - catch (error) { - resolvePromise(promise, false, error); - } - } - ZoneAwarePromise.toString = function () { - return ZONE_AWARE_PROMISE_TO_STRING; - }; - ZoneAwarePromise.resolve = function (value) { - return resolvePromise(new this(null), RESOLVED, value); - }; - ZoneAwarePromise.reject = function (error) { - return resolvePromise(new this(null), REJECTED, error); - }; - ZoneAwarePromise.race = function (values) { - var resolve; - var reject; - var promise = new this(function (res, rej) { - resolve = res; - reject = rej; - }); - function onResolve(value) { - promise && (promise = null || resolve(value)); - } - function onReject(error) { - promise && (promise = null || reject(error)); - } - for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { - var value = values_1[_i]; - if (!isThenable(value)) { - value = this.resolve(value); - } - value.then(onResolve, onReject); - } - return promise; - }; - ZoneAwarePromise.all = function (values) { - var resolve; - var reject; - var promise = new this(function (res, rej) { - resolve = res; - reject = rej; - }); - var count = 0; - var resolvedValues = []; - for (var _i = 0, values_2 = values; _i < values_2.length; _i++) { - var value = values_2[_i]; - if (!isThenable(value)) { - value = this.resolve(value); - } - value.then((function (index) { return function (value) { - resolvedValues[index] = value; - count--; - if (!count) { - resolve(resolvedValues); - } - }; })(count), reject); - count++; - } - if (!count) - resolve(resolvedValues); - return promise; - }; - ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) { - var chainPromise = new this.constructor(null); - var zone = Zone.current; - if (this[symbolState] == UNRESOLVED) { - this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected); - } - else { - scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected); - } - return chainPromise; - }; - ZoneAwarePromise.prototype.catch = function (onRejected) { - return this.then(null, onRejected); - }; - ZoneAwarePromise.prototype.finally = function (onFinally) { - var chainPromise = new this.constructor(null); - chainPromise[symbolFinally] = symbolFinally; - var zone = Zone.current; - if (this[symbolState] == UNRESOLVED) { - this[symbolValue].push(zone, chainPromise, onFinally, onFinally); - } - else { - scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally); - } - return chainPromise; - }; - return ZoneAwarePromise; - }()); - // Protect against aggressive optimizers dropping seemingly unused properties. - // E.g. Closure Compiler in advanced mode. - ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve; - ZoneAwarePromise['reject'] = ZoneAwarePromise.reject; - ZoneAwarePromise['race'] = ZoneAwarePromise.race; - ZoneAwarePromise['all'] = ZoneAwarePromise.all; - var NativePromise = global[symbolPromise] = global['Promise']; - var ZONE_AWARE_PROMISE = Zone.__symbol__('ZoneAwarePromise'); - var desc = ObjectGetOwnPropertyDescriptor(global, 'Promise'); - if (!desc || desc.configurable) { - desc && delete desc.writable; - desc && delete desc.value; - if (!desc) { - desc = { configurable: true, enumerable: true }; - } - desc.get = function () { - // if we already set ZoneAwarePromise, use patched one - // otherwise return native one. - return global[ZONE_AWARE_PROMISE] ? global[ZONE_AWARE_PROMISE] : global[symbolPromise]; - }; - desc.set = function (NewNativePromise) { - if (NewNativePromise === ZoneAwarePromise) { - // if the NewNativePromise is ZoneAwarePromise - // save to global - global[ZONE_AWARE_PROMISE] = NewNativePromise; - } - else { - // if the NewNativePromise is not ZoneAwarePromise - // for example: after load zone.js, some library just - // set es6-promise to global, if we set it to global - // directly, assertZonePatched will fail and angular - // will not loaded, so we just set the NewNativePromise - // to global[symbolPromise], so the result is just like - // we load ES6 Promise before zone.js - global[symbolPromise] = NewNativePromise; - if (!NewNativePromise.prototype[symbolThen]) { - patchThen(NewNativePromise); - } - api.setNativePromise(NewNativePromise); - } - }; - ObjectDefineProperty(global, 'Promise', desc); - } - global['Promise'] = ZoneAwarePromise; - var symbolThenPatched = __symbol__('thenPatched'); - function patchThen(Ctor) { - var proto = Ctor.prototype; - var prop = ObjectGetOwnPropertyDescriptor(proto, 'then'); - if (prop && (prop.writable === false || !prop.configurable)) { - // check Ctor.prototype.then propertyDescriptor is writable or not - // in meteor env, writable is false, we should ignore such case - return; - } - var originalThen = proto.then; - // Keep a reference to the original method. - proto[symbolThen] = originalThen; - Ctor.prototype.then = function (onResolve, onReject) { - var _this = this; - var wrapped = new ZoneAwarePromise(function (resolve, reject) { - originalThen.call(_this, resolve, reject); - }); - return wrapped.then(onResolve, onReject); - }; - Ctor[symbolThenPatched] = true; - } - function zoneify(fn) { - return function () { - var resultPromise = fn.apply(this, arguments); - if (resultPromise instanceof ZoneAwarePromise) { - return resultPromise; - } - var ctor = resultPromise.constructor; - if (!ctor[symbolThenPatched]) { - patchThen(ctor); - } - return resultPromise; - }; - } - if (NativePromise) { - patchThen(NativePromise); - var fetch_1 = global['fetch']; - if (typeof fetch_1 == 'function') { - global['fetch'] = zoneify(fetch_1); - } - } - // This is not part of public API, but it is useful for tests, so we expose it. - Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors; - return ZoneAwarePromise; -}); - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -/** - * Suppress closure compiler errors about unknown 'Zone' variable - * @fileoverview - * @suppress {undefinedVars,globalThis,missingRequire} - */ -// issue #989, to reduce bundle size, use short name -/** Object.getOwnPropertyDescriptor */ -var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; -/** Object.defineProperty */ -var ObjectDefineProperty = Object.defineProperty; -/** Object.getPrototypeOf */ -var ObjectGetPrototypeOf = Object.getPrototypeOf; -/** Object.create */ -var ObjectCreate = Object.create; -/** Array.prototype.slice */ -var ArraySlice = Array.prototype.slice; -/** addEventListener string const */ -var ADD_EVENT_LISTENER_STR = 'addEventListener'; -/** removeEventListener string const */ -var REMOVE_EVENT_LISTENER_STR = 'removeEventListener'; -/** zoneSymbol addEventListener */ -var ZONE_SYMBOL_ADD_EVENT_LISTENER = Zone.__symbol__(ADD_EVENT_LISTENER_STR); -/** zoneSymbol removeEventListener */ -var ZONE_SYMBOL_REMOVE_EVENT_LISTENER = Zone.__symbol__(REMOVE_EVENT_LISTENER_STR); -/** true string const */ -var TRUE_STR = 'true'; -/** false string const */ -var FALSE_STR = 'false'; -/** __zone_symbol__ string const */ -var ZONE_SYMBOL_PREFIX = '__zone_symbol__'; -function wrapWithCurrentZone(callback, source) { - return Zone.current.wrap(callback, source); -} -function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) { - return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel); -} -var zoneSymbol = Zone.__symbol__; -var isWindowExists = typeof window !== 'undefined'; -var internalWindow = isWindowExists ? window : undefined; -var _global = isWindowExists && internalWindow || typeof self === 'object' && self || global; -var REMOVE_ATTRIBUTE = 'removeAttribute'; -var NULL_ON_PROP_VALUE = [null]; -function bindArguments(args, source) { - for (var i = args.length - 1; i >= 0; i--) { - if (typeof args[i] === 'function') { - args[i] = wrapWithCurrentZone(args[i], source + '_' + i); - } - } - return args; -} -function patchPrototype(prototype, fnNames) { - var source = prototype.constructor['name']; - var _loop_1 = function (i) { - var name_1 = fnNames[i]; - var delegate = prototype[name_1]; - if (delegate) { - var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name_1); - if (!isPropertyWritable(prototypeDesc)) { - return "continue"; - } - prototype[name_1] = (function (delegate) { - var patched = function () { - return delegate.apply(this, bindArguments(arguments, source + '.' + name_1)); - }; - attachOriginToPatched(patched, delegate); - return patched; - })(delegate); - } - }; - for (var i = 0; i < fnNames.length; i++) { - _loop_1(i); - } -} -function isPropertyWritable(propertyDesc) { - if (!propertyDesc) { - return true; - } - if (propertyDesc.writable === false) { - return false; - } - return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined'); -} -var isWebWorker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope); -// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify -// this code. -var isNode = (!('nw' in _global) && typeof _global.process !== 'undefined' && - {}.toString.call(_global.process) === '[object process]'); -var isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']); -// we are in electron of nw, so we are both browser and nodejs -// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify -// this code. -var isMix = typeof _global.process !== 'undefined' && - {}.toString.call(_global.process) === '[object process]' && !isWebWorker && - !!(isWindowExists && internalWindow['HTMLElement']); -var zoneSymbolEventNames = {}; -var wrapFn = function (event) { - // https://github.com/angular/zone.js/issues/911, in IE, sometimes - // event will be undefined, so we need to use window.event - event = event || _global.event; - if (!event) { - return; - } - var eventNameSymbol = zoneSymbolEventNames[event.type]; - if (!eventNameSymbol) { - eventNameSymbol = zoneSymbolEventNames[event.type] = zoneSymbol('ON_PROPERTY' + event.type); - } - var target = this || event.target || _global; - var listener = target[eventNameSymbol]; - var result = listener && listener.apply(this, arguments); - if (result != undefined && !result) { - event.preventDefault(); - } - return result; -}; -function patchProperty(obj, prop, prototype) { - var desc = ObjectGetOwnPropertyDescriptor(obj, prop); - if (!desc && prototype) { - // when patch window object, use prototype to check prop exist or not - var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop); - if (prototypeDesc) { - desc = { enumerable: true, configurable: true }; - } - } - // if the descriptor not exists or is not configurable - // just return - if (!desc || !desc.configurable) { - return; - } - // A property descriptor cannot have getter/setter and be writable - // deleting the writable and value properties avoids this error: - // - // TypeError: property descriptors must not specify a value or be writable when a - // getter or setter has been specified - delete desc.writable; - delete desc.value; - var originalDescGet = desc.get; - var originalDescSet = desc.set; - // substr(2) cuz 'onclick' -> 'click', etc - var eventName = prop.substr(2); - var eventNameSymbol = zoneSymbolEventNames[eventName]; - if (!eventNameSymbol) { - eventNameSymbol = zoneSymbolEventNames[eventName] = zoneSymbol('ON_PROPERTY' + eventName); - } - desc.set = function (newValue) { - // in some of windows's onproperty callback, this is undefined - // so we need to check it - var target = this; - if (!target && obj === _global) { - target = _global; - } - if (!target) { - return; - } - var previousValue = target[eventNameSymbol]; - if (previousValue) { - target.removeEventListener(eventName, wrapFn); - } - // issue #978, when onload handler was added before loading zone.js - // we should remove it with originalDescSet - if (originalDescSet) { - originalDescSet.apply(target, NULL_ON_PROP_VALUE); - } - if (typeof newValue === 'function') { - target[eventNameSymbol] = newValue; - target.addEventListener(eventName, wrapFn, false); - } - else { - target[eventNameSymbol] = null; - } - }; - // The getter would return undefined for unassigned properties but the default value of an - // unassigned property is null - desc.get = function () { - // in some of windows's onproperty callback, this is undefined - // so we need to check it - var target = this; - if (!target && obj === _global) { - target = _global; - } - if (!target) { - return null; - } - var listener = target[eventNameSymbol]; - if (listener) { - return listener; - } - else if (originalDescGet) { - // result will be null when use inline event attribute, - // such as - // because the onclick function is internal raw uncompiled handler - // the onclick will be evaluated when first time event was triggered or - // the property is accessed, https://github.com/angular/zone.js/issues/525 - // so we should use original native get to retrieve the handler - var value = originalDescGet && originalDescGet.call(this); - if (value) { - desc.set.call(this, value); - if (typeof target[REMOVE_ATTRIBUTE] === 'function') { - target.removeAttribute(prop); - } - return value; - } - } - return null; - }; - ObjectDefineProperty(obj, prop, desc); -} -function patchOnProperties(obj, properties, prototype) { - if (properties) { - for (var i = 0; i < properties.length; i++) { - patchProperty(obj, 'on' + properties[i], prototype); - } - } - else { - var onProperties = []; - for (var prop in obj) { - if (prop.substr(0, 2) == 'on') { - onProperties.push(prop); - } - } - for (var j = 0; j < onProperties.length; j++) { - patchProperty(obj, onProperties[j], prototype); - } - } -} -var originalInstanceKey = zoneSymbol('originalInstance'); -// wrap some native API on `window` -function patchClass(className) { - var OriginalClass = _global[className]; - if (!OriginalClass) - return; - // keep original class in global - _global[zoneSymbol(className)] = OriginalClass; - _global[className] = function () { - var a = bindArguments(arguments, className); - switch (a.length) { - case 0: - this[originalInstanceKey] = new OriginalClass(); - break; - case 1: - this[originalInstanceKey] = new OriginalClass(a[0]); - break; - case 2: - this[originalInstanceKey] = new OriginalClass(a[0], a[1]); - break; - case 3: - this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]); - break; - case 4: - this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]); - break; - default: - throw new Error('Arg list too long.'); - } - }; - // attach original delegate to patched function - attachOriginToPatched(_global[className], OriginalClass); - var instance = new OriginalClass(function () { }); - var prop; - for (prop in instance) { - // https://bugs.webkit.org/show_bug.cgi?id=44721 - if (className === 'XMLHttpRequest' && prop === 'responseBlob') - continue; - (function (prop) { - if (typeof instance[prop] === 'function') { - _global[className].prototype[prop] = function () { - return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments); - }; - } - else { - ObjectDefineProperty(_global[className].prototype, prop, { - set: function (fn) { - if (typeof fn === 'function') { - this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop); - // keep callback in wrapped function so we can - // use it in Function.prototype.toString to return - // the native one. - attachOriginToPatched(this[originalInstanceKey][prop], fn); - } - else { - this[originalInstanceKey][prop] = fn; - } - }, - get: function () { - return this[originalInstanceKey][prop]; - } - }); - } - }(prop)); - } - for (prop in OriginalClass) { - if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) { - _global[className][prop] = OriginalClass[prop]; - } - } -} -function patchMethod(target, name, patchFn) { - var proto = target; - while (proto && !proto.hasOwnProperty(name)) { - proto = ObjectGetPrototypeOf(proto); - } - if (!proto && target[name]) { - // somehow we did not find it, but we can see it. This happens on IE for Window properties. - proto = target; - } - var delegateName = zoneSymbol(name); - var delegate; - if (proto && !(delegate = proto[delegateName])) { - delegate = proto[delegateName] = proto[name]; - // check whether proto[name] is writable - // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob - var desc = proto && ObjectGetOwnPropertyDescriptor(proto, name); - if (isPropertyWritable(desc)) { - var patchDelegate_1 = patchFn(delegate, delegateName, name); - proto[name] = function () { - return patchDelegate_1(this, arguments); - }; - attachOriginToPatched(proto[name], delegate); - } - } - return delegate; -} -// TODO: @JiaLiPassion, support cancel task later if necessary -function patchMacroTask(obj, funcName, metaCreator) { - var setNative = null; - function scheduleTask(task) { - var data = task.data; - data.args[data.cbIdx] = function () { - task.invoke.apply(this, arguments); - }; - setNative.apply(data.target, data.args); - return task; - } - setNative = patchMethod(obj, funcName, function (delegate) { return function (self, args) { - var meta = metaCreator(self, args); - if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') { - return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask, null); - } - else { - // cause an error by calling it directly. - return delegate.apply(self, args); - } - }; }); -} - -function attachOriginToPatched(patched, original) { - patched[zoneSymbol('OriginalDelegate')] = original; -} -var isDetectedIEOrEdge = false; -var ieOrEdge = false; -function isIEOrEdge() { - if (isDetectedIEOrEdge) { - return ieOrEdge; - } - isDetectedIEOrEdge = true; - try { - var ua = internalWindow.navigator.userAgent; - if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) { - ieOrEdge = true; - } - return ieOrEdge; - } - catch (error) { - } -} - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -// override Function.prototype.toString to make zone.js patched function -// look like native function -Zone.__load_patch('toString', function (global) { - // patch Func.prototype.toString to let them look like native - var originalFunctionToString = Function.prototype.toString; - var ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate'); - var PROMISE_SYMBOL = zoneSymbol('Promise'); - var ERROR_SYMBOL = zoneSymbol('Error'); - var newFunctionToString = function toString() { - if (typeof this === 'function') { - var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL]; - if (originalDelegate) { - if (typeof originalDelegate === 'function') { - return originalFunctionToString.apply(this[ORIGINAL_DELEGATE_SYMBOL], arguments); - } - else { - return Object.prototype.toString.call(originalDelegate); - } - } - if (this === Promise) { - var nativePromise = global[PROMISE_SYMBOL]; - if (nativePromise) { - return originalFunctionToString.apply(nativePromise, arguments); - } - } - if (this === Error) { - var nativeError = global[ERROR_SYMBOL]; - if (nativeError) { - return originalFunctionToString.apply(nativeError, arguments); - } - } - } - return originalFunctionToString.apply(this, arguments); - }; - newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString; - Function.prototype.toString = newFunctionToString; - // patch Object.prototype.toString to let them look like native - var originalObjectToString = Object.prototype.toString; - var PROMISE_OBJECT_TO_STRING = '[object Promise]'; - Object.prototype.toString = function () { - if (this instanceof Promise) { - return PROMISE_OBJECT_TO_STRING; - } - return originalObjectToString.apply(this, arguments); - }; -}); - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -/** - * @fileoverview - * @suppress {missingRequire} - */ -// an identifier to tell ZoneTask do not create a new invoke closure -var OPTIMIZED_ZONE_EVENT_TASK_DATA = { - useG: true -}; -var zoneSymbolEventNames$1 = {}; -var globalSources = {}; -var EVENT_NAME_SYMBOL_REGX = /^__zone_symbol__(\w+)(true|false)$/; -var IMMEDIATE_PROPAGATION_SYMBOL = ('__zone_symbol__propagationStopped'); -function patchEventTarget(_global, apis, patchOptions) { - var ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR; - var REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR; - var LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners'; - var REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners'; - var zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER); - var ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':'; - var PREPEND_EVENT_LISTENER = 'prependListener'; - var PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':'; - var invokeTask = function (task, target, event) { - // for better performance, check isRemoved which is set - // by removeEventListener - if (task.isRemoved) { - return; - } - var delegate = task.callback; - if (typeof delegate === 'object' && delegate.handleEvent) { - // create the bind version of handleEvent when invoke - task.callback = function (event) { return delegate.handleEvent(event); }; - task.originalDelegate = delegate; - } - // invoke static task.invoke - task.invoke(task, target, [event]); - var options = task.options; - if (options && typeof options === 'object' && options.once) { - // if options.once is true, after invoke once remove listener here - // only browser need to do this, nodejs eventEmitter will cal removeListener - // inside EventEmitter.once - var delegate_1 = task.originalDelegate ? task.originalDelegate : task.callback; - target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate_1, options); - } - }; - // global shared zoneAwareCallback to handle all event callback with capture = false - var globalZoneAwareCallback = function (event) { - // https://github.com/angular/zone.js/issues/911, in IE, sometimes - // event will be undefined, so we need to use window.event - event = event || _global.event; - if (!event) { - return; - } - // event.target is needed for Samsung TV and SourceBuffer - // || global is needed https://github.com/angular/zone.js/issues/190 - var target = this || event.target || _global; - var tasks = target[zoneSymbolEventNames$1[event.type][FALSE_STR]]; - if (tasks) { - // invoke all tasks which attached to current target with given event.type and capture = false - // for performance concern, if task.length === 1, just invoke - if (tasks.length === 1) { - invokeTask(tasks[0], target, event); - } - else { - // https://github.com/angular/zone.js/issues/836 - // copy the tasks array before invoke, to avoid - // the callback will remove itself or other listener - var copyTasks = tasks.slice(); - for (var i = 0; i < copyTasks.length; i++) { - if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) { - break; - } - invokeTask(copyTasks[i], target, event); - } - } - } - }; - // global shared zoneAwareCallback to handle all event callback with capture = true - var globalZoneAwareCaptureCallback = function (event) { - // https://github.com/angular/zone.js/issues/911, in IE, sometimes - // event will be undefined, so we need to use window.event - event = event || _global.event; - if (!event) { - return; - } - // event.target is needed for Samsung TV and SourceBuffer - // || global is needed https://github.com/angular/zone.js/issues/190 - var target = this || event.target || _global; - var tasks = target[zoneSymbolEventNames$1[event.type][TRUE_STR]]; - if (tasks) { - // invoke all tasks which attached to current target with given event.type and capture = false - // for performance concern, if task.length === 1, just invoke - if (tasks.length === 1) { - invokeTask(tasks[0], target, event); - } - else { - // https://github.com/angular/zone.js/issues/836 - // copy the tasks array before invoke, to avoid - // the callback will remove itself or other listener - var copyTasks = tasks.slice(); - for (var i = 0; i < copyTasks.length; i++) { - if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) { - break; - } - invokeTask(copyTasks[i], target, event); - } - } - } - }; - function patchEventTargetMethods(obj, patchOptions) { - if (!obj) { - return false; - } - var useGlobalCallback = true; - if (patchOptions && patchOptions.useG !== undefined) { - useGlobalCallback = patchOptions.useG; - } - var validateHandler = patchOptions && patchOptions.vh; - var checkDuplicate = true; - if (patchOptions && patchOptions.chkDup !== undefined) { - checkDuplicate = patchOptions.chkDup; - } - var returnTarget = false; - if (patchOptions && patchOptions.rt !== undefined) { - returnTarget = patchOptions.rt; - } - var proto = obj; - while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) { - proto = ObjectGetPrototypeOf(proto); - } - if (!proto && obj[ADD_EVENT_LISTENER]) { - // somehow we did not find it, but we can see it. This happens on IE for Window properties. - proto = obj; - } - if (!proto) { - return false; - } - if (proto[zoneSymbolAddEventListener]) { - return false; - } - // a shared global taskData to pass data for scheduleEventTask - // so we do not need to create a new object just for pass some data - var taskData = {}; - var nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER]; - var nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] = - proto[REMOVE_EVENT_LISTENER]; - var nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] = - proto[LISTENERS_EVENT_LISTENER]; - var nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] = - proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER]; - var nativePrependEventListener; - if (patchOptions && patchOptions.prepend) { - nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] = - proto[patchOptions.prepend]; - } - var customScheduleGlobal = function () { - // if there is already a task for the eventName + capture, - // just return, because we use the shared globalZoneAwareCallback here. - if (taskData.isExisting) { - return; - } - return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options); - }; - var customCancelGlobal = function (task) { - // if task is not marked as isRemoved, this call is directly - // from Zone.prototype.cancelTask, we should remove the task - // from tasksList of target first - if (!task.isRemoved) { - var symbolEventNames = zoneSymbolEventNames$1[task.eventName]; - var symbolEventName = void 0; - if (symbolEventNames) { - symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR]; - } - var existingTasks = symbolEventName && task.target[symbolEventName]; - if (existingTasks) { - for (var i = 0; i < existingTasks.length; i++) { - var existingTask = existingTasks[i]; - if (existingTask === task) { - existingTasks.splice(i, 1); - // set isRemoved to data for faster invokeTask check - task.isRemoved = true; - if (existingTasks.length === 0) { - // all tasks for the eventName + capture have gone, - // remove globalZoneAwareCallback and remove the task cache from target - task.allRemoved = true; - task.target[symbolEventName] = null; - } - break; - } - } - } - } - // if all tasks for the eventName + capture have gone, - // we will really remove the global event callback, - // if not, return - if (!task.allRemoved) { - return; - } - return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options); - }; - var customScheduleNonGlobal = function (task) { - return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options); - }; - var customSchedulePrepend = function (task) { - return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options); - }; - var customCancelNonGlobal = function (task) { - return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options); - }; - var customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal; - var customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal; - var compareTaskCallbackVsDelegate = function (task, delegate) { - var typeOfDelegate = typeof delegate; - return (typeOfDelegate === 'function' && task.callback === delegate) || - (typeOfDelegate === 'object' && task.originalDelegate === delegate); - }; - var compare = (patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate; - var blackListedEvents = Zone[Zone.__symbol__('BLACK_LISTED_EVENTS')]; - var makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget, prepend) { - if (returnTarget === void 0) { returnTarget = false; } - if (prepend === void 0) { prepend = false; } - return function () { - var target = this || _global; - var delegate = arguments[1]; - if (!delegate) { - return nativeListener.apply(this, arguments); - } - // don't create the bind delegate function for handleEvent - // case here to improve addEventListener performance - // we will create the bind delegate when invoke - var isHandleEvent = false; - if (typeof delegate !== 'function') { - if (!delegate.handleEvent) { - return nativeListener.apply(this, arguments); - } - isHandleEvent = true; - } - if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) { - return; - } - var eventName = arguments[0]; - var options = arguments[2]; - if (blackListedEvents) { - // check black list - for (var i = 0; i < blackListedEvents.length; i++) { - if (eventName === blackListedEvents[i]) { - return nativeListener.apply(this, arguments); - } - } - } - var capture; - var once = false; - if (options === undefined) { - capture = false; - } - else if (options === true) { - capture = true; - } - else if (options === false) { - capture = false; - } - else { - capture = options ? !!options.capture : false; - once = options ? !!options.once : false; - } - var zone = Zone.current; - var symbolEventNames = zoneSymbolEventNames$1[eventName]; - var symbolEventName; - if (!symbolEventNames) { - // the code is duplicate, but I just want to get some better performance - var falseEventName = eventName + FALSE_STR; - var trueEventName = eventName + TRUE_STR; - var symbol = ZONE_SYMBOL_PREFIX + falseEventName; - var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName; - zoneSymbolEventNames$1[eventName] = {}; - zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol; - zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture; - symbolEventName = capture ? symbolCapture : symbol; - } - else { - symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR]; - } - var existingTasks = target[symbolEventName]; - var isExisting = false; - if (existingTasks) { - // already have task registered - isExisting = true; - if (checkDuplicate) { - for (var i = 0; i < existingTasks.length; i++) { - if (compare(existingTasks[i], delegate)) { - // same callback, same capture, same event name, just return - return; - } - } - } - } - else { - existingTasks = target[symbolEventName] = []; - } - var source; - var constructorName = target.constructor['name']; - var targetSource = globalSources[constructorName]; - if (targetSource) { - source = targetSource[eventName]; - } - if (!source) { - source = constructorName + addSource + eventName; - } - // do not create a new object as task.data to pass those things - // just use the global shared one - taskData.options = options; - if (once) { - // if addEventListener with once options, we don't pass it to - // native addEventListener, instead we keep the once setting - // and handle ourselves. - taskData.options.once = false; - } - taskData.target = target; - taskData.capture = capture; - taskData.eventName = eventName; - taskData.isExisting = isExisting; - var data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : null; - // keep taskData into data to allow onScheduleEventTask to access the task information - if (data) { - data.taskData = taskData; - } - var task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn); - // should clear taskData.target to avoid memory leak - // issue, https://github.com/angular/angular/issues/20442 - taskData.target = null; - // need to clear up taskData because it is a global object - if (data) { - data.taskData = null; - } - // have to save those information to task in case - // application may call task.zone.cancelTask() directly - if (once) { - options.once = true; - } - task.options = options; - task.target = target; - task.capture = capture; - task.eventName = eventName; - if (isHandleEvent) { - // save original delegate for compare to check duplicate - task.originalDelegate = delegate; - } - if (!prepend) { - existingTasks.push(task); - } - else { - existingTasks.unshift(task); - } - if (returnTarget) { - return target; - } - }; - }; - proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget); - if (nativePrependEventListener) { - proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true); - } - proto[REMOVE_EVENT_LISTENER] = function () { - var target = this || _global; - var eventName = arguments[0]; - var options = arguments[2]; - var capture; - if (options === undefined) { - capture = false; - } - else if (options === true) { - capture = true; - } - else if (options === false) { - capture = false; - } - else { - capture = options ? !!options.capture : false; - } - var delegate = arguments[1]; - if (!delegate) { - return nativeRemoveEventListener.apply(this, arguments); - } - if (validateHandler && - !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) { - return; - } - var symbolEventNames = zoneSymbolEventNames$1[eventName]; - var symbolEventName; - if (symbolEventNames) { - symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR]; - } - var existingTasks = symbolEventName && target[symbolEventName]; - if (existingTasks) { - for (var i = 0; i < existingTasks.length; i++) { - var existingTask = existingTasks[i]; - if (compare(existingTask, delegate)) { - existingTasks.splice(i, 1); - // set isRemoved to data for faster invokeTask check - existingTask.isRemoved = true; - if (existingTasks.length === 0) { - // all tasks for the eventName + capture have gone, - // remove globalZoneAwareCallback and remove the task cache from target - existingTask.allRemoved = true; - target[symbolEventName] = null; - } - existingTask.zone.cancelTask(existingTask); - if (returnTarget) { - return target; - } - return; - } - } - } - // issue 930, didn't find the event name or callback - // from zone kept existingTasks, the callback maybe - // added outside of zone, we need to call native removeEventListener - // to try to remove it. - return nativeRemoveEventListener.apply(this, arguments); - }; - proto[LISTENERS_EVENT_LISTENER] = function () { - var target = this || _global; - var eventName = arguments[0]; - var listeners = []; - var tasks = findEventTasks(target, eventName); - for (var i = 0; i < tasks.length; i++) { - var task = tasks[i]; - var delegate = task.originalDelegate ? task.originalDelegate : task.callback; - listeners.push(delegate); - } - return listeners; - }; - proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () { - var target = this || _global; - var eventName = arguments[0]; - if (!eventName) { - var keys = Object.keys(target); - for (var i = 0; i < keys.length; i++) { - var prop = keys[i]; - var match = EVENT_NAME_SYMBOL_REGX.exec(prop); - var evtName = match && match[1]; - // in nodejs EventEmitter, removeListener event is - // used for monitoring the removeListener call, - // so just keep removeListener eventListener until - // all other eventListeners are removed - if (evtName && evtName !== 'removeListener') { - this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName); - } - } - // remove removeListener listener finally - this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener'); - } - else { - var symbolEventNames = zoneSymbolEventNames$1[eventName]; - if (symbolEventNames) { - var symbolEventName = symbolEventNames[FALSE_STR]; - var symbolCaptureEventName = symbolEventNames[TRUE_STR]; - var tasks = target[symbolEventName]; - var captureTasks = target[symbolCaptureEventName]; - if (tasks) { - var removeTasks = tasks.slice(); - for (var i = 0; i < removeTasks.length; i++) { - var task = removeTasks[i]; - var delegate = task.originalDelegate ? task.originalDelegate : task.callback; - this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options); - } - } - if (captureTasks) { - var removeTasks = captureTasks.slice(); - for (var i = 0; i < removeTasks.length; i++) { - var task = removeTasks[i]; - var delegate = task.originalDelegate ? task.originalDelegate : task.callback; - this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options); - } - } - } - } - if (returnTarget) { - return this; - } - }; - // for native toString patch - attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener); - attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener); - if (nativeRemoveAllListeners) { - attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners); - } - if (nativeListeners) { - attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners); - } - return true; - } - var results = []; - for (var i = 0; i < apis.length; i++) { - results[i] = patchEventTargetMethods(apis[i], patchOptions); - } - return results; -} -function findEventTasks(target, eventName) { - var foundTasks = []; - for (var prop in target) { - var match = EVENT_NAME_SYMBOL_REGX.exec(prop); - var evtName = match && match[1]; - if (evtName && (!eventName || evtName === eventName)) { - var tasks = target[prop]; - if (tasks) { - for (var i = 0; i < tasks.length; i++) { - foundTasks.push(tasks[i]); - } - } - } - } - return foundTasks; -} -function patchEventPrototype(global, api) { - var Event = global['Event']; - if (Event && Event.prototype) { - api.patchMethod(Event.prototype, 'stopImmediatePropagation', function (delegate) { return function (self, args) { - self[IMMEDIATE_PROPAGATION_SYMBOL] = true; - // we need to call the native stopImmediatePropagation - // in case in some hybrid application, some part of - // application will be controlled by zone, some are not - delegate && delegate.apply(self, args); - }; }); - } -} - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -/** - * @fileoverview - * @suppress {missingRequire} - */ -var taskSymbol = zoneSymbol('zoneTask'); -function patchTimer(window, setName, cancelName, nameSuffix) { - var setNative = null; - var clearNative = null; - setName += nameSuffix; - cancelName += nameSuffix; - var tasksByHandleId = {}; - function scheduleTask(task) { - var data = task.data; - function timer() { - try { - task.invoke.apply(this, arguments); - } - finally { - // issue-934, task will be cancelled - // even it is a periodic task such as - // setInterval - if (!(task.data && task.data.isPeriodic)) { - if (typeof data.handleId === 'number') { - // in non-nodejs env, we remove timerId - // from local cache - delete tasksByHandleId[data.handleId]; - } - else if (data.handleId) { - // Node returns complex objects as handleIds - // we remove task reference from timer object - data.handleId[taskSymbol] = null; - } - } - } - } - data.args[0] = timer; - data.handleId = setNative.apply(window, data.args); - return task; - } - function clearTask(task) { - return clearNative(task.data.handleId); - } - setNative = - patchMethod(window, setName, function (delegate) { return function (self, args) { - if (typeof args[0] === 'function') { - var options = { - handleId: null, - isPeriodic: nameSuffix === 'Interval', - delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 : null, - args: args - }; - var task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask); - if (!task) { - return task; - } - // Node.js must additionally support the ref and unref functions. - var handle = task.data.handleId; - if (typeof handle === 'number') { - // for non nodejs env, we save handleId: task - // mapping in local cache for clearTimeout - tasksByHandleId[handle] = task; - } - else if (handle) { - // for nodejs env, we save task - // reference in timerId Object for clearTimeout - handle[taskSymbol] = task; - } - // check whether handle is null, because some polyfill or browser - // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame - if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' && - typeof handle.unref === 'function') { - task.ref = handle.ref.bind(handle); - task.unref = handle.unref.bind(handle); - } - if (typeof handle === 'number' || handle) { - return handle; - } - return task; - } - else { - // cause an error by calling it directly. - return delegate.apply(window, args); - } - }; }); - clearNative = - patchMethod(window, cancelName, function (delegate) { return function (self, args) { - var id = args[0]; - var task; - if (typeof id === 'number') { - // non nodejs env. - task = tasksByHandleId[id]; - } - else { - // nodejs env. - task = id && id[taskSymbol]; - // other environments. - if (!task) { - task = id; - } - } - if (task && typeof task.type === 'string') { - if (task.state !== 'notScheduled' && - (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) { - if (typeof id === 'number') { - delete tasksByHandleId[id]; - } - else if (id) { - id[taskSymbol] = null; - } - // Do not cancel already canceled functions - task.zone.cancelTask(task); - } - } - else { - // cause an error by calling it directly. - delegate.apply(window, args); - } - }; }); -} - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -/* - * This is necessary for Chrome and Chrome mobile, to enable - * things like redefining `createdCallback` on an element. - */ -var _defineProperty = Object[zoneSymbol('defineProperty')] = Object.defineProperty; -var _getOwnPropertyDescriptor = Object[zoneSymbol('getOwnPropertyDescriptor')] = - Object.getOwnPropertyDescriptor; -var _create = Object.create; -var unconfigurablesKey = zoneSymbol('unconfigurables'); -function propertyPatch() { - Object.defineProperty = function (obj, prop, desc) { - if (isUnconfigurable(obj, prop)) { - throw new TypeError('Cannot assign to read only property \'' + prop + '\' of ' + obj); - } - var originalConfigurableFlag = desc.configurable; - if (prop !== 'prototype') { - desc = rewriteDescriptor(obj, prop, desc); - } - return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag); - }; - Object.defineProperties = function (obj, props) { - Object.keys(props).forEach(function (prop) { - Object.defineProperty(obj, prop, props[prop]); - }); - return obj; - }; - Object.create = function (obj, proto) { - if (typeof proto === 'object' && !Object.isFrozen(proto)) { - Object.keys(proto).forEach(function (prop) { - proto[prop] = rewriteDescriptor(obj, prop, proto[prop]); - }); - } - return _create(obj, proto); - }; - Object.getOwnPropertyDescriptor = function (obj, prop) { - var desc = _getOwnPropertyDescriptor(obj, prop); - if (isUnconfigurable(obj, prop)) { - desc.configurable = false; - } - return desc; - }; -} -function _redefineProperty(obj, prop, desc) { - var originalConfigurableFlag = desc.configurable; - desc = rewriteDescriptor(obj, prop, desc); - return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag); -} -function isUnconfigurable(obj, prop) { - return obj && obj[unconfigurablesKey] && obj[unconfigurablesKey][prop]; -} -function rewriteDescriptor(obj, prop, desc) { - // issue-927, if the desc is frozen, don't try to change the desc - if (!Object.isFrozen(desc)) { - desc.configurable = true; - } - if (!desc.configurable) { - // issue-927, if the obj is frozen, don't try to set the desc to obj - if (!obj[unconfigurablesKey] && !Object.isFrozen(obj)) { - _defineProperty(obj, unconfigurablesKey, { writable: true, value: {} }); - } - if (obj[unconfigurablesKey]) { - obj[unconfigurablesKey][prop] = true; - } - } - return desc; -} -function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) { - try { - return _defineProperty(obj, prop, desc); - } - catch (error) { - if (desc.configurable) { - // In case of errors, when the configurable flag was likely set by rewriteDescriptor(), let's - // retry with the original flag value - if (typeof originalConfigurableFlag == 'undefined') { - delete desc.configurable; - } - else { - desc.configurable = originalConfigurableFlag; - } - try { - return _defineProperty(obj, prop, desc); - } - catch (error) { - var descJson = null; - try { - descJson = JSON.stringify(desc); - } - catch (error) { - descJson = desc.toString(); - } - console.log("Attempting to configure '" + prop + "' with descriptor '" + descJson + "' on object '" + obj + "' and got error, giving up: " + error); - } - } - else { - throw error; - } - } -} - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -// we have to patch the instance since the proto is non-configurable -function apply(api, _global) { - var WS = _global.WebSocket; - // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener - // On older Chrome, no need since EventTarget was already patched - if (!_global.EventTarget) { - patchEventTarget(_global, [WS.prototype]); - } - _global.WebSocket = function (x, y) { - var socket = arguments.length > 1 ? new WS(x, y) : new WS(x); - var proxySocket; - var proxySocketProto; - // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance - var onmessageDesc = ObjectGetOwnPropertyDescriptor(socket, 'onmessage'); - if (onmessageDesc && onmessageDesc.configurable === false) { - proxySocket = ObjectCreate(socket); - // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror' - // but proxySocket not, so we will keep socket as prototype and pass it to - // patchOnProperties method - proxySocketProto = socket; - [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) { - proxySocket[propName] = function () { - var args = ArraySlice.call(arguments); - if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) { - var eventName = args.length > 0 ? args[0] : undefined; - if (eventName) { - var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName); - socket[propertySymbol] = proxySocket[propertySymbol]; - } - } - return socket[propName].apply(socket, args); - }; - }); - } - else { - // we can patch the real socket - proxySocket = socket; - } - patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto); - return proxySocket; - }; - var globalWebSocket = _global['WebSocket']; - for (var prop in WS) { - globalWebSocket[prop] = WS[prop]; - } -} - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -/** - * @fileoverview - * @suppress {globalThis} - */ -var globalEventHandlersEventNames = [ - 'abort', - 'animationcancel', - 'animationend', - 'animationiteration', - 'auxclick', - 'beforeinput', - 'blur', - 'cancel', - 'canplay', - 'canplaythrough', - 'change', - 'compositionstart', - 'compositionupdate', - 'compositionend', - 'cuechange', - 'click', - 'close', - 'contextmenu', - 'curechange', - 'dblclick', - 'drag', - 'dragend', - 'dragenter', - 'dragexit', - 'dragleave', - 'dragover', - 'drop', - 'durationchange', - 'emptied', - 'ended', - 'error', - 'focus', - 'focusin', - 'focusout', - 'gotpointercapture', - 'input', - 'invalid', - 'keydown', - 'keypress', - 'keyup', - 'load', - 'loadstart', - 'loadeddata', - 'loadedmetadata', - 'lostpointercapture', - 'mousedown', - 'mouseenter', - 'mouseleave', - 'mousemove', - 'mouseout', - 'mouseover', - 'mouseup', - 'mousewheel', - 'orientationchange', - 'pause', - 'play', - 'playing', - 'pointercancel', - 'pointerdown', - 'pointerenter', - 'pointerleave', - 'pointerlockchange', - 'mozpointerlockchange', - 'webkitpointerlockerchange', - 'pointerlockerror', - 'mozpointerlockerror', - 'webkitpointerlockerror', - 'pointermove', - 'pointout', - 'pointerover', - 'pointerup', - 'progress', - 'ratechange', - 'reset', - 'resize', - 'scroll', - 'seeked', - 'seeking', - 'select', - 'selectionchange', - 'selectstart', - 'show', - 'sort', - 'stalled', - 'submit', - 'suspend', - 'timeupdate', - 'volumechange', - 'touchcancel', - 'touchmove', - 'touchstart', - 'touchend', - 'transitioncancel', - 'transitionend', - 'waiting', - 'wheel' -]; -var documentEventNames = [ - 'afterscriptexecute', 'beforescriptexecute', 'DOMContentLoaded', 'fullscreenchange', - 'mozfullscreenchange', 'webkitfullscreenchange', 'msfullscreenchange', 'fullscreenerror', - 'mozfullscreenerror', 'webkitfullscreenerror', 'msfullscreenerror', 'readystatechange', - 'visibilitychange' -]; -var windowEventNames = [ - 'absolutedeviceorientation', - 'afterinput', - 'afterprint', - 'appinstalled', - 'beforeinstallprompt', - 'beforeprint', - 'beforeunload', - 'devicelight', - 'devicemotion', - 'deviceorientation', - 'deviceorientationabsolute', - 'deviceproximity', - 'hashchange', - 'languagechange', - 'message', - 'mozbeforepaint', - 'offline', - 'online', - 'paint', - 'pageshow', - 'pagehide', - 'popstate', - 'rejectionhandled', - 'storage', - 'unhandledrejection', - 'unload', - 'userproximity', - 'vrdisplyconnected', - 'vrdisplaydisconnected', - 'vrdisplaypresentchange' -]; -var htmlElementEventNames = [ - 'beforecopy', 'beforecut', 'beforepaste', 'copy', 'cut', 'paste', 'dragstart', 'loadend', - 'animationstart', 'search', 'transitionrun', 'transitionstart', 'webkitanimationend', - 'webkitanimationiteration', 'webkitanimationstart', 'webkittransitionend' -]; -var mediaElementEventNames = ['encrypted', 'waitingforkey', 'msneedkey', 'mozinterruptbegin', 'mozinterruptend']; -var ieElementEventNames = [ - 'activate', - 'afterupdate', - 'ariarequest', - 'beforeactivate', - 'beforedeactivate', - 'beforeeditfocus', - 'beforeupdate', - 'cellchange', - 'controlselect', - 'dataavailable', - 'datasetchanged', - 'datasetcomplete', - 'errorupdate', - 'filterchange', - 'layoutcomplete', - 'losecapture', - 'move', - 'moveend', - 'movestart', - 'propertychange', - 'resizeend', - 'resizestart', - 'rowenter', - 'rowexit', - 'rowsdelete', - 'rowsinserted', - 'command', - 'compassneedscalibration', - 'deactivate', - 'help', - 'mscontentzoom', - 'msmanipulationstatechanged', - 'msgesturechange', - 'msgesturedoubletap', - 'msgestureend', - 'msgesturehold', - 'msgesturestart', - 'msgesturetap', - 'msgotpointercapture', - 'msinertiastart', - 'mslostpointercapture', - 'mspointercancel', - 'mspointerdown', - 'mspointerenter', - 'mspointerhover', - 'mspointerleave', - 'mspointermove', - 'mspointerout', - 'mspointerover', - 'mspointerup', - 'pointerout', - 'mssitemodejumplistitemremoved', - 'msthumbnailclick', - 'stop', - 'storagecommit' -]; -var webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror']; -var formEventNames = ['autocomplete', 'autocompleteerror']; -var detailEventNames = ['toggle']; -var frameEventNames = ['load']; -var frameSetEventNames = ['blur', 'error', 'focus', 'load', 'resize', 'scroll', 'messageerror']; -var marqueeEventNames = ['bounce', 'finish', 'start']; -var XMLHttpRequestEventNames = [ - 'loadstart', 'progress', 'abort', 'error', 'load', 'progress', 'timeout', 'loadend', - 'readystatechange' -]; -var IDBIndexEventNames = ['upgradeneeded', 'complete', 'abort', 'success', 'error', 'blocked', 'versionchange', 'close']; -var websocketEventNames = ['close', 'error', 'open', 'message']; -var workerEventNames = ['error', 'message']; -var eventNames = globalEventHandlersEventNames.concat(webglEventNames, formEventNames, detailEventNames, documentEventNames, windowEventNames, htmlElementEventNames, ieElementEventNames); -function filterProperties(target, onProperties, ignoreProperties) { - if (!ignoreProperties) { - return onProperties; - } - var tip = ignoreProperties.filter(function (ip) { return ip.target === target; }); - if (!tip || tip.length === 0) { - return onProperties; - } - var targetIgnoreProperties = tip[0].ignoreProperties; - return onProperties.filter(function (op) { return targetIgnoreProperties.indexOf(op) === -1; }); -} -function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) { - // check whether target is available, sometimes target will be undefined - // because different browser or some 3rd party plugin. - if (!target) { - return; - } - var filteredProperties = filterProperties(target, onProperties, ignoreProperties); - patchOnProperties(target, filteredProperties, prototype); -} -function propertyDescriptorPatch(api, _global) { - if (isNode && !isMix) { - return; - } - var supportsWebSocket = typeof WebSocket !== 'undefined'; - if (canPatchViaPropertyDescriptor()) { - var ignoreProperties = _global.__Zone_ignore_on_properties; - // for browsers that we can patch the descriptor: Chrome & Firefox - if (isBrowser) { - var internalWindow = window; - // in IE/Edge, onProp not exist in window object, but in WindowPrototype - // so we need to pass WindowPrototype to check onProp exist or not - patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties, ObjectGetPrototypeOf(internalWindow)); - patchFilteredProperties(Document.prototype, eventNames, ignoreProperties); - if (typeof internalWindow['SVGElement'] !== 'undefined') { - patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties); - } - patchFilteredProperties(Element.prototype, eventNames, ignoreProperties); - patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties); - patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties); - patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties); - patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties); - patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties); - patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties); - var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement']; - if (HTMLMarqueeElement_1) { - patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties); - } - var Worker_1 = internalWindow['Worker']; - if (Worker_1) { - patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties); - } - } - patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties); - var XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget']; - if (XMLHttpRequestEventTarget) { - patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties); - } - if (typeof IDBIndex !== 'undefined') { - patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties); - patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties); - patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties); - patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties); - patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties); - patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties); - } - if (supportsWebSocket) { - patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties); - } - } - else { - // Safari, Android browsers (Jelly Bean) - patchViaCapturingAllTheEvents(); - patchClass('XMLHttpRequest'); - if (supportsWebSocket) { - apply(api, _global); - } - } -} -function canPatchViaPropertyDescriptor() { - if ((isBrowser || isMix) && !ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') && - typeof Element !== 'undefined') { - // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364 - // IDL interface attributes are not configurable - var desc = ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick'); - if (desc && !desc.configurable) - return false; - } - var ON_READY_STATE_CHANGE = 'onreadystatechange'; - var XMLHttpRequestPrototype = XMLHttpRequest.prototype; - var xhrDesc = ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE); - // add enumerable and configurable here because in opera - // by default XMLHttpRequest.prototype.onreadystatechange is undefined - // without adding enumerable and configurable will cause onreadystatechange - // non-configurable - // and if XMLHttpRequest.prototype.onreadystatechange is undefined, - // we should set a real desc instead a fake one - if (xhrDesc) { - ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, { - enumerable: true, - configurable: true, - get: function () { - return true; - } - }); - var req = new XMLHttpRequest(); - var result = !!req.onreadystatechange; - // restore original desc - ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {}); - return result; - } - else { - var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = zoneSymbol('fake'); - ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, { - enumerable: true, - configurable: true, - get: function () { - return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1]; - }, - set: function (value) { - this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value; - } - }); - var req = new XMLHttpRequest(); - var detectFunc = function () { }; - req.onreadystatechange = detectFunc; - var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc; - req.onreadystatechange = null; - return result; - } -} -var unboundKey = zoneSymbol('unbound'); -// Whenever any eventListener fires, we check the eventListener target and all parents -// for `onwhatever` properties and replace them with zone-bound functions -// - Chrome (for now) -function patchViaCapturingAllTheEvents() { - var _loop_1 = function (i) { - var property = eventNames[i]; - var onproperty = 'on' + property; - self.addEventListener(property, function (event) { - var elt = event.target, bound, source; - if (elt) { - source = elt.constructor['name'] + '.' + onproperty; - } - else { - source = 'unknown.' + onproperty; - } - while (elt) { - if (elt[onproperty] && !elt[onproperty][unboundKey]) { - bound = wrapWithCurrentZone(elt[onproperty], source); - bound[unboundKey] = elt[onproperty]; - elt[onproperty] = bound; - } - elt = elt.parentElement; - } - }, true); - }; - for (var i = 0; i < eventNames.length; i++) { - _loop_1(i); - } -} - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -function eventTargetPatch(_global, api) { - var WTF_ISSUE_555 = 'Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video'; - var NO_EVENT_TARGET = 'ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket' - .split(','); - var EVENT_TARGET = 'EventTarget'; - var apis = []; - var isWtf = _global['wtf']; - var WTF_ISSUE_555_ARRAY = WTF_ISSUE_555.split(','); - if (isWtf) { - // Workaround for: https://github.com/google/tracing-framework/issues/555 - apis = WTF_ISSUE_555_ARRAY.map(function (v) { return 'HTML' + v + 'Element'; }).concat(NO_EVENT_TARGET); - } - else if (_global[EVENT_TARGET]) { - apis.push(EVENT_TARGET); - } - else { - // Note: EventTarget is not available in all browsers, - // if it's not available, we instead patch the APIs in the IDL that inherit from EventTarget - apis = NO_EVENT_TARGET; - } - var isDisableIECheck = _global['__Zone_disable_IE_check'] || false; - var isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false; - var ieOrEdge = isIEOrEdge(); - var ADD_EVENT_LISTENER_SOURCE = '.addEventListener:'; - var FUNCTION_WRAPPER = '[object FunctionWrapper]'; - var BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }'; - // predefine all __zone_symbol__ + eventName + true/false string - for (var i = 0; i < eventNames.length; i++) { - var eventName = eventNames[i]; - var falseEventName = eventName + FALSE_STR; - var trueEventName = eventName + TRUE_STR; - var symbol = ZONE_SYMBOL_PREFIX + falseEventName; - var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName; - zoneSymbolEventNames$1[eventName] = {}; - zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol; - zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture; - } - // predefine all task.source string - for (var i = 0; i < WTF_ISSUE_555.length; i++) { - var target = WTF_ISSUE_555_ARRAY[i]; - var targets = globalSources[target] = {}; - for (var j = 0; j < eventNames.length; j++) { - var eventName = eventNames[j]; - targets[eventName] = target + ADD_EVENT_LISTENER_SOURCE + eventName; - } - } - var checkIEAndCrossContext = function (nativeDelegate, delegate, target, args) { - if (!isDisableIECheck && ieOrEdge) { - if (isEnableCrossContextCheck) { - try { - var testString = delegate.toString(); - if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) { - nativeDelegate.apply(target, args); - return false; - } - } - catch (error) { - nativeDelegate.apply(target, args); - return false; - } - } - else { - var testString = delegate.toString(); - if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) { - nativeDelegate.apply(target, args); - return false; - } - } - } - else if (isEnableCrossContextCheck) { - try { - delegate.toString(); - } - catch (error) { - nativeDelegate.apply(target, args); - return false; - } - } - return true; - }; - var apiTypes = []; - for (var i = 0; i < apis.length; i++) { - var type = _global[apis[i]]; - apiTypes.push(type && type.prototype); - } - // vh is validateHandler to check event handler - // is valid or not(for security check) - patchEventTarget(_global, apiTypes, { vh: checkIEAndCrossContext }); - api.patchEventTarget = patchEventTarget; - return true; -} -function patchEvent(global, api) { - patchEventPrototype(global, api); -} - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -function registerElementPatch(_global) { - if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) { - return; - } - var _registerElement = document.registerElement; - var callbacks = ['createdCallback', 'attachedCallback', 'detachedCallback', 'attributeChangedCallback']; - document.registerElement = function (name, opts) { - if (opts && opts.prototype) { - callbacks.forEach(function (callback) { - var source = 'Document.registerElement::' + callback; - var prototype = opts.prototype; - if (prototype.hasOwnProperty(callback)) { - var descriptor = ObjectGetOwnPropertyDescriptor(prototype, callback); - if (descriptor && descriptor.value) { - descriptor.value = wrapWithCurrentZone(descriptor.value, source); - _redefineProperty(opts.prototype, callback, descriptor); - } - else { - prototype[callback] = wrapWithCurrentZone(prototype[callback], source); - } - } - else if (prototype[callback]) { - prototype[callback] = wrapWithCurrentZone(prototype[callback], source); - } - }); - } - return _registerElement.call(document, name, opts); - }; - attachOriginToPatched(document.registerElement, _registerElement); -} - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ -/** - * @fileoverview - * @suppress {missingRequire} - */ -Zone.__load_patch('util', function (global, Zone, api) { - api.patchOnProperties = patchOnProperties; - api.patchMethod = patchMethod; - api.bindArguments = bindArguments; -}); -Zone.__load_patch('timers', function (global) { - var set = 'set'; - var clear = 'clear'; - patchTimer(global, set, clear, 'Timeout'); - patchTimer(global, set, clear, 'Interval'); - patchTimer(global, set, clear, 'Immediate'); -}); -Zone.__load_patch('requestAnimationFrame', function (global) { - patchTimer(global, 'request', 'cancel', 'AnimationFrame'); - patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame'); - patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame'); -}); -Zone.__load_patch('blocking', function (global, Zone) { - var blockingMethods = ['alert', 'prompt', 'confirm']; - for (var i = 0; i < blockingMethods.length; i++) { - var name_1 = blockingMethods[i]; - patchMethod(global, name_1, function (delegate, symbol, name) { - return function (s, args) { - return Zone.current.run(delegate, global, args, name); - }; - }); - } -}); -Zone.__load_patch('EventTarget', function (global, Zone, api) { - // load blackListEvents from global - var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS'); - if (global[SYMBOL_BLACK_LISTED_EVENTS]) { - Zone[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_BLACK_LISTED_EVENTS]; - } - patchEvent(global, api); - eventTargetPatch(global, api); - // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener - var XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget']; - if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) { - api.patchEventTarget(global, [XMLHttpRequestEventTarget.prototype]); - } - patchClass('MutationObserver'); - patchClass('WebKitMutationObserver'); - patchClass('IntersectionObserver'); - patchClass('FileReader'); -}); -Zone.__load_patch('on_property', function (global, Zone, api) { - propertyDescriptorPatch(api, global); - propertyPatch(); - registerElementPatch(global); -}); -Zone.__load_patch('canvas', function (global) { - var HTMLCanvasElement = global['HTMLCanvasElement']; - if (typeof HTMLCanvasElement !== 'undefined' && HTMLCanvasElement.prototype && - HTMLCanvasElement.prototype.toBlob) { - patchMacroTask(HTMLCanvasElement.prototype, 'toBlob', function (self, args) { - return { name: 'HTMLCanvasElement.toBlob', target: self, cbIdx: 0, args: args }; - }); - } -}); -Zone.__load_patch('XHR', function (global, Zone) { - // Treat XMLHttpRequest as a macrotask. - patchXHR(global); - var XHR_TASK = zoneSymbol('xhrTask'); - var XHR_SYNC = zoneSymbol('xhrSync'); - var XHR_LISTENER = zoneSymbol('xhrListener'); - var XHR_SCHEDULED = zoneSymbol('xhrScheduled'); - var XHR_URL = zoneSymbol('xhrURL'); - function patchXHR(window) { - var XMLHttpRequestPrototype = XMLHttpRequest.prototype; - function findPendingTask(target) { - return target[XHR_TASK]; - } - var oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER]; - var oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]; - if (!oriAddListener) { - var XMLHttpRequestEventTarget = window['XMLHttpRequestEventTarget']; - if (XMLHttpRequestEventTarget) { - var XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype; - oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER]; - oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]; - } - } - var READY_STATE_CHANGE = 'readystatechange'; - var SCHEDULED = 'scheduled'; - function scheduleTask(task) { - XMLHttpRequest[XHR_SCHEDULED] = false; - var data = task.data; - var target = data.target; - // remove existing event listener - var listener = target[XHR_LISTENER]; - if (!oriAddListener) { - oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER]; - oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]; - } - if (listener) { - oriRemoveListener.call(target, READY_STATE_CHANGE, listener); - } - var newListener = target[XHR_LISTENER] = function () { - if (target.readyState === target.DONE) { - // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with - // readyState=4 multiple times, so we need to check task state here - if (!data.aborted && XMLHttpRequest[XHR_SCHEDULED] && task.state === SCHEDULED) { - task.invoke(); - } - } - }; - oriAddListener.call(target, READY_STATE_CHANGE, newListener); - var storedTask = target[XHR_TASK]; - if (!storedTask) { - target[XHR_TASK] = task; - } - sendNative.apply(target, data.args); - XMLHttpRequest[XHR_SCHEDULED] = true; - return task; - } - function placeholderCallback() { } - function clearTask(task) { - var data = task.data; - // Note - ideally, we would call data.target.removeEventListener here, but it's too late - // to prevent it from firing. So instead, we store info for the event listener. - data.aborted = true; - return abortNative.apply(data.target, data.args); - } - var openNative = patchMethod(XMLHttpRequestPrototype, 'open', function () { return function (self, args) { - self[XHR_SYNC] = args[2] == false; - self[XHR_URL] = args[1]; - return openNative.apply(self, args); - }; }); - var XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send'; - var sendNative = patchMethod(XMLHttpRequestPrototype, 'send', function () { return function (self, args) { - if (self[XHR_SYNC]) { - // if the XHR is sync there is no task to schedule, just execute the code. - return sendNative.apply(self, args); - } - else { - var options = { - target: self, - url: self[XHR_URL], - isPeriodic: false, - delay: null, - args: args, - aborted: false - }; - return scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask); - } - }; }); - var abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', function () { return function (self) { - var task = findPendingTask(self); - if (task && typeof task.type == 'string') { - // If the XHR has already completed, do nothing. - // If the XHR has already been aborted, do nothing. - // Fix #569, call abort multiple times before done will cause - // macroTask task count be negative number - if (task.cancelFn == null || (task.data && task.data.aborted)) { - return; - } - task.zone.cancelTask(task); - } - // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no - // task - // to cancel. Do nothing. - }; }); - } -}); -Zone.__load_patch('geolocation', function (global) { - /// GEO_LOCATION - if (global['navigator'] && global['navigator'].geolocation) { - patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']); - } -}); -Zone.__load_patch('PromiseRejectionEvent', function (global, Zone) { - // handle unhandled promise rejection - function findPromiseRejectionHandler(evtName) { - return function (e) { - var eventTasks = findEventTasks(global, evtName); - eventTasks.forEach(function (eventTask) { - // windows has added unhandledrejection event listener - // trigger the event listener - var PromiseRejectionEvent = global['PromiseRejectionEvent']; - if (PromiseRejectionEvent) { - var evt = new PromiseRejectionEvent(evtName, { promise: e.promise, reason: e.rejection }); - eventTask.invoke(evt); - } - }); - }; - } - if (global['PromiseRejectionEvent']) { - Zone[zoneSymbol('unhandledPromiseRejectionHandler')] = - findPromiseRejectionHandler('unhandledrejection'); - Zone[zoneSymbol('rejectionHandledHandler')] = - findPromiseRejectionHandler('rejectionhandled'); - } -}); - -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -}))); - - -/***/ }), - -/***/ "./src/polyfills.ts": -/*!**************************!*\ - !*** ./src/polyfills.ts ***! - \**************************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var core_js_es7_reflect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/es7/reflect */ "./node_modules/core-js/es7/reflect.js"); -/* harmony import */ var core_js_es7_reflect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_es7_reflect__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zone.js/dist/zone */ "./node_modules/zone.js/dist/zone.js"); -/* harmony import */ var zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_1__); -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html - */ -/*************************************************************************************************** - * BROWSER POLYFILLS - */ -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; -// import 'core-js/es6/object'; -// import 'core-js/es6/function'; -// import 'core-js/es6/parse-int'; -// import 'core-js/es6/parse-float'; -// import 'core-js/es6/number'; -// import 'core-js/es6/math'; -// import 'core-js/es6/string'; -// import 'core-js/es6/date'; -// import 'core-js/es6/array'; -// import 'core-js/es6/regexp'; -// import 'core-js/es6/map'; -// import 'core-js/es6/weak-map'; -// import 'core-js/es6/set'; -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. -/** IE10 and IE11 requires the following for the Reflect API. */ -// import 'core-js/es6/reflect'; -/** Evergreen browsers require these. **/ -// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - */ -// (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame -// (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick -// (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames -/* -* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js -* with the following flag, it will bypass `zone.js` patch for IE/Edge -*/ -// (window as any).__Zone_enable_cross_context_check = true; -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ - // Included with Angular CLI. -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - - -/***/ }), - -/***/ 1: -/*!********************************!*\ - !*** multi ./src/polyfills.ts ***! - \********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(/*! /media/john/4tb/home/mvogel/yadacoin/plugins/explorer/src/polyfills.ts */"./src/polyfills.ts"); - - -/***/ }) - -},[[1,"runtime"]]]); -//# sourceMappingURL=polyfills.js.map \ No newline at end of file +"use strict";(self.webpackChunkexplorer=self.webpackChunkexplorer||[]).push([[429],{332:()=>{!function(e){const n=e.performance;function i(L){n&&n.mark&&n.mark(L)}function o(L,T){n&&n.measure&&n.measure(L,T)}i("Zone");const c=e.__Zone_symbol_prefix||"__zone_symbol__";function a(L){return c+L}const y=!0===e[a("forceDuplicateZoneCheck")];if(e.Zone){if(y||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}let d=(()=>{class L{static#e=this.__symbol__=a;static assertZonePatched(){if(e.Promise!==oe.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let t=L.current;for(;t.parent;)t=t.parent;return t}static get current(){return U.zone}static get currentTask(){return re}static __load_patch(t,r,k=!1){if(oe.hasOwnProperty(t)){if(!k&&y)throw Error("Already loaded patch: "+t)}else if(!e["__Zone_disable_"+t]){const C="Zone:"+t;i(C),oe[t]=r(e,L,z),o(C,C)}}get parent(){return this._parent}get name(){return this._name}constructor(t,r){this._parent=t,this._name=r?r.name||"unnamed":"",this._properties=r&&r.properties||{},this._zoneDelegate=new v(this,this._parent&&this._parent._zoneDelegate,r)}get(t){const r=this.getZoneWith(t);if(r)return r._properties[t]}getZoneWith(t){let r=this;for(;r;){if(r._properties.hasOwnProperty(t))return r;r=r._parent}return null}fork(t){if(!t)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,t)}wrap(t,r){if("function"!=typeof t)throw new Error("Expecting function got: "+t);const k=this._zoneDelegate.intercept(this,t,r),C=this;return function(){return C.runGuarded(k,this,arguments,r)}}run(t,r,k,C){U={parent:U,zone:this};try{return this._zoneDelegate.invoke(this,t,r,k,C)}finally{U=U.parent}}runGuarded(t,r=null,k,C){U={parent:U,zone:this};try{try{return this._zoneDelegate.invoke(this,t,r,k,C)}catch($){if(this._zoneDelegate.handleError(this,$))throw $}}finally{U=U.parent}}runTask(t,r,k){if(t.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(t.zone||J).name+"; Execution: "+this.name+")");if(t.state===x&&(t.type===Q||t.type===P))return;const C=t.state!=E;C&&t._transitionTo(E,A),t.runCount++;const $=re;re=t,U={parent:U,zone:this};try{t.type==P&&t.data&&!t.data.isPeriodic&&(t.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,t,r,k)}catch(l){if(this._zoneDelegate.handleError(this,l))throw l}}finally{t.state!==x&&t.state!==h&&(t.type==Q||t.data&&t.data.isPeriodic?C&&t._transitionTo(A,E):(t.runCount=0,this._updateTaskCount(t,-1),C&&t._transitionTo(x,E,x))),U=U.parent,re=$}}scheduleTask(t){if(t.zone&&t.zone!==this){let k=this;for(;k;){if(k===t.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${t.zone.name}`);k=k.parent}}t._transitionTo(X,x);const r=[];t._zoneDelegates=r,t._zone=this;try{t=this._zoneDelegate.scheduleTask(this,t)}catch(k){throw t._transitionTo(h,X,x),this._zoneDelegate.handleError(this,k),k}return t._zoneDelegates===r&&this._updateTaskCount(t,1),t.state==X&&t._transitionTo(A,X),t}scheduleMicroTask(t,r,k,C){return this.scheduleTask(new p(I,t,r,k,C,void 0))}scheduleMacroTask(t,r,k,C,$){return this.scheduleTask(new p(P,t,r,k,C,$))}scheduleEventTask(t,r,k,C,$){return this.scheduleTask(new p(Q,t,r,k,C,$))}cancelTask(t){if(t.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(t.zone||J).name+"; Execution: "+this.name+")");if(t.state===A||t.state===E){t._transitionTo(G,A,E);try{this._zoneDelegate.cancelTask(this,t)}catch(r){throw t._transitionTo(h,G),this._zoneDelegate.handleError(this,r),r}return this._updateTaskCount(t,-1),t._transitionTo(x,G),t.runCount=0,t}}_updateTaskCount(t,r){const k=t._zoneDelegates;-1==r&&(t._zoneDelegates=null);for(let C=0;CL.hasTask(t,r),onScheduleTask:(L,T,t,r)=>L.scheduleTask(t,r),onInvokeTask:(L,T,t,r,k,C)=>L.invokeTask(t,r,k,C),onCancelTask:(L,T,t,r)=>L.cancelTask(t,r)};class v{constructor(T,t,r){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=T,this._parentDelegate=t,this._forkZS=r&&(r&&r.onFork?r:t._forkZS),this._forkDlgt=r&&(r.onFork?t:t._forkDlgt),this._forkCurrZone=r&&(r.onFork?this.zone:t._forkCurrZone),this._interceptZS=r&&(r.onIntercept?r:t._interceptZS),this._interceptDlgt=r&&(r.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=r&&(r.onIntercept?this.zone:t._interceptCurrZone),this._invokeZS=r&&(r.onInvoke?r:t._invokeZS),this._invokeDlgt=r&&(r.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=r&&(r.onInvoke?this.zone:t._invokeCurrZone),this._handleErrorZS=r&&(r.onHandleError?r:t._handleErrorZS),this._handleErrorDlgt=r&&(r.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=r&&(r.onHandleError?this.zone:t._handleErrorCurrZone),this._scheduleTaskZS=r&&(r.onScheduleTask?r:t._scheduleTaskZS),this._scheduleTaskDlgt=r&&(r.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=r&&(r.onScheduleTask?this.zone:t._scheduleTaskCurrZone),this._invokeTaskZS=r&&(r.onInvokeTask?r:t._invokeTaskZS),this._invokeTaskDlgt=r&&(r.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=r&&(r.onInvokeTask?this.zone:t._invokeTaskCurrZone),this._cancelTaskZS=r&&(r.onCancelTask?r:t._cancelTaskZS),this._cancelTaskDlgt=r&&(r.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=r&&(r.onCancelTask?this.zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const k=r&&r.onHasTask;(k||t&&t._hasTaskZS)&&(this._hasTaskZS=k?r:b,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=T,r.onScheduleTask||(this._scheduleTaskZS=b,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),r.onInvokeTask||(this._invokeTaskZS=b,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),r.onCancelTask||(this._cancelTaskZS=b,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}fork(T,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,T,t):new d(T,t)}intercept(T,t,r){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,T,t,r):t}invoke(T,t,r,k,C){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,T,t,r,k,C):t.apply(r,k)}handleError(T,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,T,t)}scheduleTask(T,t){let r=t;if(this._scheduleTaskZS)this._hasTaskZS&&r._zoneDelegates.push(this._hasTaskDlgtOwner),r=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,T,t),r||(r=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=I)throw new Error("Task is missing scheduleFn.");R(t)}return r}invokeTask(T,t,r,k){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,T,t,r,k):t.callback.apply(r,k)}cancelTask(T,t){let r;if(this._cancelTaskZS)r=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,T,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");r=t.cancelFn(t)}return r}hasTask(T,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,T,t)}catch(r){this.handleError(T,r)}}_updateTaskCount(T,t){const r=this._taskCounts,k=r[T],C=r[T]=k+t;if(C<0)throw new Error("More tasks executed then were scheduled.");0!=k&&0!=C||this.hasTask(this.zone,{microTask:r.microTask>0,macroTask:r.macroTask>0,eventTask:r.eventTask>0,change:T})}}class p{constructor(T,t,r,k,C,$){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=T,this.source=t,this.data=k,this.scheduleFn=C,this.cancelFn=$,!r)throw new Error("callback is not defined");this.callback=r;const l=this;this.invoke=T===Q&&k&&k.useG?p.invokeTask:function(){return p.invokeTask.call(e,l,this,arguments)}}static invokeTask(T,t,r){T||(T=this),ee++;try{return T.runCount++,T.zone.runTask(T,t,r)}finally{1==ee&&_(),ee--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(x,X)}_transitionTo(T,t,r){if(this._state!==t&&this._state!==r)throw new Error(`${this.type} '${this.source}': can not transition to '${T}', expecting state '${t}'${r?" or '"+r+"'":""}, was '${this._state}'.`);this._state=T,T==x&&(this._zoneDelegates=null)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const M=a("setTimeout"),O=a("Promise"),N=a("then");let K,B=[],H=!1;function q(L){if(K||e[O]&&(K=e[O].resolve(0)),K){let T=K[N];T||(T=K.then),T.call(K,L)}else e[M](L,0)}function R(L){0===ee&&0===B.length&&q(_),L&&B.push(L)}function _(){if(!H){for(H=!0;B.length;){const L=B;B=[];for(let T=0;TU,onUnhandledError:W,microtaskDrainDone:W,scheduleMicroTask:R,showUncaughtError:()=>!d[a("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:W,patchMethod:()=>W,bindArguments:()=>[],patchThen:()=>W,patchMacroTask:()=>W,patchEventPrototype:()=>W,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>W,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>W,wrapWithCurrentZone:()=>W,filterProperties:()=>[],attachOriginToPatched:()=>W,_redefineProperty:()=>W,patchCallbacks:()=>W,nativeScheduleMicroTask:q};let U={parent:null,zone:new d(null,null)},re=null,ee=0;function W(){}o("Zone","Zone"),e.Zone=d}(typeof window<"u"&&window||typeof self<"u"&&self||global);const ue=Object.getOwnPropertyDescriptor,pe=Object.defineProperty,ve=Object.getPrototypeOf,Se=Object.create,it=Array.prototype.slice,Ze="addEventListener",De="removeEventListener",Oe=Zone.__symbol__(Ze),Ne=Zone.__symbol__(De),ie="true",ce="false",me=Zone.__symbol__("");function Ie(e,n){return Zone.current.wrap(e,n)}function Me(e,n,i,o,c){return Zone.current.scheduleMacroTask(e,n,i,o,c)}const j=Zone.__symbol__,be=typeof window<"u",_e=be?window:void 0,Y=be&&_e||"object"==typeof self&&self||global,ct="removeAttribute";function Le(e,n){for(let i=e.length-1;i>=0;i--)"function"==typeof e[i]&&(e[i]=Ie(e[i],n+"_"+i));return e}function Ve(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&typeof e.set>"u")}const Fe=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,Pe=!("nw"in Y)&&typeof Y.process<"u"&&"[object process]"==={}.toString.call(Y.process),Ae=!Pe&&!Fe&&!(!be||!_e.HTMLElement),Be=typeof Y.process<"u"&&"[object process]"==={}.toString.call(Y.process)&&!Fe&&!(!be||!_e.HTMLElement),we={},Ue=function(e){if(!(e=e||Y.event))return;let n=we[e.type];n||(n=we[e.type]=j("ON_PROPERTY"+e.type));const i=this||e.target||Y,o=i[n];let c;return Ae&&i===_e&&"error"===e.type?(c=o&&o.call(this,e.message,e.filename,e.lineno,e.colno,e.error),!0===c&&e.preventDefault()):(c=o&&o.apply(this,arguments),null!=c&&!c&&e.preventDefault()),c};function We(e,n,i){let o=ue(e,n);if(!o&&i&&ue(i,n)&&(o={enumerable:!0,configurable:!0}),!o||!o.configurable)return;const c=j("on"+n+"patched");if(e.hasOwnProperty(c)&&e[c])return;delete o.writable,delete o.value;const a=o.get,y=o.set,d=n.slice(2);let b=we[d];b||(b=we[d]=j("ON_PROPERTY"+d)),o.set=function(v){let p=this;!p&&e===Y&&(p=Y),p&&("function"==typeof p[b]&&p.removeEventListener(d,Ue),y&&y.call(p,null),p[b]=v,"function"==typeof v&&p.addEventListener(d,Ue,!1))},o.get=function(){let v=this;if(!v&&e===Y&&(v=Y),!v)return null;const p=v[b];if(p)return p;if(a){let M=a.call(this);if(M)return o.set.call(this,M),"function"==typeof v[ct]&&v.removeAttribute(n),M}return null},pe(e,n,o),e[c]=!0}function qe(e,n,i){if(n)for(let o=0;ofunction(y,d){const b=i(y,d);return b.cbIdx>=0&&"function"==typeof d[b.cbIdx]?Me(b.name,d[b.cbIdx],b,c):a.apply(y,d)})}function le(e,n){e[j("OriginalDelegate")]=n}let Xe=!1,je=!1;function ft(){if(Xe)return je;Xe=!0;try{const e=_e.navigator.userAgent;(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/")||-1!==e.indexOf("Edge/"))&&(je=!0)}catch{}return je}Zone.__load_patch("ZoneAwarePromise",(e,n,i)=>{const o=Object.getOwnPropertyDescriptor,c=Object.defineProperty,y=i.symbol,d=[],b=!0===e[y("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],v=y("Promise"),p=y("then"),M="__creationTrace__";i.onUnhandledError=l=>{if(i.showUncaughtError()){const u=l&&l.rejection;u?console.error("Unhandled Promise rejection:",u instanceof Error?u.message:u,"; Zone:",l.zone.name,"; Task:",l.task&&l.task.source,"; Value:",u,u instanceof Error?u.stack:void 0):console.error(l)}},i.microtaskDrainDone=()=>{for(;d.length;){const l=d.shift();try{l.zone.runGuarded(()=>{throw l.throwOriginal?l.rejection:l})}catch(u){N(u)}}};const O=y("unhandledPromiseRejectionHandler");function N(l){i.onUnhandledError(l);try{const u=n[O];"function"==typeof u&&u.call(this,l)}catch{}}function B(l){return l&&l.then}function H(l){return l}function K(l){return t.reject(l)}const q=y("state"),R=y("value"),_=y("finally"),J=y("parentPromiseValue"),x=y("parentPromiseState"),X="Promise.then",A=null,E=!0,G=!1,h=0;function I(l,u){return s=>{try{z(l,u,s)}catch(f){z(l,!1,f)}}}const P=function(){let l=!1;return function(s){return function(){l||(l=!0,s.apply(null,arguments))}}},Q="Promise resolved with itself",oe=y("currentTaskTrace");function z(l,u,s){const f=P();if(l===s)throw new TypeError(Q);if(l[q]===A){let g=null;try{("object"==typeof s||"function"==typeof s)&&(g=s&&s.then)}catch(w){return f(()=>{z(l,!1,w)})(),l}if(u!==G&&s instanceof t&&s.hasOwnProperty(q)&&s.hasOwnProperty(R)&&s[q]!==A)re(s),z(l,s[q],s[R]);else if(u!==G&&"function"==typeof g)try{g.call(s,f(I(l,u)),f(I(l,!1)))}catch(w){f(()=>{z(l,!1,w)})()}else{l[q]=u;const w=l[R];if(l[R]=s,l[_]===_&&u===E&&(l[q]=l[x],l[R]=l[J]),u===G&&s instanceof Error){const m=n.currentTask&&n.currentTask.data&&n.currentTask.data[M];m&&c(s,oe,{configurable:!0,enumerable:!1,writable:!0,value:m})}for(let m=0;m{try{const S=l[R],Z=!!s&&_===s[_];Z&&(s[J]=S,s[x]=w);const D=u.run(m,void 0,Z&&m!==K&&m!==H?[]:[S]);z(s,!0,D)}catch(S){z(s,!1,S)}},s)}const L=function(){},T=e.AggregateError;class t{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(u){return z(new this(null),E,u)}static reject(u){return z(new this(null),G,u)}static any(u){if(!u||"function"!=typeof u[Symbol.iterator])return Promise.reject(new T([],"All promises were rejected"));const s=[];let f=0;try{for(let m of u)f++,s.push(t.resolve(m))}catch{return Promise.reject(new T([],"All promises were rejected"))}if(0===f)return Promise.reject(new T([],"All promises were rejected"));let g=!1;const w=[];return new t((m,S)=>{for(let Z=0;Z{g||(g=!0,m(D))},D=>{w.push(D),f--,0===f&&(g=!0,S(new T(w,"All promises were rejected")))})})}static race(u){let s,f,g=new this((S,Z)=>{s=S,f=Z});function w(S){s(S)}function m(S){f(S)}for(let S of u)B(S)||(S=this.resolve(S)),S.then(w,m);return g}static all(u){return t.allWithCallback(u)}static allSettled(u){return(this&&this.prototype instanceof t?this:t).allWithCallback(u,{thenCallback:f=>({status:"fulfilled",value:f}),errorCallback:f=>({status:"rejected",reason:f})})}static allWithCallback(u,s){let f,g,w=new this((D,V)=>{f=D,g=V}),m=2,S=0;const Z=[];for(let D of u){B(D)||(D=this.resolve(D));const V=S;try{D.then(F=>{Z[V]=s?s.thenCallback(F):F,m--,0===m&&f(Z)},F=>{s?(Z[V]=s.errorCallback(F),m--,0===m&&f(Z)):g(F)})}catch(F){g(F)}m++,S++}return m-=2,0===m&&f(Z),w}constructor(u){const s=this;if(!(s instanceof t))throw new Error("Must be an instanceof Promise.");s[q]=A,s[R]=[];try{const f=P();u&&u(f(I(s,E)),f(I(s,G)))}catch(f){z(s,!1,f)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return t}then(u,s){let f=this.constructor?.[Symbol.species];(!f||"function"!=typeof f)&&(f=this.constructor||t);const g=new f(L),w=n.current;return this[q]==A?this[R].push(w,g,u,s):ee(this,w,g,u,s),g}catch(u){return this.then(null,u)}finally(u){let s=this.constructor?.[Symbol.species];(!s||"function"!=typeof s)&&(s=t);const f=new s(L);f[_]=_;const g=n.current;return this[q]==A?this[R].push(g,f,u,u):ee(this,g,f,u,u),f}}t.resolve=t.resolve,t.reject=t.reject,t.race=t.race,t.all=t.all;const r=e[v]=e.Promise;e.Promise=t;const k=y("thenPatched");function C(l){const u=l.prototype,s=o(u,"then");if(s&&(!1===s.writable||!s.configurable))return;const f=u.then;u[p]=f,l.prototype.then=function(g,w){return new t((S,Z)=>{f.call(this,S,Z)}).then(g,w)},l[k]=!0}return i.patchThen=C,r&&(C(r),ae(e,"fetch",l=>function $(l){return function(u,s){let f=l.apply(u,s);if(f instanceof t)return f;let g=f.constructor;return g[k]||C(g),f}}(l))),Promise[n.__symbol__("uncaughtPromiseErrors")]=d,t}),Zone.__load_patch("toString",e=>{const n=Function.prototype.toString,i=j("OriginalDelegate"),o=j("Promise"),c=j("Error"),a=function(){if("function"==typeof this){const v=this[i];if(v)return"function"==typeof v?n.call(v):Object.prototype.toString.call(v);if(this===Promise){const p=e[o];if(p)return n.call(p)}if(this===Error){const p=e[c];if(p)return n.call(p)}}return n.call(this)};a[i]=n,Function.prototype.toString=a;const y=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":y.call(this)}});let Ee=!1;if(typeof window<"u")try{const e=Object.defineProperty({},"passive",{get:function(){Ee=!0}});window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch{Ee=!1}const ht={useG:!0},te={},ze={},Ye=new RegExp("^"+me+"(\\w+)(true|false)$"),$e=j("propagationStopped");function Je(e,n){const i=(n?n(e):e)+ce,o=(n?n(e):e)+ie,c=me+i,a=me+o;te[e]={},te[e][ce]=c,te[e][ie]=a}function dt(e,n,i,o){const c=o&&o.add||Ze,a=o&&o.rm||De,y=o&&o.listeners||"eventListeners",d=o&&o.rmAll||"removeAllListeners",b=j(c),v="."+c+":",p="prependListener",M="."+p+":",O=function(R,_,J){if(R.isRemoved)return;const x=R.callback;let X;"object"==typeof x&&x.handleEvent&&(R.callback=E=>x.handleEvent(E),R.originalDelegate=x);try{R.invoke(R,_,[J])}catch(E){X=E}const A=R.options;return A&&"object"==typeof A&&A.once&&_[a].call(_,J.type,R.originalDelegate?R.originalDelegate:R.callback,A),X};function N(R,_,J){if(!(_=_||e.event))return;const x=R||_.target||e,X=x[te[_.type][J?ie:ce]];if(X){const A=[];if(1===X.length){const E=O(X[0],x,_);E&&A.push(E)}else{const E=X.slice();for(let G=0;G{throw G})}}}const B=function(R){return N(this,R,!1)},H=function(R){return N(this,R,!0)};function K(R,_){if(!R)return!1;let J=!0;_&&void 0!==_.useG&&(J=_.useG);const x=_&&_.vh;let X=!0;_&&void 0!==_.chkDup&&(X=_.chkDup);let A=!1;_&&void 0!==_.rt&&(A=_.rt);let E=R;for(;E&&!E.hasOwnProperty(c);)E=ve(E);if(!E&&R[c]&&(E=R),!E||E[b])return!1;const G=_&&_.eventNameToString,h={},I=E[b]=E[c],P=E[j(a)]=E[a],Q=E[j(y)]=E[y],oe=E[j(d)]=E[d];let z;_&&_.prepend&&(z=E[j(_.prepend)]=E[_.prepend]);const t=J?function(s){if(!h.isExisting)return I.call(h.target,h.eventName,h.capture?H:B,h.options)}:function(s){return I.call(h.target,h.eventName,s.invoke,h.options)},r=J?function(s){if(!s.isRemoved){const f=te[s.eventName];let g;f&&(g=f[s.capture?ie:ce]);const w=g&&s.target[g];if(w)for(let m=0;mfunction(c,a){c[$e]=!0,o&&o.apply(c,a)})}function Et(e,n,i,o,c){const a=Zone.__symbol__(o);if(n[a])return;const y=n[a]=n[o];n[o]=function(d,b,v){return b&&b.prototype&&c.forEach(function(p){const M=`${i}.${o}::`+p,O=b.prototype;try{if(O.hasOwnProperty(p)){const N=e.ObjectGetOwnPropertyDescriptor(O,p);N&&N.value?(N.value=e.wrapWithCurrentZone(N.value,M),e._redefineProperty(b.prototype,p,N)):O[p]&&(O[p]=e.wrapWithCurrentZone(O[p],M))}else O[p]&&(O[p]=e.wrapWithCurrentZone(O[p],M))}catch{}}),y.call(n,d,b,v)},e.attachOriginToPatched(n[o],y)}function Qe(e,n,i){if(!i||0===i.length)return n;const o=i.filter(a=>a.target===e);if(!o||0===o.length)return n;const c=o[0].ignoreProperties;return n.filter(a=>-1===c.indexOf(a))}function et(e,n,i,o){e&&qe(e,Qe(e,n,i),o)}function He(e){return Object.getOwnPropertyNames(e).filter(n=>n.startsWith("on")&&n.length>2).map(n=>n.substring(2))}Zone.__load_patch("util",(e,n,i)=>{const o=He(e);i.patchOnProperties=qe,i.patchMethod=ae,i.bindArguments=Le,i.patchMacroTask=lt;const c=n.__symbol__("BLACK_LISTED_EVENTS"),a=n.__symbol__("UNPATCHED_EVENTS");e[a]&&(e[c]=e[a]),e[c]&&(n[c]=n[a]=e[c]),i.patchEventPrototype=_t,i.patchEventTarget=dt,i.isIEOrEdge=ft,i.ObjectDefineProperty=pe,i.ObjectGetOwnPropertyDescriptor=ue,i.ObjectCreate=Se,i.ArraySlice=it,i.patchClass=ge,i.wrapWithCurrentZone=Ie,i.filterProperties=Qe,i.attachOriginToPatched=le,i._redefineProperty=Object.defineProperty,i.patchCallbacks=Et,i.getGlobalObjects=()=>({globalSources:ze,zoneSymbolEventNames:te,eventNames:o,isBrowser:Ae,isMix:Be,isNode:Pe,TRUE_STR:ie,FALSE_STR:ce,ZONE_SYMBOL_PREFIX:me,ADD_EVENT_LISTENER_STR:Ze,REMOVE_EVENT_LISTENER_STR:De})});const Re=j("zoneTask");function Te(e,n,i,o){let c=null,a=null;i+=o;const y={};function d(v){const p=v.data;return p.args[0]=function(){return v.invoke.apply(this,arguments)},p.handleId=c.apply(e,p.args),v}function b(v){return a.call(e,v.data.handleId)}c=ae(e,n+=o,v=>function(p,M){if("function"==typeof M[0]){const O={isPeriodic:"Interval"===o,delay:"Timeout"===o||"Interval"===o?M[1]||0:void 0,args:M},N=M[0];M[0]=function(){try{return N.apply(this,arguments)}finally{O.isPeriodic||("number"==typeof O.handleId?delete y[O.handleId]:O.handleId&&(O.handleId[Re]=null))}};const B=Me(n,M[0],O,d,b);if(!B)return B;const H=B.data.handleId;return"number"==typeof H?y[H]=B:H&&(H[Re]=B),H&&H.ref&&H.unref&&"function"==typeof H.ref&&"function"==typeof H.unref&&(B.ref=H.ref.bind(H),B.unref=H.unref.bind(H)),"number"==typeof H||H?H:B}return v.apply(e,M)}),a=ae(e,i,v=>function(p,M){const O=M[0];let N;"number"==typeof O?N=y[O]:(N=O&&O[Re],N||(N=O)),N&&"string"==typeof N.type?"notScheduled"!==N.state&&(N.cancelFn&&N.data.isPeriodic||0===N.runCount)&&("number"==typeof O?delete y[O]:O&&(O[Re]=null),N.zone.cancelTask(N)):v.apply(e,M)})}Zone.__load_patch("legacy",e=>{const n=e[Zone.__symbol__("legacyPatch")];n&&n()}),Zone.__load_patch("timers",e=>{const n="set",i="clear";Te(e,n,i,"Timeout"),Te(e,n,i,"Interval"),Te(e,n,i,"Immediate")}),Zone.__load_patch("requestAnimationFrame",e=>{Te(e,"request","cancel","AnimationFrame"),Te(e,"mozRequest","mozCancel","AnimationFrame"),Te(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",(e,n)=>{const i=["alert","prompt","confirm"];for(let o=0;ofunction(b,v){return n.current.run(a,e,v,d)})}),Zone.__load_patch("EventTarget",(e,n,i)=>{(function gt(e,n){n.patchEventPrototype(e,n)})(e,i),function mt(e,n){if(Zone[n.symbol("patchEventTarget")])return;const{eventNames:i,zoneSymbolEventNames:o,TRUE_STR:c,FALSE_STR:a,ZONE_SYMBOL_PREFIX:y}=n.getGlobalObjects();for(let b=0;b{ge("MutationObserver"),ge("WebKitMutationObserver")}),Zone.__load_patch("IntersectionObserver",(e,n,i)=>{ge("IntersectionObserver")}),Zone.__load_patch("FileReader",(e,n,i)=>{ge("FileReader")}),Zone.__load_patch("on_property",(e,n,i)=>{!function Tt(e,n){if(Pe&&!Be||Zone[e.symbol("patchEvents")])return;const i=n.__Zone_ignore_on_properties;let o=[];if(Ae){const c=window;o=o.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);const a=function ut(){try{const e=_e.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch{}return!1}()?[{target:c,ignoreProperties:["error"]}]:[];et(c,He(c),i&&i.concat(a),ve(c))}o=o.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let c=0;c{!function pt(e,n){const{isBrowser:i,isMix:o}=n.getGlobalObjects();(i||o)&&e.customElements&&"customElements"in e&&n.patchCallbacks(n,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,i)}),Zone.__load_patch("XHR",(e,n)=>{!function b(v){const p=v.XMLHttpRequest;if(!p)return;const M=p.prototype;let N=M[Oe],B=M[Ne];if(!N){const h=v.XMLHttpRequestEventTarget;if(h){const I=h.prototype;N=I[Oe],B=I[Ne]}}const H="readystatechange",K="scheduled";function q(h){const I=h.data,P=I.target;P[a]=!1,P[d]=!1;const Q=P[c];N||(N=P[Oe],B=P[Ne]),Q&&B.call(P,H,Q);const oe=P[c]=()=>{if(P.readyState===P.DONE)if(!I.aborted&&P[a]&&h.state===K){const U=P[n.__symbol__("loadfalse")];if(0!==P.status&&U&&U.length>0){const re=h.invoke;h.invoke=function(){const ee=P[n.__symbol__("loadfalse")];for(let W=0;Wfunction(h,I){return h[o]=0==I[2],h[y]=I[1],J.apply(h,I)}),X=j("fetchTaskAborting"),A=j("fetchTaskScheduling"),E=ae(M,"send",()=>function(h,I){if(!0===n.current[A]||h[o])return E.apply(h,I);{const P={target:h,url:h[y],isPeriodic:!1,args:I,aborted:!1},Q=Me("XMLHttpRequest.send",R,P,q,_);h&&!0===h[d]&&!P.aborted&&Q.state===K&&Q.invoke()}}),G=ae(M,"abort",()=>function(h,I){const P=function O(h){return h[i]}(h);if(P&&"string"==typeof P.type){if(null==P.cancelFn||P.data&&P.data.aborted)return;P.zone.cancelTask(P)}else if(!0===n.current[X])return G.apply(h,I)})}(e);const i=j("xhrTask"),o=j("xhrSync"),c=j("xhrListener"),a=j("xhrScheduled"),y=j("xhrURL"),d=j("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",e=>{e.navigator&&e.navigator.geolocation&&function at(e,n){const i=e.constructor.name;for(let o=0;o{const b=function(){return d.apply(this,Le(arguments,i+"."+c))};return le(b,d),b})(a)}}}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",(e,n)=>{function i(o){return function(c){Ke(e,o).forEach(y=>{const d=e.PromiseRejectionEvent;if(d){const b=new d(o,{promise:c.promise,reason:c.rejection});y.invoke(b)}})}}e.PromiseRejectionEvent&&(n[j("unhandledPromiseRejectionHandler")]=i("unhandledrejection"),n[j("rejectionHandledHandler")]=i("rejectionhandled"))}),Zone.__load_patch("queueMicrotask",(e,n,i)=>{!function yt(e,n){n.patchMethod(e,"queueMicrotask",i=>function(o,c){Zone.current.scheduleMicroTask("queueMicrotask",c[0])})}(e,i)})}},ue=>{ue(ue.s=332)}]); \ No newline at end of file diff --git a/static/explorer/runtime.js b/static/explorer/runtime.js index d2c03a56..c3049b18 100644 --- a/static/explorer/runtime.js +++ b/static/explorer/runtime.js @@ -1,137 +1 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ var executeModules = data[2]; -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ deferredModules.push.apply(deferredModules, executeModules || []); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ }; -/******/ function checkDeferredModules() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ return result; -/******/ } -/******/ -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ "runtime": 0 -/******/ }; -/******/ -/******/ var deferredModules = []; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // run deferred modules from other chunks -/******/ checkDeferredModules(); -/******/ }) -/************************************************************************/ -/******/ ([]); -//# sourceMappingURL=runtime.js.map \ No newline at end of file +(()=>{"use strict";var e,i={},p={};function n(e){var f=p[e];if(void 0!==f)return f.exports;var r=p[e]={exports:{}};return i[e](r,r.exports,n),r.exports}n.m=i,e=[],n.O=(f,r,u,l)=>{if(!r){var c=1/0;for(a=0;a=l)&&Object.keys(n.O).every(h=>n.O[h](r[o]))?r.splice(o--,1):(t=!1,l0&&e[a-1][2]>l;a--)e[a]=e[a-1];e[a]=[r,u,l]},n.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),(()=>{var e={666:0};n.O.j=u=>0===e[u];var f=(u,l)=>{var o,s,[a,c,t]=l,v=0;if(a.some(d=>0!==e[d])){for(o in c)n.o(c,o)&&(n.m[o]=c[o]);if(t)var _=t(n)}for(u&&u(l);v+~]|"+K+")"+K+"*"),Gt=new RegExp(K+"|>"),Je=new RegExp(Ge),Jt=new RegExp("^"+Ke+"$"),ht={ID:new RegExp("^#("+Ke+")"),CLASS:new RegExp("^\\.("+Ke+")"),TAG:new RegExp("^("+Ke+"|[*])"),ATTR:new RegExp("^"+X),PSEUDO:new RegExp("^"+Ge),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+Qe+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},we=/^(?:input|select|textarea|button)$/i,Pt=/^h\d$/i,$e=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,se=/[+~]/,ne=new RegExp("\\\\[\\da-fA-F]{1,6}"+K+"?|\\\\([^\\r\\n\\f])","g"),ge=function(u,g){var y="0x"+u.slice(1)-65536;return g||(y<0?String.fromCharCode(y+65536):String.fromCharCode(y>>10|55296,1023&y|56320))},dt=function(){wt()},me=mn(function(u){return!0===u.disabled&&J(u,"fieldset")},{dir:"parentNode",next:"legend"});try{_.apply(ae=fe.call(Be.childNodes),Be.childNodes)}catch{_={apply:function(g,y){rn.apply(g,fe.call(y))},call:function(g){rn.apply(g,fe.call(arguments,1))}}}function $(u,g,y,b){var x,k,S,L,D,U,P,z=g&&g.ownerDocument,Y=g?g.nodeType:9;if(y=y||[],"string"!=typeof u||!u||1!==Y&&9!==Y&&11!==Y)return y;if(!b&&(wt(g),g=g||l,d)){if(11!==Y&&(D=$e.exec(u)))if(x=D[1]){if(9===Y){if(!(S=g.getElementById(x)))return y;if(S.id===x)return _.call(y,S),y}else if(z&&(S=z.getElementById(x))&&$.contains(g,S)&&S.id===x)return _.call(y,S),y}else{if(D[2])return _.apply(y,g.getElementsByTagName(u)),y;if((x=D[3])&&g.getElementsByClassName)return _.apply(y,g.getElementsByClassName(x)),y}if(!(re[u+" "]||h&&h.test(u))){if(P=u,z=g,1===Y&&(Gt.test(u)||ut.test(u))){for((z=se.test(u)&&Zn(g.parentNode)||g)==g&&B.scope||((L=g.getAttribute("id"))?L=s.escapeSelector(L):g.setAttribute("id",L=w)),k=(U=Zt(u)).length;k--;)U[k]=(L?"#"+L:":scope")+" "+gn(U[k]);P=U.join(",")}try{return _.apply(y,z.querySelectorAll(P)),y}catch{re(u,!0)}finally{L===w&&g.removeAttribute("id")}}}return bn(u.replace(Dt,"$1"),g,y,b)}function te(){var u=[];return function g(y,b){return u.push(y+" ")>t.cacheLength&&delete g[u.shift()],g[y+" "]=b}}function ie(u){return u[w]=!0,u}function Z(u){var g=l.createElement("fieldset");try{return!!u(g)}catch{return!1}finally{g.parentNode&&g.parentNode.removeChild(g),g=null}}function Ze(u){return function(g){return J(g,"input")&&g.type===u}}function Mt(u){return function(g){return(J(g,"input")||J(g,"button"))&&g.type===u}}function bt(u){return function(g){return"form"in g?g.parentNode&&!1===g.disabled?"label"in g?"label"in g.parentNode?g.parentNode.disabled===u:g.disabled===u:g.isDisabled===u||g.isDisabled!==!u&&me(g)===u:g.disabled===u:"label"in g&&g.disabled===u}}function Ee(u){return ie(function(g){return g=+g,ie(function(y,b){for(var x,k=u([],y.length,g),S=k.length;S--;)y[x=k[S]]&&(y[x]=!(b[x]=y[x]))})})}function Zn(u){return u&&typeof u.getElementsByTagName<"u"&&u}function wt(u){var g,y=u?u.ownerDocument||u:Be;return y!=l&&9===y.nodeType&&y.documentElement&&(c=(l=y).documentElement,d=!s.isXMLDoc(l),m=c.matches||c.webkitMatchesSelector||c.msMatchesSelector,c.msMatchesSelector&&Be!=l&&(g=l.defaultView)&&g.top!==g&&g.addEventListener("unload",dt),B.getById=Z(function(b){return c.appendChild(b).id=s.expando,!l.getElementsByName||!l.getElementsByName(s.expando).length}),B.disconnectedMatch=Z(function(b){return m.call(b,"*")}),B.scope=Z(function(){return l.querySelectorAll(":scope")}),B.cssHas=Z(function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch{return!0}}),B.getById?(t.filter.ID=function(b){var x=b.replace(ne,ge);return function(k){return k.getAttribute("id")===x}},t.find.ID=function(b,x){if(typeof x.getElementById<"u"&&d){var k=x.getElementById(b);return k?[k]:[]}}):(t.filter.ID=function(b){var x=b.replace(ne,ge);return function(k){var S=typeof k.getAttributeNode<"u"&&k.getAttributeNode("id");return S&&S.value===x}},t.find.ID=function(b,x){if(typeof x.getElementById<"u"&&d){var k,S,L,D=x.getElementById(b);if(D){if((k=D.getAttributeNode("id"))&&k.value===b)return[D];for(L=x.getElementsByName(b),S=0;D=L[S++];)if((k=D.getAttributeNode("id"))&&k.value===b)return[D]}return[]}}),t.find.TAG=function(b,x){return typeof x.getElementsByTagName<"u"?x.getElementsByTagName(b):x.querySelectorAll(b)},t.find.CLASS=function(b,x){if(typeof x.getElementsByClassName<"u"&&d)return x.getElementsByClassName(b)},h=[],Z(function(b){var x;c.appendChild(b).innerHTML="",b.querySelectorAll("[selected]").length||h.push("\\["+K+"*(?:value|"+Qe+")"),b.querySelectorAll("[id~="+w+"-]").length||h.push("~="),b.querySelectorAll("a#"+w+"+*").length||h.push(".#.+[+~]"),b.querySelectorAll(":checked").length||h.push(":checked"),(x=l.createElement("input")).setAttribute("type","hidden"),b.appendChild(x).setAttribute("name","D"),c.appendChild(b).disabled=!0,2!==b.querySelectorAll(":disabled").length&&h.push(":enabled",":disabled"),(x=l.createElement("input")).setAttribute("name",""),b.appendChild(x),b.querySelectorAll("[name='']").length||h.push("\\["+K+"*name"+K+"*="+K+"*(?:''|\"\")")}),B.cssHas||h.push(":has"),h=h.length&&new RegExp(h.join("|")),ue=function(b,x){if(b===x)return o=!0,0;var k=!b.compareDocumentPosition-!x.compareDocumentPosition;return k||(1&(k=(b.ownerDocument||b)==(x.ownerDocument||x)?b.compareDocumentPosition(x):1)||!B.sortDetached&&x.compareDocumentPosition(b)===k?b===l||b.ownerDocument==Be&&$.contains(Be,b)?-1:x===l||x.ownerDocument==Be&&$.contains(Be,x)?1:r?Re.call(r,b)-Re.call(r,x):0:4&k?-1:1)}),l}for(e in $.matches=function(u,g){return $(u,null,null,g)},$.matchesSelector=function(u,g){if(wt(u),d&&!re[g+" "]&&(!h||!h.test(g)))try{var y=m.call(u,g);if(y||B.disconnectedMatch||u.document&&11!==u.document.nodeType)return y}catch{re(g,!0)}return 0<$(g,l,null,[u]).length},$.contains=function(u,g){return(u.ownerDocument||u)!=l&&wt(u),s.contains(u,g)},$.attr=function(u,g){(u.ownerDocument||u)!=l&&wt(u);var y=t.attrHandle[g.toLowerCase()],b=y&&We.call(t.attrHandle,g.toLowerCase())?y(u,g,!d):void 0;return void 0!==b?b:u.getAttribute(g)},$.error=function(u){throw new Error("Syntax error, unrecognized expression: "+u)},s.uniqueSort=function(u){var g,y=[],b=0,x=0;if(o=!B.sortStable,r=!B.sortStable&&fe.call(u,0),ri.call(u,ue),o){for(;g=u[x++];)g===u[x]&&(b=y.push(x));for(;b--;)si.call(u,y[b],1)}return r=null,u},s.fn.uniqueSort=function(){return this.pushStack(s.uniqueSort(fe.apply(this)))},(t=s.expr={cacheLength:50,createPseudo:ie,match:ht,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(u){return u[1]=u[1].replace(ne,ge),u[3]=(u[3]||u[4]||u[5]||"").replace(ne,ge),"~="===u[2]&&(u[3]=" "+u[3]+" "),u.slice(0,4)},CHILD:function(u){return u[1]=u[1].toLowerCase(),"nth"===u[1].slice(0,3)?(u[3]||$.error(u[0]),u[4]=+(u[4]?u[5]+(u[6]||1):2*("even"===u[3]||"odd"===u[3])),u[5]=+(u[7]+u[8]||"odd"===u[3])):u[3]&&$.error(u[0]),u},PSEUDO:function(u){var g,y=!u[6]&&u[2];return ht.CHILD.test(u[0])?null:(u[3]?u[2]=u[4]||u[5]||"":y&&Je.test(y)&&(g=Zt(y,!0))&&(g=y.indexOf(")",y.length-g)-y.length)&&(u[0]=u[0].slice(0,g),u[2]=y.slice(0,g)),u.slice(0,3))}},filter:{TAG:function(u){var g=u.replace(ne,ge).toLowerCase();return"*"===u?function(){return!0}:function(y){return J(y,g)}},CLASS:function(u){var g=O[u+" "];return g||(g=new RegExp("(^|"+K+")"+u+"("+K+"|$)"))&&O(u,function(y){return g.test("string"==typeof y.className&&y.className||typeof y.getAttribute<"u"&&y.getAttribute("class")||"")})},ATTR:function(u,g,y){return function(b){var x=$.attr(b,u);return null==x?"!="===g:!g||(x+="","="===g?x===y:"!="===g?x!==y:"^="===g?y&&0===x.indexOf(y):"*="===g?y&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ft(e,t,i){return R(t)?s.grep(e,function(r,o){return!!t.call(r,o,r)!==i}):t.nodeType?s.grep(e,function(r){return r===t!==i}):"string"!=typeof t?s.grep(e,function(r){return-1)[^>]*|#([\w-]+))$/;(s.fn.init=function(e,t,i){var r,o;if(!e)return this;if(i=i||kn,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Sn.exec(e))||!r[1]&&t)return!t||t.jquery?(t||i).find(e):this.constructor(t).find(e);if(r[1]){if(s.merge(this,s.parseHTML(r[1],(t=t instanceof s?t[0]:t)&&t.nodeType?t.ownerDocument||t:W,!0)),E.test(r[1])&&s.isPlainObject(t))for(r in t)R(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(o=W.getElementById(r[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):R(e)?void 0!==i.ready?i.ready(e):e(s):s.makeArray(e,this)}).prototype=s.fn,kn=s(W);var st=/^(?:parents|prev(?:Until|All))/,Rt={children:!0,contents:!0,next:!0,prev:!0};function De(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}s.fn.extend({has:function(e){var t=s(e,this),i=t.length;return this.filter(function(){for(var r=0;r\x20\t\r\n\f]*)/i,Ut=/^$|^module$|\/(?:java|ecma)script/i;Ct=W.createDocumentFragment().appendChild(W.createElement("div")),(on=W.createElement("input")).setAttribute("type","radio"),on.setAttribute("checked","checked"),on.setAttribute("name","t"),Ct.appendChild(on),B.checkClone=Ct.cloneNode(!0).cloneNode(!0).lastChild.checked,Ct.innerHTML="",B.noCloneChecked=!!Ct.cloneNode(!0).lastChild.defaultValue,Ct.innerHTML="",B.option=!!Ct.lastChild;var Ce={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function pe(e,t){var i;return i=typeof e.getElementsByTagName<"u"?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll<"u"?e.querySelectorAll(t||"*"):[],void 0===t||t&&J(e,t)?s.merge([e],i):i}function On(e,t){for(var i=0,r=e.length;i",""]);var Fi=/<|&#?\w+;/;function hi(e,t,i,r,o){for(var l,c,d,h,m,_,w=t.createDocumentFragment(),v=[],T=0,O=e.length;T\s*$/g;function ln(e,t){return J(e,"table")&&J(11!==t.nodeType?t:t.firstChild,"tr")&&s(e).children("tbody")[0]||e}function Ot(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function cn(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function fi(e,t){var i,r,o,l,c,d;if(1===t.nodeType){if(I.hasData(e)&&(d=I.get(e).events))for(o in I.remove(t,"handle events"),d)for(i=0,r=d[o].length;i"u"?s.prop(e,t,i):(1===l&&s.isXMLDoc(e)||(o=s.attrHooks[t.toLowerCase()]||(s.expr.match.bool.test(t)?Rn:void 0)),void 0!==i?null===i?void s.removeAttr(e,t):o&&"set"in o&&void 0!==(r=o.set(e,i,t))?r:(e.setAttribute(t,i+""),i):o&&"get"in o&&null!==(r=o.get(e,t))?r:null==(r=s.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!B.radioValue&&"radio"===t&&J(e,"input")){var i=e.value;return e.setAttribute("type",t),i&&(e.value=i),t}}}},removeAttr:function(e,t){var i,r=0,o=t&&t.match(Le);if(o&&1===e.nodeType)for(;i=o[r++];)e.removeAttribute(i)}}),Rn={set:function(e,t,i){return!1===t?s.removeAttr(e,i):e.setAttribute(i,i),i}},s.each(s.expr.match.bool.source.match(/\w+/g),function(e,t){var i=Qt[t]||s.find.attr;Qt[t]=function(r,o,l){var c,d,h=o.toLowerCase();return l||(d=Qt[h],Qt[h]=c,c=null!=i(r,o,l)?h:null,Qt[h]=d),c}});var Ui=/^(?:input|select|textarea|button)$/i,Ci=/^(?:a|area)$/i;function Ve(e){return(e.match(Le)||[]).join(" ")}function At(e){return e.getAttribute&&e.getAttribute("class")||""}function Wn(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(Le)||[]}s.fn.extend({prop:function(e,t){return ze(this,s.prop,e,t,1").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",i=function(l){t.remove(),i=null,l&&o("error"===l.type?404:200,l.type)}),W.head.appendChild(t[0])},abort:function(){i&&i()}}});var Ye,Gn=[],Jn=/(=)\?(?=&|$)|\?\?/;s.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gn.pop()||s.expando+"_"+Ai.guid++;return this[e]=!0,e}}),s.ajaxPrefilter("json jsonp",function(e,t,i){var r,o,l,c=!1!==e.jsonp&&(Jn.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Jn.test(e.data)&&"data");if(c||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=R(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,c?e[c]=e[c].replace(Jn,"$1"+r):!1!==e.jsonp&&(e.url+=(hn.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return l||s.error(r+" was not called"),l[0]},e.dataTypes[0]="json",o=H[r],H[r]=function(){l=arguments},i.always(function(){void 0===o?s(H).removeProp(r):H[r]=o,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gn.push(r)),l&&R(o)&&o(l[0]),l=o=void 0}),"script"}),B.createHTMLDocument=((Ye=W.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ye.childNodes.length),s.parseHTML=function(e,t,i){return"string"!=typeof e?[]:("boolean"==typeof t&&(i=t,t=!1),t||(B.createHTMLDocument?((r=(t=W.implementation.createHTMLDocument("")).createElement("base")).href=W.location.href,t.head.appendChild(r)):t=W),l=!i&&[],(o=E.exec(e))?[t.createElement(o[1])]:(o=hi([e],t,l),l&&l.length&&s(l).remove(),s.merge([],o.childNodes)));var r,o,l},s.fn.load=function(e,t,i){var r,o,l,c=this,d=e.indexOf(" ");return-1").append(s.parseHTML(h)).find(r):h)}).always(i&&function(h,m){c.each(function(){i.apply(this,l||[h.responseText,m,h])})}),this},s.expr.pseudos.animated=function(e){return s.grep(s.timers,function(t){return e===t.elem}).length},s.offset={setOffset:function(e,t,i){var r,o,l,c,d,h,m=s.css(e,"position"),_=s(e),w={};"static"===m&&(e.style.position="relative"),d=_.offset(),l=s.css(e,"top"),h=s.css(e,"left"),("absolute"===m||"fixed"===m)&&-1<(l+h).indexOf("auto")?(c=(r=_.position()).top,o=r.left):(c=parseFloat(l)||0,o=parseFloat(h)||0),R(t)&&(t=t.call(e,i,s.extend({},d))),null!=t.top&&(w.top=t.top-d.top+c),null!=t.left&&(w.left=t.left-d.left+o),"using"in t?t.using.call(e,w):_.css(w)}},s.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(o){s.offset.setOffset(this,e,o)});var t,i,r=this[0];return r?r.getClientRects().length?{top:(t=r.getBoundingClientRect()).top+(i=r.ownerDocument.defaultView).pageYOffset,left:t.left+i.pageXOffset}:{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,i,r=this[0],o={top:0,left:0};if("fixed"===s.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),i=r.ownerDocument,e=r.offsetParent||i.documentElement;e&&(e===i.body||e===i.documentElement)&&"static"===s.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((o=s(e).offset()).top+=s.css(e,"borderTopWidth",!0),o.left+=s.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-s.css(r,"marginTop",!0),left:t.left-o.left-s.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===s.css(e,"position");)e=e.offsetParent;return e||Ne})}}),s.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var i="pageYOffset"===t;s.fn[e]=function(r){return ze(this,function(o,l,c){var d;if(xt(o)?d=o:9===o.nodeType&&(d=o.defaultView),void 0===c)return d?d[t]:o[l];d?d.scrollTo(i?d.pageXOffset:c,i?c:d.pageYOffset):o[l]=c},e,r,arguments.length)}}),s.each(["top","left"],function(e,t){s.cssHooks[t]=Mn(B.pixelPosition,function(i,r){if(r)return r=Yt(i,t),In.test(r)?s(i).position()[t]+"px":r})}),s.each({Height:"height",Width:"width"},function(e,t){s.each({padding:"inner"+e,content:t,"":"outer"+e},function(i,r){s.fn[r]=function(o,l){var c=arguments.length&&(i||"boolean"!=typeof o),d=i||(!0===o||!0===l?"margin":"border");return ze(this,function(h,m,_){var w;return xt(h)?0===r.indexOf("outer")?h["inner"+e]:h.document.documentElement["client"+e]:9===h.nodeType?(w=h.documentElement,Math.max(h.body["scroll"+e],w["scroll"+e],h.body["offset"+e],w["offset"+e],w["client"+e])):void 0===_?s.css(h,m,d):s.style(h,m,_,d)},t,c?o:void 0,c)}})}),s.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){s.fn[t]=function(i){return this.on(t,i)}}),s.fn.extend({bind:function(e,t,i){return this.on(e,null,t,i)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,i,r){return this.on(t,e,i,r)},undelegate:function(e,t,i){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",i)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),s.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){s.fn[t]=function(i,r){return 0"u"&&(H.jQuery=H.$=s),s}),function(H,tt){"object"==typeof exports&&typeof module<"u"?module.exports=tt(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],tt):(H=typeof globalThis<"u"?globalThis:H||self).bootstrap=tt(H.Popper)}(this,function(H){"use strict";const ae=function tt(f){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(f)for(const a in f)if("default"!==a){const p=Object.getOwnPropertyDescriptor(f,a);Object.defineProperty(n,a,p.get?p:{enumerable:!0,get:()=>f[a]})}return n.default=f,Object.freeze(n)}(H),nt=new Map,fe={set(f,n,a){nt.has(f)||nt.set(f,new Map);const p=nt.get(f);p.has(n)||0===p.size?p.set(n,a):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(p.keys())[0]}.`)},get:(f,n)=>nt.has(f)&&nt.get(f).get(n)||null,remove(f,n){if(!nt.has(f))return;const a=nt.get(f);a.delete(n),0===a.size&&nt.delete(f)}},nn="transitionend",qt=f=>(f&&window.CSS&&window.CSS.escape&&(f=f.replace(/#([^\s"#']+)/g,(n,a)=>`#${CSS.escape(a)}`)),f),Re=f=>{f.dispatchEvent(new Event(nn))},ke=f=>!(!f||"object"!=typeof f)&&(void 0!==f.jquery&&(f=f[0]),void 0!==f.nodeType),it=f=>ke(f)?f.jquery?f[0]:f:"string"==typeof f&&f.length>0?document.querySelector(qt(f)):null,We=f=>{if(!ke(f)||0===f.getClientRects().length)return!1;const n="visible"===getComputedStyle(f).getPropertyValue("visibility"),a=f.closest("details:not([open])");if(!a)return n;if(a!==f){const p=f.closest("summary");if(p&&p.parentNode!==a||null===p)return!1}return n},rt=f=>!f||f.nodeType!==Node.ELEMENT_NODE||!!f.classList.contains("disabled")||(void 0!==f.disabled?f.disabled:f.hasAttribute("disabled")&&"false"!==f.getAttribute("disabled")),ii=f=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof f.getRootNode){const n=f.getRootNode();return n instanceof ShadowRoot?n:null}return f instanceof ShadowRoot?f:f.parentNode?ii(f.parentNode):null},B=()=>{},xt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,W=[],Se=()=>"rtl"===document.documentElement.dir,Te=f=>{var n;n=()=>{const a=xt();if(a){const p=f.NAME,C=a.fn[p];a.fn[p]=f.jQueryInterface,a.fn[p].Constructor=f,a.fn[p].noConflict=()=>(a.fn[p]=C,f.jQueryInterface)}},"loading"===document.readyState?(W.length||document.addEventListener("DOMContentLoaded",()=>{for(const a of W)a()}),W.push(n)):n()},le=(f,n=[],a=f)=>"function"==typeof f?f(...n):a,xn=(f,n,a=!0)=>{if(!a)return void le(f);const p=(N=>{if(!N)return 0;let{transitionDuration:Q,transitionDelay:oe}=window.getComputedStyle(N);const Pe=Number.parseFloat(Q),Fe=Number.parseFloat(oe);return Pe||Fe?(Q=Q.split(",")[0],oe=oe.split(",")[0],1e3*(Number.parseFloat(Q)+Number.parseFloat(oe))):0})(n)+5;let C=!1;const A=({target:N})=>{N===n&&(C=!0,n.removeEventListener(nn,A),le(f))};n.addEventListener(nn,A),setTimeout(()=>{C||Re(n)},p)},Tn=(f,n,a,p)=>{const C=f.length;let A=f.indexOf(n);return-1===A?!a&&p?f[C-1]:f[0]:(A+=a?1:-1,p&&(A=(A+C)%C),f[Math.max(0,Math.min(A,C-1))])},s=/[^.]*(?=\..*)\.|.*/,Cn=/\..*/,J=/::\d+$/,En={};let ri=1;const si={mouseenter:"mouseover",mouseleave:"mouseout"},K=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function Dt(f,n){return n&&`${n}::${ri++}`||f.uidEvent||ri++}function oi(f){const n=Dt(f);return f.uidEvent=n,En[n]=En[n]||{},En[n]}function ai(f,n,a=null){return Object.values(f).find(p=>p.callable===n&&p.delegationSelector===a)}function Be(f,n,a){const p="string"==typeof n,C=p?a:n||a;let A=An(f);return K.has(A)||(A=f),[p,C,A]}function rn(f,n,a,p,C){if("string"!=typeof n||!f)return;let[A,N,Q]=Be(n,a,p);var en;n in si&&(en=N,N=function(pt){if(!pt.relatedTarget||pt.relatedTarget!==pt.delegateTarget&&!pt.delegateTarget.contains(pt.relatedTarget))return en.call(this,pt)});const oe=oi(f),Pe=oe[Q]||(oe[Q]={}),Fe=ai(Pe,N,A?a:null);if(Fe)return void(Fe.oneOff=Fe.oneOff&&C);const ft=Dt(N,n.replace(s,"")),kt=A?function(St,en,pt){return function ni(Ii){const Ji=St.querySelectorAll(en);for(let{target:tn}=Ii;tn&&tn!==this;tn=tn.parentNode)for(const Zi of Ji)if(Zi===tn)return Ft(Ii,{delegateTarget:tn}),ni.oneOff&&E.off(St,Ii.type,en,pt),pt.apply(tn,[Ii])}}(f,a,N):function(St,en){return function pt(ni){return Ft(ni,{delegateTarget:St}),pt.oneOff&&E.off(St,ni.type,en),en.apply(St,[ni])}}(f,N);kt.delegationSelector=A?a:null,kt.callable=N,kt.oneOff=C,kt.uidEvent=ft,Pe[ft]=kt,f.addEventListener(Q,kt,A)}function gt(f,n,a,p,C){const A=ai(n[a],p,C);A&&(f.removeEventListener(a,A,!!C),delete n[a][A.uidEvent])}function li(f,n,a,p){const C=n[a]||{};for(const[A,N]of Object.entries(C))A.includes(p)&>(f,n,a,N.callable,N.delegationSelector)}function An(f){return f=f.replace(Cn,""),si[f]||f}const E={on(f,n,a,p){rn(f,n,a,p,!1)},one(f,n,a,p){rn(f,n,a,p,!0)},off(f,n,a,p){if("string"!=typeof n||!f)return;const[C,A,N]=Be(n,a,p),Q=N!==n,oe=oi(f),Pe=oe[N]||{},Fe=n.startsWith(".");if(void 0===A){if(Fe)for(const ft of Object.keys(oe))li(f,oe,ft,n.slice(1));for(const[ft,kt]of Object.entries(Pe)){const St=ft.replace(J,"");Q&&!n.includes(St)||gt(f,oe,N,kt.callable,kt.delegationSelector)}}else{if(!Object.keys(Pe).length)return;gt(f,oe,N,A,C?a:null)}},trigger(f,n,a){if("string"!=typeof n||!f)return null;const p=xt();let C=null,A=!0,N=!0,Q=!1;n!==An(n)&&p&&(C=p.Event(n,a),p(f).trigger(C),A=!C.isPropagationStopped(),N=!C.isImmediatePropagationStopped(),Q=C.isDefaultPrevented());const oe=Ft(new Event(n,{bubbles:A,cancelable:!0}),a);return Q&&oe.preventDefault(),N&&f.dispatchEvent(oe),oe.defaultPrevented&&C&&C.preventDefault(),oe}};function Ft(f,n={}){for(const[a,p]of Object.entries(n))try{f[a]=p}catch{Object.defineProperty(f,a,{configurable:!0,get:()=>p})}return f}function kn(f){if("true"===f)return!0;if("false"===f)return!1;if(f===Number(f).toString())return Number(f);if(""===f||"null"===f)return null;if("string"!=typeof f)return f;try{return JSON.parse(decodeURIComponent(f))}catch{return f}}function Sn(f){return f.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}const st={setDataAttribute(f,n,a){f.setAttribute(`data-bs-${Sn(n)}`,a)},removeDataAttribute(f,n){f.removeAttribute(`data-bs-${Sn(n)}`)},getDataAttributes(f){if(!f)return{};const n={},a=Object.keys(f.dataset).filter(p=>p.startsWith("bs")&&!p.startsWith("bsConfig"));for(const p of a){let C=p.replace(/^bs/,"");C=C.charAt(0).toLowerCase()+C.slice(1,C.length),n[C]=kn(f.dataset[p])}return n},getDataAttribute:(f,n)=>kn(f.getAttribute(`data-bs-${Sn(n)}`))};class Rt{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(n){return n=this._mergeConfigObj(n),n=this._configAfterMerge(n),this._typeCheckConfig(n),n}_configAfterMerge(n){return n}_mergeConfigObj(n,a){const p=ke(a)?st.getDataAttribute(a,"config"):{};return{...this.constructor.Default,..."object"==typeof p?p:{},...ke(a)?st.getDataAttributes(a):{},..."object"==typeof n?n:{}}}_typeCheckConfig(n,a=this.constructor.DefaultType){for(const[C,A]of Object.entries(a)){const N=n[C],Q=ke(N)?"element":null==(p=N)?`${p}`:Object.prototype.toString.call(p).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(A).test(Q))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${C}" provided type "${Q}" but expected type "${A}".`)}var p}}class De extends Rt{constructor(n,a){super(),(n=it(n))&&(this._element=n,this._config=this._getConfig(a),fe.set(this._element,this.constructor.DATA_KEY,this))}dispose(){fe.remove(this._element,this.constructor.DATA_KEY),E.off(this._element,this.constructor.EVENT_KEY);for(const n of Object.getOwnPropertyNames(this))this[n]=null}_queueCallback(n,a,p=!0){xn(n,a,p)}_getConfig(n){return n=this._mergeConfigObj(n,this._element),n=this._configAfterMerge(n),this._typeCheckConfig(n),n}static getInstance(n){return fe.get(it(n),this.DATA_KEY)}static getOrCreateInstance(n,a={}){return this.getInstance(n)||new this(n,"object"==typeof a?a:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(n){return`${n}${this.EVENT_KEY}`}}const Le=f=>{let n=f.getAttribute("data-bs-target");if(!n||"#"===n){let a=f.getAttribute("href");if(!a||!a.includes("#")&&!a.startsWith("."))return null;a.includes("#")&&!a.startsWith("#")&&(a=`#${a.split("#")[1]}`),n=a&&"#"!==a?a.trim():null}return n?n.split(",").map(a=>qt(a)).join(","):null},j={find:(f,n=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(n,f)),findOne:(f,n=document.documentElement)=>Element.prototype.querySelector.call(n,f),children:(f,n)=>[].concat(...f.children).filter(a=>a.matches(n)),parents(f,n){const a=[];let p=f.parentNode.closest(n);for(;p;)a.push(p),p=p.parentNode.closest(n);return a},prev(f,n){let a=f.previousElementSibling;for(;a;){if(a.matches(n))return[a];a=a.previousElementSibling}return[]},next(f,n){let a=f.nextElementSibling;for(;a;){if(a.matches(n))return[a];a=a.nextElementSibling}return[]},focusableChildren(f){const n=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(a=>`${a}:not([tabindex^="-"])`).join(",");return this.find(n,f).filter(a=>!rt(a)&&We(a))},getSelectorFromElement(f){const n=Le(f);return n&&j.findOne(n)?n:null},getElementFromSelector(f){const n=Le(f);return n?j.findOne(n):null},getMultipleElementsFromSelector(f){const n=Le(f);return n?j.find(n):[]}},Tt=(f,n="hide")=>{const p=f.NAME;E.on(document,`click.dismiss${f.EVENT_KEY}`,`[data-bs-dismiss="${p}"]`,function(C){if(["A","AREA"].includes(this.tagName)&&C.preventDefault(),rt(this))return;const A=j.getElementFromSelector(this)||this.closest(`.${p}`);f.getOrCreateInstance(A)[n]()})},Dn=".bs.alert",Pi=`close${Dn}`,Ln=`closed${Dn}`;class mt extends De{static get NAME(){return"alert"}close(){if(E.trigger(this._element,Pi).defaultPrevented)return;this._element.classList.remove("show");const n=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,n)}_destroyElement(){this._element.remove(),E.trigger(this._element,Ln),this.dispose()}static jQueryInterface(n){return this.each(function(){const a=mt.getOrCreateInstance(this);if("string"==typeof n){if(void 0===a[n]||n.startsWith("_")||"constructor"===n)throw new TypeError(`No method named "${n}"`);a[n](this)}})}}Tt(mt,"close"),Te(mt);const ze='[data-bs-toggle="button"]';class Wt extends De{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(n){return this.each(function(){const a=Wt.getOrCreateInstance(this);"toggle"===n&&a[n]()})}}E.on(document,"click.bs.button.data-api",ze,f=>{f.preventDefault();const n=f.target.closest(ze);Wt.getOrCreateInstance(n).toggle()}),Te(Wt);const Lt=".bs.swipe",Mi=`touchstart${Lt}`,Xe=`touchmove${Lt}`,Bt=`touchend${Lt}`,zt=`pointerdown${Lt}`,I=`pointerup${Lt}`,ve={endCallback:null,leftCallback:null,rightCallback:null},Hi={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class sn extends Rt{constructor(n,a){super(),this._element=n,n&&sn.isSupported()&&(this._config=this._getConfig(a),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return ve}static get DefaultType(){return Hi}static get NAME(){return"swipe"}dispose(){E.off(this._element,Lt)}_start(n){this._supportPointerEvents?this._eventIsPointerPenTouch(n)&&(this._deltaX=n.clientX):this._deltaX=n.touches[0].clientX}_end(n){this._eventIsPointerPenTouch(n)&&(this._deltaX=n.clientX-this._deltaX),this._handleSwipe(),le(this._config.endCallback)}_move(n){this._deltaX=n.touches&&n.touches.length>1?0:n.touches[0].clientX-this._deltaX}_handleSwipe(){const n=Math.abs(this._deltaX);if(n<=40)return;const a=n/this._deltaX;this._deltaX=0,a&&le(a>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(E.on(this._element,zt,n=>this._start(n)),E.on(this._element,I,n=>this._end(n)),this._element.classList.add("pointer-event")):(E.on(this._element,Mi,n=>this._start(n)),E.on(this._element,Xe,n=>this._move(n)),E.on(this._element,Bt,n=>this._end(n)))}_eventIsPointerPenTouch(n){return this._supportPointerEvents&&("pen"===n.pointerType||"touch"===n.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",Nn=".data-api",at="next",ye="prev",Ne="left",lt="right",qi=`slide${ot}`,Nt=`slid${ot}`,ci=`keydown${ot}`,ui=`mouseenter${ot}`,jt=`mouseleave${ot}`,Ct=`dragstart${ot}`,on=`load${ot}${Nn}`,Xt=`click${ot}${Nn}`,jn="carousel",Ut="active",Ce=".active",pe=".carousel-item",On=Ce+pe,Fi={ArrowLeft:lt,ArrowRight:Ne},hi={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},di={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Me extends De{constructor(n,a){super(n,a),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=j.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===jn&&this.cycle()}static get Default(){return hi}static get DefaultType(){return di}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&We(this._element)&&this.next()}prev(){this._slide(ye)}pause(){this._isSliding&&Re(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?E.one(this._element,Nt,()=>this.cycle()):this.cycle())}to(n){const a=this._getItems();if(n>a.length-1||n<0)return;if(this._isSliding)return void E.one(this._element,Nt,()=>this.to(n));const p=this._getItemIndex(this._getActive());p!==n&&this._slide(n>p?at:ye,a[n])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(n){return n.defaultInterval=n.interval,n}_addEventListeners(){this._config.keyboard&&E.on(this._element,ci,n=>this._keydown(n)),"hover"===this._config.pause&&(E.on(this._element,ui,()=>this.pause()),E.on(this._element,jt,()=>this._maybeEnableCycle())),this._config.touch&&sn.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const a of j.find(".carousel-item img",this._element))E.on(a,Ct,p=>p.preventDefault());this._swipeHelper=new sn(this._element,{leftCallback:()=>this._slide(this._directionToOrder(Ne)),rightCallback:()=>this._slide(this._directionToOrder(lt)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}})}_keydown(n){if(/input|textarea/i.test(n.target.tagName))return;const a=Fi[n.key];a&&(n.preventDefault(),this._slide(this._directionToOrder(a)))}_getItemIndex(n){return this._getItems().indexOf(n)}_setActiveIndicatorElement(n){if(!this._indicatorsElement)return;const a=j.findOne(Ce,this._indicatorsElement);a.classList.remove(Ut),a.removeAttribute("aria-current");const p=j.findOne(`[data-bs-slide-to="${n}"]`,this._indicatorsElement);p&&(p.classList.add(Ut),p.setAttribute("aria-current","true"))}_updateInterval(){const n=this._activeElement||this._getActive();if(!n)return;const a=Number.parseInt(n.getAttribute("data-bs-interval"),10);this._config.interval=a||this._config.defaultInterval}_slide(n,a=null){if(this._isSliding)return;const p=this._getActive(),C=n===at,A=a||Tn(this._getItems(),p,C,this._config.wrap);if(A===p)return;const N=this._getItemIndex(A),Q=ft=>E.trigger(this._element,ft,{relatedTarget:A,direction:this._orderToDirection(n),from:this._getItemIndex(p),to:N});if(Q(qi).defaultPrevented||!p||!A)return;const oe=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(N),this._activeElement=A;const Pe=C?"carousel-item-start":"carousel-item-end",Fe=C?"carousel-item-next":"carousel-item-prev";A.classList.add(Fe),p.classList.add(Pe),A.classList.add(Pe),this._queueCallback(()=>{A.classList.remove(Pe,Fe),A.classList.add(Ut),p.classList.remove(Ut,Fe,Pe),this._isSliding=!1,Q(Nt)},p,this._isAnimated()),oe&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return j.findOne(On,this._element)}_getItems(){return j.find(pe,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(n){return Se()?n===Ne?ye:at:n===Ne?at:ye}_orderToDirection(n){return Se()?n===ye?Ne:lt:n===ye?lt:Ne}static jQueryInterface(n){return this.each(function(){const a=Me.getOrCreateInstance(this,n);if("number"!=typeof n){if("string"==typeof n){if(void 0===a[n]||n.startsWith("_")||"constructor"===n)throw new TypeError(`No method named "${n}"`);a[n]()}}else a.to(n)})}}E.on(document,Xt,"[data-bs-slide], [data-bs-slide-to]",function(f){const n=j.getElementFromSelector(this);if(!n||!n.classList.contains(jn))return;f.preventDefault();const a=Me.getOrCreateInstance(n),p=this.getAttribute("data-bs-slide-to");return p?(a.to(p),void a._maybeEnableCycle()):"next"===st.getDataAttribute(this,"slide")?(a.next(),void a._maybeEnableCycle()):(a.prev(),void a._maybeEnableCycle())}),E.on(window,on,()=>{const f=j.find('[data-bs-ride="carousel"]');for(const n of f)Me.getOrCreateInstance(n)}),Te(Me);const Ue=".bs.collapse",$n=`show${Ue}`,an=`shown${Ue}`,Ri=`hide${Ue}`,Wi=`hidden${Ue}`,Bi=`click${Ue}.data-api`,ln="show",Ot="collapse",cn="collapsing",fi=`:scope .${Ot} .${Ot}`,vt='[data-bs-toggle="collapse"]',pi={parent:null,toggle:!0},In={parent:"(null|element)",toggle:"boolean"};class yt extends De{constructor(n,a){super(n,a),this._isTransitioning=!1,this._triggerArray=[];const p=j.find(vt);for(const C of p){const A=j.getSelectorFromElement(C),N=j.find(A).filter(Q=>Q===this._element);null!==A&&N.length&&this._triggerArray.push(C)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return pi}static get DefaultType(){return In}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let n=[];if(this._config.parent&&(n=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter(C=>C!==this._element).map(C=>yt.getOrCreateInstance(C,{toggle:!1}))),n.length&&n[0]._isTransitioning||E.trigger(this._element,$n).defaultPrevented)return;for(const C of n)C.hide();const a=this._getDimension();this._element.classList.remove(Ot),this._element.classList.add(cn),this._element.style[a]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const p=`scroll${a[0].toUpperCase()+a.slice(1)}`;this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(cn),this._element.classList.add(Ot,ln),this._element.style[a]="",E.trigger(this._element,an)},this._element,!0),this._element.style[a]=`${this._element[p]}px`}hide(){if(this._isTransitioning||!this._isShown()||E.trigger(this._element,Ri).defaultPrevented)return;const n=this._getDimension();this._element.style[n]=`${this._element.getBoundingClientRect()[n]}px`,this._element.classList.add(cn),this._element.classList.remove(Ot,ln);for(const a of this._triggerArray){const p=j.getElementFromSelector(a);p&&!this._isShown(p)&&this._addAriaAndCollapsedClass([a],!1)}this._isTransitioning=!0,this._element.style[n]="",this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(cn),this._element.classList.add(Ot),E.trigger(this._element,Wi)},this._element,!0)}_isShown(n=this._element){return n.classList.contains(ln)}_configAfterMerge(n){return n.toggle=!!n.toggle,n.parent=it(n.parent),n}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const n=this._getFirstLevelChildren(vt);for(const a of n){const p=j.getElementFromSelector(a);p&&this._addAriaAndCollapsedClass([a],this._isShown(p))}}_getFirstLevelChildren(n){const a=j.find(fi,this._config.parent);return j.find(n,this._config.parent).filter(p=>!a.includes(p))}_addAriaAndCollapsedClass(n,a){if(n.length)for(const p of n)p.classList.toggle("collapsed",!a),p.setAttribute("aria-expanded",a)}static jQueryInterface(n){const a={};return"string"==typeof n&&/show|hide/.test(n)&&(a.toggle=!1),this.each(function(){const p=yt.getOrCreateInstance(this,a);if("string"==typeof n){if(void 0===p[n])throw new TypeError(`No method named "${n}"`);p[n]()}})}}E.on(document,Bi,vt,function(f){("A"===f.target.tagName||f.delegateTarget&&"A"===f.delegateTarget.tagName)&&f.preventDefault();for(const n of j.getMultipleElementsFromSelector(this))yt.getOrCreateInstance(n,{toggle:!1}).toggle()}),Te(yt);const Vt="dropdown",_t=".bs.dropdown",Pn=".data-api",Yt="ArrowUp",Mn="ArrowDown",gi=`hide${_t}`,mi=`hidden${_t}`,vi=`show${_t}`,Hn=`shown${_t}`,yi=`click${_t}${Pn}`,_i=`keydown${_t}${Pn}`,bi=`keyup${_t}${Pn}`,Et="show",ct='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',wi=`${ct}.${Et}`,_e=".dropdown-menu",$t=Se()?"top-end":"top-start",un=Se()?"top-start":"top-end",It=Se()?"bottom-end":"bottom-start",xi=Se()?"bottom-start":"bottom-end",zi=Se()?"left-start":"right-start",Xi=Se()?"right-start":"left-start",qn={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ti={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class be extends De{constructor(n,a){super(n,a),this._popper=null,this._parent=this._element.parentNode,this._menu=j.next(this._element,_e)[0]||j.prev(this._element,_e)[0]||j.findOne(_e,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return qn}static get DefaultType(){return Ti}static get NAME(){return Vt}toggle(){return this._isShown()?this.hide():this.show()}show(){if(rt(this._element)||this._isShown())return;const n={relatedTarget:this._element};if(!E.trigger(this._element,vi,n).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const a of[].concat(...document.body.children))E.on(a,"mouseover",B);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Et),this._element.classList.add(Et),E.trigger(this._element,Hn,n)}}hide(){!rt(this._element)&&this._isShown()&&this._completeHide({relatedTarget:this._element})}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(n){if(!E.trigger(this._element,gi,n).defaultPrevented){if("ontouchstart"in document.documentElement)for(const a of[].concat(...document.body.children))E.off(a,"mouseover",B);this._popper&&this._popper.destroy(),this._menu.classList.remove(Et),this._element.classList.remove(Et),this._element.setAttribute("aria-expanded","false"),st.removeDataAttribute(this._menu,"popper"),E.trigger(this._element,mi,n)}}_getConfig(n){if("object"==typeof(n=super._getConfig(n)).reference&&!ke(n.reference)&&"function"!=typeof n.reference.getBoundingClientRect)throw new TypeError(`${Vt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return n}_createPopper(){if(void 0===ae)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let n=this._element;"parent"===this._config.reference?n=this._parent:ke(this._config.reference)?n=it(this._config.reference):"object"==typeof this._config.reference&&(n=this._config.reference);const a=this._getPopperConfig();this._popper=ae.createPopper(n,this._menu,a)}_isShown(){return this._menu.classList.contains(Et)}_getPlacement(){const n=this._parent;if(n.classList.contains("dropend"))return zi;if(n.classList.contains("dropstart"))return Xi;if(n.classList.contains("dropup-center"))return"top";if(n.classList.contains("dropdown-center"))return"bottom";const a="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return n.classList.contains("dropup")?a?un:$t:a?xi:It}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:n}=this._config;return"string"==typeof n?n.split(",").map(a=>Number.parseInt(a,10)):"function"==typeof n?a=>n(a,this._element):n}_getPopperConfig(){const n={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(st.setDataAttribute(this._menu,"popper","static"),n.modifiers=[{name:"applyStyles",enabled:!1}]),{...n,...le(this._config.popperConfig,[n])}}_selectMenuItem({key:n,target:a}){const p=j.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(C=>We(C));p.length&&Tn(p,a,n===Mn,!p.includes(a)).focus()}static jQueryInterface(n){return this.each(function(){const a=be.getOrCreateInstance(this,n);if("string"==typeof n){if(void 0===a[n])throw new TypeError(`No method named "${n}"`);a[n]()}})}static clearMenus(n){if(2===n.button||"keyup"===n.type&&"Tab"!==n.key)return;const a=j.find(wi);for(const p of a){const C=be.getInstance(p);if(!C||!1===C._config.autoClose)continue;const A=n.composedPath(),N=A.includes(C._menu);if(A.includes(C._element)||"inside"===C._config.autoClose&&!N||"outside"===C._config.autoClose&&N||C._menu.contains(n.target)&&("keyup"===n.type&&"Tab"===n.key||/input|select|option|textarea|form/i.test(n.target.tagName)))continue;const Q={relatedTarget:C._element};"click"===n.type&&(Q.clickEvent=n),C._completeHide(Q)}}static dataApiKeydownHandler(n){const a=/input|textarea/i.test(n.target.tagName),p="Escape"===n.key,C=[Yt,Mn].includes(n.key);if(!C&&!p||a&&!p)return;n.preventDefault();const A=this.matches(ct)?this:j.prev(this,ct)[0]||j.next(this,ct)[0]||j.findOne(ct,n.delegateTarget.parentNode),N=be.getOrCreateInstance(A);if(C)return n.stopPropagation(),N.show(),void N._selectMenuItem(n);N._isShown()&&(n.stopPropagation(),N.hide(),A.focus())}}E.on(document,_i,ct,be.dataApiKeydownHandler),E.on(document,_i,_e,be.dataApiKeydownHandler),E.on(document,yi,be.clearMenus),E.on(document,bi,be.clearMenus),E.on(document,yi,ct,function(f){f.preventDefault(),be.getOrCreateInstance(this).toggle()}),Te(be);const Fn="backdrop",Rn=`mousedown.bs.${Fn}`,Qt={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ui={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ci extends Rt{constructor(n){super(),this._config=this._getConfig(n),this._isAppended=!1,this._element=null}static get Default(){return Qt}static get DefaultType(){return Ui}static get NAME(){return Fn}show(n){if(!this._config.isVisible)return void le(n);this._append();this._getElement().classList.add("show"),this._emulateAnimation(()=>{le(n)})}hide(n){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),le(n)})):le(n)}dispose(){this._isAppended&&(E.off(this._element,Rn),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const n=document.createElement("div");n.className=this._config.className,this._config.isAnimated&&n.classList.add("fade"),this._element=n}return this._element}_configAfterMerge(n){return n.rootElement=it(n.rootElement),n}_append(){if(this._isAppended)return;const n=this._getElement();this._config.rootElement.append(n),E.on(n,Rn,()=>{le(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(n){xn(n,this._getElement(),this._config.isAnimated)}}const Ve=".bs.focustrap",At=`focusin${Ve}`,Wn=`keydown.tab${Ve}`,Ei="backward",Kt={autofocus:!0,trapElement:null},Ai={autofocus:"boolean",trapElement:"element"};class hn extends Rt{constructor(n){super(),this._config=this._getConfig(n),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Kt}static get DefaultType(){return Ai}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),E.off(document,Ve),E.on(document,At,n=>this._handleFocusin(n)),E.on(document,Wn,n=>this._handleKeydown(n)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,E.off(document,Ve))}_handleFocusin(n){const{trapElement:a}=this._config;if(n.target===document||n.target===a||a.contains(n.target))return;const p=j.focusableChildren(a);0===p.length?a.focus():this._lastTabNavDirection===Ei?p[p.length-1].focus():p[0].focus()}_handleKeydown(n){"Tab"===n.key&&(this._lastTabNavDirection=n.shiftKey?Ei:"forward")}}const Bn=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",zn=".sticky-top",dn="padding-right",Xn="margin-right";class Un{constructor(){this._element=document.body}getWidth(){const n=document.documentElement.clientWidth;return Math.abs(window.innerWidth-n)}hide(){const n=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,dn,a=>a+n),this._setElementAttributes(Bn,dn,a=>a+n),this._setElementAttributes(zn,Xn,a=>a-n)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,dn),this._resetElementAttributes(Bn,dn),this._resetElementAttributes(zn,Xn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(n,a,p){const C=this.getWidth();this._applyManipulationCallback(n,A=>{if(A!==this._element&&window.innerWidth>A.clientWidth+C)return;this._saveInitialAttribute(A,a);const N=window.getComputedStyle(A).getPropertyValue(a);A.style.setProperty(a,`${p(Number.parseFloat(N))}px`)})}_saveInitialAttribute(n,a){const p=n.style.getPropertyValue(a);p&&st.setDataAttribute(n,a,p)}_resetElementAttributes(n,a){this._applyManipulationCallback(n,p=>{const C=st.getDataAttribute(p,a);null!==C?(st.removeDataAttribute(p,a),p.style.setProperty(a,C)):p.style.removeProperty(a)})}_applyManipulationCallback(n,a){if(ke(n))a(n);else for(const p of j.find(n,this._element))a(p)}}const Oe=".bs.modal",Vn=`hide${Oe}`,Vi=`hidePrevented${Oe}`,ki=`hidden${Oe}`,Si=`show${Oe}`,Yi=`shown${Oe}`,Qi=`resize${Oe}`,Ki=`click.dismiss${Oe}`,Di=`mousedown.dismiss${Oe}`,Yn=`keydown.dismiss${Oe}`,Li=`click${Oe}.data-api`,fn="modal-open",pn="modal-static",Kn={backdrop:!0,focus:!0,keyboard:!0},Gi={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class He extends De{constructor(n,a){super(n,a),this._dialog=j.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Un,this._addEventListeners()}static get Default(){return Kn}static get DefaultType(){return Gi}static get NAME(){return"modal"}toggle(n){return this._isShown?this.hide():this.show(n)}show(n){this._isShown||this._isTransitioning||E.trigger(this._element,Si,{relatedTarget:n}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(fn),this._adjustDialog(),this._backdrop.show(()=>this._showElement(n)))}hide(){this._isShown&&!this._isTransitioning&&(E.trigger(this._element,Vn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove("show"),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())))}dispose(){E.off(window,Oe),E.off(this._dialog,Oe),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ci({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new hn({trapElement:this._element})}_showElement(n){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const a=j.findOne(".modal-body",this._dialog);a&&(a.scrollTop=0),this._element.classList.add("show"),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,E.trigger(this._element,Yi,{relatedTarget:n})},this._dialog,this._isAnimated())}_addEventListeners(){E.on(this._element,Yn,n=>{"Escape"===n.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())}),E.on(window,Qi,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),E.on(this._element,Di,n=>{E.one(this._element,Ki,a=>{this._element===n.target&&this._element===a.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(fn),this._resetAdjustments(),this._scrollBar.reset(),E.trigger(this._element,ki)})}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(E.trigger(this._element,Vi).defaultPrevented)return;const n=this._element.scrollHeight>document.documentElement.clientHeight,a=this._element.style.overflowY;"hidden"===a||this._element.classList.contains(pn)||(n||(this._element.style.overflowY="hidden"),this._element.classList.add(pn),this._queueCallback(()=>{this._element.classList.remove(pn),this._queueCallback(()=>{this._element.style.overflowY=a},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const n=this._element.scrollHeight>document.documentElement.clientHeight,a=this._scrollBar.getWidth(),p=a>0;if(p&&!n){const C=Se()?"paddingLeft":"paddingRight";this._element.style[C]=`${a}px`}if(!p&&n){const C=Se()?"paddingRight":"paddingLeft";this._element.style[C]=`${a}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(n,a){return this.each(function(){const p=He.getOrCreateInstance(this,n);if("string"==typeof n){if(void 0===p[n])throw new TypeError(`No method named "${n}"`);p[n](a)}})}}E.on(document,Li,'[data-bs-toggle="modal"]',function(f){const n=j.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&f.preventDefault(),E.one(n,Si,p=>{p.defaultPrevented||E.one(n,ki,()=>{We(this)&&this.focus()})});const a=j.findOne(".modal.show");a&&He.getInstance(a).hide(),He.getOrCreateInstance(n).toggle(this)}),Tt(He),Te(He);const Ye=".bs.offcanvas",Gn=".data-api",Jn=`load${Ye}${Gn}`,ji="showing",e=".offcanvas.show",t=`show${Ye}`,i=`shown${Ye}`,r=`hide${Ye}`,o=`hidePrevented${Ye}`,l=`hidden${Ye}`,c=`resize${Ye}`,d=`click${Ye}${Gn}`,h=`keydown.dismiss${Ye}`,m={backdrop:!0,keyboard:!0,scroll:!1},_={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class w extends De{constructor(n,a){super(n,a),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return m}static get DefaultType(){return _}static get NAME(){return"offcanvas"}toggle(n){return this._isShown?this.hide():this.show(n)}show(n){this._isShown||E.trigger(this._element,t,{relatedTarget:n}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ji),this._queueCallback(()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add("show"),this._element.classList.remove(ji),E.trigger(this._element,i,{relatedTarget:n})},this._element,!0))}hide(){this._isShown&&(E.trigger(this._element,r).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add("hiding"),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove("show","hiding"),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Un).reset(),E.trigger(this._element,l)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const n=!!this._config.backdrop;return new Ci({className:"offcanvas-backdrop",isVisible:n,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:n?()=>{"static"!==this._config.backdrop?this.hide():E.trigger(this._element,o)}:null})}_initializeFocusTrap(){return new hn({trapElement:this._element})}_addEventListeners(){E.on(this._element,h,n=>{"Escape"===n.key&&(this._config.keyboard?this.hide():E.trigger(this._element,o))})}static jQueryInterface(n){return this.each(function(){const a=w.getOrCreateInstance(this,n);if("string"==typeof n){if(void 0===a[n]||n.startsWith("_")||"constructor"===n)throw new TypeError(`No method named "${n}"`);a[n](this)}})}}E.on(document,d,'[data-bs-toggle="offcanvas"]',function(f){const n=j.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&f.preventDefault(),rt(this))return;E.one(n,l,()=>{We(this)&&this.focus()});const a=j.findOne(e);a&&a!==n&&w.getInstance(a).hide(),w.getOrCreateInstance(n).toggle(this)}),E.on(window,Jn,()=>{for(const f of j.find(e))w.getOrCreateInstance(f).show()}),E.on(window,c,()=>{for(const f of j.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(f).position&&w.getOrCreateInstance(f).hide()}),Tt(w),Te(w);const v={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},T=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),O=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,q=(f,n)=>{const a=f.nodeName.toLowerCase();return n.includes(a)?!T.has(a)||!!O.test(f.nodeValue):n.filter(p=>p instanceof RegExp).some(p=>p.test(a))},F={allowList:v,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},re={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ue={entry:"(string|element|function|null)",selector:"(string|element)"};class Qe extends Rt{constructor(n){super(),this._config=this._getConfig(n)}static get Default(){return F}static get DefaultType(){return re}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map(n=>this._resolvePossibleFunction(n)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(n){return this._checkContent(n),this._config.content={...this._config.content,...n},this}toHtml(){const n=document.createElement("div");n.innerHTML=this._maybeSanitize(this._config.template);for(const[C,A]of Object.entries(this._config.content))this._setContent(n,A,C);const a=n.children[0],p=this._resolvePossibleFunction(this._config.extraClass);return p&&a.classList.add(...p.split(" ")),a}_typeCheckConfig(n){super._typeCheckConfig(n),this._checkContent(n.content)}_checkContent(n){for(const[a,p]of Object.entries(n))super._typeCheckConfig({selector:a,entry:p},ue)}_setContent(n,a,p){const C=j.findOne(p,n);C&&((a=this._resolvePossibleFunction(a))?ke(a)?this._putElementInTemplate(it(a),C):this._config.html?C.innerHTML=this._maybeSanitize(a):C.textContent=a:C.remove())}_maybeSanitize(n){return this._config.sanitize?function(a,p,C){if(!a.length)return a;if(C&&"function"==typeof C)return C(a);const A=(new window.DOMParser).parseFromString(a,"text/html"),N=[].concat(...A.body.querySelectorAll("*"));for(const Q of N){const oe=Q.nodeName.toLowerCase();if(!Object.keys(p).includes(oe)){Q.remove();continue}const Pe=[].concat(...Q.attributes),Fe=[].concat(p["*"]||[],p[oe]||[]);for(const ft of Pe)q(ft,Fe)||Q.removeAttribute(ft.nodeName)}return A.body.innerHTML}(n,this._config.allowList,this._config.sanitizeFn):n}_resolvePossibleFunction(n){return le(n,[this])}_putElementInTemplate(n,a){if(this._config.html)return a.innerHTML="",void a.append(n);a.textContent=n.textContent}}const Ke=new Set(["sanitize","allowList","sanitizeFn"]),X="fade",Ge="show",V=".modal",ee="hide.bs.modal",ut="hover",Gt="focus",Je={AUTO:"auto",TOP:"top",RIGHT:Se()?"left":"right",BOTTOM:"bottom",LEFT:Se()?"right":"left"},Jt={allowList:v,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ht={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class we extends De{constructor(n,a){if(void 0===ae)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(n,a),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Jt}static get DefaultType(){return ht}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),E.off(this._element.closest(V),ee,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const n=E.trigger(this._element,this.constructor.eventName("show")),a=(ii(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(n.defaultPrevented||!a)return;this._disposePopper();const p=this._getTipElement();this._element.setAttribute("aria-describedby",p.getAttribute("id"));const{container:C}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(C.append(p),E.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(p),p.classList.add(Ge),"ontouchstart"in document.documentElement)for(const A of[].concat(...document.body.children))E.on(A,"mouseover",B);this._queueCallback(()=>{E.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(this._isShown()&&!E.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Ge),"ontouchstart"in document.documentElement)for(const n of[].concat(...document.body.children))E.off(n,"mouseover",B);this._activeTrigger.click=!1,this._activeTrigger[Gt]=!1,this._activeTrigger[ut]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),E.trigger(this._element,this.constructor.eventName("hidden")))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(n){const a=this._getTemplateFactory(n).toHtml();if(!a)return null;a.classList.remove(X,Ge),a.classList.add(`bs-${this.constructor.NAME}-auto`);const p=(C=>{do{C+=Math.floor(1e6*Math.random())}while(document.getElementById(C));return C})(this.constructor.NAME).toString();return a.setAttribute("id",p),this._isAnimated()&&a.classList.add(X),a}setContent(n){this._newContent=n,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(n){return this._templateFactory?this._templateFactory.changeContent(n):this._templateFactory=new Qe({...this._config,content:n,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(n){return this.constructor.getOrCreateInstance(n.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(X)}_isShown(){return this.tip&&this.tip.classList.contains(Ge)}_createPopper(n){const a=le(this._config.placement,[this,n,this._element]),p=Je[a.toUpperCase()];return ae.createPopper(this._element,n,this._getPopperConfig(p))}_getOffset(){const{offset:n}=this._config;return"string"==typeof n?n.split(",").map(a=>Number.parseInt(a,10)):"function"==typeof n?a=>n(a,this._element):n}_resolvePossibleFunction(n){return le(n,[this._element])}_getPopperConfig(n){const a={placement:n,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:p=>{this._getTipElement().setAttribute("data-popper-placement",p.state.placement)}}]};return{...a,...le(this._config.popperConfig,[a])}}_setListeners(){const n=this._config.trigger.split(" ");for(const a of n)if("click"===a)E.on(this._element,this.constructor.eventName("click"),this._config.selector,p=>{this._initializeOnDelegatedTarget(p).toggle()});else if("manual"!==a){const p=this.constructor.eventName(a===ut?"mouseenter":"focusin"),C=this.constructor.eventName(a===ut?"mouseleave":"focusout");E.on(this._element,p,this._config.selector,A=>{const N=this._initializeOnDelegatedTarget(A);N._activeTrigger["focusin"===A.type?Gt:ut]=!0,N._enter()}),E.on(this._element,C,this._config.selector,A=>{const N=this._initializeOnDelegatedTarget(A);N._activeTrigger["focusout"===A.type?Gt:ut]=N._element.contains(A.relatedTarget),N._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},E.on(this._element.closest(V),ee,this._hideModalHandler)}_fixTitle(){const n=this._element.getAttribute("title");n&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",n),this._element.setAttribute("data-bs-original-title",n),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(n,a){clearTimeout(this._timeout),this._timeout=setTimeout(n,a)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(n){const a=st.getDataAttributes(this._element);for(const p of Object.keys(a))Ke.has(p)&&delete a[p];return n={...a,..."object"==typeof n&&n?n:{}},n=this._mergeConfigObj(n),n=this._configAfterMerge(n),this._typeCheckConfig(n),n}_configAfterMerge(n){return n.container=!1===n.container?document.body:it(n.container),"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),n}_getDelegateConfig(){const n={};for(const[a,p]of Object.entries(this._config))this.constructor.Default[a]!==p&&(n[a]=p);return n.selector=!1,n.trigger="manual",n}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(n){return this.each(function(){const a=we.getOrCreateInstance(this,n);if("string"==typeof n){if(void 0===a[n])throw new TypeError(`No method named "${n}"`);a[n]()}})}}Te(we);const Pt={...we.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},$e={...we.DefaultType,content:"(null|string|element|function)"};class se extends we{static get Default(){return Pt}static get DefaultType(){return $e}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(n){return this.each(function(){const a=se.getOrCreateInstance(this,n);if("string"==typeof n){if(void 0===a[n])throw new TypeError(`No method named "${n}"`);a[n]()}})}}Te(se);const ne=".bs.scrollspy",ge=`activate${ne}`,dt=`click${ne}`,me=`load${ne}.data-api`,$="active",te="[href]",ie=".nav-link",Z=`${ie}, .nav-item > ${ie}, .list-group-item`,Ze={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Mt={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class bt extends De{constructor(n,a){super(n,a),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Ze}static get DefaultType(){return Mt}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const n of this._observableSections.values())this._observer.observe(n)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(n){return n.target=it(n.target)||document.body,n.rootMargin=n.offset?`${n.offset}px 0px -30%`:n.rootMargin,"string"==typeof n.threshold&&(n.threshold=n.threshold.split(",").map(a=>Number.parseFloat(a))),n}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(E.off(this._config.target,dt),E.on(this._config.target,dt,te,n=>{const a=this._observableSections.get(n.target.hash);if(a){n.preventDefault();const p=this._rootElement||window,C=a.offsetTop-this._element.offsetTop;if(p.scrollTo)return void p.scrollTo({top:C,behavior:"smooth"});p.scrollTop=C}}))}_getNewObserver(){return new IntersectionObserver(a=>this._observerCallback(a),{root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin})}_observerCallback(n){const a=N=>this._targetLinks.get(`#${N.target.id}`),p=N=>{this._previousScrollData.visibleEntryTop=N.target.offsetTop,this._process(a(N))},C=(this._rootElement||document.documentElement).scrollTop,A=C>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=C;for(const N of n){if(!N.isIntersecting){this._activeTarget=null,this._clearActiveClass(a(N));continue}const Q=N.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(A&&Q){if(p(N),!C)return}else A||Q||p(N)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const n=j.find(te,this._config.target);for(const a of n){if(!a.hash||rt(a))continue;const p=j.findOne(decodeURI(a.hash),this._element);We(p)&&(this._targetLinks.set(decodeURI(a.hash),a),this._observableSections.set(a.hash,p))}}_process(n){this._activeTarget!==n&&(this._clearActiveClass(this._config.target),this._activeTarget=n,n.classList.add($),this._activateParents(n),E.trigger(this._element,ge,{relatedTarget:n}))}_activateParents(n){if(n.classList.contains("dropdown-item"))j.findOne(".dropdown-toggle",n.closest(".dropdown")).classList.add($);else for(const a of j.parents(n,".nav, .list-group"))for(const p of j.prev(a,Z))p.classList.add($)}_clearActiveClass(n){n.classList.remove($);const a=j.find(`${te}.${$}`,n);for(const p of a)p.classList.remove($)}static jQueryInterface(n){return this.each(function(){const a=bt.getOrCreateInstance(this,n);if("string"==typeof n){if(void 0===a[n]||n.startsWith("_")||"constructor"===n)throw new TypeError(`No method named "${n}"`);a[n]()}})}}E.on(window,me,()=>{for(const f of j.find('[data-bs-spy="scroll"]'))bt.getOrCreateInstance(f)}),Te(bt);const Ee=".bs.tab",Zn=`hide${Ee}`,wt=`hidden${Ee}`,$i=`show${Ee}`,Zt=`shown${Ee}`,gn=`click${Ee}`,mn=`keydown${Ee}`,ei=`load${Ee}`,vn="ArrowLeft",yn="ArrowRight",ti="ArrowUp",_n="ArrowDown",bn="Home",u="End",g="active",y="fade",b="show",x=".dropdown-toggle",k=`:not(${x})`,S='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',L=`.nav-link${k}, .list-group-item${k}, [role="tab"]${k}, ${S}`,D=`.${g}[data-bs-toggle="tab"], .${g}[data-bs-toggle="pill"], .${g}[data-bs-toggle="list"]`;class U extends De{constructor(n){super(n),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),E.on(this._element,mn,a=>this._keydown(a)))}static get NAME(){return"tab"}show(){const n=this._element;if(this._elemIsActive(n))return;const a=this._getActiveElem(),p=a?E.trigger(a,Zn,{relatedTarget:n}):null;E.trigger(n,$i,{relatedTarget:a}).defaultPrevented||p&&p.defaultPrevented||(this._deactivate(a,n),this._activate(n,a))}_activate(n,a){n&&(n.classList.add(g),this._activate(j.getElementFromSelector(n)),this._queueCallback(()=>{"tab"===n.getAttribute("role")?(n.removeAttribute("tabindex"),n.setAttribute("aria-selected",!0),this._toggleDropDown(n,!0),E.trigger(n,Zt,{relatedTarget:a})):n.classList.add(b)},n,n.classList.contains(y)))}_deactivate(n,a){n&&(n.classList.remove(g),n.blur(),this._deactivate(j.getElementFromSelector(n)),this._queueCallback(()=>{"tab"===n.getAttribute("role")?(n.setAttribute("aria-selected",!1),n.setAttribute("tabindex","-1"),this._toggleDropDown(n,!1),E.trigger(n,wt,{relatedTarget:a})):n.classList.remove(b)},n,n.classList.contains(y)))}_keydown(n){if(![vn,yn,ti,_n,bn,u].includes(n.key))return;n.stopPropagation(),n.preventDefault();const a=this._getChildren().filter(C=>!rt(C));let p;if([bn,u].includes(n.key))p=a[n.key===bn?0:a.length-1];else{const C=[yn,_n].includes(n.key);p=Tn(a,n.target,C,!0)}p&&(p.focus({preventScroll:!0}),U.getOrCreateInstance(p).show())}_getChildren(){return j.find(L,this._parent)}_getActiveElem(){return this._getChildren().find(n=>this._elemIsActive(n))||null}_setInitialAttributes(n,a){this._setAttributeIfNotExists(n,"role","tablist");for(const p of a)this._setInitialAttributesOnChild(p)}_setInitialAttributesOnChild(n){n=this._getInnerElement(n);const a=this._elemIsActive(n),p=this._getOuterElement(n);n.setAttribute("aria-selected",a),p!==n&&this._setAttributeIfNotExists(p,"role","presentation"),a||n.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(n,"role","tab"),this._setInitialAttributesOnTargetPanel(n)}_setInitialAttributesOnTargetPanel(n){const a=j.getElementFromSelector(n);a&&(this._setAttributeIfNotExists(a,"role","tabpanel"),n.id&&this._setAttributeIfNotExists(a,"aria-labelledby",`${n.id}`))}_toggleDropDown(n,a){const p=this._getOuterElement(n);if(!p.classList.contains("dropdown"))return;const C=(A,N)=>{const Q=j.findOne(A,p);Q&&Q.classList.toggle(N,a)};C(x,g),C(".dropdown-menu",b),p.setAttribute("aria-expanded",a)}_setAttributeIfNotExists(n,a,p){n.hasAttribute(a)||n.setAttribute(a,p)}_elemIsActive(n){return n.classList.contains(g)}_getInnerElement(n){return n.matches(L)?n:j.findOne(L,n)}_getOuterElement(n){return n.closest(".nav-item, .list-group-item")||n}static jQueryInterface(n){return this.each(function(){const a=U.getOrCreateInstance(this);if("string"==typeof n){if(void 0===a[n]||n.startsWith("_")||"constructor"===n)throw new TypeError(`No method named "${n}"`);a[n]()}})}}E.on(document,gn,S,function(f){["A","AREA"].includes(this.tagName)&&f.preventDefault(),rt(this)||U.getOrCreateInstance(this).show()}),E.on(window,ei,()=>{for(const f of j.find(D))U.getOrCreateInstance(f)}),Te(U);const P=".bs.toast",z=`mouseover${P}`,Y=`mouseout${P}`,M=`focusin${P}`,ce=`focusout${P}`,de=`hide${P}`,he=`hidden${P}`,xe=`show${P}`,Ae=`shown${P}`,G="show",et="showing",qe={animation:"boolean",autohide:"boolean",delay:"number"},wn={animation:!0,autohide:!0,delay:5e3};class Ht extends De{constructor(n,a){super(n,a),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return wn}static get DefaultType(){return qe}static get NAME(){return"toast"}show(){E.trigger(this._element,xe).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),this._element.classList.add(G,et),this._queueCallback(()=>{this._element.classList.remove(et),E.trigger(this._element,Ae),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this.isShown()&&(E.trigger(this._element,de).defaultPrevented||(this._element.classList.add(et),this._queueCallback(()=>{this._element.classList.add("hide"),this._element.classList.remove(et,G),E.trigger(this._element,he)},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(G),super.dispose()}isShown(){return this._element.classList.contains(G)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(n,a){switch(n.type){case"mouseover":case"mouseout":this._hasMouseInteraction=a;break;case"focusin":case"focusout":this._hasKeyboardInteraction=a}if(a)return void this._clearTimeout();const p=n.relatedTarget;this._element===p||this._element.contains(p)||this._maybeScheduleHide()}_setListeners(){E.on(this._element,z,n=>this._onInteraction(n,!0)),E.on(this._element,Y,n=>this._onInteraction(n,!1)),E.on(this._element,M,n=>this._onInteraction(n,!0)),E.on(this._element,ce,n=>this._onInteraction(n,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(n){return this.each(function(){const a=Ht.getOrCreateInstance(this,n);if("string"==typeof n){if(void 0===a[n])throw new TypeError(`No method named "${n}"`);a[n](this)}})}}return Tt(Ht),Te(Ht),{Alert:mt,Button:Wt,Carousel:Me,Collapse:yt,Dropdown:be,Modal:He,Offcanvas:w,Popover:se,ScrollSpy:bt,Tab:U,Toast:Ht,Tooltip:we}}); \ No newline at end of file diff --git a/static/explorer/styles.css b/static/explorer/styles.css new file mode 100644 index 00000000..4273daa4 --- /dev/null +++ b/static/explorer/styles.css @@ -0,0 +1,9 @@ +@charset "UTF-8";.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), .65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), .8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), .3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:.5rem;--bs-navbar-toggler-padding-y:.25rem;--bs-navbar-toggler-padding-x:.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), .15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:.25rem;--bs-navbar-toggler-transition:box-shadow .15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, .55);--bs-navbar-hover-color:rgba(255, 255, 255, .75);--bs-navbar-disabled-color:rgba(255, 255, 255, .25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, .1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform .2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 .25rem rgba(13, 110, 253, .25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}[data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem rgba(13, 110, 253, .25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}@font-face{font-display:block;font-family:bootstrap-icons;src:url(bootstrap-icons.bfa90bda92a84a6a.woff2?dd67030699838ea613ee6dbda90effa6) format("woff2"),url(bootstrap-icons.70a9dee9e5ab72aa.woff?dd67030699838ea613ee6dbda90effa6) format("woff")}@charset "UTF-8";/*! +* Bootstrap v5.3.3 (https://getbootstrap.com/) +* Copyright 2011-2024 The Bootstrap Authors +* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) +*/:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, .75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, .5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, .175);--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 .5rem 1rem rgba(0, 0, 0, .15);--bs-box-shadow-sm:0 .125rem .25rem rgba(0, 0, 0, .075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, .175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, .075);--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:rgba(13, 110, 253, .25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, .75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, .5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, .15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,:after,:before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer:before{content:"\2014\a0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:.25rem}.g-1,.gy-1{--bs-gutter-y:.25rem}.g-2,.gx-2{--bs-gutter-x:.5rem}.g-2,.gy-2{--bs-gutter-y:.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), .05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), .1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), .075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a6b5cc;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b5b6b7;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a6c3ca;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control-plaintext~label:after,.form-floating>.form-control:focus~label:after,.form-floating>.form-control:not(:placeholder-shown)~label:after,.form-floating>.form-select~label:after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#6c757d}.form-floating>.form-control:disabled~label:after,.form-floating>:disabled~label:after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3.75rem + 1.5em)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3.75rem + 1.5em)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:.75rem;--bs-btn-padding-y:.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, .15),0 1px 1px rgba(0, 0, 0, .075);--bs-btn-disabled-opacity:.65;--bs-btn-focus-box-shadow:0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, .125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:.25rem;--bs-btn-padding-x:.5rem;--bs-btn-font-size:.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:.5rem;--bs-dropdown-spacer:.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle:after{display:none}.dropstart .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, .15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), .65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), .8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), .3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:.5rem;--bs-navbar-toggler-padding-y:.25rem;--bs-navbar-toggler-padding-x:.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), .15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:.25rem;--bs-navbar-toggler-transition:box-shadow .15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, .55);--bs-navbar-hover-color:rgba(255, 255, 255, .75);--bs-navbar-disabled-color:rgba(255, 255, 255, .25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, .1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), .03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;inset:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform .2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 .25rem rgba(13, 110, 253, .25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:.75rem;--bs-pagination-padding-y:.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 .25rem rgba(13, 110, 253, .25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:.5rem;--bs-pagination-padding-y:.25rem;--bs-pagination-font-size:.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:.65em;--bs-badge-padding-y:.35em;--bs-badge-font-size:.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width .6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem rgba(13, 110, 253, .25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white,[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:.75rem;--bs-toast-padding-y:.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), .85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), .85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:.5rem;--bs-tooltip-padding-y:.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:.9;--bs-tooltip-arrow-width:.8rem;--bs-tooltip-arrow-height:.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,.bs-tooltip-top .tooltip-arrow:before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,.bs-tooltip-end .tooltip-arrow:before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,.bs-tooltip-bottom .tooltip-arrow:before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,.bs-tooltip-start .tooltip-arrow:before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow:after,.popover .popover-arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-top>.popover-arrow:before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-top>.popover-arrow:after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-end>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-end>.popover-arrow:after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-start>.popover-arrow:before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-start>.popover-arrow:after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translate(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-border-width:.25em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform .3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translate(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn:before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix:after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link:after{position:absolute;inset:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:.1}.border-opacity-25{--bs-border-opacity:.25}.border-opacity-50{--bs-border-opacity:.5}.border-opacity-75{--bs-border-opacity:.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:1rem!important}.column-gap-4{column-gap:1.5rem!important}.column-gap-5{column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:#00000080!important}.text-white-50{--bs-text-opacity:1;color:#ffffff80!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:.25}.text-opacity-50{--bs-text-opacity:.5}.text-opacity-75{--bs-text-opacity:.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--bs-link-opacity:.1}.link-opacity-25,.link-opacity-25-hover:hover{--bs-link-opacity:.25}.link-opacity-50,.link-opacity-50-hover:hover{--bs-link-opacity:.5}.link-opacity-75,.link-opacity-75-hover:hover{--bs-link-opacity:.75}.link-opacity-100,.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:.1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:.25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:.5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:.75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:.1}.bg-opacity-25{--bs-bg-opacity:.25}.bg-opacity-50{--bs-bg-opacity:.5}.bg-opacity-75{--bs-bg-opacity:.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:1rem!important}.column-gap-sm-4{column-gap:1.5rem!important}.column-gap-sm-5{column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:1rem!important}.column-gap-md-4{column-gap:1.5rem!important}.column-gap-md-5{column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:1rem!important}.column-gap-lg-4{column-gap:1.5rem!important}.column-gap-lg-5{column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:1rem!important}.column-gap-xl-4{column-gap:1.5rem!important}.column-gap-xl-5{column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:1rem!important}.column-gap-xxl-4{column-gap:1.5rem!important}.column-gap-xxl-5{column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}/*! + * Bootstrap Icons v1.11.3 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */@font-face{font-display:block;font-family:bootstrap-icons;src:url(bootstrap-icons.bfa90bda92a84a6a.woff2?dd67030699838ea613ee6dbda90effa6) format("woff2"),url(bootstrap-icons.70a9dee9e5ab72aa.woff?dd67030699838ea613ee6dbda90effa6) format("woff")}.bi:before,[class^=bi-]:before,[class*=" bi-"]:before{display:inline-block;font-family:bootstrap-icons!important;font-style:normal;font-weight:400!important;font-variant:normal;text-transform:none;line-height:1;vertical-align:-.125em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.bi-123:before{content:"\f67f"}.bi-alarm-fill:before{content:"\f101"}.bi-alarm:before{content:"\f102"}.bi-align-bottom:before{content:"\f103"}.bi-align-center:before{content:"\f104"}.bi-align-end:before{content:"\f105"}.bi-align-middle:before{content:"\f106"}.bi-align-start:before{content:"\f107"}.bi-align-top:before{content:"\f108"}.bi-alt:before{content:"\f109"}.bi-app-indicator:before{content:"\f10a"}.bi-app:before{content:"\f10b"}.bi-archive-fill:before{content:"\f10c"}.bi-archive:before{content:"\f10d"}.bi-arrow-90deg-down:before{content:"\f10e"}.bi-arrow-90deg-left:before{content:"\f10f"}.bi-arrow-90deg-right:before{content:"\f110"}.bi-arrow-90deg-up:before{content:"\f111"}.bi-arrow-bar-down:before{content:"\f112"}.bi-arrow-bar-left:before{content:"\f113"}.bi-arrow-bar-right:before{content:"\f114"}.bi-arrow-bar-up:before{content:"\f115"}.bi-arrow-clockwise:before{content:"\f116"}.bi-arrow-counterclockwise:before{content:"\f117"}.bi-arrow-down-circle-fill:before{content:"\f118"}.bi-arrow-down-circle:before{content:"\f119"}.bi-arrow-down-left-circle-fill:before{content:"\f11a"}.bi-arrow-down-left-circle:before{content:"\f11b"}.bi-arrow-down-left-square-fill:before{content:"\f11c"}.bi-arrow-down-left-square:before{content:"\f11d"}.bi-arrow-down-left:before{content:"\f11e"}.bi-arrow-down-right-circle-fill:before{content:"\f11f"}.bi-arrow-down-right-circle:before{content:"\f120"}.bi-arrow-down-right-square-fill:before{content:"\f121"}.bi-arrow-down-right-square:before{content:"\f122"}.bi-arrow-down-right:before{content:"\f123"}.bi-arrow-down-short:before{content:"\f124"}.bi-arrow-down-square-fill:before{content:"\f125"}.bi-arrow-down-square:before{content:"\f126"}.bi-arrow-down-up:before{content:"\f127"}.bi-arrow-down:before{content:"\f128"}.bi-arrow-left-circle-fill:before{content:"\f129"}.bi-arrow-left-circle:before{content:"\f12a"}.bi-arrow-left-right:before{content:"\f12b"}.bi-arrow-left-short:before{content:"\f12c"}.bi-arrow-left-square-fill:before{content:"\f12d"}.bi-arrow-left-square:before{content:"\f12e"}.bi-arrow-left:before{content:"\f12f"}.bi-arrow-repeat:before{content:"\f130"}.bi-arrow-return-left:before{content:"\f131"}.bi-arrow-return-right:before{content:"\f132"}.bi-arrow-right-circle-fill:before{content:"\f133"}.bi-arrow-right-circle:before{content:"\f134"}.bi-arrow-right-short:before{content:"\f135"}.bi-arrow-right-square-fill:before{content:"\f136"}.bi-arrow-right-square:before{content:"\f137"}.bi-arrow-right:before{content:"\f138"}.bi-arrow-up-circle-fill:before{content:"\f139"}.bi-arrow-up-circle:before{content:"\f13a"}.bi-arrow-up-left-circle-fill:before{content:"\f13b"}.bi-arrow-up-left-circle:before{content:"\f13c"}.bi-arrow-up-left-square-fill:before{content:"\f13d"}.bi-arrow-up-left-square:before{content:"\f13e"}.bi-arrow-up-left:before{content:"\f13f"}.bi-arrow-up-right-circle-fill:before{content:"\f140"}.bi-arrow-up-right-circle:before{content:"\f141"}.bi-arrow-up-right-square-fill:before{content:"\f142"}.bi-arrow-up-right-square:before{content:"\f143"}.bi-arrow-up-right:before{content:"\f144"}.bi-arrow-up-short:before{content:"\f145"}.bi-arrow-up-square-fill:before{content:"\f146"}.bi-arrow-up-square:before{content:"\f147"}.bi-arrow-up:before{content:"\f148"}.bi-arrows-angle-contract:before{content:"\f149"}.bi-arrows-angle-expand:before{content:"\f14a"}.bi-arrows-collapse:before{content:"\f14b"}.bi-arrows-expand:before{content:"\f14c"}.bi-arrows-fullscreen:before{content:"\f14d"}.bi-arrows-move:before{content:"\f14e"}.bi-aspect-ratio-fill:before{content:"\f14f"}.bi-aspect-ratio:before{content:"\f150"}.bi-asterisk:before{content:"\f151"}.bi-at:before{content:"\f152"}.bi-award-fill:before{content:"\f153"}.bi-award:before{content:"\f154"}.bi-back:before{content:"\f155"}.bi-backspace-fill:before{content:"\f156"}.bi-backspace-reverse-fill:before{content:"\f157"}.bi-backspace-reverse:before{content:"\f158"}.bi-backspace:before{content:"\f159"}.bi-badge-3d-fill:before{content:"\f15a"}.bi-badge-3d:before{content:"\f15b"}.bi-badge-4k-fill:before{content:"\f15c"}.bi-badge-4k:before{content:"\f15d"}.bi-badge-8k-fill:before{content:"\f15e"}.bi-badge-8k:before{content:"\f15f"}.bi-badge-ad-fill:before{content:"\f160"}.bi-badge-ad:before{content:"\f161"}.bi-badge-ar-fill:before{content:"\f162"}.bi-badge-ar:before{content:"\f163"}.bi-badge-cc-fill:before{content:"\f164"}.bi-badge-cc:before{content:"\f165"}.bi-badge-hd-fill:before{content:"\f166"}.bi-badge-hd:before{content:"\f167"}.bi-badge-tm-fill:before{content:"\f168"}.bi-badge-tm:before{content:"\f169"}.bi-badge-vo-fill:before{content:"\f16a"}.bi-badge-vo:before{content:"\f16b"}.bi-badge-vr-fill:before{content:"\f16c"}.bi-badge-vr:before{content:"\f16d"}.bi-badge-wc-fill:before{content:"\f16e"}.bi-badge-wc:before{content:"\f16f"}.bi-bag-check-fill:before{content:"\f170"}.bi-bag-check:before{content:"\f171"}.bi-bag-dash-fill:before{content:"\f172"}.bi-bag-dash:before{content:"\f173"}.bi-bag-fill:before{content:"\f174"}.bi-bag-plus-fill:before{content:"\f175"}.bi-bag-plus:before{content:"\f176"}.bi-bag-x-fill:before{content:"\f177"}.bi-bag-x:before{content:"\f178"}.bi-bag:before{content:"\f179"}.bi-bar-chart-fill:before{content:"\f17a"}.bi-bar-chart-line-fill:before{content:"\f17b"}.bi-bar-chart-line:before{content:"\f17c"}.bi-bar-chart-steps:before{content:"\f17d"}.bi-bar-chart:before{content:"\f17e"}.bi-basket-fill:before{content:"\f17f"}.bi-basket:before{content:"\f180"}.bi-basket2-fill:before{content:"\f181"}.bi-basket2:before{content:"\f182"}.bi-basket3-fill:before{content:"\f183"}.bi-basket3:before{content:"\f184"}.bi-battery-charging:before{content:"\f185"}.bi-battery-full:before{content:"\f186"}.bi-battery-half:before{content:"\f187"}.bi-battery:before{content:"\f188"}.bi-bell-fill:before{content:"\f189"}.bi-bell:before{content:"\f18a"}.bi-bezier:before{content:"\f18b"}.bi-bezier2:before{content:"\f18c"}.bi-bicycle:before{content:"\f18d"}.bi-binoculars-fill:before{content:"\f18e"}.bi-binoculars:before{content:"\f18f"}.bi-blockquote-left:before{content:"\f190"}.bi-blockquote-right:before{content:"\f191"}.bi-book-fill:before{content:"\f192"}.bi-book-half:before{content:"\f193"}.bi-book:before{content:"\f194"}.bi-bookmark-check-fill:before{content:"\f195"}.bi-bookmark-check:before{content:"\f196"}.bi-bookmark-dash-fill:before{content:"\f197"}.bi-bookmark-dash:before{content:"\f198"}.bi-bookmark-fill:before{content:"\f199"}.bi-bookmark-heart-fill:before{content:"\f19a"}.bi-bookmark-heart:before{content:"\f19b"}.bi-bookmark-plus-fill:before{content:"\f19c"}.bi-bookmark-plus:before{content:"\f19d"}.bi-bookmark-star-fill:before{content:"\f19e"}.bi-bookmark-star:before{content:"\f19f"}.bi-bookmark-x-fill:before{content:"\f1a0"}.bi-bookmark-x:before{content:"\f1a1"}.bi-bookmark:before{content:"\f1a2"}.bi-bookmarks-fill:before{content:"\f1a3"}.bi-bookmarks:before{content:"\f1a4"}.bi-bookshelf:before{content:"\f1a5"}.bi-bootstrap-fill:before{content:"\f1a6"}.bi-bootstrap-reboot:before{content:"\f1a7"}.bi-bootstrap:before{content:"\f1a8"}.bi-border-all:before{content:"\f1a9"}.bi-border-bottom:before{content:"\f1aa"}.bi-border-center:before{content:"\f1ab"}.bi-border-inner:before{content:"\f1ac"}.bi-border-left:before{content:"\f1ad"}.bi-border-middle:before{content:"\f1ae"}.bi-border-outer:before{content:"\f1af"}.bi-border-right:before{content:"\f1b0"}.bi-border-style:before{content:"\f1b1"}.bi-border-top:before{content:"\f1b2"}.bi-border-width:before{content:"\f1b3"}.bi-border:before{content:"\f1b4"}.bi-bounding-box-circles:before{content:"\f1b5"}.bi-bounding-box:before{content:"\f1b6"}.bi-box-arrow-down-left:before{content:"\f1b7"}.bi-box-arrow-down-right:before{content:"\f1b8"}.bi-box-arrow-down:before{content:"\f1b9"}.bi-box-arrow-in-down-left:before{content:"\f1ba"}.bi-box-arrow-in-down-right:before{content:"\f1bb"}.bi-box-arrow-in-down:before{content:"\f1bc"}.bi-box-arrow-in-left:before{content:"\f1bd"}.bi-box-arrow-in-right:before{content:"\f1be"}.bi-box-arrow-in-up-left:before{content:"\f1bf"}.bi-box-arrow-in-up-right:before{content:"\f1c0"}.bi-box-arrow-in-up:before{content:"\f1c1"}.bi-box-arrow-left:before{content:"\f1c2"}.bi-box-arrow-right:before{content:"\f1c3"}.bi-box-arrow-up-left:before{content:"\f1c4"}.bi-box-arrow-up-right:before{content:"\f1c5"}.bi-box-arrow-up:before{content:"\f1c6"}.bi-box-seam:before{content:"\f1c7"}.bi-box:before{content:"\f1c8"}.bi-braces:before{content:"\f1c9"}.bi-bricks:before{content:"\f1ca"}.bi-briefcase-fill:before{content:"\f1cb"}.bi-briefcase:before{content:"\f1cc"}.bi-brightness-alt-high-fill:before{content:"\f1cd"}.bi-brightness-alt-high:before{content:"\f1ce"}.bi-brightness-alt-low-fill:before{content:"\f1cf"}.bi-brightness-alt-low:before{content:"\f1d0"}.bi-brightness-high-fill:before{content:"\f1d1"}.bi-brightness-high:before{content:"\f1d2"}.bi-brightness-low-fill:before{content:"\f1d3"}.bi-brightness-low:before{content:"\f1d4"}.bi-broadcast-pin:before{content:"\f1d5"}.bi-broadcast:before{content:"\f1d6"}.bi-brush-fill:before{content:"\f1d7"}.bi-brush:before{content:"\f1d8"}.bi-bucket-fill:before{content:"\f1d9"}.bi-bucket:before{content:"\f1da"}.bi-bug-fill:before{content:"\f1db"}.bi-bug:before{content:"\f1dc"}.bi-building:before{content:"\f1dd"}.bi-bullseye:before{content:"\f1de"}.bi-calculator-fill:before{content:"\f1df"}.bi-calculator:before{content:"\f1e0"}.bi-calendar-check-fill:before{content:"\f1e1"}.bi-calendar-check:before{content:"\f1e2"}.bi-calendar-date-fill:before{content:"\f1e3"}.bi-calendar-date:before{content:"\f1e4"}.bi-calendar-day-fill:before{content:"\f1e5"}.bi-calendar-day:before{content:"\f1e6"}.bi-calendar-event-fill:before{content:"\f1e7"}.bi-calendar-event:before{content:"\f1e8"}.bi-calendar-fill:before{content:"\f1e9"}.bi-calendar-minus-fill:before{content:"\f1ea"}.bi-calendar-minus:before{content:"\f1eb"}.bi-calendar-month-fill:before{content:"\f1ec"}.bi-calendar-month:before{content:"\f1ed"}.bi-calendar-plus-fill:before{content:"\f1ee"}.bi-calendar-plus:before{content:"\f1ef"}.bi-calendar-range-fill:before{content:"\f1f0"}.bi-calendar-range:before{content:"\f1f1"}.bi-calendar-week-fill:before{content:"\f1f2"}.bi-calendar-week:before{content:"\f1f3"}.bi-calendar-x-fill:before{content:"\f1f4"}.bi-calendar-x:before{content:"\f1f5"}.bi-calendar:before{content:"\f1f6"}.bi-calendar2-check-fill:before{content:"\f1f7"}.bi-calendar2-check:before{content:"\f1f8"}.bi-calendar2-date-fill:before{content:"\f1f9"}.bi-calendar2-date:before{content:"\f1fa"}.bi-calendar2-day-fill:before{content:"\f1fb"}.bi-calendar2-day:before{content:"\f1fc"}.bi-calendar2-event-fill:before{content:"\f1fd"}.bi-calendar2-event:before{content:"\f1fe"}.bi-calendar2-fill:before{content:"\f1ff"}.bi-calendar2-minus-fill:before{content:"\f200"}.bi-calendar2-minus:before{content:"\f201"}.bi-calendar2-month-fill:before{content:"\f202"}.bi-calendar2-month:before{content:"\f203"}.bi-calendar2-plus-fill:before{content:"\f204"}.bi-calendar2-plus:before{content:"\f205"}.bi-calendar2-range-fill:before{content:"\f206"}.bi-calendar2-range:before{content:"\f207"}.bi-calendar2-week-fill:before{content:"\f208"}.bi-calendar2-week:before{content:"\f209"}.bi-calendar2-x-fill:before{content:"\f20a"}.bi-calendar2-x:before{content:"\f20b"}.bi-calendar2:before{content:"\f20c"}.bi-calendar3-event-fill:before{content:"\f20d"}.bi-calendar3-event:before{content:"\f20e"}.bi-calendar3-fill:before{content:"\f20f"}.bi-calendar3-range-fill:before{content:"\f210"}.bi-calendar3-range:before{content:"\f211"}.bi-calendar3-week-fill:before{content:"\f212"}.bi-calendar3-week:before{content:"\f213"}.bi-calendar3:before{content:"\f214"}.bi-calendar4-event:before{content:"\f215"}.bi-calendar4-range:before{content:"\f216"}.bi-calendar4-week:before{content:"\f217"}.bi-calendar4:before{content:"\f218"}.bi-camera-fill:before{content:"\f219"}.bi-camera-reels-fill:before{content:"\f21a"}.bi-camera-reels:before{content:"\f21b"}.bi-camera-video-fill:before{content:"\f21c"}.bi-camera-video-off-fill:before{content:"\f21d"}.bi-camera-video-off:before{content:"\f21e"}.bi-camera-video:before{content:"\f21f"}.bi-camera:before{content:"\f220"}.bi-camera2:before{content:"\f221"}.bi-capslock-fill:before{content:"\f222"}.bi-capslock:before{content:"\f223"}.bi-card-checklist:before{content:"\f224"}.bi-card-heading:before{content:"\f225"}.bi-card-image:before{content:"\f226"}.bi-card-list:before{content:"\f227"}.bi-card-text:before{content:"\f228"}.bi-caret-down-fill:before{content:"\f229"}.bi-caret-down-square-fill:before{content:"\f22a"}.bi-caret-down-square:before{content:"\f22b"}.bi-caret-down:before{content:"\f22c"}.bi-caret-left-fill:before{content:"\f22d"}.bi-caret-left-square-fill:before{content:"\f22e"}.bi-caret-left-square:before{content:"\f22f"}.bi-caret-left:before{content:"\f230"}.bi-caret-right-fill:before{content:"\f231"}.bi-caret-right-square-fill:before{content:"\f232"}.bi-caret-right-square:before{content:"\f233"}.bi-caret-right:before{content:"\f234"}.bi-caret-up-fill:before{content:"\f235"}.bi-caret-up-square-fill:before{content:"\f236"}.bi-caret-up-square:before{content:"\f237"}.bi-caret-up:before{content:"\f238"}.bi-cart-check-fill:before{content:"\f239"}.bi-cart-check:before{content:"\f23a"}.bi-cart-dash-fill:before{content:"\f23b"}.bi-cart-dash:before{content:"\f23c"}.bi-cart-fill:before{content:"\f23d"}.bi-cart-plus-fill:before{content:"\f23e"}.bi-cart-plus:before{content:"\f23f"}.bi-cart-x-fill:before{content:"\f240"}.bi-cart-x:before{content:"\f241"}.bi-cart:before{content:"\f242"}.bi-cart2:before{content:"\f243"}.bi-cart3:before{content:"\f244"}.bi-cart4:before{content:"\f245"}.bi-cash-stack:before{content:"\f246"}.bi-cash:before{content:"\f247"}.bi-cast:before{content:"\f248"}.bi-chat-dots-fill:before{content:"\f249"}.bi-chat-dots:before{content:"\f24a"}.bi-chat-fill:before{content:"\f24b"}.bi-chat-left-dots-fill:before{content:"\f24c"}.bi-chat-left-dots:before{content:"\f24d"}.bi-chat-left-fill:before{content:"\f24e"}.bi-chat-left-quote-fill:before{content:"\f24f"}.bi-chat-left-quote:before{content:"\f250"}.bi-chat-left-text-fill:before{content:"\f251"}.bi-chat-left-text:before{content:"\f252"}.bi-chat-left:before{content:"\f253"}.bi-chat-quote-fill:before{content:"\f254"}.bi-chat-quote:before{content:"\f255"}.bi-chat-right-dots-fill:before{content:"\f256"}.bi-chat-right-dots:before{content:"\f257"}.bi-chat-right-fill:before{content:"\f258"}.bi-chat-right-quote-fill:before{content:"\f259"}.bi-chat-right-quote:before{content:"\f25a"}.bi-chat-right-text-fill:before{content:"\f25b"}.bi-chat-right-text:before{content:"\f25c"}.bi-chat-right:before{content:"\f25d"}.bi-chat-square-dots-fill:before{content:"\f25e"}.bi-chat-square-dots:before{content:"\f25f"}.bi-chat-square-fill:before{content:"\f260"}.bi-chat-square-quote-fill:before{content:"\f261"}.bi-chat-square-quote:before{content:"\f262"}.bi-chat-square-text-fill:before{content:"\f263"}.bi-chat-square-text:before{content:"\f264"}.bi-chat-square:before{content:"\f265"}.bi-chat-text-fill:before{content:"\f266"}.bi-chat-text:before{content:"\f267"}.bi-chat:before{content:"\f268"}.bi-check-all:before{content:"\f269"}.bi-check-circle-fill:before{content:"\f26a"}.bi-check-circle:before{content:"\f26b"}.bi-check-square-fill:before{content:"\f26c"}.bi-check-square:before{content:"\f26d"}.bi-check:before{content:"\f26e"}.bi-check2-all:before{content:"\f26f"}.bi-check2-circle:before{content:"\f270"}.bi-check2-square:before{content:"\f271"}.bi-check2:before{content:"\f272"}.bi-chevron-bar-contract:before{content:"\f273"}.bi-chevron-bar-down:before{content:"\f274"}.bi-chevron-bar-expand:before{content:"\f275"}.bi-chevron-bar-left:before{content:"\f276"}.bi-chevron-bar-right:before{content:"\f277"}.bi-chevron-bar-up:before{content:"\f278"}.bi-chevron-compact-down:before{content:"\f279"}.bi-chevron-compact-left:before{content:"\f27a"}.bi-chevron-compact-right:before{content:"\f27b"}.bi-chevron-compact-up:before{content:"\f27c"}.bi-chevron-contract:before{content:"\f27d"}.bi-chevron-double-down:before{content:"\f27e"}.bi-chevron-double-left:before{content:"\f27f"}.bi-chevron-double-right:before{content:"\f280"}.bi-chevron-double-up:before{content:"\f281"}.bi-chevron-down:before{content:"\f282"}.bi-chevron-expand:before{content:"\f283"}.bi-chevron-left:before{content:"\f284"}.bi-chevron-right:before{content:"\f285"}.bi-chevron-up:before{content:"\f286"}.bi-circle-fill:before{content:"\f287"}.bi-circle-half:before{content:"\f288"}.bi-circle-square:before{content:"\f289"}.bi-circle:before{content:"\f28a"}.bi-clipboard-check:before{content:"\f28b"}.bi-clipboard-data:before{content:"\f28c"}.bi-clipboard-minus:before{content:"\f28d"}.bi-clipboard-plus:before{content:"\f28e"}.bi-clipboard-x:before{content:"\f28f"}.bi-clipboard:before{content:"\f290"}.bi-clock-fill:before{content:"\f291"}.bi-clock-history:before{content:"\f292"}.bi-clock:before{content:"\f293"}.bi-cloud-arrow-down-fill:before{content:"\f294"}.bi-cloud-arrow-down:before{content:"\f295"}.bi-cloud-arrow-up-fill:before{content:"\f296"}.bi-cloud-arrow-up:before{content:"\f297"}.bi-cloud-check-fill:before{content:"\f298"}.bi-cloud-check:before{content:"\f299"}.bi-cloud-download-fill:before{content:"\f29a"}.bi-cloud-download:before{content:"\f29b"}.bi-cloud-drizzle-fill:before{content:"\f29c"}.bi-cloud-drizzle:before{content:"\f29d"}.bi-cloud-fill:before{content:"\f29e"}.bi-cloud-fog-fill:before{content:"\f29f"}.bi-cloud-fog:before{content:"\f2a0"}.bi-cloud-fog2-fill:before{content:"\f2a1"}.bi-cloud-fog2:before{content:"\f2a2"}.bi-cloud-hail-fill:before{content:"\f2a3"}.bi-cloud-hail:before{content:"\f2a4"}.bi-cloud-haze-fill:before{content:"\f2a6"}.bi-cloud-haze:before{content:"\f2a7"}.bi-cloud-haze2-fill:before{content:"\f2a8"}.bi-cloud-lightning-fill:before{content:"\f2a9"}.bi-cloud-lightning-rain-fill:before{content:"\f2aa"}.bi-cloud-lightning-rain:before{content:"\f2ab"}.bi-cloud-lightning:before{content:"\f2ac"}.bi-cloud-minus-fill:before{content:"\f2ad"}.bi-cloud-minus:before{content:"\f2ae"}.bi-cloud-moon-fill:before{content:"\f2af"}.bi-cloud-moon:before{content:"\f2b0"}.bi-cloud-plus-fill:before{content:"\f2b1"}.bi-cloud-plus:before{content:"\f2b2"}.bi-cloud-rain-fill:before{content:"\f2b3"}.bi-cloud-rain-heavy-fill:before{content:"\f2b4"}.bi-cloud-rain-heavy:before{content:"\f2b5"}.bi-cloud-rain:before{content:"\f2b6"}.bi-cloud-slash-fill:before{content:"\f2b7"}.bi-cloud-slash:before{content:"\f2b8"}.bi-cloud-sleet-fill:before{content:"\f2b9"}.bi-cloud-sleet:before{content:"\f2ba"}.bi-cloud-snow-fill:before{content:"\f2bb"}.bi-cloud-snow:before{content:"\f2bc"}.bi-cloud-sun-fill:before{content:"\f2bd"}.bi-cloud-sun:before{content:"\f2be"}.bi-cloud-upload-fill:before{content:"\f2bf"}.bi-cloud-upload:before{content:"\f2c0"}.bi-cloud:before{content:"\f2c1"}.bi-clouds-fill:before{content:"\f2c2"}.bi-clouds:before{content:"\f2c3"}.bi-cloudy-fill:before{content:"\f2c4"}.bi-cloudy:before{content:"\f2c5"}.bi-code-slash:before{content:"\f2c6"}.bi-code-square:before{content:"\f2c7"}.bi-code:before{content:"\f2c8"}.bi-collection-fill:before{content:"\f2c9"}.bi-collection-play-fill:before{content:"\f2ca"}.bi-collection-play:before{content:"\f2cb"}.bi-collection:before{content:"\f2cc"}.bi-columns-gap:before{content:"\f2cd"}.bi-columns:before{content:"\f2ce"}.bi-command:before{content:"\f2cf"}.bi-compass-fill:before{content:"\f2d0"}.bi-compass:before{content:"\f2d1"}.bi-cone-striped:before{content:"\f2d2"}.bi-cone:before{content:"\f2d3"}.bi-controller:before{content:"\f2d4"}.bi-cpu-fill:before{content:"\f2d5"}.bi-cpu:before{content:"\f2d6"}.bi-credit-card-2-back-fill:before{content:"\f2d7"}.bi-credit-card-2-back:before{content:"\f2d8"}.bi-credit-card-2-front-fill:before{content:"\f2d9"}.bi-credit-card-2-front:before{content:"\f2da"}.bi-credit-card-fill:before{content:"\f2db"}.bi-credit-card:before{content:"\f2dc"}.bi-crop:before{content:"\f2dd"}.bi-cup-fill:before{content:"\f2de"}.bi-cup-straw:before{content:"\f2df"}.bi-cup:before{content:"\f2e0"}.bi-cursor-fill:before{content:"\f2e1"}.bi-cursor-text:before{content:"\f2e2"}.bi-cursor:before{content:"\f2e3"}.bi-dash-circle-dotted:before{content:"\f2e4"}.bi-dash-circle-fill:before{content:"\f2e5"}.bi-dash-circle:before{content:"\f2e6"}.bi-dash-square-dotted:before{content:"\f2e7"}.bi-dash-square-fill:before{content:"\f2e8"}.bi-dash-square:before{content:"\f2e9"}.bi-dash:before{content:"\f2ea"}.bi-diagram-2-fill:before{content:"\f2eb"}.bi-diagram-2:before{content:"\f2ec"}.bi-diagram-3-fill:before{content:"\f2ed"}.bi-diagram-3:before{content:"\f2ee"}.bi-diamond-fill:before{content:"\f2ef"}.bi-diamond-half:before{content:"\f2f0"}.bi-diamond:before{content:"\f2f1"}.bi-dice-1-fill:before{content:"\f2f2"}.bi-dice-1:before{content:"\f2f3"}.bi-dice-2-fill:before{content:"\f2f4"}.bi-dice-2:before{content:"\f2f5"}.bi-dice-3-fill:before{content:"\f2f6"}.bi-dice-3:before{content:"\f2f7"}.bi-dice-4-fill:before{content:"\f2f8"}.bi-dice-4:before{content:"\f2f9"}.bi-dice-5-fill:before{content:"\f2fa"}.bi-dice-5:before{content:"\f2fb"}.bi-dice-6-fill:before{content:"\f2fc"}.bi-dice-6:before{content:"\f2fd"}.bi-disc-fill:before{content:"\f2fe"}.bi-disc:before{content:"\f2ff"}.bi-discord:before{content:"\f300"}.bi-display-fill:before{content:"\f301"}.bi-display:before{content:"\f302"}.bi-distribute-horizontal:before{content:"\f303"}.bi-distribute-vertical:before{content:"\f304"}.bi-door-closed-fill:before{content:"\f305"}.bi-door-closed:before{content:"\f306"}.bi-door-open-fill:before{content:"\f307"}.bi-door-open:before{content:"\f308"}.bi-dot:before{content:"\f309"}.bi-download:before{content:"\f30a"}.bi-droplet-fill:before{content:"\f30b"}.bi-droplet-half:before{content:"\f30c"}.bi-droplet:before{content:"\f30d"}.bi-earbuds:before{content:"\f30e"}.bi-easel-fill:before{content:"\f30f"}.bi-easel:before{content:"\f310"}.bi-egg-fill:before{content:"\f311"}.bi-egg-fried:before{content:"\f312"}.bi-egg:before{content:"\f313"}.bi-eject-fill:before{content:"\f314"}.bi-eject:before{content:"\f315"}.bi-emoji-angry-fill:before{content:"\f316"}.bi-emoji-angry:before{content:"\f317"}.bi-emoji-dizzy-fill:before{content:"\f318"}.bi-emoji-dizzy:before{content:"\f319"}.bi-emoji-expressionless-fill:before{content:"\f31a"}.bi-emoji-expressionless:before{content:"\f31b"}.bi-emoji-frown-fill:before{content:"\f31c"}.bi-emoji-frown:before{content:"\f31d"}.bi-emoji-heart-eyes-fill:before{content:"\f31e"}.bi-emoji-heart-eyes:before{content:"\f31f"}.bi-emoji-laughing-fill:before{content:"\f320"}.bi-emoji-laughing:before{content:"\f321"}.bi-emoji-neutral-fill:before{content:"\f322"}.bi-emoji-neutral:before{content:"\f323"}.bi-emoji-smile-fill:before{content:"\f324"}.bi-emoji-smile-upside-down-fill:before{content:"\f325"}.bi-emoji-smile-upside-down:before{content:"\f326"}.bi-emoji-smile:before{content:"\f327"}.bi-emoji-sunglasses-fill:before{content:"\f328"}.bi-emoji-sunglasses:before{content:"\f329"}.bi-emoji-wink-fill:before{content:"\f32a"}.bi-emoji-wink:before{content:"\f32b"}.bi-envelope-fill:before{content:"\f32c"}.bi-envelope-open-fill:before{content:"\f32d"}.bi-envelope-open:before{content:"\f32e"}.bi-envelope:before{content:"\f32f"}.bi-eraser-fill:before{content:"\f330"}.bi-eraser:before{content:"\f331"}.bi-exclamation-circle-fill:before{content:"\f332"}.bi-exclamation-circle:before{content:"\f333"}.bi-exclamation-diamond-fill:before{content:"\f334"}.bi-exclamation-diamond:before{content:"\f335"}.bi-exclamation-octagon-fill:before{content:"\f336"}.bi-exclamation-octagon:before{content:"\f337"}.bi-exclamation-square-fill:before{content:"\f338"}.bi-exclamation-square:before{content:"\f339"}.bi-exclamation-triangle-fill:before{content:"\f33a"}.bi-exclamation-triangle:before{content:"\f33b"}.bi-exclamation:before{content:"\f33c"}.bi-exclude:before{content:"\f33d"}.bi-eye-fill:before{content:"\f33e"}.bi-eye-slash-fill:before{content:"\f33f"}.bi-eye-slash:before{content:"\f340"}.bi-eye:before{content:"\f341"}.bi-eyedropper:before{content:"\f342"}.bi-eyeglasses:before{content:"\f343"}.bi-facebook:before{content:"\f344"}.bi-file-arrow-down-fill:before{content:"\f345"}.bi-file-arrow-down:before{content:"\f346"}.bi-file-arrow-up-fill:before{content:"\f347"}.bi-file-arrow-up:before{content:"\f348"}.bi-file-bar-graph-fill:before{content:"\f349"}.bi-file-bar-graph:before{content:"\f34a"}.bi-file-binary-fill:before{content:"\f34b"}.bi-file-binary:before{content:"\f34c"}.bi-file-break-fill:before{content:"\f34d"}.bi-file-break:before{content:"\f34e"}.bi-file-check-fill:before{content:"\f34f"}.bi-file-check:before{content:"\f350"}.bi-file-code-fill:before{content:"\f351"}.bi-file-code:before{content:"\f352"}.bi-file-diff-fill:before{content:"\f353"}.bi-file-diff:before{content:"\f354"}.bi-file-earmark-arrow-down-fill:before{content:"\f355"}.bi-file-earmark-arrow-down:before{content:"\f356"}.bi-file-earmark-arrow-up-fill:before{content:"\f357"}.bi-file-earmark-arrow-up:before{content:"\f358"}.bi-file-earmark-bar-graph-fill:before{content:"\f359"}.bi-file-earmark-bar-graph:before{content:"\f35a"}.bi-file-earmark-binary-fill:before{content:"\f35b"}.bi-file-earmark-binary:before{content:"\f35c"}.bi-file-earmark-break-fill:before{content:"\f35d"}.bi-file-earmark-break:before{content:"\f35e"}.bi-file-earmark-check-fill:before{content:"\f35f"}.bi-file-earmark-check:before{content:"\f360"}.bi-file-earmark-code-fill:before{content:"\f361"}.bi-file-earmark-code:before{content:"\f362"}.bi-file-earmark-diff-fill:before{content:"\f363"}.bi-file-earmark-diff:before{content:"\f364"}.bi-file-earmark-easel-fill:before{content:"\f365"}.bi-file-earmark-easel:before{content:"\f366"}.bi-file-earmark-excel-fill:before{content:"\f367"}.bi-file-earmark-excel:before{content:"\f368"}.bi-file-earmark-fill:before{content:"\f369"}.bi-file-earmark-font-fill:before{content:"\f36a"}.bi-file-earmark-font:before{content:"\f36b"}.bi-file-earmark-image-fill:before{content:"\f36c"}.bi-file-earmark-image:before{content:"\f36d"}.bi-file-earmark-lock-fill:before{content:"\f36e"}.bi-file-earmark-lock:before{content:"\f36f"}.bi-file-earmark-lock2-fill:before{content:"\f370"}.bi-file-earmark-lock2:before{content:"\f371"}.bi-file-earmark-medical-fill:before{content:"\f372"}.bi-file-earmark-medical:before{content:"\f373"}.bi-file-earmark-minus-fill:before{content:"\f374"}.bi-file-earmark-minus:before{content:"\f375"}.bi-file-earmark-music-fill:before{content:"\f376"}.bi-file-earmark-music:before{content:"\f377"}.bi-file-earmark-person-fill:before{content:"\f378"}.bi-file-earmark-person:before{content:"\f379"}.bi-file-earmark-play-fill:before{content:"\f37a"}.bi-file-earmark-play:before{content:"\f37b"}.bi-file-earmark-plus-fill:before{content:"\f37c"}.bi-file-earmark-plus:before{content:"\f37d"}.bi-file-earmark-post-fill:before{content:"\f37e"}.bi-file-earmark-post:before{content:"\f37f"}.bi-file-earmark-ppt-fill:before{content:"\f380"}.bi-file-earmark-ppt:before{content:"\f381"}.bi-file-earmark-richtext-fill:before{content:"\f382"}.bi-file-earmark-richtext:before{content:"\f383"}.bi-file-earmark-ruled-fill:before{content:"\f384"}.bi-file-earmark-ruled:before{content:"\f385"}.bi-file-earmark-slides-fill:before{content:"\f386"}.bi-file-earmark-slides:before{content:"\f387"}.bi-file-earmark-spreadsheet-fill:before{content:"\f388"}.bi-file-earmark-spreadsheet:before{content:"\f389"}.bi-file-earmark-text-fill:before{content:"\f38a"}.bi-file-earmark-text:before{content:"\f38b"}.bi-file-earmark-word-fill:before{content:"\f38c"}.bi-file-earmark-word:before{content:"\f38d"}.bi-file-earmark-x-fill:before{content:"\f38e"}.bi-file-earmark-x:before{content:"\f38f"}.bi-file-earmark-zip-fill:before{content:"\f390"}.bi-file-earmark-zip:before{content:"\f391"}.bi-file-earmark:before{content:"\f392"}.bi-file-easel-fill:before{content:"\f393"}.bi-file-easel:before{content:"\f394"}.bi-file-excel-fill:before{content:"\f395"}.bi-file-excel:before{content:"\f396"}.bi-file-fill:before{content:"\f397"}.bi-file-font-fill:before{content:"\f398"}.bi-file-font:before{content:"\f399"}.bi-file-image-fill:before{content:"\f39a"}.bi-file-image:before{content:"\f39b"}.bi-file-lock-fill:before{content:"\f39c"}.bi-file-lock:before{content:"\f39d"}.bi-file-lock2-fill:before{content:"\f39e"}.bi-file-lock2:before{content:"\f39f"}.bi-file-medical-fill:before{content:"\f3a0"}.bi-file-medical:before{content:"\f3a1"}.bi-file-minus-fill:before{content:"\f3a2"}.bi-file-minus:before{content:"\f3a3"}.bi-file-music-fill:before{content:"\f3a4"}.bi-file-music:before{content:"\f3a5"}.bi-file-person-fill:before{content:"\f3a6"}.bi-file-person:before{content:"\f3a7"}.bi-file-play-fill:before{content:"\f3a8"}.bi-file-play:before{content:"\f3a9"}.bi-file-plus-fill:before{content:"\f3aa"}.bi-file-plus:before{content:"\f3ab"}.bi-file-post-fill:before{content:"\f3ac"}.bi-file-post:before{content:"\f3ad"}.bi-file-ppt-fill:before{content:"\f3ae"}.bi-file-ppt:before{content:"\f3af"}.bi-file-richtext-fill:before{content:"\f3b0"}.bi-file-richtext:before{content:"\f3b1"}.bi-file-ruled-fill:before{content:"\f3b2"}.bi-file-ruled:before{content:"\f3b3"}.bi-file-slides-fill:before{content:"\f3b4"}.bi-file-slides:before{content:"\f3b5"}.bi-file-spreadsheet-fill:before{content:"\f3b6"}.bi-file-spreadsheet:before{content:"\f3b7"}.bi-file-text-fill:before{content:"\f3b8"}.bi-file-text:before{content:"\f3b9"}.bi-file-word-fill:before{content:"\f3ba"}.bi-file-word:before{content:"\f3bb"}.bi-file-x-fill:before{content:"\f3bc"}.bi-file-x:before{content:"\f3bd"}.bi-file-zip-fill:before{content:"\f3be"}.bi-file-zip:before{content:"\f3bf"}.bi-file:before{content:"\f3c0"}.bi-files-alt:before{content:"\f3c1"}.bi-files:before{content:"\f3c2"}.bi-film:before{content:"\f3c3"}.bi-filter-circle-fill:before{content:"\f3c4"}.bi-filter-circle:before{content:"\f3c5"}.bi-filter-left:before{content:"\f3c6"}.bi-filter-right:before{content:"\f3c7"}.bi-filter-square-fill:before{content:"\f3c8"}.bi-filter-square:before{content:"\f3c9"}.bi-filter:before{content:"\f3ca"}.bi-flag-fill:before{content:"\f3cb"}.bi-flag:before{content:"\f3cc"}.bi-flower1:before{content:"\f3cd"}.bi-flower2:before{content:"\f3ce"}.bi-flower3:before{content:"\f3cf"}.bi-folder-check:before{content:"\f3d0"}.bi-folder-fill:before{content:"\f3d1"}.bi-folder-minus:before{content:"\f3d2"}.bi-folder-plus:before{content:"\f3d3"}.bi-folder-symlink-fill:before{content:"\f3d4"}.bi-folder-symlink:before{content:"\f3d5"}.bi-folder-x:before{content:"\f3d6"}.bi-folder:before{content:"\f3d7"}.bi-folder2-open:before{content:"\f3d8"}.bi-folder2:before{content:"\f3d9"}.bi-fonts:before{content:"\f3da"}.bi-forward-fill:before{content:"\f3db"}.bi-forward:before{content:"\f3dc"}.bi-front:before{content:"\f3dd"}.bi-fullscreen-exit:before{content:"\f3de"}.bi-fullscreen:before{content:"\f3df"}.bi-funnel-fill:before{content:"\f3e0"}.bi-funnel:before{content:"\f3e1"}.bi-gear-fill:before{content:"\f3e2"}.bi-gear-wide-connected:before{content:"\f3e3"}.bi-gear-wide:before{content:"\f3e4"}.bi-gear:before{content:"\f3e5"}.bi-gem:before{content:"\f3e6"}.bi-geo-alt-fill:before{content:"\f3e7"}.bi-geo-alt:before{content:"\f3e8"}.bi-geo-fill:before{content:"\f3e9"}.bi-geo:before{content:"\f3ea"}.bi-gift-fill:before{content:"\f3eb"}.bi-gift:before{content:"\f3ec"}.bi-github:before{content:"\f3ed"}.bi-globe:before{content:"\f3ee"}.bi-globe2:before{content:"\f3ef"}.bi-google:before{content:"\f3f0"}.bi-graph-down:before{content:"\f3f1"}.bi-graph-up:before{content:"\f3f2"}.bi-grid-1x2-fill:before{content:"\f3f3"}.bi-grid-1x2:before{content:"\f3f4"}.bi-grid-3x2-gap-fill:before{content:"\f3f5"}.bi-grid-3x2-gap:before{content:"\f3f6"}.bi-grid-3x2:before{content:"\f3f7"}.bi-grid-3x3-gap-fill:before{content:"\f3f8"}.bi-grid-3x3-gap:before{content:"\f3f9"}.bi-grid-3x3:before{content:"\f3fa"}.bi-grid-fill:before{content:"\f3fb"}.bi-grid:before{content:"\f3fc"}.bi-grip-horizontal:before{content:"\f3fd"}.bi-grip-vertical:before{content:"\f3fe"}.bi-hammer:before{content:"\f3ff"}.bi-hand-index-fill:before{content:"\f400"}.bi-hand-index-thumb-fill:before{content:"\f401"}.bi-hand-index-thumb:before{content:"\f402"}.bi-hand-index:before{content:"\f403"}.bi-hand-thumbs-down-fill:before{content:"\f404"}.bi-hand-thumbs-down:before{content:"\f405"}.bi-hand-thumbs-up-fill:before{content:"\f406"}.bi-hand-thumbs-up:before{content:"\f407"}.bi-handbag-fill:before{content:"\f408"}.bi-handbag:before{content:"\f409"}.bi-hash:before{content:"\f40a"}.bi-hdd-fill:before{content:"\f40b"}.bi-hdd-network-fill:before{content:"\f40c"}.bi-hdd-network:before{content:"\f40d"}.bi-hdd-rack-fill:before{content:"\f40e"}.bi-hdd-rack:before{content:"\f40f"}.bi-hdd-stack-fill:before{content:"\f410"}.bi-hdd-stack:before{content:"\f411"}.bi-hdd:before{content:"\f412"}.bi-headphones:before{content:"\f413"}.bi-headset:before{content:"\f414"}.bi-heart-fill:before{content:"\f415"}.bi-heart-half:before{content:"\f416"}.bi-heart:before{content:"\f417"}.bi-heptagon-fill:before{content:"\f418"}.bi-heptagon-half:before{content:"\f419"}.bi-heptagon:before{content:"\f41a"}.bi-hexagon-fill:before{content:"\f41b"}.bi-hexagon-half:before{content:"\f41c"}.bi-hexagon:before{content:"\f41d"}.bi-hourglass-bottom:before{content:"\f41e"}.bi-hourglass-split:before{content:"\f41f"}.bi-hourglass-top:before{content:"\f420"}.bi-hourglass:before{content:"\f421"}.bi-house-door-fill:before{content:"\f422"}.bi-house-door:before{content:"\f423"}.bi-house-fill:before{content:"\f424"}.bi-house:before{content:"\f425"}.bi-hr:before{content:"\f426"}.bi-hurricane:before{content:"\f427"}.bi-image-alt:before{content:"\f428"}.bi-image-fill:before{content:"\f429"}.bi-image:before{content:"\f42a"}.bi-images:before{content:"\f42b"}.bi-inbox-fill:before{content:"\f42c"}.bi-inbox:before{content:"\f42d"}.bi-inboxes-fill:before{content:"\f42e"}.bi-inboxes:before{content:"\f42f"}.bi-info-circle-fill:before{content:"\f430"}.bi-info-circle:before{content:"\f431"}.bi-info-square-fill:before{content:"\f432"}.bi-info-square:before{content:"\f433"}.bi-info:before{content:"\f434"}.bi-input-cursor-text:before{content:"\f435"}.bi-input-cursor:before{content:"\f436"}.bi-instagram:before{content:"\f437"}.bi-intersect:before{content:"\f438"}.bi-journal-album:before{content:"\f439"}.bi-journal-arrow-down:before{content:"\f43a"}.bi-journal-arrow-up:before{content:"\f43b"}.bi-journal-bookmark-fill:before{content:"\f43c"}.bi-journal-bookmark:before{content:"\f43d"}.bi-journal-check:before{content:"\f43e"}.bi-journal-code:before{content:"\f43f"}.bi-journal-medical:before{content:"\f440"}.bi-journal-minus:before{content:"\f441"}.bi-journal-plus:before{content:"\f442"}.bi-journal-richtext:before{content:"\f443"}.bi-journal-text:before{content:"\f444"}.bi-journal-x:before{content:"\f445"}.bi-journal:before{content:"\f446"}.bi-journals:before{content:"\f447"}.bi-joystick:before{content:"\f448"}.bi-justify-left:before{content:"\f449"}.bi-justify-right:before{content:"\f44a"}.bi-justify:before{content:"\f44b"}.bi-kanban-fill:before{content:"\f44c"}.bi-kanban:before{content:"\f44d"}.bi-key-fill:before{content:"\f44e"}.bi-key:before{content:"\f44f"}.bi-keyboard-fill:before{content:"\f450"}.bi-keyboard:before{content:"\f451"}.bi-ladder:before{content:"\f452"}.bi-lamp-fill:before{content:"\f453"}.bi-lamp:before{content:"\f454"}.bi-laptop-fill:before{content:"\f455"}.bi-laptop:before{content:"\f456"}.bi-layer-backward:before{content:"\f457"}.bi-layer-forward:before{content:"\f458"}.bi-layers-fill:before{content:"\f459"}.bi-layers-half:before{content:"\f45a"}.bi-layers:before{content:"\f45b"}.bi-layout-sidebar-inset-reverse:before{content:"\f45c"}.bi-layout-sidebar-inset:before{content:"\f45d"}.bi-layout-sidebar-reverse:before{content:"\f45e"}.bi-layout-sidebar:before{content:"\f45f"}.bi-layout-split:before{content:"\f460"}.bi-layout-text-sidebar-reverse:before{content:"\f461"}.bi-layout-text-sidebar:before{content:"\f462"}.bi-layout-text-window-reverse:before{content:"\f463"}.bi-layout-text-window:before{content:"\f464"}.bi-layout-three-columns:before{content:"\f465"}.bi-layout-wtf:before{content:"\f466"}.bi-life-preserver:before{content:"\f467"}.bi-lightbulb-fill:before{content:"\f468"}.bi-lightbulb-off-fill:before{content:"\f469"}.bi-lightbulb-off:before{content:"\f46a"}.bi-lightbulb:before{content:"\f46b"}.bi-lightning-charge-fill:before{content:"\f46c"}.bi-lightning-charge:before{content:"\f46d"}.bi-lightning-fill:before{content:"\f46e"}.bi-lightning:before{content:"\f46f"}.bi-link-45deg:before{content:"\f470"}.bi-link:before{content:"\f471"}.bi-linkedin:before{content:"\f472"}.bi-list-check:before{content:"\f473"}.bi-list-nested:before{content:"\f474"}.bi-list-ol:before{content:"\f475"}.bi-list-stars:before{content:"\f476"}.bi-list-task:before{content:"\f477"}.bi-list-ul:before{content:"\f478"}.bi-list:before{content:"\f479"}.bi-lock-fill:before{content:"\f47a"}.bi-lock:before{content:"\f47b"}.bi-mailbox:before{content:"\f47c"}.bi-mailbox2:before{content:"\f47d"}.bi-map-fill:before{content:"\f47e"}.bi-map:before{content:"\f47f"}.bi-markdown-fill:before{content:"\f480"}.bi-markdown:before{content:"\f481"}.bi-mask:before{content:"\f482"}.bi-megaphone-fill:before{content:"\f483"}.bi-megaphone:before{content:"\f484"}.bi-menu-app-fill:before{content:"\f485"}.bi-menu-app:before{content:"\f486"}.bi-menu-button-fill:before{content:"\f487"}.bi-menu-button-wide-fill:before{content:"\f488"}.bi-menu-button-wide:before{content:"\f489"}.bi-menu-button:before{content:"\f48a"}.bi-menu-down:before{content:"\f48b"}.bi-menu-up:before{content:"\f48c"}.bi-mic-fill:before{content:"\f48d"}.bi-mic-mute-fill:before{content:"\f48e"}.bi-mic-mute:before{content:"\f48f"}.bi-mic:before{content:"\f490"}.bi-minecart-loaded:before{content:"\f491"}.bi-minecart:before{content:"\f492"}.bi-moisture:before{content:"\f493"}.bi-moon-fill:before{content:"\f494"}.bi-moon-stars-fill:before{content:"\f495"}.bi-moon-stars:before{content:"\f496"}.bi-moon:before{content:"\f497"}.bi-mouse-fill:before{content:"\f498"}.bi-mouse:before{content:"\f499"}.bi-mouse2-fill:before{content:"\f49a"}.bi-mouse2:before{content:"\f49b"}.bi-mouse3-fill:before{content:"\f49c"}.bi-mouse3:before{content:"\f49d"}.bi-music-note-beamed:before{content:"\f49e"}.bi-music-note-list:before{content:"\f49f"}.bi-music-note:before{content:"\f4a0"}.bi-music-player-fill:before{content:"\f4a1"}.bi-music-player:before{content:"\f4a2"}.bi-newspaper:before{content:"\f4a3"}.bi-node-minus-fill:before{content:"\f4a4"}.bi-node-minus:before{content:"\f4a5"}.bi-node-plus-fill:before{content:"\f4a6"}.bi-node-plus:before{content:"\f4a7"}.bi-nut-fill:before{content:"\f4a8"}.bi-nut:before{content:"\f4a9"}.bi-octagon-fill:before{content:"\f4aa"}.bi-octagon-half:before{content:"\f4ab"}.bi-octagon:before{content:"\f4ac"}.bi-option:before{content:"\f4ad"}.bi-outlet:before{content:"\f4ae"}.bi-paint-bucket:before{content:"\f4af"}.bi-palette-fill:before{content:"\f4b0"}.bi-palette:before{content:"\f4b1"}.bi-palette2:before{content:"\f4b2"}.bi-paperclip:before{content:"\f4b3"}.bi-paragraph:before{content:"\f4b4"}.bi-patch-check-fill:before{content:"\f4b5"}.bi-patch-check:before{content:"\f4b6"}.bi-patch-exclamation-fill:before{content:"\f4b7"}.bi-patch-exclamation:before{content:"\f4b8"}.bi-patch-minus-fill:before{content:"\f4b9"}.bi-patch-minus:before{content:"\f4ba"}.bi-patch-plus-fill:before{content:"\f4bb"}.bi-patch-plus:before{content:"\f4bc"}.bi-patch-question-fill:before{content:"\f4bd"}.bi-patch-question:before{content:"\f4be"}.bi-pause-btn-fill:before{content:"\f4bf"}.bi-pause-btn:before{content:"\f4c0"}.bi-pause-circle-fill:before{content:"\f4c1"}.bi-pause-circle:before{content:"\f4c2"}.bi-pause-fill:before{content:"\f4c3"}.bi-pause:before{content:"\f4c4"}.bi-peace-fill:before{content:"\f4c5"}.bi-peace:before{content:"\f4c6"}.bi-pen-fill:before{content:"\f4c7"}.bi-pen:before{content:"\f4c8"}.bi-pencil-fill:before{content:"\f4c9"}.bi-pencil-square:before{content:"\f4ca"}.bi-pencil:before{content:"\f4cb"}.bi-pentagon-fill:before{content:"\f4cc"}.bi-pentagon-half:before{content:"\f4cd"}.bi-pentagon:before{content:"\f4ce"}.bi-people-fill:before{content:"\f4cf"}.bi-people:before{content:"\f4d0"}.bi-percent:before{content:"\f4d1"}.bi-person-badge-fill:before{content:"\f4d2"}.bi-person-badge:before{content:"\f4d3"}.bi-person-bounding-box:before{content:"\f4d4"}.bi-person-check-fill:before{content:"\f4d5"}.bi-person-check:before{content:"\f4d6"}.bi-person-circle:before{content:"\f4d7"}.bi-person-dash-fill:before{content:"\f4d8"}.bi-person-dash:before{content:"\f4d9"}.bi-person-fill:before{content:"\f4da"}.bi-person-lines-fill:before{content:"\f4db"}.bi-person-plus-fill:before{content:"\f4dc"}.bi-person-plus:before{content:"\f4dd"}.bi-person-square:before{content:"\f4de"}.bi-person-x-fill:before{content:"\f4df"}.bi-person-x:before{content:"\f4e0"}.bi-person:before{content:"\f4e1"}.bi-phone-fill:before{content:"\f4e2"}.bi-phone-landscape-fill:before{content:"\f4e3"}.bi-phone-landscape:before{content:"\f4e4"}.bi-phone-vibrate-fill:before{content:"\f4e5"}.bi-phone-vibrate:before{content:"\f4e6"}.bi-phone:before{content:"\f4e7"}.bi-pie-chart-fill:before{content:"\f4e8"}.bi-pie-chart:before{content:"\f4e9"}.bi-pin-angle-fill:before{content:"\f4ea"}.bi-pin-angle:before{content:"\f4eb"}.bi-pin-fill:before{content:"\f4ec"}.bi-pin:before{content:"\f4ed"}.bi-pip-fill:before{content:"\f4ee"}.bi-pip:before{content:"\f4ef"}.bi-play-btn-fill:before{content:"\f4f0"}.bi-play-btn:before{content:"\f4f1"}.bi-play-circle-fill:before{content:"\f4f2"}.bi-play-circle:before{content:"\f4f3"}.bi-play-fill:before{content:"\f4f4"}.bi-play:before{content:"\f4f5"}.bi-plug-fill:before{content:"\f4f6"}.bi-plug:before{content:"\f4f7"}.bi-plus-circle-dotted:before{content:"\f4f8"}.bi-plus-circle-fill:before{content:"\f4f9"}.bi-plus-circle:before{content:"\f4fa"}.bi-plus-square-dotted:before{content:"\f4fb"}.bi-plus-square-fill:before{content:"\f4fc"}.bi-plus-square:before{content:"\f4fd"}.bi-plus:before{content:"\f4fe"}.bi-power:before{content:"\f4ff"}.bi-printer-fill:before{content:"\f500"}.bi-printer:before{content:"\f501"}.bi-puzzle-fill:before{content:"\f502"}.bi-puzzle:before{content:"\f503"}.bi-question-circle-fill:before{content:"\f504"}.bi-question-circle:before{content:"\f505"}.bi-question-diamond-fill:before{content:"\f506"}.bi-question-diamond:before{content:"\f507"}.bi-question-octagon-fill:before{content:"\f508"}.bi-question-octagon:before{content:"\f509"}.bi-question-square-fill:before{content:"\f50a"}.bi-question-square:before{content:"\f50b"}.bi-question:before{content:"\f50c"}.bi-rainbow:before{content:"\f50d"}.bi-receipt-cutoff:before{content:"\f50e"}.bi-receipt:before{content:"\f50f"}.bi-reception-0:before{content:"\f510"}.bi-reception-1:before{content:"\f511"}.bi-reception-2:before{content:"\f512"}.bi-reception-3:before{content:"\f513"}.bi-reception-4:before{content:"\f514"}.bi-record-btn-fill:before{content:"\f515"}.bi-record-btn:before{content:"\f516"}.bi-record-circle-fill:before{content:"\f517"}.bi-record-circle:before{content:"\f518"}.bi-record-fill:before{content:"\f519"}.bi-record:before{content:"\f51a"}.bi-record2-fill:before{content:"\f51b"}.bi-record2:before{content:"\f51c"}.bi-reply-all-fill:before{content:"\f51d"}.bi-reply-all:before{content:"\f51e"}.bi-reply-fill:before{content:"\f51f"}.bi-reply:before{content:"\f520"}.bi-rss-fill:before{content:"\f521"}.bi-rss:before{content:"\f522"}.bi-rulers:before{content:"\f523"}.bi-save-fill:before{content:"\f524"}.bi-save:before{content:"\f525"}.bi-save2-fill:before{content:"\f526"}.bi-save2:before{content:"\f527"}.bi-scissors:before{content:"\f528"}.bi-screwdriver:before{content:"\f529"}.bi-search:before{content:"\f52a"}.bi-segmented-nav:before{content:"\f52b"}.bi-server:before{content:"\f52c"}.bi-share-fill:before{content:"\f52d"}.bi-share:before{content:"\f52e"}.bi-shield-check:before{content:"\f52f"}.bi-shield-exclamation:before{content:"\f530"}.bi-shield-fill-check:before{content:"\f531"}.bi-shield-fill-exclamation:before{content:"\f532"}.bi-shield-fill-minus:before{content:"\f533"}.bi-shield-fill-plus:before{content:"\f534"}.bi-shield-fill-x:before{content:"\f535"}.bi-shield-fill:before{content:"\f536"}.bi-shield-lock-fill:before{content:"\f537"}.bi-shield-lock:before{content:"\f538"}.bi-shield-minus:before{content:"\f539"}.bi-shield-plus:before{content:"\f53a"}.bi-shield-shaded:before{content:"\f53b"}.bi-shield-slash-fill:before{content:"\f53c"}.bi-shield-slash:before{content:"\f53d"}.bi-shield-x:before{content:"\f53e"}.bi-shield:before{content:"\f53f"}.bi-shift-fill:before{content:"\f540"}.bi-shift:before{content:"\f541"}.bi-shop-window:before{content:"\f542"}.bi-shop:before{content:"\f543"}.bi-shuffle:before{content:"\f544"}.bi-signpost-2-fill:before{content:"\f545"}.bi-signpost-2:before{content:"\f546"}.bi-signpost-fill:before{content:"\f547"}.bi-signpost-split-fill:before{content:"\f548"}.bi-signpost-split:before{content:"\f549"}.bi-signpost:before{content:"\f54a"}.bi-sim-fill:before{content:"\f54b"}.bi-sim:before{content:"\f54c"}.bi-skip-backward-btn-fill:before{content:"\f54d"}.bi-skip-backward-btn:before{content:"\f54e"}.bi-skip-backward-circle-fill:before{content:"\f54f"}.bi-skip-backward-circle:before{content:"\f550"}.bi-skip-backward-fill:before{content:"\f551"}.bi-skip-backward:before{content:"\f552"}.bi-skip-end-btn-fill:before{content:"\f553"}.bi-skip-end-btn:before{content:"\f554"}.bi-skip-end-circle-fill:before{content:"\f555"}.bi-skip-end-circle:before{content:"\f556"}.bi-skip-end-fill:before{content:"\f557"}.bi-skip-end:before{content:"\f558"}.bi-skip-forward-btn-fill:before{content:"\f559"}.bi-skip-forward-btn:before{content:"\f55a"}.bi-skip-forward-circle-fill:before{content:"\f55b"}.bi-skip-forward-circle:before{content:"\f55c"}.bi-skip-forward-fill:before{content:"\f55d"}.bi-skip-forward:before{content:"\f55e"}.bi-skip-start-btn-fill:before{content:"\f55f"}.bi-skip-start-btn:before{content:"\f560"}.bi-skip-start-circle-fill:before{content:"\f561"}.bi-skip-start-circle:before{content:"\f562"}.bi-skip-start-fill:before{content:"\f563"}.bi-skip-start:before{content:"\f564"}.bi-slack:before{content:"\f565"}.bi-slash-circle-fill:before{content:"\f566"}.bi-slash-circle:before{content:"\f567"}.bi-slash-square-fill:before{content:"\f568"}.bi-slash-square:before{content:"\f569"}.bi-slash:before{content:"\f56a"}.bi-sliders:before{content:"\f56b"}.bi-smartwatch:before{content:"\f56c"}.bi-snow:before{content:"\f56d"}.bi-snow2:before{content:"\f56e"}.bi-snow3:before{content:"\f56f"}.bi-sort-alpha-down-alt:before{content:"\f570"}.bi-sort-alpha-down:before{content:"\f571"}.bi-sort-alpha-up-alt:before{content:"\f572"}.bi-sort-alpha-up:before{content:"\f573"}.bi-sort-down-alt:before{content:"\f574"}.bi-sort-down:before{content:"\f575"}.bi-sort-numeric-down-alt:before{content:"\f576"}.bi-sort-numeric-down:before{content:"\f577"}.bi-sort-numeric-up-alt:before{content:"\f578"}.bi-sort-numeric-up:before{content:"\f579"}.bi-sort-up-alt:before{content:"\f57a"}.bi-sort-up:before{content:"\f57b"}.bi-soundwave:before{content:"\f57c"}.bi-speaker-fill:before{content:"\f57d"}.bi-speaker:before{content:"\f57e"}.bi-speedometer:before{content:"\f57f"}.bi-speedometer2:before{content:"\f580"}.bi-spellcheck:before{content:"\f581"}.bi-square-fill:before{content:"\f582"}.bi-square-half:before{content:"\f583"}.bi-square:before{content:"\f584"}.bi-stack:before{content:"\f585"}.bi-star-fill:before{content:"\f586"}.bi-star-half:before{content:"\f587"}.bi-star:before{content:"\f588"}.bi-stars:before{content:"\f589"}.bi-stickies-fill:before{content:"\f58a"}.bi-stickies:before{content:"\f58b"}.bi-sticky-fill:before{content:"\f58c"}.bi-sticky:before{content:"\f58d"}.bi-stop-btn-fill:before{content:"\f58e"}.bi-stop-btn:before{content:"\f58f"}.bi-stop-circle-fill:before{content:"\f590"}.bi-stop-circle:before{content:"\f591"}.bi-stop-fill:before{content:"\f592"}.bi-stop:before{content:"\f593"}.bi-stoplights-fill:before{content:"\f594"}.bi-stoplights:before{content:"\f595"}.bi-stopwatch-fill:before{content:"\f596"}.bi-stopwatch:before{content:"\f597"}.bi-subtract:before{content:"\f598"}.bi-suit-club-fill:before{content:"\f599"}.bi-suit-club:before{content:"\f59a"}.bi-suit-diamond-fill:before{content:"\f59b"}.bi-suit-diamond:before{content:"\f59c"}.bi-suit-heart-fill:before{content:"\f59d"}.bi-suit-heart:before{content:"\f59e"}.bi-suit-spade-fill:before{content:"\f59f"}.bi-suit-spade:before{content:"\f5a0"}.bi-sun-fill:before{content:"\f5a1"}.bi-sun:before{content:"\f5a2"}.bi-sunglasses:before{content:"\f5a3"}.bi-sunrise-fill:before{content:"\f5a4"}.bi-sunrise:before{content:"\f5a5"}.bi-sunset-fill:before{content:"\f5a6"}.bi-sunset:before{content:"\f5a7"}.bi-symmetry-horizontal:before{content:"\f5a8"}.bi-symmetry-vertical:before{content:"\f5a9"}.bi-table:before{content:"\f5aa"}.bi-tablet-fill:before{content:"\f5ab"}.bi-tablet-landscape-fill:before{content:"\f5ac"}.bi-tablet-landscape:before{content:"\f5ad"}.bi-tablet:before{content:"\f5ae"}.bi-tag-fill:before{content:"\f5af"}.bi-tag:before{content:"\f5b0"}.bi-tags-fill:before{content:"\f5b1"}.bi-tags:before{content:"\f5b2"}.bi-telegram:before{content:"\f5b3"}.bi-telephone-fill:before{content:"\f5b4"}.bi-telephone-forward-fill:before{content:"\f5b5"}.bi-telephone-forward:before{content:"\f5b6"}.bi-telephone-inbound-fill:before{content:"\f5b7"}.bi-telephone-inbound:before{content:"\f5b8"}.bi-telephone-minus-fill:before{content:"\f5b9"}.bi-telephone-minus:before{content:"\f5ba"}.bi-telephone-outbound-fill:before{content:"\f5bb"}.bi-telephone-outbound:before{content:"\f5bc"}.bi-telephone-plus-fill:before{content:"\f5bd"}.bi-telephone-plus:before{content:"\f5be"}.bi-telephone-x-fill:before{content:"\f5bf"}.bi-telephone-x:before{content:"\f5c0"}.bi-telephone:before{content:"\f5c1"}.bi-terminal-fill:before{content:"\f5c2"}.bi-terminal:before{content:"\f5c3"}.bi-text-center:before{content:"\f5c4"}.bi-text-indent-left:before{content:"\f5c5"}.bi-text-indent-right:before{content:"\f5c6"}.bi-text-left:before{content:"\f5c7"}.bi-text-paragraph:before{content:"\f5c8"}.bi-text-right:before{content:"\f5c9"}.bi-textarea-resize:before{content:"\f5ca"}.bi-textarea-t:before{content:"\f5cb"}.bi-textarea:before{content:"\f5cc"}.bi-thermometer-half:before{content:"\f5cd"}.bi-thermometer-high:before{content:"\f5ce"}.bi-thermometer-low:before{content:"\f5cf"}.bi-thermometer-snow:before{content:"\f5d0"}.bi-thermometer-sun:before{content:"\f5d1"}.bi-thermometer:before{content:"\f5d2"}.bi-three-dots-vertical:before{content:"\f5d3"}.bi-three-dots:before{content:"\f5d4"}.bi-toggle-off:before{content:"\f5d5"}.bi-toggle-on:before{content:"\f5d6"}.bi-toggle2-off:before{content:"\f5d7"}.bi-toggle2-on:before{content:"\f5d8"}.bi-toggles:before{content:"\f5d9"}.bi-toggles2:before{content:"\f5da"}.bi-tools:before{content:"\f5db"}.bi-tornado:before{content:"\f5dc"}.bi-trash-fill:before{content:"\f5dd"}.bi-trash:before{content:"\f5de"}.bi-trash2-fill:before{content:"\f5df"}.bi-trash2:before{content:"\f5e0"}.bi-tree-fill:before{content:"\f5e1"}.bi-tree:before{content:"\f5e2"}.bi-triangle-fill:before{content:"\f5e3"}.bi-triangle-half:before{content:"\f5e4"}.bi-triangle:before{content:"\f5e5"}.bi-trophy-fill:before{content:"\f5e6"}.bi-trophy:before{content:"\f5e7"}.bi-tropical-storm:before{content:"\f5e8"}.bi-truck-flatbed:before{content:"\f5e9"}.bi-truck:before{content:"\f5ea"}.bi-tsunami:before{content:"\f5eb"}.bi-tv-fill:before{content:"\f5ec"}.bi-tv:before{content:"\f5ed"}.bi-twitch:before{content:"\f5ee"}.bi-twitter:before{content:"\f5ef"}.bi-type-bold:before{content:"\f5f0"}.bi-type-h1:before{content:"\f5f1"}.bi-type-h2:before{content:"\f5f2"}.bi-type-h3:before{content:"\f5f3"}.bi-type-italic:before{content:"\f5f4"}.bi-type-strikethrough:before{content:"\f5f5"}.bi-type-underline:before{content:"\f5f6"}.bi-type:before{content:"\f5f7"}.bi-ui-checks-grid:before{content:"\f5f8"}.bi-ui-checks:before{content:"\f5f9"}.bi-ui-radios-grid:before{content:"\f5fa"}.bi-ui-radios:before{content:"\f5fb"}.bi-umbrella-fill:before{content:"\f5fc"}.bi-umbrella:before{content:"\f5fd"}.bi-union:before{content:"\f5fe"}.bi-unlock-fill:before{content:"\f5ff"}.bi-unlock:before{content:"\f600"}.bi-upc-scan:before{content:"\f601"}.bi-upc:before{content:"\f602"}.bi-upload:before{content:"\f603"}.bi-vector-pen:before{content:"\f604"}.bi-view-list:before{content:"\f605"}.bi-view-stacked:before{content:"\f606"}.bi-vinyl-fill:before{content:"\f607"}.bi-vinyl:before{content:"\f608"}.bi-voicemail:before{content:"\f609"}.bi-volume-down-fill:before{content:"\f60a"}.bi-volume-down:before{content:"\f60b"}.bi-volume-mute-fill:before{content:"\f60c"}.bi-volume-mute:before{content:"\f60d"}.bi-volume-off-fill:before{content:"\f60e"}.bi-volume-off:before{content:"\f60f"}.bi-volume-up-fill:before{content:"\f610"}.bi-volume-up:before{content:"\f611"}.bi-vr:before{content:"\f612"}.bi-wallet-fill:before{content:"\f613"}.bi-wallet:before{content:"\f614"}.bi-wallet2:before{content:"\f615"}.bi-watch:before{content:"\f616"}.bi-water:before{content:"\f617"}.bi-whatsapp:before{content:"\f618"}.bi-wifi-1:before{content:"\f619"}.bi-wifi-2:before{content:"\f61a"}.bi-wifi-off:before{content:"\f61b"}.bi-wifi:before{content:"\f61c"}.bi-wind:before{content:"\f61d"}.bi-window-dock:before{content:"\f61e"}.bi-window-sidebar:before{content:"\f61f"}.bi-window:before{content:"\f620"}.bi-wrench:before{content:"\f621"}.bi-x-circle-fill:before{content:"\f622"}.bi-x-circle:before{content:"\f623"}.bi-x-diamond-fill:before{content:"\f624"}.bi-x-diamond:before{content:"\f625"}.bi-x-octagon-fill:before{content:"\f626"}.bi-x-octagon:before{content:"\f627"}.bi-x-square-fill:before{content:"\f628"}.bi-x-square:before{content:"\f629"}.bi-x:before{content:"\f62a"}.bi-youtube:before{content:"\f62b"}.bi-zoom-in:before{content:"\f62c"}.bi-zoom-out:before{content:"\f62d"}.bi-bank:before{content:"\f62e"}.bi-bank2:before{content:"\f62f"}.bi-bell-slash-fill:before{content:"\f630"}.bi-bell-slash:before{content:"\f631"}.bi-cash-coin:before{content:"\f632"}.bi-check-lg:before{content:"\f633"}.bi-coin:before{content:"\f634"}.bi-currency-bitcoin:before{content:"\f635"}.bi-currency-dollar:before{content:"\f636"}.bi-currency-euro:before{content:"\f637"}.bi-currency-exchange:before{content:"\f638"}.bi-currency-pound:before{content:"\f639"}.bi-currency-yen:before{content:"\f63a"}.bi-dash-lg:before{content:"\f63b"}.bi-exclamation-lg:before{content:"\f63c"}.bi-file-earmark-pdf-fill:before{content:"\f63d"}.bi-file-earmark-pdf:before{content:"\f63e"}.bi-file-pdf-fill:before{content:"\f63f"}.bi-file-pdf:before{content:"\f640"}.bi-gender-ambiguous:before{content:"\f641"}.bi-gender-female:before{content:"\f642"}.bi-gender-male:before{content:"\f643"}.bi-gender-trans:before{content:"\f644"}.bi-headset-vr:before{content:"\f645"}.bi-info-lg:before{content:"\f646"}.bi-mastodon:before{content:"\f647"}.bi-messenger:before{content:"\f648"}.bi-piggy-bank-fill:before{content:"\f649"}.bi-piggy-bank:before{content:"\f64a"}.bi-pin-map-fill:before{content:"\f64b"}.bi-pin-map:before{content:"\f64c"}.bi-plus-lg:before{content:"\f64d"}.bi-question-lg:before{content:"\f64e"}.bi-recycle:before{content:"\f64f"}.bi-reddit:before{content:"\f650"}.bi-safe-fill:before{content:"\f651"}.bi-safe2-fill:before{content:"\f652"}.bi-safe2:before{content:"\f653"}.bi-sd-card-fill:before{content:"\f654"}.bi-sd-card:before{content:"\f655"}.bi-skype:before{content:"\f656"}.bi-slash-lg:before{content:"\f657"}.bi-translate:before{content:"\f658"}.bi-x-lg:before{content:"\f659"}.bi-safe:before{content:"\f65a"}.bi-apple:before{content:"\f65b"}.bi-microsoft:before{content:"\f65d"}.bi-windows:before{content:"\f65e"}.bi-behance:before{content:"\f65c"}.bi-dribbble:before{content:"\f65f"}.bi-line:before{content:"\f660"}.bi-medium:before{content:"\f661"}.bi-paypal:before{content:"\f662"}.bi-pinterest:before{content:"\f663"}.bi-signal:before{content:"\f664"}.bi-snapchat:before{content:"\f665"}.bi-spotify:before{content:"\f666"}.bi-stack-overflow:before{content:"\f667"}.bi-strava:before{content:"\f668"}.bi-wordpress:before{content:"\f669"}.bi-vimeo:before{content:"\f66a"}.bi-activity:before{content:"\f66b"}.bi-easel2-fill:before{content:"\f66c"}.bi-easel2:before{content:"\f66d"}.bi-easel3-fill:before{content:"\f66e"}.bi-easel3:before{content:"\f66f"}.bi-fan:before{content:"\f670"}.bi-fingerprint:before{content:"\f671"}.bi-graph-down-arrow:before{content:"\f672"}.bi-graph-up-arrow:before{content:"\f673"}.bi-hypnotize:before{content:"\f674"}.bi-magic:before{content:"\f675"}.bi-person-rolodex:before{content:"\f676"}.bi-person-video:before{content:"\f677"}.bi-person-video2:before{content:"\f678"}.bi-person-video3:before{content:"\f679"}.bi-person-workspace:before{content:"\f67a"}.bi-radioactive:before{content:"\f67b"}.bi-webcam-fill:before{content:"\f67c"}.bi-webcam:before{content:"\f67d"}.bi-yin-yang:before{content:"\f67e"}.bi-bandaid-fill:before{content:"\f680"}.bi-bandaid:before{content:"\f681"}.bi-bluetooth:before{content:"\f682"}.bi-body-text:before{content:"\f683"}.bi-boombox:before{content:"\f684"}.bi-boxes:before{content:"\f685"}.bi-dpad-fill:before{content:"\f686"}.bi-dpad:before{content:"\f687"}.bi-ear-fill:before{content:"\f688"}.bi-ear:before{content:"\f689"}.bi-envelope-check-fill:before{content:"\f68b"}.bi-envelope-check:before{content:"\f68c"}.bi-envelope-dash-fill:before{content:"\f68e"}.bi-envelope-dash:before{content:"\f68f"}.bi-envelope-exclamation-fill:before{content:"\f691"}.bi-envelope-exclamation:before{content:"\f692"}.bi-envelope-plus-fill:before{content:"\f693"}.bi-envelope-plus:before{content:"\f694"}.bi-envelope-slash-fill:before{content:"\f696"}.bi-envelope-slash:before{content:"\f697"}.bi-envelope-x-fill:before{content:"\f699"}.bi-envelope-x:before{content:"\f69a"}.bi-explicit-fill:before{content:"\f69b"}.bi-explicit:before{content:"\f69c"}.bi-git:before{content:"\f69d"}.bi-infinity:before{content:"\f69e"}.bi-list-columns-reverse:before{content:"\f69f"}.bi-list-columns:before{content:"\f6a0"}.bi-meta:before{content:"\f6a1"}.bi-nintendo-switch:before{content:"\f6a4"}.bi-pc-display-horizontal:before{content:"\f6a5"}.bi-pc-display:before{content:"\f6a6"}.bi-pc-horizontal:before{content:"\f6a7"}.bi-pc:before{content:"\f6a8"}.bi-playstation:before{content:"\f6a9"}.bi-plus-slash-minus:before{content:"\f6aa"}.bi-projector-fill:before{content:"\f6ab"}.bi-projector:before{content:"\f6ac"}.bi-qr-code-scan:before{content:"\f6ad"}.bi-qr-code:before{content:"\f6ae"}.bi-quora:before{content:"\f6af"}.bi-quote:before{content:"\f6b0"}.bi-robot:before{content:"\f6b1"}.bi-send-check-fill:before{content:"\f6b2"}.bi-send-check:before{content:"\f6b3"}.bi-send-dash-fill:before{content:"\f6b4"}.bi-send-dash:before{content:"\f6b5"}.bi-send-exclamation-fill:before{content:"\f6b7"}.bi-send-exclamation:before{content:"\f6b8"}.bi-send-fill:before{content:"\f6b9"}.bi-send-plus-fill:before{content:"\f6ba"}.bi-send-plus:before{content:"\f6bb"}.bi-send-slash-fill:before{content:"\f6bc"}.bi-send-slash:before{content:"\f6bd"}.bi-send-x-fill:before{content:"\f6be"}.bi-send-x:before{content:"\f6bf"}.bi-send:before{content:"\f6c0"}.bi-steam:before{content:"\f6c1"}.bi-terminal-dash:before{content:"\f6c3"}.bi-terminal-plus:before{content:"\f6c4"}.bi-terminal-split:before{content:"\f6c5"}.bi-ticket-detailed-fill:before{content:"\f6c6"}.bi-ticket-detailed:before{content:"\f6c7"}.bi-ticket-fill:before{content:"\f6c8"}.bi-ticket-perforated-fill:before{content:"\f6c9"}.bi-ticket-perforated:before{content:"\f6ca"}.bi-ticket:before{content:"\f6cb"}.bi-tiktok:before{content:"\f6cc"}.bi-window-dash:before{content:"\f6cd"}.bi-window-desktop:before{content:"\f6ce"}.bi-window-fullscreen:before{content:"\f6cf"}.bi-window-plus:before{content:"\f6d0"}.bi-window-split:before{content:"\f6d1"}.bi-window-stack:before{content:"\f6d2"}.bi-window-x:before{content:"\f6d3"}.bi-xbox:before{content:"\f6d4"}.bi-ethernet:before{content:"\f6d5"}.bi-hdmi-fill:before{content:"\f6d6"}.bi-hdmi:before{content:"\f6d7"}.bi-usb-c-fill:before{content:"\f6d8"}.bi-usb-c:before{content:"\f6d9"}.bi-usb-fill:before{content:"\f6da"}.bi-usb-plug-fill:before{content:"\f6db"}.bi-usb-plug:before{content:"\f6dc"}.bi-usb-symbol:before{content:"\f6dd"}.bi-usb:before{content:"\f6de"}.bi-boombox-fill:before{content:"\f6df"}.bi-displayport:before{content:"\f6e1"}.bi-gpu-card:before{content:"\f6e2"}.bi-memory:before{content:"\f6e3"}.bi-modem-fill:before{content:"\f6e4"}.bi-modem:before{content:"\f6e5"}.bi-motherboard-fill:before{content:"\f6e6"}.bi-motherboard:before{content:"\f6e7"}.bi-optical-audio-fill:before{content:"\f6e8"}.bi-optical-audio:before{content:"\f6e9"}.bi-pci-card:before{content:"\f6ea"}.bi-router-fill:before{content:"\f6eb"}.bi-router:before{content:"\f6ec"}.bi-thunderbolt-fill:before{content:"\f6ef"}.bi-thunderbolt:before{content:"\f6f0"}.bi-usb-drive-fill:before{content:"\f6f1"}.bi-usb-drive:before{content:"\f6f2"}.bi-usb-micro-fill:before{content:"\f6f3"}.bi-usb-micro:before{content:"\f6f4"}.bi-usb-mini-fill:before{content:"\f6f5"}.bi-usb-mini:before{content:"\f6f6"}.bi-cloud-haze2:before{content:"\f6f7"}.bi-device-hdd-fill:before{content:"\f6f8"}.bi-device-hdd:before{content:"\f6f9"}.bi-device-ssd-fill:before{content:"\f6fa"}.bi-device-ssd:before{content:"\f6fb"}.bi-displayport-fill:before{content:"\f6fc"}.bi-mortarboard-fill:before{content:"\f6fd"}.bi-mortarboard:before{content:"\f6fe"}.bi-terminal-x:before{content:"\f6ff"}.bi-arrow-through-heart-fill:before{content:"\f700"}.bi-arrow-through-heart:before{content:"\f701"}.bi-badge-sd-fill:before{content:"\f702"}.bi-badge-sd:before{content:"\f703"}.bi-bag-heart-fill:before{content:"\f704"}.bi-bag-heart:before{content:"\f705"}.bi-balloon-fill:before{content:"\f706"}.bi-balloon-heart-fill:before{content:"\f707"}.bi-balloon-heart:before{content:"\f708"}.bi-balloon:before{content:"\f709"}.bi-box2-fill:before{content:"\f70a"}.bi-box2-heart-fill:before{content:"\f70b"}.bi-box2-heart:before{content:"\f70c"}.bi-box2:before{content:"\f70d"}.bi-braces-asterisk:before{content:"\f70e"}.bi-calendar-heart-fill:before{content:"\f70f"}.bi-calendar-heart:before{content:"\f710"}.bi-calendar2-heart-fill:before{content:"\f711"}.bi-calendar2-heart:before{content:"\f712"}.bi-chat-heart-fill:before{content:"\f713"}.bi-chat-heart:before{content:"\f714"}.bi-chat-left-heart-fill:before{content:"\f715"}.bi-chat-left-heart:before{content:"\f716"}.bi-chat-right-heart-fill:before{content:"\f717"}.bi-chat-right-heart:before{content:"\f718"}.bi-chat-square-heart-fill:before{content:"\f719"}.bi-chat-square-heart:before{content:"\f71a"}.bi-clipboard-check-fill:before{content:"\f71b"}.bi-clipboard-data-fill:before{content:"\f71c"}.bi-clipboard-fill:before{content:"\f71d"}.bi-clipboard-heart-fill:before{content:"\f71e"}.bi-clipboard-heart:before{content:"\f71f"}.bi-clipboard-minus-fill:before{content:"\f720"}.bi-clipboard-plus-fill:before{content:"\f721"}.bi-clipboard-pulse:before{content:"\f722"}.bi-clipboard-x-fill:before{content:"\f723"}.bi-clipboard2-check-fill:before{content:"\f724"}.bi-clipboard2-check:before{content:"\f725"}.bi-clipboard2-data-fill:before{content:"\f726"}.bi-clipboard2-data:before{content:"\f727"}.bi-clipboard2-fill:before{content:"\f728"}.bi-clipboard2-heart-fill:before{content:"\f729"}.bi-clipboard2-heart:before{content:"\f72a"}.bi-clipboard2-minus-fill:before{content:"\f72b"}.bi-clipboard2-minus:before{content:"\f72c"}.bi-clipboard2-plus-fill:before{content:"\f72d"}.bi-clipboard2-plus:before{content:"\f72e"}.bi-clipboard2-pulse-fill:before{content:"\f72f"}.bi-clipboard2-pulse:before{content:"\f730"}.bi-clipboard2-x-fill:before{content:"\f731"}.bi-clipboard2-x:before{content:"\f732"}.bi-clipboard2:before{content:"\f733"}.bi-emoji-kiss-fill:before{content:"\f734"}.bi-emoji-kiss:before{content:"\f735"}.bi-envelope-heart-fill:before{content:"\f736"}.bi-envelope-heart:before{content:"\f737"}.bi-envelope-open-heart-fill:before{content:"\f738"}.bi-envelope-open-heart:before{content:"\f739"}.bi-envelope-paper-fill:before{content:"\f73a"}.bi-envelope-paper-heart-fill:before{content:"\f73b"}.bi-envelope-paper-heart:before{content:"\f73c"}.bi-envelope-paper:before{content:"\f73d"}.bi-filetype-aac:before{content:"\f73e"}.bi-filetype-ai:before{content:"\f73f"}.bi-filetype-bmp:before{content:"\f740"}.bi-filetype-cs:before{content:"\f741"}.bi-filetype-css:before{content:"\f742"}.bi-filetype-csv:before{content:"\f743"}.bi-filetype-doc:before{content:"\f744"}.bi-filetype-docx:before{content:"\f745"}.bi-filetype-exe:before{content:"\f746"}.bi-filetype-gif:before{content:"\f747"}.bi-filetype-heic:before{content:"\f748"}.bi-filetype-html:before{content:"\f749"}.bi-filetype-java:before{content:"\f74a"}.bi-filetype-jpg:before{content:"\f74b"}.bi-filetype-js:before{content:"\f74c"}.bi-filetype-jsx:before{content:"\f74d"}.bi-filetype-key:before{content:"\f74e"}.bi-filetype-m4p:before{content:"\f74f"}.bi-filetype-md:before{content:"\f750"}.bi-filetype-mdx:before{content:"\f751"}.bi-filetype-mov:before{content:"\f752"}.bi-filetype-mp3:before{content:"\f753"}.bi-filetype-mp4:before{content:"\f754"}.bi-filetype-otf:before{content:"\f755"}.bi-filetype-pdf:before{content:"\f756"}.bi-filetype-php:before{content:"\f757"}.bi-filetype-png:before{content:"\f758"}.bi-filetype-ppt:before{content:"\f75a"}.bi-filetype-psd:before{content:"\f75b"}.bi-filetype-py:before{content:"\f75c"}.bi-filetype-raw:before{content:"\f75d"}.bi-filetype-rb:before{content:"\f75e"}.bi-filetype-sass:before{content:"\f75f"}.bi-filetype-scss:before{content:"\f760"}.bi-filetype-sh:before{content:"\f761"}.bi-filetype-svg:before{content:"\f762"}.bi-filetype-tiff:before{content:"\f763"}.bi-filetype-tsx:before{content:"\f764"}.bi-filetype-ttf:before{content:"\f765"}.bi-filetype-txt:before{content:"\f766"}.bi-filetype-wav:before{content:"\f767"}.bi-filetype-woff:before{content:"\f768"}.bi-filetype-xls:before{content:"\f76a"}.bi-filetype-xml:before{content:"\f76b"}.bi-filetype-yml:before{content:"\f76c"}.bi-heart-arrow:before{content:"\f76d"}.bi-heart-pulse-fill:before{content:"\f76e"}.bi-heart-pulse:before{content:"\f76f"}.bi-heartbreak-fill:before{content:"\f770"}.bi-heartbreak:before{content:"\f771"}.bi-hearts:before{content:"\f772"}.bi-hospital-fill:before{content:"\f773"}.bi-hospital:before{content:"\f774"}.bi-house-heart-fill:before{content:"\f775"}.bi-house-heart:before{content:"\f776"}.bi-incognito:before{content:"\f777"}.bi-magnet-fill:before{content:"\f778"}.bi-magnet:before{content:"\f779"}.bi-person-heart:before{content:"\f77a"}.bi-person-hearts:before{content:"\f77b"}.bi-phone-flip:before{content:"\f77c"}.bi-plugin:before{content:"\f77d"}.bi-postage-fill:before{content:"\f77e"}.bi-postage-heart-fill:before{content:"\f77f"}.bi-postage-heart:before{content:"\f780"}.bi-postage:before{content:"\f781"}.bi-postcard-fill:before{content:"\f782"}.bi-postcard-heart-fill:before{content:"\f783"}.bi-postcard-heart:before{content:"\f784"}.bi-postcard:before{content:"\f785"}.bi-search-heart-fill:before{content:"\f786"}.bi-search-heart:before{content:"\f787"}.bi-sliders2-vertical:before{content:"\f788"}.bi-sliders2:before{content:"\f789"}.bi-trash3-fill:before{content:"\f78a"}.bi-trash3:before{content:"\f78b"}.bi-valentine:before{content:"\f78c"}.bi-valentine2:before{content:"\f78d"}.bi-wrench-adjustable-circle-fill:before{content:"\f78e"}.bi-wrench-adjustable-circle:before{content:"\f78f"}.bi-wrench-adjustable:before{content:"\f790"}.bi-filetype-json:before{content:"\f791"}.bi-filetype-pptx:before{content:"\f792"}.bi-filetype-xlsx:before{content:"\f793"}.bi-1-circle-fill:before{content:"\f796"}.bi-1-circle:before{content:"\f797"}.bi-1-square-fill:before{content:"\f798"}.bi-1-square:before{content:"\f799"}.bi-2-circle-fill:before{content:"\f79c"}.bi-2-circle:before{content:"\f79d"}.bi-2-square-fill:before{content:"\f79e"}.bi-2-square:before{content:"\f79f"}.bi-3-circle-fill:before{content:"\f7a2"}.bi-3-circle:before{content:"\f7a3"}.bi-3-square-fill:before{content:"\f7a4"}.bi-3-square:before{content:"\f7a5"}.bi-4-circle-fill:before{content:"\f7a8"}.bi-4-circle:before{content:"\f7a9"}.bi-4-square-fill:before{content:"\f7aa"}.bi-4-square:before{content:"\f7ab"}.bi-5-circle-fill:before{content:"\f7ae"}.bi-5-circle:before{content:"\f7af"}.bi-5-square-fill:before{content:"\f7b0"}.bi-5-square:before{content:"\f7b1"}.bi-6-circle-fill:before{content:"\f7b4"}.bi-6-circle:before{content:"\f7b5"}.bi-6-square-fill:before{content:"\f7b6"}.bi-6-square:before{content:"\f7b7"}.bi-7-circle-fill:before{content:"\f7ba"}.bi-7-circle:before{content:"\f7bb"}.bi-7-square-fill:before{content:"\f7bc"}.bi-7-square:before{content:"\f7bd"}.bi-8-circle-fill:before{content:"\f7c0"}.bi-8-circle:before{content:"\f7c1"}.bi-8-square-fill:before{content:"\f7c2"}.bi-8-square:before{content:"\f7c3"}.bi-9-circle-fill:before{content:"\f7c6"}.bi-9-circle:before{content:"\f7c7"}.bi-9-square-fill:before{content:"\f7c8"}.bi-9-square:before{content:"\f7c9"}.bi-airplane-engines-fill:before{content:"\f7ca"}.bi-airplane-engines:before{content:"\f7cb"}.bi-airplane-fill:before{content:"\f7cc"}.bi-airplane:before{content:"\f7cd"}.bi-alexa:before{content:"\f7ce"}.bi-alipay:before{content:"\f7cf"}.bi-android:before{content:"\f7d0"}.bi-android2:before{content:"\f7d1"}.bi-box-fill:before{content:"\f7d2"}.bi-box-seam-fill:before{content:"\f7d3"}.bi-browser-chrome:before{content:"\f7d4"}.bi-browser-edge:before{content:"\f7d5"}.bi-browser-firefox:before{content:"\f7d6"}.bi-browser-safari:before{content:"\f7d7"}.bi-c-circle-fill:before{content:"\f7da"}.bi-c-circle:before{content:"\f7db"}.bi-c-square-fill:before{content:"\f7dc"}.bi-c-square:before{content:"\f7dd"}.bi-capsule-pill:before{content:"\f7de"}.bi-capsule:before{content:"\f7df"}.bi-car-front-fill:before{content:"\f7e0"}.bi-car-front:before{content:"\f7e1"}.bi-cassette-fill:before{content:"\f7e2"}.bi-cassette:before{content:"\f7e3"}.bi-cc-circle-fill:before{content:"\f7e6"}.bi-cc-circle:before{content:"\f7e7"}.bi-cc-square-fill:before{content:"\f7e8"}.bi-cc-square:before{content:"\f7e9"}.bi-cup-hot-fill:before{content:"\f7ea"}.bi-cup-hot:before{content:"\f7eb"}.bi-currency-rupee:before{content:"\f7ec"}.bi-dropbox:before{content:"\f7ed"}.bi-escape:before{content:"\f7ee"}.bi-fast-forward-btn-fill:before{content:"\f7ef"}.bi-fast-forward-btn:before{content:"\f7f0"}.bi-fast-forward-circle-fill:before{content:"\f7f1"}.bi-fast-forward-circle:before{content:"\f7f2"}.bi-fast-forward-fill:before{content:"\f7f3"}.bi-fast-forward:before{content:"\f7f4"}.bi-filetype-sql:before{content:"\f7f5"}.bi-fire:before{content:"\f7f6"}.bi-google-play:before{content:"\f7f7"}.bi-h-circle-fill:before{content:"\f7fa"}.bi-h-circle:before{content:"\f7fb"}.bi-h-square-fill:before{content:"\f7fc"}.bi-h-square:before{content:"\f7fd"}.bi-indent:before{content:"\f7fe"}.bi-lungs-fill:before{content:"\f7ff"}.bi-lungs:before{content:"\f800"}.bi-microsoft-teams:before{content:"\f801"}.bi-p-circle-fill:before{content:"\f804"}.bi-p-circle:before{content:"\f805"}.bi-p-square-fill:before{content:"\f806"}.bi-p-square:before{content:"\f807"}.bi-pass-fill:before{content:"\f808"}.bi-pass:before{content:"\f809"}.bi-prescription:before{content:"\f80a"}.bi-prescription2:before{content:"\f80b"}.bi-r-circle-fill:before{content:"\f80e"}.bi-r-circle:before{content:"\f80f"}.bi-r-square-fill:before{content:"\f810"}.bi-r-square:before{content:"\f811"}.bi-repeat-1:before{content:"\f812"}.bi-repeat:before{content:"\f813"}.bi-rewind-btn-fill:before{content:"\f814"}.bi-rewind-btn:before{content:"\f815"}.bi-rewind-circle-fill:before{content:"\f816"}.bi-rewind-circle:before{content:"\f817"}.bi-rewind-fill:before{content:"\f818"}.bi-rewind:before{content:"\f819"}.bi-train-freight-front-fill:before{content:"\f81a"}.bi-train-freight-front:before{content:"\f81b"}.bi-train-front-fill:before{content:"\f81c"}.bi-train-front:before{content:"\f81d"}.bi-train-lightrail-front-fill:before{content:"\f81e"}.bi-train-lightrail-front:before{content:"\f81f"}.bi-truck-front-fill:before{content:"\f820"}.bi-truck-front:before{content:"\f821"}.bi-ubuntu:before{content:"\f822"}.bi-unindent:before{content:"\f823"}.bi-unity:before{content:"\f824"}.bi-universal-access-circle:before{content:"\f825"}.bi-universal-access:before{content:"\f826"}.bi-virus:before{content:"\f827"}.bi-virus2:before{content:"\f828"}.bi-wechat:before{content:"\f829"}.bi-yelp:before{content:"\f82a"}.bi-sign-stop-fill:before{content:"\f82b"}.bi-sign-stop-lights-fill:before{content:"\f82c"}.bi-sign-stop-lights:before{content:"\f82d"}.bi-sign-stop:before{content:"\f82e"}.bi-sign-turn-left-fill:before{content:"\f82f"}.bi-sign-turn-left:before{content:"\f830"}.bi-sign-turn-right-fill:before{content:"\f831"}.bi-sign-turn-right:before{content:"\f832"}.bi-sign-turn-slight-left-fill:before{content:"\f833"}.bi-sign-turn-slight-left:before{content:"\f834"}.bi-sign-turn-slight-right-fill:before{content:"\f835"}.bi-sign-turn-slight-right:before{content:"\f836"}.bi-sign-yield-fill:before{content:"\f837"}.bi-sign-yield:before{content:"\f838"}.bi-ev-station-fill:before{content:"\f839"}.bi-ev-station:before{content:"\f83a"}.bi-fuel-pump-diesel-fill:before{content:"\f83b"}.bi-fuel-pump-diesel:before{content:"\f83c"}.bi-fuel-pump-fill:before{content:"\f83d"}.bi-fuel-pump:before{content:"\f83e"}.bi-0-circle-fill:before{content:"\f83f"}.bi-0-circle:before{content:"\f840"}.bi-0-square-fill:before{content:"\f841"}.bi-0-square:before{content:"\f842"}.bi-rocket-fill:before{content:"\f843"}.bi-rocket-takeoff-fill:before{content:"\f844"}.bi-rocket-takeoff:before{content:"\f845"}.bi-rocket:before{content:"\f846"}.bi-stripe:before{content:"\f847"}.bi-subscript:before{content:"\f848"}.bi-superscript:before{content:"\f849"}.bi-trello:before{content:"\f84a"}.bi-envelope-at-fill:before{content:"\f84b"}.bi-envelope-at:before{content:"\f84c"}.bi-regex:before{content:"\f84d"}.bi-text-wrap:before{content:"\f84e"}.bi-sign-dead-end-fill:before{content:"\f84f"}.bi-sign-dead-end:before{content:"\f850"}.bi-sign-do-not-enter-fill:before{content:"\f851"}.bi-sign-do-not-enter:before{content:"\f852"}.bi-sign-intersection-fill:before{content:"\f853"}.bi-sign-intersection-side-fill:before{content:"\f854"}.bi-sign-intersection-side:before{content:"\f855"}.bi-sign-intersection-t-fill:before{content:"\f856"}.bi-sign-intersection-t:before{content:"\f857"}.bi-sign-intersection-y-fill:before{content:"\f858"}.bi-sign-intersection-y:before{content:"\f859"}.bi-sign-intersection:before{content:"\f85a"}.bi-sign-merge-left-fill:before{content:"\f85b"}.bi-sign-merge-left:before{content:"\f85c"}.bi-sign-merge-right-fill:before{content:"\f85d"}.bi-sign-merge-right:before{content:"\f85e"}.bi-sign-no-left-turn-fill:before{content:"\f85f"}.bi-sign-no-left-turn:before{content:"\f860"}.bi-sign-no-parking-fill:before{content:"\f861"}.bi-sign-no-parking:before{content:"\f862"}.bi-sign-no-right-turn-fill:before{content:"\f863"}.bi-sign-no-right-turn:before{content:"\f864"}.bi-sign-railroad-fill:before{content:"\f865"}.bi-sign-railroad:before{content:"\f866"}.bi-building-add:before{content:"\f867"}.bi-building-check:before{content:"\f868"}.bi-building-dash:before{content:"\f869"}.bi-building-down:before{content:"\f86a"}.bi-building-exclamation:before{content:"\f86b"}.bi-building-fill-add:before{content:"\f86c"}.bi-building-fill-check:before{content:"\f86d"}.bi-building-fill-dash:before{content:"\f86e"}.bi-building-fill-down:before{content:"\f86f"}.bi-building-fill-exclamation:before{content:"\f870"}.bi-building-fill-gear:before{content:"\f871"}.bi-building-fill-lock:before{content:"\f872"}.bi-building-fill-slash:before{content:"\f873"}.bi-building-fill-up:before{content:"\f874"}.bi-building-fill-x:before{content:"\f875"}.bi-building-fill:before{content:"\f876"}.bi-building-gear:before{content:"\f877"}.bi-building-lock:before{content:"\f878"}.bi-building-slash:before{content:"\f879"}.bi-building-up:before{content:"\f87a"}.bi-building-x:before{content:"\f87b"}.bi-buildings-fill:before{content:"\f87c"}.bi-buildings:before{content:"\f87d"}.bi-bus-front-fill:before{content:"\f87e"}.bi-bus-front:before{content:"\f87f"}.bi-ev-front-fill:before{content:"\f880"}.bi-ev-front:before{content:"\f881"}.bi-globe-americas:before{content:"\f882"}.bi-globe-asia-australia:before{content:"\f883"}.bi-globe-central-south-asia:before{content:"\f884"}.bi-globe-europe-africa:before{content:"\f885"}.bi-house-add-fill:before{content:"\f886"}.bi-house-add:before{content:"\f887"}.bi-house-check-fill:before{content:"\f888"}.bi-house-check:before{content:"\f889"}.bi-house-dash-fill:before{content:"\f88a"}.bi-house-dash:before{content:"\f88b"}.bi-house-down-fill:before{content:"\f88c"}.bi-house-down:before{content:"\f88d"}.bi-house-exclamation-fill:before{content:"\f88e"}.bi-house-exclamation:before{content:"\f88f"}.bi-house-gear-fill:before{content:"\f890"}.bi-house-gear:before{content:"\f891"}.bi-house-lock-fill:before{content:"\f892"}.bi-house-lock:before{content:"\f893"}.bi-house-slash-fill:before{content:"\f894"}.bi-house-slash:before{content:"\f895"}.bi-house-up-fill:before{content:"\f896"}.bi-house-up:before{content:"\f897"}.bi-house-x-fill:before{content:"\f898"}.bi-house-x:before{content:"\f899"}.bi-person-add:before{content:"\f89a"}.bi-person-down:before{content:"\f89b"}.bi-person-exclamation:before{content:"\f89c"}.bi-person-fill-add:before{content:"\f89d"}.bi-person-fill-check:before{content:"\f89e"}.bi-person-fill-dash:before{content:"\f89f"}.bi-person-fill-down:before{content:"\f8a0"}.bi-person-fill-exclamation:before{content:"\f8a1"}.bi-person-fill-gear:before{content:"\f8a2"}.bi-person-fill-lock:before{content:"\f8a3"}.bi-person-fill-slash:before{content:"\f8a4"}.bi-person-fill-up:before{content:"\f8a5"}.bi-person-fill-x:before{content:"\f8a6"}.bi-person-gear:before{content:"\f8a7"}.bi-person-lock:before{content:"\f8a8"}.bi-person-slash:before{content:"\f8a9"}.bi-person-up:before{content:"\f8aa"}.bi-scooter:before{content:"\f8ab"}.bi-taxi-front-fill:before{content:"\f8ac"}.bi-taxi-front:before{content:"\f8ad"}.bi-amd:before{content:"\f8ae"}.bi-database-add:before{content:"\f8af"}.bi-database-check:before{content:"\f8b0"}.bi-database-dash:before{content:"\f8b1"}.bi-database-down:before{content:"\f8b2"}.bi-database-exclamation:before{content:"\f8b3"}.bi-database-fill-add:before{content:"\f8b4"}.bi-database-fill-check:before{content:"\f8b5"}.bi-database-fill-dash:before{content:"\f8b6"}.bi-database-fill-down:before{content:"\f8b7"}.bi-database-fill-exclamation:before{content:"\f8b8"}.bi-database-fill-gear:before{content:"\f8b9"}.bi-database-fill-lock:before{content:"\f8ba"}.bi-database-fill-slash:before{content:"\f8bb"}.bi-database-fill-up:before{content:"\f8bc"}.bi-database-fill-x:before{content:"\f8bd"}.bi-database-fill:before{content:"\f8be"}.bi-database-gear:before{content:"\f8bf"}.bi-database-lock:before{content:"\f8c0"}.bi-database-slash:before{content:"\f8c1"}.bi-database-up:before{content:"\f8c2"}.bi-database-x:before{content:"\f8c3"}.bi-database:before{content:"\f8c4"}.bi-houses-fill:before{content:"\f8c5"}.bi-houses:before{content:"\f8c6"}.bi-nvidia:before{content:"\f8c7"}.bi-person-vcard-fill:before{content:"\f8c8"}.bi-person-vcard:before{content:"\f8c9"}.bi-sina-weibo:before{content:"\f8ca"}.bi-tencent-qq:before{content:"\f8cb"}.bi-wikipedia:before{content:"\f8cc"}.bi-alphabet-uppercase:before{content:"\f2a5"}.bi-alphabet:before{content:"\f68a"}.bi-amazon:before{content:"\f68d"}.bi-arrows-collapse-vertical:before{content:"\f690"}.bi-arrows-expand-vertical:before{content:"\f695"}.bi-arrows-vertical:before{content:"\f698"}.bi-arrows:before{content:"\f6a2"}.bi-ban-fill:before{content:"\f6a3"}.bi-ban:before{content:"\f6b6"}.bi-bing:before{content:"\f6c2"}.bi-cake:before{content:"\f6e0"}.bi-cake2:before{content:"\f6ed"}.bi-cookie:before{content:"\f6ee"}.bi-copy:before{content:"\f759"}.bi-crosshair:before{content:"\f769"}.bi-crosshair2:before{content:"\f794"}.bi-emoji-astonished-fill:before{content:"\f795"}.bi-emoji-astonished:before{content:"\f79a"}.bi-emoji-grimace-fill:before{content:"\f79b"}.bi-emoji-grimace:before{content:"\f7a0"}.bi-emoji-grin-fill:before{content:"\f7a1"}.bi-emoji-grin:before{content:"\f7a6"}.bi-emoji-surprise-fill:before{content:"\f7a7"}.bi-emoji-surprise:before{content:"\f7ac"}.bi-emoji-tear-fill:before{content:"\f7ad"}.bi-emoji-tear:before{content:"\f7b2"}.bi-envelope-arrow-down-fill:before{content:"\f7b3"}.bi-envelope-arrow-down:before{content:"\f7b8"}.bi-envelope-arrow-up-fill:before{content:"\f7b9"}.bi-envelope-arrow-up:before{content:"\f7be"}.bi-feather:before{content:"\f7bf"}.bi-feather2:before{content:"\f7c4"}.bi-floppy-fill:before{content:"\f7c5"}.bi-floppy:before{content:"\f7d8"}.bi-floppy2-fill:before{content:"\f7d9"}.bi-floppy2:before{content:"\f7e4"}.bi-gitlab:before{content:"\f7e5"}.bi-highlighter:before{content:"\f7f8"}.bi-marker-tip:before{content:"\f802"}.bi-nvme-fill:before{content:"\f803"}.bi-nvme:before{content:"\f80c"}.bi-opencollective:before{content:"\f80d"}.bi-pci-card-network:before{content:"\f8cd"}.bi-pci-card-sound:before{content:"\f8ce"}.bi-radar:before{content:"\f8cf"}.bi-send-arrow-down-fill:before{content:"\f8d0"}.bi-send-arrow-down:before{content:"\f8d1"}.bi-send-arrow-up-fill:before{content:"\f8d2"}.bi-send-arrow-up:before{content:"\f8d3"}.bi-sim-slash-fill:before{content:"\f8d4"}.bi-sim-slash:before{content:"\f8d5"}.bi-sourceforge:before{content:"\f8d6"}.bi-substack:before{content:"\f8d7"}.bi-threads-fill:before{content:"\f8d8"}.bi-threads:before{content:"\f8d9"}.bi-transparency:before{content:"\f8da"}.bi-twitter-x:before{content:"\f8db"}.bi-type-h4:before{content:"\f8dc"}.bi-type-h5:before{content:"\f8dd"}.bi-type-h6:before{content:"\f8de"}.bi-backpack-fill:before{content:"\f8df"}.bi-backpack:before{content:"\f8e0"}.bi-backpack2-fill:before{content:"\f8e1"}.bi-backpack2:before{content:"\f8e2"}.bi-backpack3-fill:before{content:"\f8e3"}.bi-backpack3:before{content:"\f8e4"}.bi-backpack4-fill:before{content:"\f8e5"}.bi-backpack4:before{content:"\f8e6"}.bi-brilliance:before{content:"\f8e7"}.bi-cake-fill:before{content:"\f8e8"}.bi-cake2-fill:before{content:"\f8e9"}.bi-duffle-fill:before{content:"\f8ea"}.bi-duffle:before{content:"\f8eb"}.bi-exposure:before{content:"\f8ec"}.bi-gender-neuter:before{content:"\f8ed"}.bi-highlights:before{content:"\f8ee"}.bi-luggage-fill:before{content:"\f8ef"}.bi-luggage:before{content:"\f8f0"}.bi-mailbox-flag:before{content:"\f8f1"}.bi-mailbox2-flag:before{content:"\f8f2"}.bi-noise-reduction:before{content:"\f8f3"}.bi-passport-fill:before{content:"\f8f4"}.bi-passport:before{content:"\f8f5"}.bi-person-arms-up:before{content:"\f8f6"}.bi-person-raised-hand:before{content:"\f8f7"}.bi-person-standing-dress:before{content:"\f8f8"}.bi-person-standing:before{content:"\f8f9"}.bi-person-walking:before{content:"\f8fa"}.bi-person-wheelchair:before{content:"\f8fb"}.bi-shadows:before{content:"\f8fc"}.bi-suitcase-fill:before{content:"\f8fd"}.bi-suitcase-lg-fill:before{content:"\f8fe"}.bi-suitcase-lg:before{content:"\f8ff"}.bi-suitcase:before{content:"\f900"}.bi-suitcase2-fill:before{content:"\f901"}.bi-suitcase2:before{content:"\f902"}.bi-vignette:before{content:"\f903"}body{background-color:silver;margin:0;font-family:Arial,sans-serif;color:#303030}a{color:#3498db;text-decoration:none}a:hover{color:gray}.blocks-container{margin:10px;padding:20px;background-color:#343a40;border-radius:5px;color:#fff;word-wrap:break-word;overflow-x:auto;font-size:16px}@media (max-width: 767px){.blocks-container{padding:10px;margin:5px;font-size:14px}}.block-details{display:flex;align-items:center;justify-content:space-between;width:100%;overflow:auto}.previous-button,.next-button{background:#343a40;color:#fff;padding:10px 20px;cursor:pointer;transition:background .3s ease;border-radius:5px;margin:10px}.previous-button:hover,.next-button:hover{background:#3498db}.accordion{background:#424242;color:#fff;border:none;padding:10px 20px;cursor:pointer;transition:background .3s ease;border-radius:5px;margin-bottom:10px}.accordion:hover{background:#3498db}.blocks-table{width:100%;table-layout:auto;overflow-x:auto}.blocks-table th,.blocks-table td{border:1px solid #ddd;padding:8px;text-align:left;border-radius:5px}.blocks-table th{background-color:#1f2428;color:#fff;border-radius:5px}.blocks-table tbody tr:hover{background-color:#1f2428;color:#fff;cursor:pointer}.blocks-table tbody tr.expanded-row{cursor:default;word-wrap:break-word;overflow-x:auto}.blocks-table tbody tr.expanded-row td[colspan="5"] .transaction-details{word-wrap:break-word;overflow-x:auto}.blocks-table th.hash-column,.blocks-table td.hash-column{word-break:break-word;white-space:normal}.transaction-table{width:80%;margin:0 auto}.transaction-table th,.transaction-table td{border:1px solid #ddd;padding:8px;text-align:left}.transaction-table th{background-color:#424242}.expanded-row{background-color:transparent!important;color:inherit!important}.transaction-section{display:inline-block;vertical-align:top}.transaction-box{padding:10px;border:1px solid #ccc;border-radius:5px;margin:5px}.in-section,.out-section{vertical-align:top}.arrow-box{text-align:center;margin-top:20px}.transaction-details{background-color:#1f2428;border-radius:5px;color:#fff;padding:10px;margin-top:10px;display:inline-block;word-break:break-word;overflow:hidden;width:100%;box-sizing:border-box}.transfer-in-info-box,.transfer-out-info-box,.arrow-box{background-color:#343a40;border-radius:10px;margin-top:5px;padding:5px;font-size:.9em;display:block;align-items:center}.transfer-in-info-box{border:2px solid #4CAF50;color:#fff}.transfer-out-info-box{border:2px solid #3498db;color:#fff}.arrow-icon{width:50px;height:auto}.transaction-value-button{padding:2px;border:none;border-radius:3px;cursor:default;background-color:#3498db;color:#fff;display:block}.searched-item{color:#ff0;font-weight:700}.transaction-type-button{padding:5px 10px;border:none;border-radius:3px;margin-top:5px;cursor:pointer;opacity:.7;transition:background-color .3s}.coinbase{background-color:#4caf50;color:#fff}.coinbase:hover{background-color:#45a049;color:#fff}.transfer{background-color:#3498db;color:#fff}.transfer:hover{background-color:#1e87cf;color:#fff}.create-identity{background-color:#f39c12;color:#fff}.create-identity:hover{background-color:#e74c3c;color:#fff}.encrypted-message,.message{background-color:#8b5ef6;color:#fff}.encrypted-message:hover,.message:hover{background-color:#6a1b9a;color:#fff} diff --git a/templates/explorer/index.html b/templates/explorer/index.html index 27b32af9..26874534 100644 --- a/templates/explorer/index.html +++ b/templates/explorer/index.html @@ -1,22 +1,24 @@ - - + +
    - - - - - - + + YadaCoin Explorer + + + + +
    - - + + + + + + diff --git a/yadacoin/app.py b/yadacoin/app.py index e9a9f4b0..7cdd80a1 100644 --- a/yadacoin/app.py +++ b/yadacoin/app.py @@ -1,6 +1,7 @@ -""" +""" Async Yadacoin node poc """ +import asyncio import binascii import importlib import json @@ -115,6 +116,7 @@ class NodeApplication(Application): def __init__(self, test=False): options.parse_command_line(final=False) + self.background_processing_lock = asyncio.Lock() self.init_config(options) self.configure_logging() self.init_config_properties(test=test) @@ -328,133 +330,202 @@ async def background_block_checker(self): """ self.config.app_log.debug("background_block_checker") if not hasattr(self.config, "background_block_checker"): - self.config.background_block_checker = WorkerVars(busy=False, last_send=0) + self.config.background_block_checker = WorkerVars(busy=False, last_send=int(time()), last_block_height=None, last_block_hash=None, first_run=True) + if self.config.background_block_checker.busy: return - self.config.background_block_checker.busy = True - try: - self.config.background_block_checker.last_block_height = 0 - if LatestBlock.block: - self.config.background_block_checker.last_block_height = ( - LatestBlock.block.index - ) - await LatestBlock.block_checker() - if ( - self.config.background_block_checker.last_block_height - != LatestBlock.block.index - ): - self.config.app_log.info( - "Latest block height: %s | time: %s" - % ( - self.config.LatestBlock.block.index, - datetime.fromtimestamp( - int(self.config.LatestBlock.block.time) - ).strftime("%Y-%m-%d %H:%M:%S"), + async with self.background_processing_lock: + self.config.background_block_checker.busy = True + + try: + current_block_index = LatestBlock.block.index + current_block_hash = LatestBlock.block.hash + + if ( + self.config.background_block_checker.last_block_height != current_block_index + or self.config.background_block_checker.last_block_hash != self.config.LatestBlock.block.hash + ): + if self.config.background_block_checker.first_run: + self.config.background_block_checker.first_run = False + synced = False + else: + synced = await Peer.is_synced() + if synced: + self.config.app_log.info( + "Latest block height: %s | time: %s" + % ( + current_block_index, + datetime.fromtimestamp( + int(self.config.LatestBlock.block.time) + ).strftime("%Y-%m-%d %H:%M:%S"), + ) + ) + await self.config.nodeShared.send_block_to_peers( + self.config.LatestBlock.block + ) + try: + await self.config.mp.refresh() + except Exception: + self.config.app_log.warning("{}".format(format_exc())) + + try: + await StratumServer.block_checker() + except Exception: + self.config.app_log.warning("{}".format(format_exc())) + + if not synced: + self.config.app_log.info("Sending a new block prohibited, synchronization in progress") + + self.config.background_block_checker.last_block_height = current_block_index + self.config.background_block_checker.last_block_hash = current_block_hash + + elif int(time()) - self.config.background_block_checker.last_send > 600: + self.config.background_block_checker.last_send = int(time()) + self.config.app_log.info("Time condition met, sending Last Block to peers.") + await self.config.nodeShared.send_block_to_peers( + self.config.LatestBlock.block ) + self.config.health.block_checker.last_activity = int(time()) + except Exception: + self.config.app_log.error(format_exc()) + + try: + if self.config.processing_queues.block_queue.queue: + self.config.processing_queues.block_queue.time_sum_start() + await self.config.consensus.process_block_queue() + self.config.processing_queues.block_queue.time_sum_end() + self.config.health.block_inserter.last_activity = int(time()) + self.config.app_log.debug( + f"block_inserter.last_activity: {self.config.health.block_inserter.last_activity}" ) - await self.config.nodeShared.send_block_to_peers( - self.config.LatestBlock.block - ) - elif int(time()) - self.config.background_block_checker.last_send > 60: - self.config.background_block_checker.last_send = int(time()) - await self.config.nodeShared.send_block_to_peers( - self.config.LatestBlock.block - ) + except: + self.config.app_log.error(format_exc()) + self.config.processing_queues.block_queue.time_sum_end() - self.config.health.block_checker.last_activity = int(time()) - except Exception: - self.config.app_log.error(format_exc()) - self.config.background_block_checker.busy = False + try: + self.config.app_log.debug("Running StratumServer.block_checker()") + await StratumServer.block_checker() + except Exception: + self.config.app_log.warning("Error in StratumServer.block_checker: {}".format(format_exc())) + + self.config.background_block_checker.busy = False async def background_message_sender(self): - self.config.app_log.debug("background_message_sender") + if not hasattr(self.config, "background_message_sender"): self.config.background_message_sender = WorkerVars(busy=False) + if self.config.background_message_sender.busy: + self.config.app_log.info("background_message_sender - Already busy, returning") return + self.config.background_message_sender.busy = True + start_time = int(time()) + try: - for x in self.config.nodeServer.retry_messages.copy(): - message = self.config.nodeServer.retry_messages.get(x) - if not message: - if x in self.config.nodeServer.retry_messages: - del self.config.nodeServer.retry_messages[x] - continue - message.setdefault("retry_attempts", 0) - message["retry_attempts"] += 1 - for peer_cls in list( - self.config.nodeServer.inbound_streams.keys() - ).copy(): - if x[0] in self.config.nodeServer.inbound_streams[peer_cls]: - if message["retry_attempts"] > 3: - for y in self.config.nodeServer.retry_messages.copy(): - if y[0] == x[0]: - del self.config.nodeServer.retry_messages[y] - await self.remove_peer( - self.config.nodeServer.inbound_streams[peer_cls][x[0]], - reason=f"background_message_sender nodeServer {x}", - ) - self.config.app_log.warning( - f"peer removed: background_message_sender nodeServer {x}" - ) - continue - if len(x) > 3: - await self.config.nodeShared.write_result( - self.config.nodeServer.inbound_streams[peer_cls][x[0]], - x[1], - message, - x[3], - ) - else: - await self.config.nodeShared.write_params( - self.config.nodeServer.inbound_streams[peer_cls][x[0]], - x[1], - message, - ) - - for x in self.config.nodeClient.retry_messages.copy(): - message = self.config.nodeClient.retry_messages.get(x) - if not message: - if x in self.config.nodeClient.retry_messages: - del self.config.nodeClient.retry_messages[x] - continue - message.setdefault("retry_attempts", 0) - message["retry_attempts"] += 1 - for peer_cls in list( - self.config.nodeClient.outbound_streams.keys() - ).copy(): - if x[0] in self.config.nodeClient.outbound_streams[peer_cls]: - if message["retry_attempts"] > 3: - for y in self.config.nodeClient.retry_messages.copy(): - if y[0] == x[0]: - del self.config.nodeClient.retry_messages[y] - await self.remove_peer( - self.config.nodeClient.outbound_streams[peer_cls][x[0]], - reason=f"background_message_sender nodeClient {x}", - ) - self.config.app_log.warning( - f"peer removed: background_message_sender nodeClient {x}" - ) - continue - if len(x) > 3: - await self.config.nodeShared.write_result( - self.config.nodeClient.outbound_streams[peer_cls][x[0]], - x[1], - message, - x[3], - ) - else: - await self.config.nodeShared.write_params( - self.config.nodeClient.outbound_streams[peer_cls][x[0]], - x[1], - message, - ) + sent_messages_count = 0 + try: + for x in self.config.nodeServer.retry_messages.copy(): + message = self.config.nodeServer.retry_messages.get(x) + self.config.app_log.debug(f"Processing retry_message for nodeServer: {x}") + if not message: + if x in self.config.nodeServer.retry_messages: + del self.config.nodeServer.retry_messages[x] + continue + message.setdefault("retry_attempts", 0) + message["retry_attempts"] += 1 + for peer_cls in list(self.config.nodeServer.inbound_streams.keys()).copy(): + if x[0] in self.config.nodeServer.inbound_streams[peer_cls]: + if message["retry_attempts"] > 2: + for y in self.config.nodeServer.retry_messages.copy(): + if y[0] == x[0]: + del self.config.nodeServer.retry_messages[y] + await self.remove_peer( + self.config.nodeServer.inbound_streams[peer_cls][x[0]], + reason=f"background_message_sender nodeServer {x}", + ) + self.config.app_log.warning( + f"peer removed: background_message_sender nodeServer {x}" + ) + continue + if len(x) > 3: + await self.config.nodeShared.write_result( + self.config.nodeServer.inbound_streams[peer_cls][x[0]], + x[1], + message, + x[3], + ) + else: + await self.config.nodeShared.write_params( + self.config.nodeServer.inbound_streams[peer_cls][x[0]], + x[1], + message, + ) + sent_messages_count += 1 + except Exception as e: + self.config.app_log.error(f"Error in nodeServer.retry_messages loop: {e}") + self.config.background_message_sender.busy = False + return + + try: + for x in self.config.nodeClient.retry_messages.copy(): + message = self.config.nodeClient.retry_messages.get(x) + self.config.app_log.debug(f"Processing retry_message for nodeClient: {x}") + if not message: + if x in self.config.nodeClient.retry_messages: + del self.config.nodeClient.retry_messages[x] + continue + message.setdefault("retry_attempts", 0) + message["retry_attempts"] += 1 + for peer_cls in list(self.config.nodeClient.outbound_streams.keys()).copy(): + if x[0] in self.config.nodeClient.outbound_streams[peer_cls]: + if message["retry_attempts"] > 2: + for y in self.config.nodeClient.retry_messages.copy(): + if y[0] == x[0]: + if y in self.config.nodeClient.retry_messages: + del self.config.nodeClient.retry_messages[y] + self.config.app_log.info(f"Removed entry for {y} from retry_messages dictionary.") + else: + self.config.app_log.info(f"Entry for {y} does not exist in retry_messages dictionary.") + await self.remove_peer( + self.config.nodeClient.outbound_streams[peer_cls][x[0]], + reason=f"background_message_sender nodeClient {x}", + ) + self.config.app_log.warning( + f"peer removed: background_message_sender nodeClient {x}" + ) + continue + + if len(x) > 3: + await self.config.nodeShared.write_result( + self.config.nodeClient.outbound_streams[peer_cls][x[0]], + x[1], + message, + x[3], + ) + else: + await self.config.nodeShared.write_params( + self.config.nodeClient.outbound_streams[peer_cls][x[0]], + x[1], + message, + ) + sent_messages_count += 1 + except Exception as e: + self.config.app_log.error(f"Error in nodeClient.retry_messages loop: {e}") + self.config.background_message_sender.busy = False + return self.config.health.message_sender.last_activity = int(time()) + + self.config.app_log.debug( + f"background_message_sender - Sent {sent_messages_count} messages. Time elapsed: {int(time()) - start_time} seconds" + ) except Exception: self.config.app_log.error(format_exc()) - self.config.background_message_sender.busy = False + + finally: + self.config.background_message_sender.busy = False async def background_txn_queue_processor(self): self.config.app_log.debug("background_txn_queue_processor") @@ -477,42 +548,46 @@ async def background_txn_queue_processor(self): async def background_block_queue_processor(self): self.config.app_log.debug("background_block_queue_processor") if not hasattr(self.config, "background_block_queue_processor"): - self.config.background_block_queue_processor = WorkerVars(busy=False) + self.config.background_block_queue_processor = WorkerVars(busy=False, consensus_last_activity=int(time())) if self.config.background_block_queue_processor.busy: return - self.config.background_block_queue_processor.busy = True - while True: + async with self.background_processing_lock: + self.config.background_block_queue_processor.busy = True + try: synced = await Peer.is_synced() - skip = False - if self.config.processing_queues.block_queue.queue: - if ( - time() - self.config.health.consensus.last_activity - < CHAIN.FORCE_CONSENSUS_TIME_THRESHOLD - ): - skip = True + skip = True + if time() - self.config.background_block_queue_processor.consensus_last_activity >= 15: + self.config.background_block_queue_processor.consensus_last_activity = int(time()) + skip = False + else: + self.config.app_log.debug(f"Synced: {synced}, Skip: {skip}") if not skip or not synced: await self.config.consensus.sync_bottom_up(synced) + self.config.app_log.debug("Syncing bottom-up.") self.config.health.consensus.last_activity = time() + self.config.app_log.debug( + f"consensus.last_activity: {self.config.health.consensus.last_activity}" + ) except Exception: self.config.app_log.error(format_exc()) - try: - if self.config.processing_queues.block_queue.queue: - if (time() - self.config.health.block_inserter.last_activity) > 1: - self.config.processing_queues.block_queue.time_sum_start() - await self.config.consensus.process_block_queue() - self.config.processing_queues.block_queue.time_sum_end() - self.config.health.block_inserter.last_activity = int(time()) - except: - self.config.app_log.error(format_exc()) - self.config.processing_queues.block_queue.time_sum_end() + self.config.background_block_queue_processor.busy = False + + async def background_pool_info_checker(self): + self.config.app_log.debug("background_pool_info_checker") + if not hasattr(self.config, "background_pool_info_checker"): + self.config.background_pool_info_checker = WorkerVars(busy=False) + if self.config.background_pool_info_checker.busy: + return + self.config.background_pool_info_checker.busy = True + try: + await self.config.mp.update_pool_stats() + #await self.config.mp.update_miners_stats() + except Exception as e: + self.config.app_log.error(f"Error in background_pool_info_checker: {str(e)}") + self.config.background_pool_info_checker.busy = False - synced = await Peer.is_synced() - if not synced: - continue - break - self.config.background_block_queue_processor.busy = False async def background_pool_payer(self): """Responsible for paying miners""" @@ -619,39 +694,58 @@ async def background_mempool_cleaner(self): self.config.background_mempool_cleaner.busy = True try: await self.config.TU.clean_mempool(self.config) - await self.config.TU.rebroadcast_mempool(self.config, include_zero=True) + #await self.config.TU.combine_oldest_transactions(self.config) + await self.config.mp.clean_pool_info() + await self.config.mp.clean_shares() self.config.health.mempool_cleaner.last_activity = int(time()) except Exception: self.config.app_log.error(format_exc()) self.config.background_mempool_cleaner.busy = False + async def background_mempool_sender(self): + """Responsible for rebroadcasting mempool transactions""" + self.config.app_log.debug("background_mempool_sender") + + if not hasattr(self.config, "background_mempool_sender"): + self.config.background_mempool_sender = WorkerVars(busy=False) + + if self.config.background_mempool_sender.busy: + return + + self.config.background_mempool_sender.busy = True + + try: + await self.config.TU.rebroadcast_mempool( + self.config, NodeRPC.confirmed_peers, include_zero=True + ) + except Exception: + self.config.app_log.error(format_exc()) + self.config.background_mempool_sender.busy = False + async def background_nonce_processor(self): """Responsible for processing all share submissions from miners""" - self.config.app_log.debug("background_nonce_processor") + self.config.app_log.warning("background_nonce_processor") if not hasattr(self.config, "background_nonce_processor"): self.config.background_nonce_processor = WorkerVars(busy=False) if self.config.background_nonce_processor.busy: + self.config.app_log.debug("background_nonce_processor - busy") return self.config.background_nonce_processor.busy = True try: - if self.config.processing_queues.nonce_queue.queue: - self.config.processing_queues.nonce_queue.time_sum_start() - await self.config.mp.process_nonce_queue() - self.config.processing_queues.nonce_queue.time_sum_end() - self.config.health.nonce_processor.last_activity = int(time()) + await self.config.mp.process_nonce_queue() except: self.config.app_log.error(format_exc()) - self.config.processing_queues.nonce_queue.time_sum_end() self.config.background_nonce_processor.busy = False + def configure_logging(self): # tornado.log.enable_pretty_logging() self.config.app_log = logging.getLogger("tornado.application") tornado.log.enable_pretty_logging(logger=self.config.app_log) logfile = path.abspath("yada_app.log") # Rotate log after reaching 512K, keep 5 old copies. - rotateHandler = RotatingFileHandler(logfile, "a", 512 * 1024, 5) + rotateHandler = RotatingFileHandler(logfile, "a", 5 * 1024 * 1024, 10) formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s") rotateHandler.setFormatter(formatter) self.config.app_log.addHandler(rotateHandler) @@ -740,6 +834,10 @@ def init_ioloop(self): self.background_mempool_cleaner, self.config.mempool_cleaner_wait * 1000 ).start() + PeriodicCallback( + self.background_mempool_sender, self.config.mempool_sender_wait * 1000 + ).start() + PeriodicCallback( self.background_txn_queue_processor, self.config.txn_queue_processor_wait * 1000, @@ -764,6 +862,12 @@ def init_ioloop(self): self.config.nonce_processor_wait * 1000, ).start() + PeriodicCallback( + self.background_pool_info_checker, + self.config.pool_info_checker_wait * 1000 + ).start() + + if self.config.pool_payout: self.config.app_log.info("PoolPayout activated") self.config.pp = PoolPayer() @@ -771,8 +875,8 @@ def init_ioloop(self): PeriodicCallback( self.background_pool_payer, self.config.pool_payer_wait * 1000 ).start() - while True: - tornado.ioloop.IOLoop.current().start() + + tornado.ioloop.IOLoop.current().start() def init_jwt(self): jwt_key = EccKey(curve="p256", d=int(self.config.private_key, 16)) diff --git a/yadacoin/core/block.py b/yadacoin/core/block.py index b77f39f3..072c8697 100644 --- a/yadacoin/core/block.py +++ b/yadacoin/core/block.py @@ -6,6 +6,7 @@ from datetime import timedelta from decimal import Decimal, getcontext from logging import getLogger +from cachetools import TTLCache from bitcoin.signmessage import BitcoinMessage, VerifyMessage from bitcoin.wallet import P2PKHBitcoinAddress @@ -22,11 +23,14 @@ from yadacoin.core.transaction import ( InvalidTransactionException, Output, + TotalValueMismatchException, Transaction, TransactionAddressInvalidException, ) from yadacoin.core.transactionutils import TU +cache = TTLCache(maxsize=1, ttl=21600) + def quantize_eight(value): getcontext().prec = len(str(value)) + 8 @@ -78,6 +82,7 @@ class UnknownOutputAddressException(Exception): class Block(object): + last_generated_block = None # Memory optimization __slots__ = ( "app_log", @@ -155,7 +160,6 @@ async def init_async( for txn in transactions or []: transaction = Transaction.ensure_instance(txn) transaction.coinbase = Block.is_coinbase(self, transaction) - transaction.contract_generated = await transaction.is_contract_generated() self.transactions.append(transaction) return self @@ -194,13 +198,15 @@ async def generate( transaction_objs = [] fee_sum = 0.0 + masternode_fee_sum = 0.0 used_sigs = [] used_inputs = {} regular_txns = [] generated_txns = [] + for x in transactions: x = Transaction.ensure_instance(x) - if await x.is_contract_generated(): + if await x.contract_generated: generated_txns.append(x) else: regular_txns.append(x) @@ -216,6 +222,11 @@ async def generate( fee_sum = sum( [float(transaction_obj.fee) for transaction_obj in transaction_objs] ) + + masternode_fee_sum = sum( + float(transaction_obj.masternode_fee) for transaction_obj in transaction_objs + ) + block_reward = CHAIN.get_block_reward(index) if index >= CHAIN.PAY_MASTER_NODES_FORK: @@ -230,29 +241,42 @@ async def generate( } ) ] - masternode_reward_total = block_reward * 0.1 + masternode_reward_total = (block_reward * 0.1) + float(masternode_fee_sum) - successful_nodes = [] - for node in nodes: - from tornado.tcpclient import TCPClient + successful_nodes = cache.get("successful_nodes") - try: - stream = await TCPClient().connect( - node.host, node.port, timeout=timedelta(seconds=1) - ) - except StreamClosedError: - config.app_log.warning( - f"Stream closed exception in block generate: testing masternode {node.host}:{node.port}" - ) - except TimeoutError: - config.app_log.warning( - f"Timeout exception in block generate: testing masternode {node.host}:{node.port}" - ) - except Exception: - config.app_log.warning( - f"Unhandled exception in block generate: testing masternode {node.host}:{node.port}" - ) - successful_nodes.append(node) + if successful_nodes is None: + config.app_log.info("Cache is empty, perform the testing of nodes and save the result in the cache.") + successful_nodes = [] + + for node in nodes: + from tornado.tcpclient import TCPClient + + try: + stream = await TCPClient().connect( + node.host, node.port, timeout=timedelta(seconds=1) + ) + successful_nodes.append(node) + stream.close() + except StreamClosedError: + config.app_log.warning( + f"Stream closed exception in block generate: testing masternode {node.host}:{node.port}" + ) + except TimeoutError: + config.app_log.warning( + f"Timeout exception in block generate: testing masternode {node.host}:{node.port}" + ) + except Exception as e: + config.app_log.warning( + f"Unhandled exception in block generate: testing masternode {node.host}:{node.port} - {str(e)}" + ) + + if not successful_nodes: + config.app_log.info("No successful nodes found, using full list of nodes.") + successful_nodes = nodes + + config.app_log.info("Save the result in cache.") + cache["successful_nodes"] = successful_nodes masternode_reward_divided = masternode_reward_total / len(successful_nodes) for successful_node in successful_nodes: @@ -297,6 +321,7 @@ async def generate( public_key=public_key, target=target, ) + cls.last_generated_block = block txn_hashes = block.get_transaction_hashes() block.set_merkle_root(txn_hashes) block.header = block.generate_header() @@ -320,7 +345,19 @@ async def validate_transactions( "duplicate transaction found and removed" ) - await transaction_obj.verify() + check_max_inputs = False + if index > CHAIN.CHECK_MAX_INPUTS_FORK: + check_max_inputs = True + + check_masternode_fee = False + if index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + check_masternode_fee = True + + await transaction_obj.verify( + check_max_inputs=check_max_inputs, + check_masternode_fee=check_masternode_fee, + ) + for output in transaction_obj.outputs: if not config.address_is_valid(output.to): raise TransactionAddressInvalidException( @@ -540,6 +577,7 @@ async def verify(self): # verify reward coinbase_sum = 0 fee_sum = 0.0 + masternode_fee_sum = 0.0 masternode_sums = {} for txn in self.transactions: if int(self.index) >= CHAIN.TXN_V3_FORK and int(txn.version) < 3: @@ -571,7 +609,7 @@ async def verify(self): else: for output in txn.outputs: coinbase_sum += float(output.value) - elif txn.contract_generated: + elif await txn.contract_generated: if self.index >= CHAIN.TXN_V3_FORK_CHECK_MINER_SIGNATURE: result = verify_signature( base64.b64decode(txn.miner_signature), @@ -593,8 +631,12 @@ async def verify(self): ], ) fee_sum += float(txn.fee) + if self.index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + masternode_fee_sum += float(txn.masternode_fee) else: fee_sum += float(txn.fee) + if self.index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + masternode_fee_sum += float(txn.masternode_fee) reward = CHAIN.get_block_reward(self.index) @@ -605,13 +647,29 @@ async def verify(self): Integrate block error 1 ('Coinbase output total does not equal block reward + transaction fees', 0.020999999999999998, 0.021000000000000796) """ - if self.index >= CHAIN.PAY_MASTER_NODES_FORK: + if self.index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + masternode_sum = sum(x for x in masternode_sums.values()) + print( + f"here6.1 - {quantize_eight(fee_sum + masternode_fee_sum)} - {quantize_eight((coinbase_sum + masternode_sum) - reward)}" + ) + if quantize_eight(fee_sum + masternode_fee_sum) != quantize_eight( + (coinbase_sum + masternode_sum) - reward + ): + print(f"here6.2 - {self.index}") + print(fee_sum, masternode_fee_sum, masternode_sum, coinbase_sum, reward) + raise TotalValueMismatchException( + "Masternode output totals do not equal block reward + masternode transaction fees", + masternode_fee_sum, + (masternode_sum - reward), + ) + + elif self.index >= CHAIN.PAY_MASTER_NODES_FORK: masternode_sum = sum(x for x in masternode_sums.values()) if quantize_eight(fee_sum) != quantize_eight( (coinbase_sum + masternode_sum) - reward ): print(fee_sum, coinbase_sum, reward) - raise Exception( + raise TotalValueMismatchException( "Coinbase output total does not equal block reward + transaction fees", fee_sum, (coinbase_sum - reward), @@ -620,7 +678,7 @@ async def verify(self): else: if quantize_eight(fee_sum) != quantize_eight(coinbase_sum - reward): print(fee_sum, coinbase_sum, reward) - raise Exception( + raise TotalValueMismatchException( "Coinbase output total does not equal block reward + transaction fees", fee_sum, (coinbase_sum - reward), diff --git a/yadacoin/core/blockchain.py b/yadacoin/core/blockchain.py index f1c98ffa..0bffcbad 100644 --- a/yadacoin/core/blockchain.py +++ b/yadacoin/core/blockchain.py @@ -171,6 +171,14 @@ async def test_block(block, extra_blocks=[], simulate_last_block=None): if block.index >= 35200 and delta_t < 600 and block.special_min: return False + check_max_inputs = False + if block.index > CHAIN.CHECK_MAX_INPUTS_FORK: + check_max_inputs = True + + check_masternode_fee = False + if block.index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + check_masternode_fee = True + used_inputs = {} i = 0 async for transaction in Blockchain.get_txns(block.transactions): @@ -179,7 +187,10 @@ async def test_block(block, extra_blocks=[], simulate_last_block=None): config.app_log.info("verifying txn: {} block: {}".format(i, block.index)) i += 1 try: - await transaction.verify() + await transaction.verify( + check_max_inputs=check_max_inputs, + check_masternode_fee=check_masternode_fee, + ) except InvalidTransactionException as e: config.app_log.warning(e) return False @@ -319,8 +330,20 @@ async def find_error_block(self): last_block = None async for block in self.blocks: await block.verify() + + check_max_inputs = False + if block.index > CHAIN.CHECK_MAX_INPUTS_FORK: + check_max_inputs = True + + check_masternode_fee = False + if block.index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + check_masternode_fee = True + for txn in block.transactions: - await txn.verify() + await txn.verify( + check_max_inputs=check_max_inputs, + check_masternode_fee=check_masternode_fee, + ) if last_block: if int(block.index) - int(last_block.index) > 1: return last_block.index + 1 diff --git a/yadacoin/core/blockchainutils.py b/yadacoin/core/blockchainutils.py index dc96e919..0c9417a5 100644 --- a/yadacoin/core/blockchainutils.py +++ b/yadacoin/core/blockchainutils.py @@ -188,7 +188,7 @@ async def get_wallet_unspent_transactions(self, address, ids=None, no_zeros=Fals unspent_txns_query.extend( [ {"$match": {"transactions.id": {"$nin": list(spent_ids)}}}, - {"$sort": {"transactions.outputs.value": 1}}, + {"$sort": {"transactions.time": 1}}, # Change sorting on time ] ) @@ -201,6 +201,38 @@ async def get_wallet_unspent_transactions(self, address, ids=None, no_zeros=Fals ] yield unspent_txn["transactions"] + async def get_wallet_masternode_fees_paid_transactions( + self, public_key, from_block + ): + query = [ + { + "$match": { + "index": {"$gte": from_block}, + "transactions.public_key": public_key, + }, + }, + {"$unwind": "$transactions"}, + { + "$match": { + "transactions.public_key": public_key, + "transactions.masternode_fee": {"$gt": 0}, + }, + }, + ] + # Return the cursor directly without awaiting it + + txns = self.config.mongo.async_db.blocks.aggregate(query) + async for txn in txns: + yield txn + + async def get_masternode_fees_paid_sum(self, public_key, from_block): + sum = 0 + async for txn in self.get_wallet_masternode_fees_paid_transactions( + public_key, from_block + ): + sum += txn["transactions"]["masternode_fee"] + return sum + async def get_transactions( self, wif, query, queryType, raw=False, both=True, skip=None ): diff --git a/yadacoin/core/chain.py b/yadacoin/core/chain.py index 01616062..78b614af 100644 --- a/yadacoin/core/chain.py +++ b/yadacoin/core/chain.py @@ -73,6 +73,10 @@ class CHAIN(object): FORCE_CONSENSUS_TIME_THRESHOLD = 30 + MAX_INPUTS = 100 + CHECK_MAX_INPUTS_FORK = 463590 + CHECK_MASTERNODE_FEE_FORK = 507500 + @classmethod def target_block_time(cls, network: str): """What is the target block time for a specific network?""" diff --git a/yadacoin/core/config.py b/yadacoin/core/config.py index 3f91e9c0..ba72f60b 100644 --- a/yadacoin/core/config.py +++ b/yadacoin/core/config.py @@ -122,10 +122,13 @@ def __init__(self, config=None): self.shares_required = config.get("shares_required", False) self.pool_payout = config.get("pool_payout", False) self.pool_take = config.get("pool_take", 0.01) - self.payout_frequency = config.get("payout_frequency", 6) + self.payout_scheme = config.get("payout_scheme", "pplns") + self.payout_frequency = config.get("payout_frequency", 300) # unused anymore self.max_miners = config.get("max_miners", 100) self.max_peers = config.get("max_peers", 20) self.pool_diff = config.get("pool_diff", 100000) + self.expected_share_time = config.get("expected_share_time", 25) # expected share time in seconds. For example: if you set 20, the target difficulty for the miner will be set to reach one share every 25 seconds. + self.block_confirmation = config.get("block_confirmation", 12) self.restrict_graph_api = config.get("restrict_graph_api", False) @@ -141,17 +144,20 @@ def __init__(self, config=None): self.peers_wait = config.get("peers_wait", 3) self.status_wait = config.get("status_wait", 10) - self.txn_queue_processor_wait = config.get("txn_queue_processor_wait", 10) - self.block_queue_processor_wait = config.get("block_queue_processor_wait", 10) - self.block_checker_wait = config.get("block_checker_wait", 1) + self.txn_queue_processor_wait = config.get("txn_queue_processor_wait", 1) + self.block_queue_processor_wait = config.get("block_queue_processor_wait", 1) + self.block_checker_wait = config.get("block_checker_wait", 2) self.message_sender_wait = config.get("message_sender_wait", 10) - self.pool_payer_wait = config.get("pool_payer_wait", 120) + self.pool_payer_wait = config.get("pool_payer_wait", 1800) + self.pool_info_checker_wait = config.get("pool_info_checker_wait", 30) self.cache_validator_wait = config.get("cache_validator_wait", 30) self.mempool_cleaner_wait = config.get("mempool_cleaner_wait", 1200) + self.mempool_sender_wait = config.get("mempool_sender_wait", 180) self.nonce_processor_wait = config.get("nonce_processor_wait", 1) self.mongo_query_timeout = config.get("mongo_query_timeout", 30000) - self.http_request_timeout = config.get("http_request_timeout", 3000) + self.http_request_timeout = config.get("http_request_timeout", 60) + self.masternode_fee_minimum = config.get("masternode_fee_minimum", 1) for key, val in config.items(): if not hasattr(self, key): @@ -327,7 +333,9 @@ def generate( "shares_required": False, "pool_payout": False, "pool_take": 0.01, - "payout_frequency": 6, + "pool_payer_wait": 1800, + "pool_info_checker_wait": 30, + "block_confirmation": 12, "max_miners": 100, "max_peers": 20, "pool_diff": 100000, @@ -392,10 +400,13 @@ def from_dict(cls, config): cls.shares_required = config.get("shares_required", False) cls.pool_payout = config.get("pool_payout", False) cls.pool_take = config.get("pool_take", 0.01) - cls.payout_frequency = config.get("payout_frequency", 6) + cls.payout_scheme = config.get("payout_scheme", "pplns") + cls.payout_frequency = config.get("payout_frequency", 300) # unused anymore cls.max_miners = config.get("max_miners", 100) cls.max_peers = config.get("max_peers", 20) cls.pool_diff = config.get("pool_diff", 100000) + cls.expected_share_time = config.get("expected_share_time", 25) + cls.block_confirmation = config.get("block_confirmation", 12) cls.restrict_graph_api = config.get("restrict_graph_api", False) @@ -414,17 +425,20 @@ def from_dict(cls, config): cls.peers_wait = config.get("peers_wait", 3) cls.status_wait = config.get("status_wait", 10) - cls.txn_queue_processor_wait = config.get("txn_queue_processor_wait", 10) - cls.block_queue_processor_wait = config.get("block_queue_processor_wait", 10) - cls.block_checker_wait = config.get("block_checker_wait", 1) + cls.txn_queue_processor_wait = config.get("txn_queue_processor_wait", 1) + cls.block_queue_processor_wait = config.get("block_queue_processor_wait", 1) + cls.block_checker_wait = config.get("block_checker_wait", 2) cls.message_sender_wait = config.get("message_sender_wait", 10) - cls.pool_payer_wait = config.get("pool_payer_wait", 120) + cls.pool_payer_wait = config.get("pool_payer_wait", 1800) + cls.pool_info_checker_wait = config.get("pool_info_checker_wait", 30) cls.cache_validator_wait = config.get("cache_validator_wait", 30) cls.mempool_cleaner_wait = config.get("mempool_cleaner_wait", 1200) + cls.mempool_sender_wait = config.get("mempool_sender_wait", 180) cls.nonce_processor_wait = config.get("nonce_processor_wait", 1) cls.mongo_query_timeout = config.get("mongo_query_timeout", 3000) - cls.http_request_timeout = config.get("http_request_timeout", 3000) + cls.http_request_timeout = config.get("http_request_timeout", 60) + cls.masternode_fee_minimum = config.get("masternode_fee_minimum", 1) @staticmethod def address_is_valid(address): diff --git a/yadacoin/core/consensus.py b/yadacoin/core/consensus.py index 1e836ed4..dbe215d3 100644 --- a/yadacoin/core/consensus.py +++ b/yadacoin/core/consensus.py @@ -4,6 +4,7 @@ import datetime import json import logging +import asyncio from time import time from traceback import format_exc @@ -15,6 +16,7 @@ from yadacoin.core.config import Config from yadacoin.core.processingqueue import BlockProcessingQueueItem from yadacoin.tcpsocket.pool import StratumServer +from yadacoin.core.peer import Peer class Consensus(object): @@ -131,22 +133,24 @@ async def process_block_queue_item(self, item): return if block.index > (self.config.LatestBlock.block.index + 100): + difference = block.index - self.config.LatestBlock.block.index self.config.app_log.info( - "newblock, block index greater than latest block + 100" + f"Received a new block with index {block.index}. Remaining blocks to synchronize: {difference}" ) return if block.index < self.config.LatestBlock.block.index: - await self.config.nodeShared.write_params( - stream, - "newblock", - {"payload": {"block": self.config.LatestBlock.block.to_dict()}}, - ) self.config.app_log.info( f"block index less than our latest block index: {block.index} < {self.config.LatestBlock.block.index} | {stream.peer.identity.to_dict}" ) return + if block.signature == self.config.LatestBlock.block.signature and block.index == self.config.LatestBlock.block.index: + self.config.app_log.info( + "Received block is the same as the latest block" + ) + return + if not await self.config.consensus.insert_consensus_block( block, stream.peer ): @@ -200,23 +204,35 @@ async def insert_consensus_block(self, block, peer): existing = await self.mongo.async_db.consensus.find_one( { "index": block.index, - "peer.rid": peer.rid, "id": block.signature, } ) + if existing: + self.app_log.debug( + "Block with index %s, id %s already exists in consensus." + % (block.index, block.signature) + ) return True + try: await block.verify() - except: + except Exception as e: + self.app_log.error( + "Failed to verify block with index %s, id %s for peer %s: %s" + % (block.index, block.signature, peer.to_string(), str(e)) + ) return False - self.app_log.info( - "inserting new consensus block for height and peer: %s %s" - % (block.index, peer.to_string()) + + self.app_log.debug( + "Inserting new consensus block for index %s, id %s for peer %s." + % (block.index, block.signature, peer.to_string()) ) + await self.mongo.async_db.consensus.delete_many( - {"index": block.index, "peer.rid": peer.rid} + {"index": block.index} ) + await self.mongo.async_db.consensus.insert_one( { "block": block.to_dict(), @@ -225,6 +241,7 @@ async def insert_consensus_block(self, block, peer): "peer": peer.to_dict(), } ) + return True async def sync_bottom_up(self, synced): @@ -256,7 +273,7 @@ async def sync_bottom_up(self, synced): latest_consensus = await Block.from_dict(latest_consensus["block"]) if self.debug: self.app_log.info( - "Latest consensus_block {}".format(latest_consensus.index) + f"Latest consensus_block {latest_consensus.index}" ) records = await self.mongo.async_db.consensus.find( @@ -274,7 +291,7 @@ async def sync_bottom_up(self, synced): self.config.processing_queues.block_queue.add( BlockProcessingQueueItem(Blockchain(record["block"]), stream) ) - + self.app_log.info("Synchronization from bottom to top completed successfully.") return True else: # this path is for syncing only. @@ -284,8 +301,9 @@ async def sync_bottom_up(self, synced): # getblocks <--- rpc request # blocksresponse <--- rpc response # process_block_queue - if (time() - self.last_network_search) > 30 or not synced: + if (time() - self.last_network_search) >= 15 or not synced: self.last_network_search = time() + self.app_log.debug("Calling search_network_for_new") return await self.search_network_for_new() async def search_network_for_new(self): @@ -301,10 +319,12 @@ async def search_network_for_new(self): try: peer.syncing = True await self.request_blocks(peer) + except StreamClosedError: peer.close() except Exception as e: self.config.app_log.warning(e) + break self.config.health.consensus.last_activity = time() async def request_blocks(self, peer): @@ -510,15 +530,8 @@ async def insert_block(self, block, stream): self.app_log.info("New block inserted for height: {}".format(block.index)) if self.config.mp: - if self.syncing or (hasattr(stream, "syncing") and stream.syncing): - return True - try: - await self.config.mp.refresh() - except Exception: - self.app_log.warning("{}".format(format_exc())) - try: - await StratumServer.block_checker() + await self.config.mp.update_block_status() except Exception: self.app_log.warning("{}".format(format_exc())) @@ -526,4 +539,4 @@ async def insert_block(self, block, stream): except Exception: from traceback import format_exc - self.app_log.warning("{}".format(format_exc())) + self.app_log.warning("{}".format(format_exc())) \ No newline at end of file diff --git a/yadacoin/core/health.py b/yadacoin/core/health.py index 81575589..34fbf64a 100644 --- a/yadacoin/core/health.py +++ b/yadacoin/core/health.py @@ -50,7 +50,7 @@ async def check_health(self): return self.report_status(False) for stream in streams: - if time.time() - stream.last_activity > 720: + if time.time() - stream.last_activity > 1200: await self.config.node_server_instance.remove_peer( stream, reason="Stale stream detected in TCPServer, peer removed" ) @@ -174,6 +174,10 @@ async def check_health(self): class PoolPayerHealth(HealthItem): + def __init__(self): + super().__init__() + self.config = Config() + self.timeout = self.config.pool_payer_wait + 20 async def check_health(self): if not self.config.pp: return self.report_status(True, ignore=True) @@ -238,13 +242,13 @@ def __init__(self): self.health_items.append(self.nonce_processor) async def check_health(self): + status = True for x in self.health_items: if not await x.check_health() and not x.ignore: await x.reset() - self.status = False - return False - self.status = True - return True + status = False + self.status = status + return self.status def to_dict(self): out = {x.__class__.__name__: x.to_dict() for x in self.health_items} diff --git a/yadacoin/core/job.py b/yadacoin/core/job.py index 7059f981..6c175d1d 100644 --- a/yadacoin/core/job.py +++ b/yadacoin/core/job.py @@ -2,20 +2,22 @@ class Job: @classmethod async def from_dict(cls, job): inst = cls() - inst.id = job["job_id"] + inst.id = job["peer_id"] + inst.job_id = job["job_id"] inst.diff = job["difficulty"] inst.target = job["target"] inst.blob = job["blob"] + inst.header = job["header"] inst.seed_hash = job["seed_hash"] inst.index = job["height"] - inst.extra_nonce = job["extra_nonce"] inst.algo = job["algo"] + inst.extra_nonce = job["extra_nonce"] + inst.miner_diff = job["miner_diff"] return inst def to_dict(self): return { - "job_id": self.id, - "difficulty": self.diff, + "job_id": self.job_id, "target": self.target, "blob": self.blob, "seed_hash": self.seed_hash, diff --git a/yadacoin/core/latestblock.py b/yadacoin/core/latestblock.py index 25271474..ace66abe 100644 --- a/yadacoin/core/latestblock.py +++ b/yadacoin/core/latestblock.py @@ -1,9 +1,16 @@ +import time + from yadacoin.core.config import Config +from yadacoin.core.chain import CHAIN class LatestBlock: config = None block = None + blocktemplate_target = None + blocktemplate_time = None + blocktemplate_index = None + blocktemplate_hash = None @classmethod async def set_config(cls): @@ -38,3 +45,48 @@ async def get_latest_block(cls): return await Block.from_dict(block) else: cls.block = None + + @classmethod + async def get_block_template(cls): + from yadacoin.core.block import Block + if not cls.block: + await cls.update_latest_block() + + if cls.block: + try: + #cls.config.app_log.info(f"Block version: {cls.block.version}") + #cls.config.app_log.info(f"Block hash: {cls.block.hash}") + #cls.config.app_log.info(f"Block index: {cls.block.index}") + #cls.config.app_log.info(f"Block time: {cls.block.time}") + #cls.config.app_log.info(f"Block transactions: {cls.block.transactions}") + + if (cls.block.hash != cls.blocktemplate_hash or cls.block.index != cls.blocktemplate_index): + cls.blocktemplate_time = int(time.time()) + + new_block = await Block.init_async( + version=cls.block.version, + block_time=cls.blocktemplate_time, + block_index=cls.block.index + 1, + prev_hash=cls.block.hash, + ) + + cls.blocktemplate_target = await CHAIN.get_target_10min(cls.block, new_block) + + cls.blocktemplate_index = cls.block.index + cls.blocktemplate_hash = cls.block.hash + + target_hex = hex(cls.blocktemplate_target)[2:].rjust(64, '0') + + return { + "version": cls.block.version, + "prev_hash": cls.block.hash, + "index": cls.block.index, + "target": target_hex, + "time": cls.blocktemplate_time + } + except Exception as e: + cls.config.app_log.error(f"Error calculating block template: {e}") + raise e + else: + cls.config.app_log.error("No block found when trying to get block template.") + return None \ No newline at end of file diff --git a/yadacoin/core/miner.py b/yadacoin/core/miner.py index bdb39a4e..a7b6b7c0 100644 --- a/yadacoin/core/miner.py +++ b/yadacoin/core/miner.py @@ -1,17 +1,29 @@ +import time import random import string +from logging import getLogger from yadacoin.core.peer import Miner as MinerBase - class Miner(MinerBase): address = "" address_only = "" agent = "" - id_attribute = "address_only" + custom_diff = "" + miner_diff = "" + id_attribute = "peer_id" - def __init__(self, address, agent=""): + def __init__(self, address, agent="", custom_diff="", peer_id="", miner_diff=""): super(Miner, self).__init__() + self.miner_diff = miner_diff + self.shares_history = [] + self.agent = agent + self.peer_id = peer_id + self.miner_diff = miner_diff + if "@" in address: + parts = address.split("@") + address = parts[0] + self.custom_diff = int(parts[1]) if len(parts) > 1 else 0 if "." in address: self.address = address self.address_only = address.split(".")[0] @@ -22,7 +34,7 @@ def __init__(self, address, agent=""): from yadacoin.tcpsocket.pool import StratumServer N = 17 - StratumServer.inbound_streams[Miner.__name__].setdefault(address, {}) + StratumServer.inbound_streams[Miner.__name__].setdefault(peer_id, {}) self.worker = "".join( random.choices(string.ascii_uppercase + string.digits, k=N) ) @@ -30,11 +42,42 @@ def __init__(self, address, agent=""): self.address_only = address if not self.config.address_is_valid(self.address): raise InvalidAddressException() - self.agent = agent def to_json(self): - return {"address": self.address_only, "worker": self.worker} + return { + "address": self.address_only, + "worker": self.worker, + "agent": self.agent, + "custom_diff": self.custom_diff, + "miner_diff": self.miner_diff, + "peer_id": self.peer_id, + } + + def add_share_to_history(self, share): + self.shares_history.append(share) + self.app_log.debug(f"Shares history for {self.peer_id}: {self.shares_history}") + + def calculate_new_miner_diff(self): + self.shares_history = [share for share in self.shares_history if share["timestamp"] > (time.time() - 600)] + if any(share["timestamp"] < (time.time() - 300) for share in self.shares_history): + recent_shares = [share for share in self.shares_history] + + total_share_size = sum(share["miner_diff"] for share in recent_shares) + average_share_size = total_share_size / 10 / ( 60 / self.config.expected_share_time) + new_miner_diff = max(average_share_size, 70000) + new_miner_diff = round(new_miner_diff / 1000) * 1000 + + if self.custom_diff is not None: + new_miner_diff = self.custom_diff + + self.config.app_log.info(f"New miner_diff calculated: {new_miner_diff} for Miner:{self.peer_id}") + self.miner_diff = new_miner_diff + + return new_miner_diff + else: + self.config.app_log.info(f"Using current miner_diff: {self.miner_diff}") + return self.miner_diff class InvalidAddressException(Exception): - pass + pass \ No newline at end of file diff --git a/yadacoin/core/miningpool.py b/yadacoin/core/miningpool.py index 5f377cc5..2d21c3a4 100644 --- a/yadacoin/core/miningpool.py +++ b/yadacoin/core/miningpool.py @@ -1,9 +1,14 @@ import binascii +import time import json import random import uuid +import asyncio +import secrets + from logging import getLogger -from time import time +from decimal import Decimal +from datetime import datetime, timedelta from yadacoin.core.block import Block from yadacoin.core.blockchain import Blockchain @@ -11,13 +16,20 @@ from yadacoin.core.config import Config from yadacoin.core.job import Job from yadacoin.core.peer import Peer +from yadacoin.core.miner import Miner +from yadacoin.core.health import Health from yadacoin.core.processingqueue import BlockProcessingQueueItem from yadacoin.core.transaction import Transaction from yadacoin.core.transactionutils import TU from yadacoin.tcpsocket.pool import StratumServer +from tornado.iostream import StreamClosedError class MiningPool(object): + def __init__(self): + self.used_extra_nonces = set() + self.last_header = None + @classmethod async def init_async(cls): self = cls() @@ -25,7 +37,7 @@ async def init_async(cls): self.mongo = self.config.mongo self.app_log = getLogger("tornado.application") self.target_block_time = CHAIN.target_block_time(self.config.network) - self.max_target = CHAIN.MAX_TARGET + self.max_target = 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF self.inbound = {} self.connected_ips = {} self.last_block_time = 0 @@ -46,19 +58,23 @@ def get_status(self): return status async def process_nonce_queue(self): - item = self.config.processing_queues.nonce_queue.pop() + item = await self.config.processing_queues.nonce_queue.pop() i = 0 # max loops while item: + await self.config.processing_queues.nonce_queue.time_sum_start() self.config.processing_queues.nonce_queue.inc_num_items_processed() body = item.body - stream = item.stream miner = item.miner + stream = item.stream nonce = body["params"].get("nonce") - job = stream.jobs[body["params"]["id"]] + job_id = body["params"]["id"] + job = stream.jobs[body["params"]["id"] or body["params"]["job_id"]] if type(nonce) is not str: result = {"error": True, "message": "nonce is wrong data type"} + self.update_failed_share_count(miner.peer_id) if len(nonce) > CHAIN.MAX_NONCE_LEN: result = {"error": True, "message": "nonce is too long"} + self.update_failed_share_count(miner.peer_id) data = { "id": body.get("id"), "method": body.get("method"), @@ -66,34 +82,33 @@ async def process_nonce_queue(self): } data["result"] = await self.process_nonce(miner, nonce, job) if not data["result"]: - data["error"] = {"message": "Invalid hash for current block"} + data["error"] = {"code": "-1", "message": "Share rejected due to invalid data or expiration."} + self.config.processing_queues.nonce_queue.inc_num_invalid_items() try: await stream.write("{}\n".format(json.dumps(data)).encode()) except: pass - if "error" in data: - await StratumServer.send_job(stream) await StratumServer.block_checker() + await self.config.processing_queues.nonce_queue.time_sum_end() + self.config.health.nonce_processor.last_activity = int(time.time()) i += 1 - if i >= 1000: + if i >= 5000: self.config.app_log.info( "process_nonce_queue: max loops exceeded, exiting" ) return - item = self.config.processing_queues.nonce_queue.pop() + item = await self.config.processing_queues.nonce_queue.pop() async def process_nonce(self, miner, nonce, job): - nonce = nonce + job.extra_nonce.encode().hex() - header = ( - binascii.unhexlify(job.blob) - .decode() - .replace("{00}", "{nonce}") - .replace(job.extra_nonce, "") - ) + nonce = nonce + job.extra_nonce + header = job.header + self.config.app_log.debug(f"Extra Nonce for job {job.index}: {job.extra_nonce}") + self.config.app_log.debug(f"Nonce for job {job.index}: {nonce}") hash1 = self.block_factory.generate_hash_from_header(job.index, header, nonce) + self.config.app_log.debug(f"Hash1 for job {job.index}: {hash1}") if self.block_factory.index >= CHAIN.BLOCK_V5_FORK: hash1_test = Blockchain.little_hash(hash1) else: @@ -137,16 +152,7 @@ async def process_nonce(self, miner, nonce, job): accepted = False - target = int( - "0x" - + ( - f"0000000000000000000000000000000000000000000000000000000000000000" - + f"{hex(0x10000000000000001 // self.config.pool_diff)[2:64]}FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"[ - :64 - ] - )[-64:], - 16, - ) + target = 0x0000FFFF00000000000000000000000000000000000000000000000000000000 if block_candidate.index >= CHAIN.BLOCK_V5_FORK: test_hash = int(Blockchain.little_hash(block_candidate.hash), 16) @@ -164,7 +170,8 @@ async def process_nonce(self, miner, nonce, job): "index": block_candidate.index, "hash": block_candidate.hash, "nonce": nonce, - "time": int(time()), + "weight": job.miner_diff, + "time": int(time.time()), } }, upsert=True, @@ -274,7 +281,7 @@ async def refresh(self): trigger the events for the pools, even if the block index did not change.""" # TODO: to be taken care of, no refresh atm between blocks try: - if self.refreshing or not await Peer.is_synced(): + if self.refreshing: return self.refreshing = True await self.config.LatestBlock.block_checker() @@ -303,10 +310,10 @@ async def block_to_mine_info(self): if self.block_factory is None: # await self.refresh() return {} + target = hex(int(self.block_factory.target))[2:].rjust(64, "0") + self.config.app_log.info("Target: %s", target) res = { - "target": hex(int(self.block_factory.target))[2:].rjust( - 64, "0" - ), # target is now in hex format + "target": target, # target is now in hex format "special_target": hex(int(self.block_factory.special_target))[2:].rjust( 64, "0" ), # target is now in hex format @@ -319,8 +326,8 @@ async def block_to_mine_info(self): } return res - async def block_template(self, agent): - """Returns info for current block to mine""" + async def block_template(self, agent, custom_diff, peer_id, miner_diff): + """Returns info for the current block to mine""" if self.block_factory is None: await self.refresh() if not self.block_factory.target: @@ -328,40 +335,64 @@ async def block_template(self, agent): self.config.LatestBlock.block ) - job = await self.generate_job(agent) + job = await self.generate_job(agent, custom_diff, peer_id, miner_diff) return job - async def generate_job(self, agent): + async def generate_job(self, agent, custom_diff, peer_id, miner_diff): difficulty = int(self.max_target / self.block_factory.target) seed_hash = "4181a493b397a733b083639334bc32b407915b9a82b7917ac361816f0a1f5d4d" # sha256(yadacoin65000) job_id = str(uuid.uuid4()) - extra_nonce = hex(random.randrange(1000000, 1000000000000000))[2:] - header = self.block_factory.header.replace("{nonce}", "{00}" + extra_nonce) + header = self.block_factory.header + + # Check if header has changed + if header != self.last_header: + self.last_header = header + self.used_extra_nonces.clear() # Reset used extra nonces + + self.config.app_log.info(f"Job header: {header}") - if "XMRigCC/3" in agent or "XMRig/3" in agent: - target = hex(0x10000000000000001 // self.config.pool_diff) - elif self.config.pool_diff <= 69905: + extra_nonce = self.generate_unique_extra_nonce() + blob = header.encode().hex().replace("7b6e6f6e63657d", "00000000" + extra_nonce) + miner_diff = max(int(custom_diff), 70000) if custom_diff is not None else miner_diff + + if "XMRigCC/3" in agent or "XMRig/6" in agent or "xmrigcc-proxy" in agent: + target = hex(0x10000000000000001 // miner_diff)[2:].zfill(16) + elif miner_diff <= 69905: target = hex( - 0x10000000000000001 // self.config.pool_diff - 0x0000F00000000000 + 0x10000000000000001 // miner_diff - 0x0000F00000000000 )[2:].zfill(48) else: target = "-" + hex( - 0x10000000000000001 // self.config.pool_diff - 0x0000F00000000000 + 0x10000000000000001 // miner_diff - 0x0000F00000000000 )[3:].zfill(48) res = { "job_id": job_id, + "peer_id": peer_id, + "header": header, "difficulty": difficulty, "target": target, # can only be 16 characters long - "blob": header.encode().hex(), + "blob": blob, "seed_hash": seed_hash, - "height": self.config.LatestBlock.block.index - + 1, # This is the height of the one we are mining + "height": self.config.LatestBlock.block.index + 1, # This is the height of the one we are mining "extra_nonce": extra_nonce, "algo": "rx/yada", + "miner_diff": miner_diff, + "agent": agent, } + + self.config.app_log.debug(f"Generated job: {res}") + self.config.app_log.info(f"Used extra nonces: {self.used_extra_nonces}") + return await Job.from_dict(res) + def generate_unique_extra_nonce(self): + extra_nonce = secrets.token_hex(1) + while extra_nonce in self.used_extra_nonces: + extra_nonce = secrets.token_hex(1) + self.used_extra_nonces.add(extra_nonce) + return extra_nonce + async def set_target_as_previous_non_special_min(self): """TODO: this is not correct, should use a cached version of the current target somewhere, and recalc on new block event if we cross a boundary (% 2016 currently). Beware, at boundary we need to recalc the new diff one block ahead @@ -399,10 +430,19 @@ async def get_pending_transactions(self): mempool_smart_contract_objs = {} transaction_objs = {} used_sigs = [] + + check_masternode_fee = False + if self.config.LatestBlock.block.index + 1 >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + check_masternode_fee = True + async for txn in self.mongo.async_db.miner_transactions.find( {"relationship.smart_contract": {"$exists": True}} ).sort([("fee", -1), ("time", 1)]): - transaction_obj = await self.verify_pending_transaction(txn, used_sigs) + transaction_obj = await self.verify_pending_transaction( + txn, + used_sigs, + check_masternode_fee=check_masternode_fee, + ) if not isinstance(transaction_obj, Transaction): continue @@ -424,7 +464,11 @@ async def get_pending_transactions(self): async for txn in self.mongo.async_db.miner_transactions.find( {"relationship.smart_contract": {"$exists": False}} ).sort([("fee", -1), ("time", 1)]): - transaction_obj = await self.verify_pending_transaction(txn, used_sigs) + transaction_obj = await self.verify_pending_transaction( + txn, + used_sigs, + check_masternode_fee=check_masternode_fee, + ) if not isinstance(transaction_obj, Transaction): continue if transaction_obj.private == True: @@ -490,7 +534,9 @@ async def get_pending_transactions(self): + generated_txns ) - async def verify_pending_transaction(self, txn, used_sigs): + async def verify_pending_transaction( + self, txn, used_sigs, check_masternode_fee=False + ): try: if isinstance(txn, Transaction): transaction_obj = txn @@ -507,12 +553,10 @@ async def verify_pending_transaction(self, txn, used_sigs): self.config.app_log.warning("transaction version too old, skipping") return - transaction_obj.contract_generated = ( - await transaction_obj.is_contract_generated() + await transaction_obj.verify( + check_masternode_fee=check_masternode_fee, ) - await transaction_obj.verify() - if transaction_obj.transaction_signature in used_sigs: self.config.app_log.warning("duplicate transaction found and removed") return @@ -564,6 +608,155 @@ async def verify_pending_transaction(self, txn, used_sigs): except Exception as e: await Transaction.handle_exception(e, transaction_obj) + async def update_pool_stats(self): + await self.config.LatestBlock.block_checker() + + expected_blocks = 144 + mining_time_interval = 600 + + pipeline = [ + { + "$match": { + "time": {"$gte": time.time() - mining_time_interval} + } + }, + { + "$group": { + "_id": None, + "total_weight": {"$sum": "$weight"} + } + } + ] + + result = await self.config.mongo.async_db.shares.aggregate(pipeline).to_list(1) + + if result and len(result) > 0: + total_weight = result[0]["total_weight"] + pool_hash_rate = total_weight / mining_time_interval + else: + pool_hash_rate = 0 + + daily_blocks_found = await self.config.mongo.async_db.blocks.count_documents( + {"time": {"$gte": time.time() - (600 * 144)}} + ) + avg_block_time = daily_blocks_found / expected_blocks * 600 + if daily_blocks_found > 0: + net_target = self.config.LatestBlock.block.target + avg_blocks_found = self.config.mongo.async_db.blocks.find( + {"time": {"$gte": time.time() - (600 * 36)}}, + projection={"_id": 0, "target": 1} + ) + + avg_block_targets = [block["target"] async for block in avg_blocks_found] + if avg_block_targets: + avg_net_target = sum(int(target, 16) for target in avg_block_targets) / len(avg_block_targets) + avg_net_difficulty = ( + 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + / avg_net_target + ) + net_difficulty = ( + 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + / net_target + ) + avg_network_hash_rate = ( + len(avg_block_targets) + / 36 + * avg_net_difficulty + * 2**16 + / avg_block_time + ) + network_hash_rate = net_difficulty * 2**16 / 600 + else: + avg_network_hash_rate = 1 + net_difficulty = ( + 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + / 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + ) + network_hash_rate = 0 + + await self.config.mongo.async_db.pool_info.insert_one( + { + "pool_hash_rate": pool_hash_rate, + "network_hash_rate": network_hash_rate, + "net_difficulty": net_difficulty, + "avg_network_hash_rate": avg_network_hash_rate, + "time": int(time.time()), + } + ) + + async def clean_pool_info(self): + current_time = time.time() + retention_time = current_time - (48 * 60 * 60) # 48 hours in seconds + + result = await self.config.mongo.async_db.pool_info.delete_many({"time": {"$lt": retention_time}}) + self.config.app_log.info(f"Deleted {result.deleted_count} documents from the pool_info collection") + + async def clean_shares(self): + current_time = time.time() + retention_time = current_time - (14 * 24 * 60 * 60) # 14 days in seconds + + result = await self.config.mongo.async_db.shares.delete_many({"time": {"$lt": retention_time}}) + self.config.app_log.info(f"Deleted {result.deleted_count} documents from the shares collection") + + async def update_miners_stats(self): + miner_hashrate_seconds = 1200 + current_time = int(time.time()) + + hashrate_query = {"time": {"$gt": current_time - miner_hashrate_seconds}} + + hashrate_cursor = self.config.mongo.async_db.shares.aggregate([ + {"$match": hashrate_query}, + {"$group": { + "_id": { + "address": {"$ifNull": [{"$arrayElemAt": [{"$split": ["$address", "."]}, 0]}, "No address"]}, + "worker": {"$ifNull": [{"$arrayElemAt": [{"$split": ["$address", "."]}, 1]}, "No worker"]} + }, + "number_of_shares": {"$sum": 1} + }} + ]) + + worker_hashrate = {} + miner_stats = [] + total_hashrate = 0 + + async for doc in hashrate_cursor: + address = doc["_id"]["address"] + worker_name = doc["_id"]["worker"] + number_of_shares = doc["number_of_shares"] + + worker_hashrate_individual = number_of_shares * self.config.pool_diff // miner_hashrate_seconds + total_hashrate += worker_hashrate_individual + + if address not in worker_hashrate: + worker_hashrate[address] = {} + + if worker_name not in worker_hashrate[address]: + worker_hashrate[address][worker_name] = { + "worker_hashrate": 0 + } + + worker_hashrate[address][worker_name]["worker_hashrate"] += worker_hashrate_individual + + for address, worker_data in worker_hashrate.items(): + address_stats = [] + total_address_hashrate = 0 + for worker_name, data in worker_data.items(): + hashrate_data = { + "worker_name": worker_name, + "worker_hashrate": data["worker_hashrate"], + } + address_stats.append(hashrate_data) + total_address_hashrate += data["worker_hashrate"] + miner_stats.append({"miner_address": address, "worker_stats": address_stats, "total_hashrate": total_address_hashrate}) + + miners_stats_data = { + "time": int(time.time()), + "miner_stats": miner_stats, + "total_hashrate": total_hashrate + } + + await self.config.mongo.async_db.miners_stats.insert_one(miners_stats_data) + async def accept_block(self, block): self.app_log.info("Candidate submitted for index: {}".format(block.index)) self.app_log.info("Transactions:") @@ -580,4 +773,96 @@ async def accept_block(self, block): await self.config.websocketServer.send_block(block) - await self.refresh() + await self.save_block_to_database(block) + + #await self.refresh() + + async def save_block_to_database(self, block): + block_data = block.to_dict() + block_data['found_time'] = int(time.time()) + block_data['status'] = "Pending" + try: + effort_data = await self.block_effort(block.index, block.target) + block_data.update(effort_data) + miner_address = await self.get_miner_address(block.hash) + block_data['miner_address'] = miner_address + except Exception as e: + self.app_log.error(f"Error calculating effort: {e}") + + await self.config.mongo.async_db.pool_blocks.insert_one(block_data) + + async def get_miner_address(self, block_hash): + share_data = await self.config.mongo.async_db.shares.find_one( + {"hash": block_hash}, + {"_id": 0, "address": 1} + ) + return share_data['address'] if share_data else None + + async def block_effort(self, block_index, block_target): + latest_block = await self.config.mongo.async_db.pool_blocks.find( + {}, + {"_id": 0, "index": 1}, + ).sort([("index", -1)]).limit(1).to_list(1) + + if latest_block: + round_start = latest_block[0]['index'] + 1 + else: + round_start = 0 + + total_weight = await self.calculate_total_weight(round_start, block_index) + + self.config.app_log.debug(f"block_target: {block_target}") + self.config.app_log.info(f"block_index: {block_index}") + self.config.app_log.info(f"round_start: {round_start}") + self.config.app_log.info(f"total_weight: {total_weight}") + + + block_difficulty = 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / block_target + total_block_hash = block_difficulty * 2**16 + block_effort = (total_weight * 100) / total_block_hash + self.config.app_log.info(f"block_effort: {block_effort}") + + return { + 'effort': block_effort, + } + + async def calculate_total_weight(self, round_start, round_end): + if round_start == round_end: + pipeline = [ + {"$match": {"index": round_start}}, + {"$group": {"_id": None, "total_weight": {"$sum": "$weight"}}} + ] + else: + pipeline = [ + {"$match": {"index": {"$gte": round_start, "$lte": round_end}}}, + {"$group": {"_id": None, "total_weight": {"$sum": "$weight"}}} + ] + + result = await self.config.mongo.async_db.shares.aggregate(pipeline).to_list(1) + return result[0]["total_weight"] if result else 0 + + + + async def update_block_status(self): + pool_blocks_collection = self.config.mongo.async_db.pool_blocks + latest_block_index = self.config.LatestBlock.block.index + pending_blocks_list = await pool_blocks_collection.find({"status": {"$in": ["Pending", None]}}).to_list(None) + + for block in pending_blocks_list: + confirmations = latest_block_index - block['index'] + + if confirmations >= self.config.block_confirmation: + matching_block = await self.config.mongo.async_db.blocks.find_one({"index": block['index']}) + + if matching_block and matching_block['hash'] == block['hash']: + await pool_blocks_collection.update_one( + {"_id": block['_id']}, + {"$set": {"status": "Accepted"}} + ) + else: + await pool_blocks_collection.update_one( + {"_id": block['_id']}, + {"$set": {"status": "Orphan"}} + ) + + self.app_log.info(f"Block with index {block['index']} updated to status: {block['status']}") diff --git a/yadacoin/core/miningpoolpayout.py b/yadacoin/core/miningpoolpayout.py index 7d33bc17..abc0f5ee 100644 --- a/yadacoin/core/miningpoolpayout.py +++ b/yadacoin/core/miningpoolpayout.py @@ -19,11 +19,12 @@ def __init__(self): self.config = Config() self.app_log = getLogger("tornado.application") - async def do_payout(self, already_paid_height=None): + async def do_payout(self, already_paid_height=None, start_index=None): # first check which blocks we won. # then determine if we have already paid out # they must be 6 blocks deep - if not already_paid_height: + + if not start_index: already_paid_height = ( await self.config.mongo.async_db.share_payout.find_one( {}, sort=[("index", -1)] @@ -31,6 +32,10 @@ async def do_payout(self, already_paid_height=None): ) if not already_paid_height: already_paid_height = {} + else: + already_paid_height = {"index": max(already_paid_height.get("index", 0))} + else: + already_paid_height = {"index": start_index} won_blocks = self.config.mongo.async_db.blocks.aggregate( [ @@ -71,26 +76,29 @@ async def do_payout(self, already_paid_height=None): if coinbase.outputs[0].to != self.config.address: continue if self.config.debug: - self.app_log.debug(won_block.index) - if ( - won_block.index + self.config.payout_frequency - ) <= self.config.LatestBlock.block.index: - if len(ready_blocks) >= self.config.payout_frequency: - if self.config.debug: - self.app_log.debug( - "entering payout at block: {}".format(won_block.index) - ) - do_payout = True - break - else: - if self.config.debug: - self.app_log.debug( - "block added for payout {}".format(won_block.index) - ) - ready_blocks.append(won_block) + self.app_log.debug(won_block.index) + + confirmations = self.config.LatestBlock.block.index - won_block.index + if confirmations < self.config.block_confirmation: # We set the block maturation + if self.config.debug: + self.app_log.debug("Payment stopped, block has insufficient confirmations.") + continue + if self.config.debug: + self.app_log.debug( + "block added for payout {}".format(won_block.index) + ) + ready_blocks.append(won_block) + + if ready_blocks: + do_payout = True if not do_payout: + if self.config.debug: + self.app_log.debug("No payout is required.") return + else: + if self.config.debug: + self.app_log.debug("Payout is required.") # check if we already paid out outputs = {} @@ -156,8 +164,11 @@ async def do_payout(self, already_paid_height=None): "do_payout_for_blocks passed address compare {}".format(block.index) ) pool_take = self.config.pool_take - total_pool_take = coinbase.outputs[0].value * pool_take - total_payout = coinbase.outputs[0].value - total_pool_take + if pool_take == 0: + total_payout = coinbase.outputs[0].value - 0.0001 # We charge a transaction fee only + else: + total_pool_take = coinbase.outputs[0].value * (pool_take) + total_payout = coinbase.outputs[0].value - total_pool_take coinbases.append(coinbase) if self.config.debug: self.app_log.debug( @@ -248,21 +259,34 @@ async def do_payout(self, already_paid_height=None): await self.config.mongo.async_db.miner_transactions.insert_one( transaction.to_dict() ) + block_indexes = [block.index for block in ready_blocks] await self.config.mongo.async_db.share_payout.insert_one( - {"index": block.index, "txn": transaction.to_dict()} + {"index": block_indexes, "txn": transaction.to_dict()} ) await self.broadcast_transaction(transaction) async def get_share_list_for_height(self, index): + if self.config.payout_scheme == "pplns": + previous_block_index = index - 24 + self.config.app_log.info(f"PPLNS payment scheme used.") + else: + previous_block_index = await self.find_previous_block_index(index) + self.config.app_log.info(f"PROP payment scheme used.") + + if previous_block_index is None: + return {} + raw_shares = [] async for x in self.config.mongo.async_db.shares.find( - {"index": index, "address": {"$ne": None}} + {"index": {"$gte": previous_block_index, "$lte": index}, "address": {"$ne": None}} ).sort([("index", 1)]): raw_shares.append(x) if not raw_shares: return False - total_difficulty = self.get_difficulty([x for x in raw_shares]) + shares = {} + total_weight = 0 + for share in raw_shares: address = share["address"].split(".")[0] if not self.config.address_is_valid(address): @@ -280,31 +304,64 @@ async def get_share_list_for_height(self, index): "blocks": [], } shares[address]["blocks"].append(share) + total_weight += share["weight"] + self.config.app_log.info(f"Share range for payout: {previous_block_index} - {index}") + self.config.app_log.info(f"Total weight for height {index}: {total_weight}") - add_up = 0 for address, item in shares.items(): - test_difficulty = self.get_difficulty(item["blocks"]) - shares[address]["payout_share"] = float(test_difficulty) / float( - total_difficulty + item["total_weight"] = sum(share["weight"] for share in item["blocks"]) + item["payout_share"] = float(item["total_weight"]) / float(total_weight) + self.config.app_log.info( + f"Miner {address} - Total weight: {item['total_weight']}, Payout share: {item['payout_share']}" ) - add_up += test_difficulty - if add_up == total_difficulty: - return shares - else: - raise NonMatchingDifficultyException() + self.config.app_log.debug(f"get_share_list_for_height - Returning shares: {shares}") + return shares + + async def find_previous_block_index(self, current_block_index): + pool_public_key = ( + self.config.pool_public_key + if hasattr(self.config, "pool_public_key") + else self.config.public_key + ) + + pool_blocks_found_list = ( + await self.config.mongo.async_db.blocks.find( + {"public_key": pool_public_key, "index": {"$lt": current_block_index}}, + {"_id": 0, "index": 1}, + ) + .sort([("index", -1)]) + .limit(1) + .to_list(1) + ) - def get_difficulty(self, blocks): - difficulty = 0 - for block in blocks: - target = int(block["hash"], 16) - difficulty += CHAIN.MAX_TARGET - target - return difficulty + if pool_blocks_found_list: + previous_block_index = pool_blocks_found_list[0]["index"] + 1 + return previous_block_index + else: + self.config.app_log.info( + f"No previous block found for current block {current_block_index}" + ) + return None async def already_used(self, txn): - return await self.config.mongo.async_db.blocks.find_one( - {"transactions.inputs.id": txn.transaction_signature} + results = self.config.mongo.async_db.blocks.aggregate( + [ + { + "$match": { + "transactions.inputs.id": txn.transaction_signature, + } + }, + {"$unwind": "$transactions"}, + { + "$match": { + "transactions.inputs.id": txn.transaction_signature, + "transactions.public_key": self.config.public_key, + } + }, + ] ) + return [x async for x in results] async def broadcast_transaction(self, transaction): self.app_log.debug(f"broadcast_transaction {transaction.transaction_signature}") diff --git a/yadacoin/core/mongo.py b/yadacoin/core/mongo.py index fd6edff5..1a0de38b 100644 --- a/yadacoin/core/mongo.py +++ b/yadacoin/core/mongo.py @@ -2,6 +2,7 @@ from motor.motor_tornado import MotorClient from pymongo import ASCENDING, DESCENDING, IndexModel, MongoClient +from pymongo.monitoring import CommandListener from yadacoin.core.config import Config @@ -9,23 +10,56 @@ class Mongo(object): def __init__(self): self.config = Config() - self.client = MongoClient(self.config.mongodb_host) + if hasattr(self.config, "mongodb_username") and hasattr( + self.config, "mongodb_password" + ): + try: + self.client = MongoClient(self.config.mongodb_host) + admin_db = self.client["admin"] + admin_db.command( + "createUser", + self.config.mongodb_username, + pwd=self.config.mongodb_password, + roles=["root"], + ) + except: + pass + self.client = MongoClient( + self.config.mongodb_host, + username=self.config.mongodb_username, + password=self.config.mongodb_password, + ) + else: + self.client = MongoClient(self.config.mongodb_host) self.db = self.client[self.config.database] self.site_db = self.client[self.config.site_database] try: # test connection - self.db.yadacoin.find_one() + self.db.blocks.find_one() except Exception as e: raise e __id = IndexModel([("id", ASCENDING)], name="__id", unique=True) __hash = IndexModel([("hash", ASCENDING)], name="__hash") + __time = IndexModel([("time", ASCENDING)], name="__time") __index = IndexModel([("index", ASCENDING)], name="__index") __to = IndexModel([("transactions.outputs.to", ASCENDING)], name="__to") + __value = IndexModel( + [("transactions.outputs.value", ASCENDING)], name="__value" + ) __txn_id = IndexModel([("transactions.id", ASCENDING)], name="__txn_id") + __txn_hash = IndexModel([("transactions.hash", ASCENDING)], name="__txn_hash") __txn_inputs_id = IndexModel( [("transactions.inputs.id", ASCENDING)], name="__txn_inputs_id" ) + __txn_id_inputs_id = IndexModel( + [("transactions.id", ASCENDING), ("transactions.inputs.id", ASCENDING)], + name="__txn_id_inputs_id", + ) + __txn_id_public_key = IndexModel( + [("transactions.id", ASCENDING), ("transactions.public_key", ASCENDING)], + name="__txn_id_public_key", + ) __txn_public_key = IndexModel( [("transactions.public_key", ASCENDING)], name="__txn_public_key" ) @@ -44,6 +78,10 @@ def __init__(self): ], name="__txn_public_key_inputs_public_key_address", ) + __public_key_index = IndexModel( + [("public_key", ASCENDING), ("index", DESCENDING)], + name="__public_key_index", + ) __public_key_time = IndexModel( [ ("public_key", ASCENDING), @@ -92,20 +130,59 @@ def __init__(self): ], name="__txn_rel_contract_identity_public_key", ) + __txn_rel_contract_expiry = IndexModel( + [ + ( + "transactions.relationship.smart_contract.expiry", + ASCENDING, + ) + ], + name="__txn_rel_contract_expiry", + ) + __updated_at = IndexModel( + [ + ( + "updated_at", + ASCENDING, + ) + ], + name="__updated_at", + ) + __txn_outputs_to_index = IndexModel( + [("transactions.outputs.to", ASCENDING), ("index", ASCENDING)], + name="__txn_outputs_to_index", + ) + __txn_inputs_0 = IndexModel( + [("transactions.inputs.0", ASCENDING)], + name="__txn_inputs_0", + ) + __txn_rel_smart_contract_expiry_txn_time = IndexModel( + [ + ("transactions.relationship.smart_contract.expiry", ASCENDING), + ("transactions.time", ASCENDING), + ], + name="__txn_rel_smart_contract_expiry_txn_time", + ) try: self.db.blocks.create_indexes( [ __hash, + __time, __index, __id, __to, + __value, __txn_id, + __txn_hash, __txn_inputs_id, + __txn_id_inputs_id, + __txn_id_public_key, __txn_public_key, __txn_inputs_public_key, __txn_inputs_address, __txn_public_key_inputs_public_key_address, + __public_key_index, __public_key_time, __public_key, __prev_hash, @@ -119,15 +196,38 @@ def __init__(self): __txn_time, __txn_contract_rid, __txn_rel_contract_identity_public_key, + __txn_rel_contract_expiry, + __updated_at, + __txn_outputs_to_index, + __txn_inputs_0, + __txn_rel_smart_contract_expiry_txn_time, ] ) except: pass + __index = IndexModel([("index", ASCENDING)], name="__index") + __found_time = IndexModel([("found_time", DESCENDING)], name="__found_time") + __miner_address = IndexModel([("miner_address", ASCENDING)], name="__miner_address") + __status = IndexModel([("status", ASCENDING)], name="__status") + + try: + self.db.pool_blocks.create_indexes( + [ + __index, + __found_time, + __miner_address, + __status, + ] + ) + except Exception as e: + print(f"Error creating indexes: {e}") + __id = IndexModel([("id", ASCENDING)], name="__id") __height = IndexModel([("height", ASCENDING)], name="__height") + __cache_time = IndexModel([("cache_time", ASCENDING)], name="__cache_time") try: - self.db.unspent_cache.create_indexes([__id, __height]) + self.db.unspent_cache.create_indexes([__id, __height, __cache_time]) except: pass @@ -149,31 +249,22 @@ def __init__(self): except: pass - __address = IndexModel([("address", ASCENDING)], name="__address") - __address_desc = IndexModel([("address", DESCENDING)], name="__address_desc") - __address_only = IndexModel( - [("address_only", ASCENDING)], name="__address_only" - ) - __address_only_desc = IndexModel( - [("address_only", DESCENDING)], name="__address_only_desc" - ) - __index = IndexModel([("index", ASCENDING)], name="__index") - __hash = IndexModel([("hash", ASCENDING)], name="__hash") + __address_only_index = IndexModel([("address_only", ASCENDING), ("index", ASCENDING)], name="__address_only") + __address_time_index = IndexModel([("address", ASCENDING), ("time", DESCENDING)], name="__address_time") __time = IndexModel([("time", DESCENDING)], name="__time") + __index = IndexModel([("index", ASCENDING)], name="__index") + try: self.db.shares.create_indexes( [ - __address, - __address_desc, - __address_only, - __address_only_desc, - __index, - __hash, + __address_only_index, + __address_time_index, __time, + __index, ] ) - except: - pass + except Exception as e: + print(f"Error creating indexes: {e}") __index = IndexModel([("index", DESCENDING)], name="__index") try: @@ -186,11 +277,16 @@ def __init__(self): pass __txn_id = IndexModel([("txn.id", ASCENDING)], name="__txn_id") + __cache_time = IndexModel([("cache_time", ASCENDING)], name="__cache_time") try: - self.db.transactions_by_rid_cache.create_indexes([__txn_id]) + self.db.transactions_by_rid_cache.create_indexes([__txn_id, __cache_time]) except: pass + __id = IndexModel([("id", ASCENDING)], name="__id") + __hash = IndexModel([("hash", ASCENDING)], name="__hash") + __outputs_to = IndexModel([("outputs.to", ASCENDING)], name="__outputs_to") + __public_key = IndexModel([("public_key", ASCENDING)], name="__public_key") __rid = IndexModel([("rid", ASCENDING)], name="__rid") __requested_rid = IndexModel( [("requested_rid", ASCENDING)], name="__requested_rid" @@ -203,9 +299,61 @@ def __init__(self): __fee_time = IndexModel( [("fee", DESCENDING), ("time", ASCENDING)], name="__fee_time" ) + __rel_smart_contract = IndexModel( + [("relationship.smart_contract", ASCENDING)], name="__rel_smart_contract" + ) try: self.db.miner_transactions.create_indexes( [ + __id, + __hash, + __outputs_to, + __public_key, + __rid, + __requested_rid, + __requester_rid, + __time, + __inputs_id, + __fee_time, + __rel_smart_contract, + ] + ) + except: + pass + + __id = IndexModel([("txn.id", ASCENDING)], name="__id") + __hash = IndexModel([("txn.hash", ASCENDING)], name="__hash") + __index = IndexModel( + [("index", DESCENDING)], + name="__index", + ) + __outputs_to = IndexModel([("txn.outputs.to", ASCENDING)], name="__outputs_to") + __outputs_to_index = IndexModel( + [("txn.outputs.to", ASCENDING), ("index", DESCENDING)], + name="__outputs_to_index", + ) + __public_key = IndexModel([("txn.public_key", ASCENDING)], name="__public_key") + __rid = IndexModel([("txn.rid", ASCENDING)], name="__rid") + __requested_rid = IndexModel( + [("txn.requested_rid", ASCENDING)], name="__requested_rid" + ) + __requester_rid = IndexModel( + [("txn.requester_rid", ASCENDING)], name="__requester_rid" + ) + __time = IndexModel([("txn.time", DESCENDING)], name="__time") + __inputs_id = IndexModel([("txn.inputs.id", ASCENDING)], name="__inputs_id") + __fee_time = IndexModel( + [("txn.fee", DESCENDING), ("txn.time", ASCENDING)], name="__fee_time" + ) + try: + self.db.failed_transactions.create_indexes( + [ + __id, + __hash, + __index, + __outputs_to, + __outputs_to_index, + __public_key, __rid, __requested_rid, __requester_rid, @@ -234,19 +382,44 @@ def __init__(self): pass __timestamp = IndexModel([("timestamp", DESCENDING)], name="__timestamp") + __archived = IndexModel([("archived", ASCENDING)], name="__archived") + __timestamp_archived = IndexModel( + [("timestamp", DESCENDING), ("archived", ASCENDING)], + name="__timestamp_archived", + ) try: - self.db.node_status.create_indexes([__timestamp]) + self.db.node_status.create_indexes( + [__timestamp, __archived, __timestamp_archived] + ) + except: + raise + + __time = IndexModel([("time", ASCENDING)], name="__time") + __stat = IndexModel([("stat", ASCENDING)], name="__stat") + try: + self.db.pool_stats.create_indexes([__time, __stat]) except: raise # TODO: add indexes for peers - # See https://motor.readthedocs.io/en/stable/tutorial-tornado.html - self.async_client = MotorClient(self.config.mongodb_host) - self.async_db = AsyncDB(self.async_client) + if hasattr(self.config, "mongodb_username") and hasattr( + self.config, "mongodb_password" + ): + self.async_client = MotorClient( + self.config.mongodb_host, + username=self.config.mongodb_username, + password=self.config.mongodb_password, + event_listeners=[listener], + ) + else: + self.async_client = MotorClient( + self.config.mongodb_host, event_listeners=[listener] + ) + self.async_db = self.async_client[self.config.database] # self.async_db = self.async_client[self.config.database] self.async_site_db = self.async_client[self.config.site_database] - + self.async_db.slow_queries = [] # convert block time from string to number blocks_to_convert = self.db.blocks.find({"time": {"$type": 2}}) for block in blocks_to_convert: @@ -300,144 +473,257 @@ def __init__(self): self.db.blocks.delete_one({"index": block["index"]}) -class AsyncDB: - def __init__(self, async_client): - self.async_client = async_client - self._config = Config() - self.slow_queries = [] - - def __getattr__(self, __name: str): - return Collection(self.async_client, __name) - - async def list_collection_names(self, *args, **kwargs): - start_time = time() - self._db = self.async_client[self._config.database] - result = await self._db.list_collection_names() - if time() - start_time > 3: - self._config.app_log.warning(f"SLOW QUERY: find_one {args}, {kwargs}") - return result - - def __getitem__(self, name): - return getattr(self, name) - - -class Collection: - def __init__(self, async_client, collection): - self._config = Config() - self._db = async_client[self._config.database] - self.collection = collection - - def set_start_time(self): - self.start_time = time() - - def set_duration(self): - self.duration = float("%.3f" % (time() - self.start_time)) +class DeuggingListener(CommandListener): + commands = [ + "find", + "delete", + "insert_one", + "update", + "aggregate", + ] + + def get_collection_name(self, event): + if event.command_name in self.commands: + return event.command.get(event.command_name) + return None + + def started(self, event): + if event.command_name not in self.commands: + return + config = Config() + if not config.mongo: + return + + if not hasattr(config, "mongo_debug"): + return + if not config.mongo_debug: + return + event.command["start_time"] = time() + event.command["max_time_ms"] = config.mongo_query_timeout + if event.command.get(event.command_name) == "child_keys": + return + self.log_explain_output(event) + + def succeeded(self, event): + config = Config() + if not hasattr(config, "mongo_debug"): + return + if not config.mongo_debug: + return + if not hasattr(event, "command"): + return + self.duration = time() - event.command["start_time"] + self.do_logging(event.command_name, event.command) + + def failed(self, event): + config = Config() + if not hasattr(config, "mongo_debug"): + return + if not config.mongo_debug: + return + self.duration = time() - event.command["start_time"] + self.do_logging(event.command_name, event.command) def do_logging(self, query_type, args, kwargs): + config = Config() self.set_duration() message = f"QUERY: {query_type} {self.collection} {args}, {kwargs}, duration: {self.duration}" - if self.duration > 3 and getattr(self._config, "slow_query_logging", None): - self._config.app_log.warning(f"SLOW {message}") - self._config.mongo.async_db.slow_queries.append(message) + if self.duration > 3 and getattr(config, "slow_query_logging", None): + config.app_log.warning(f"SLOW {message}") + config.mongo.async_db.slow_queries.append(message) else: - if hasattr(self._config, "mongo_debug") and self._config.mongo_debug: - self._config.app_log.debug(message) - - async def find_one(self, *args, **kwargs): - self.set_start_time() - kwargs["max_time_ms"] = self._config.mongo_query_timeout - result = await self._db.get_collection(self.collection).find_one( - *args, **kwargs - ) - if self.collection == "child_keys": - return result - self.do_logging("find_one", args, kwargs) - return result - - def find(self, *args, **kwargs): - self.set_start_time() - kwargs["max_time_ms"] = self._config.mongo_query_timeout - result = self._db.get_collection(self.collection).find(*args, **kwargs) - if self.collection == "child_keys": - return result - self.do_logging("find", args, kwargs) - return result - - async def count_documents(self, *args, **kwargs): - self.set_start_time() - pipeline = [ - {"$match": args[0]}, - {"$group": {"_id": None, "count": {"$sum": 1}}}, - ] - cursor = self._db.get_collection(self.collection).aggregate( - pipeline, maxTimeMS=self._config.mongo_query_timeout - ) - result = 0 - async for doc in cursor: - result = doc.get("count", 0) - break - if self.collection == "child_keys": - return result - - self.do_logging("count_documents", args, kwargs) - return result - - async def delete_many(self, *args, **kwargs): - self.set_start_time() - result = await self._db.get_collection(self.collection).delete_many( - *args, **kwargs - ) - if self.collection == "child_keys": - return result - self.do_logging("delete_many", args, kwargs) - return result - - async def insert_one(self, *args, **kwargs): - self.set_start_time() - result = await self._db.get_collection(self.collection).insert_one( - *args, **kwargs - ) - if self.collection == "child_keys": - return result - self.do_logging("insert_one", args, kwargs) - return result - - async def replace_one(self, *args, **kwargs): - self.set_start_time() - result = await self._db.get_collection(self.collection).replace_one( - *args, **kwargs - ) - if self.collection == "child_keys": - return result - self.do_logging("replace_one", args, kwargs) - return result - - async def update_one(self, *args, **kwargs): - self.set_start_time() - result = await self._db.get_collection(self.collection).update_one( - *args, **kwargs - ) - if self.collection == "child_keys": - return result - self.do_logging("update_one", args, kwargs) - return result - - async def update_many(self, *args, **kwargs): - self.set_start_time() - result = await self._db.get_collection(self.collection).update_many( - *args, **kwargs - ) - if self.collection == "child_keys": - return result - self.do_logging("update_many", args, kwargs) - return result - - def aggregate(self, *args, **kwargs): - self.set_start_time() - result = self._db.get_collection(self.collection).aggregate( - *args, **kwargs, maxTimeMS=self._config.mongo_query_timeout - ) - if self.collection == "child_keys": - return result - self.do_logging("aggregate", args, kwargs) - return result + if hasattr(config, "mongo_debug") and config.mongo_debug: + config.app_log.debug(message) + + def log_explain_output(self, event): + config = Config() + # Perform the explain command asynchronously + collection_name = self.get_collection_name(event) + explain_command = event.command.copy() + explain_command["explain"] = event.command_name + + db = config.mongo.client.get_database(event.database_name) + if event.command_name in [ + "find", + "find_one", + "insert_one", + ] and event.command.get("filter", {}): + explain_result = getattr(db[collection_name], event.command_name)( + event.command.get("filter", {}) + ).explain() + + self.get_used_indexes(explain_result, event) + elif event.command_name in [ + "delete", + ] and event.command.get("deletes", {}): + for delete_op in event.command.get("deletes", []): + filter_criteria = delete_op.get("q", {}) + if not filter_criteria: + return + explain_result = db[collection_name].find(filter_criteria).explain() + self.get_used_indexes(explain_result, event) + elif event.command_name in [ + "update", + ] and event.command.get("updates", {}): + for delete_op in event.command.get("updates", []): + filter_criteria = delete_op.get("q", {}) + if not filter_criteria: + return + explain_result = db[collection_name].find(filter_criteria).explain() + self.get_used_indexes(explain_result, event) + elif event.command_name == "aggregate" and explain_command.get("pipeline", []): + if event.command.get("explain"): + return + pipeline = explain_command.get("pipeline", []) + explain_result = db.command( + { + "aggregate": collection_name, + "pipeline": pipeline, + "explain": True, + } + ) + self.get_used_indexes(explain_result, event) + else: + return False + + def get_used_indexes(self, explain_result, event): + if not explain_result: + return + config = Config() + used_indexes = False + if event.command.get("pipeline", {}): + if explain_result.get("stages"): + query_planner = explain_result["stages"][0]["$cursor"].get( + "queryPlanner", {} + ) + else: + query_planner = explain_result.get("queryPlanner", {}) + winning_plan = query_planner.get("winningPlan", {}) + used_indexes = winning_plan.get("indexName", False) + if not used_indexes: + try: + used_indexes = self.get_used_index_from_input_stage(winning_plan) + except: + message = f"Failed getting index information: {event.command_name} : {query_planner['namespace']} : {event.command.get('pipeline', {})}" + config.app_log.warning(message) + + if not used_indexes: + self.handle_unindexed_log( + event.command_name, + query_planner["namespace"], + event.command.get("pipeline", {}), + ) + elif event.command.get("filter", {}): + query_planner = explain_result.get("queryPlanner", {}) + winning_plan = query_planner.get("winningPlan", {}) + input_stage = winning_plan.get("inputStage", {}) + used_indexes = input_stage.get("indexName", False) + + if not used_indexes: + try: + used_indexes = self.get_used_index_from_input_stage(winning_plan) + except: + message = f"Failed getting index information: {event.command_name} : {query_planner['namespace']} : {event.command.get('filter', {})}" + config.app_log.warning(message) + + if not used_indexes: + self.handle_unindexed_log( + event.command_name, + query_planner["namespace"], + event.command.get("filter", {}), + ) + elif event.command.get("deletes", {}): + query_planner = explain_result.get("queryPlanner", {}) + winning_plan = query_planner.get("winningPlan", {}) + input_stage = winning_plan.get("inputStage", {}) + used_indexes = input_stage.get("indexName", False) + if not used_indexes: + self.handle_unindexed_log( + event.command_name, + query_planner["namespace"], + event.command.get("deletes", {}), + ) + elif event.command.get("updates", {}): + query_planner = explain_result.get("queryPlanner", {}) + winning_plan = query_planner.get("winningPlan", {}) + input_stage = winning_plan.get("inputStage", {}) + used_indexes = input_stage.get("indexName", False) + if not used_indexes: + self.handle_unindexed_log( + event.command_name, + query_planner["namespace"], + event.command.get("updates", {}), + ) + if used_indexes: + message = f"Indexes used: {used_indexes} : {event.command_name} : {query_planner['namespace']} : {event.command.get('pipeline', event.command.get('filter', {}))}" + config.app_log.info(message) + return used_indexes + + def get_used_index_from_input_stage(self, input_stage, used_indexes=None): + if used_indexes is None: + used_indexes = [] + index_name = input_stage.get("indexName", False) + if index_name: + used_indexes.append(index_name) + return True + + interim_input_stage = input_stage.get("inputStage", {}) + if interim_input_stage: + input_stage = input_stage.get("inputStage", {}) + result = self.get_used_index_from_input_stage(input_stage, used_indexes) + if not result: + return False + interim_input_stages = input_stage.get("inputStages", {}) + if interim_input_stages: + for input_stg in interim_input_stages: + result = self.get_used_index_from_input_stage(input_stg, used_indexes) + if not result: + return False + return used_indexes + return used_indexes + + def handle_unindexed_log(self, command_name, collection, query): + if collection.endswith("unindexed_queries") or collection.endswith("_cache"): + return + config = Config() + message = f"Unindexed query detected: {command_name} : {collection} : {query}" + config.app_log.warning(message) + flattened_data = self.flatten_data(query) + config.mongo.db.unindexed_queries.update_many( + { + "command_name": command_name, + "collection": collection, + **{f"query.{k}": {"$exists": True} for k, v in flattened_data.items()}, + }, + { + "$set": { + "command_name": command_name, + "collection": collection, + **{f"query.{k}": v for k, v in flattened_data.items()}, + }, + "$inc": {"count": 1}, + }, + upsert=True, + ) + + def flatten_data(self, data, parent_key="", sep="."): + items = [] + if isinstance(data, dict): + for k, v in data.items(): + new_key = f"{parent_key}{sep}{k}" if parent_key else k + if isinstance(v, dict) or isinstance(v, list): + items.extend(self.flatten_data(v, new_key, sep=sep).items()) + else: + items.append((new_key, None)) + elif isinstance(data, list): + for i, item in enumerate(data): + new_key = f"{parent_key}{sep}{i}" if parent_key else str(i) + if isinstance(item, dict) or isinstance(item, list): + items.extend(self.flatten_data(item, new_key, sep=sep).items()) + else: + items.append((new_key, None)) + return dict(items) + + +# Register the profiling listener +listener = DeuggingListener() \ No newline at end of file diff --git a/yadacoin/core/nodes.py b/yadacoin/core/nodes.py index 39232979..e75c7362 100644 --- a/yadacoin/core/nodes.py +++ b/yadacoin/core/nodes.py @@ -1,12 +1,32 @@ +from collections import defaultdict + from bitcoin.wallet import P2PKHBitcoinAddress from yadacoin.core.peer import Seed, SeedGateway, ServiceProvider class Nodes: + @classmethod + def set_fork_points(cls): + cls().fork_points = [] + for NODE in cls()._NODES: + for rng in NODE["ranges"]: + cls().fork_points.append(rng[0]) + cls().fork_points = sorted(list(set(cls().fork_points))) + + @classmethod + def set_nodes(cls): + cls().NODES = defaultdict(list) + for fork_point in cls().fork_points: + for NODE in cls()._NODES: + for rng in NODE["ranges"]: + if rng[1] and rng[1] <= fork_point: + continue + if rng[0] <= fork_point: + cls().NODES[fork_point].append(NODE["node"]) + @classmethod def get_fork_for_block_height(cls, height): - cls().fork_points = cls().NODES.keys() prev = 0 for x in cls().fork_points: if height < x: @@ -62,9 +82,10 @@ def __init__(self): if hasattr(self, "initialized"): return self.initialized = True - self.NODES = { - 0: [ - Seed.from_dict( + self._NODES = [ + { + "ranges": [(0, None)], + "node": Seed.from_dict( { "host": "yadacoin.io", "port": 8000, @@ -76,7 +97,10 @@ def __init__(self): "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", } ), - Seed.from_dict( + }, + { + "ranges": [(0, None)], + "node": Seed.from_dict( { "host": "seed.hashyada.com", "port": 8002, @@ -88,7 +112,10 @@ def __init__(self): "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", } ), - Seed.from_dict( + }, + { + "ranges": [(0, None)], + "node": Seed.from_dict( { "host": "seedau.hashyada.com", "port": 8002, @@ -100,1031 +127,485 @@ def __init__(self): "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", } ), - ], - 443600: [ - Seed.from_dict( + }, + { + "ranges": [(443600, None)], + "node": Seed.from_dict( { - "host": "yadacoin.io", + "host": "seed.crbrain.online", "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - "public_key": "02fa9550f57055c96c7ce4c6c9cd1411856beba5c7d5a07417e980a39aa03da3dc", - }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - } - ), - Seed.from_dict( - { - "host": "seed.hashyada.com", - "port": 8002, - "identity": { - "username": "", - "username_signature": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - "public_key": "0254c7e913ebf0c49c80129c7acc306033a62ac52219ec03e41a6f0a2549b91658", - }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - } - ), - Seed.from_dict( - { - "host": "seedau.hashyada.com", - "port": 8002, - "identity": { - "username": "", - "username_signature": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - "public_key": "029fa1eed6c2129f2eb00729c06bd945282c193b09f4cb566738b488268ed131bf", + "username_signature": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", + "public_key": "020d96b95281506e3e7f03ae3bbb7a91ddf6a6eb573d88fca88d292923be9f9f8d", }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", + "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", } ), - Seed.from_dict( + }, + { + "ranges": [(443700, None)], + "node": Seed.from_dict( { - "host": "seed.crbrain.online", + "host": "yada-alpha.mynodes.live", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - "public_key": "020d96b95281506e3e7f03ae3bbb7a91ddf6a6eb573d88fca88d292923be9f9f8d", + "username_signature": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", + "public_key": "039f52499e24b192ffd3f93d161965816d1fd41c4f8963fdd654067034e2716e93", }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", + "seed_gateway": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", } ), - ], - 443700: [ - Seed.from_dict( + }, + { + "ranges": [(446400, None)], + "node": Seed.from_dict( { - "host": "yadacoin.io", + "host": "seed.yada.toksyk.pl", "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - "public_key": "02fa9550f57055c96c7ce4c6c9cd1411856beba5c7d5a07417e980a39aa03da3dc", + "username_signature": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", + "public_key": "033bd1fea8397cd471333ddd27c43a0d580dde3d477efa7ee1ffe61a770f26e256", }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", + "seed_gateway": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", } ), - Seed.from_dict( + }, + { + "ranges": [(449000, None)], + "node": Seed.from_dict( { - "host": "seed.hashyada.com", - "port": 8002, + "host": "seed.darksidetx.net", + "port": 8000, "identity": { "username": "", - "username_signature": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - "public_key": "0254c7e913ebf0c49c80129c7acc306033a62ac52219ec03e41a6f0a2549b91658", + "username_signature": "MEUCIQDArjnhho8q8tCxHLmgvuDDS4qdSgQx1y7aNEGYHi/4ywIgWG/aboG4krfQQ4MS5MaPkedsc1syIbz+jfAGsg/siG4=", + "public_key": "02549a9dc415bc2fd7a4ad8d3ead9be82d051ff605590db8781f45b3f8c5ede431", }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", + "seed_gateway": "MEUCIQDFjb4L3Pv0GaBqdzB0WazxMjUQ8cNG7FBY/v/n9yUgIwIgA+FFy88yMIWqM6fyIeariS4EpyZj33JChr8UJe+Ummc=", } ), - Seed.from_dict( + }, + { + "ranges": [(449000, None)], + "node": Seed.from_dict( { - "host": "seedau.hashyada.com", + "host": "seedno.hashyada.com", "port": 8002, "identity": { "username": "", - "username_signature": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - "public_key": "029fa1eed6c2129f2eb00729c06bd945282c193b09f4cb566738b488268ed131bf", + "username_signature": "MEUCIQCS++mJ1UNC1qywcYFr46l6rOadA0TYGchrA4RSWbsFqQIgM+VqpSkFdvsML5XHHtYFG5oXbQbjdQgXWQIHPuhfFHg=", + "public_key": "03637f6c620bac37adb03106a47682ac0c787cf6b46b5b6670f05989a6983bb1ea", }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", + "seed_gateway": "MEUCIQC4unLqHmurNumWFIqyTwNJFTOttVhfIyMWxfpqDlxh2AIgHpK8UOO8geA916203XcjIb8cpbeKKjT1nKHH6f1a+ds=", } ), - Seed.from_dict( + }, + { + "ranges": [(452000, None)], + "node": Seed.from_dict( { - "host": "seed.crbrain.online", + "host": "seed.friendspool.club", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - "public_key": "020d96b95281506e3e7f03ae3bbb7a91ddf6a6eb573d88fca88d292923be9f9f8d", + "username_signature": "MEUCIQDPBUWV9XpFBLkrwbWalS/NrVST87JTYwWBjiPlSZD/BwIgYdGYC/Kuy4C3CYNzUpQFg/oRC+oPvsMERyYURGN0G8I=", + "public_key": "034f740341e3e5d317e0284fd7420352a8f4af15e2d754f0f852c956ecd66c66c4", }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", + "seed_gateway": "MEUCIQCWPClBEn7FVXuICcLTLxgxAINccOVsjrpHftPcATFLnQIgCUYxh+SFiJhXnd0vGpjxxJq9rQGm2P7dGmqyG3VehTw=", } ), - Seed.from_dict( + }, + { + "ranges": [(467200, None)], + "node": Seed.from_dict( { - "host": "yada-alpha.mynodes.live", + "host": "seed.berkinyada.xyz", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - "public_key": "039f52499e24b192ffd3f93d161965816d1fd41c4f8963fdd654067034e2716e93", + "username_signature": "MEUCIQDNbo0Mnw7IGt8Agm6tff+3GN+pFdi/5yn0kLqfV1FSSwIgcsURlw/G2oAgQd01lKQUzrDiotIVKUMyLfjicq8syyo=", + "public_key": "02eaa032e5cbb32b24541831a86b1df941fa351957fa27b309af0b52c77b21dab3", }, - "seed_gateway": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", + "seed_gateway": "MEUCIQCeSYhmcosLZxrYrya2r7eyY78gQrTn6B83wjlA0ZIpjAIgec2OmwpFf5B3sLBRlAJdkzrGyioV9CSwu55xcuWtdnQ=", } ), - ], - 446400: [ - Seed.from_dict( + }, + { + "ranges": [(467700, 472000)], + "node": Seed.from_dict( { - "host": "yadacoin.io", - "port": 8000, + "host": "seed.funckyman.xyz", + "port": 8003, "identity": { "username": "", - "username_signature": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - "public_key": "02fa9550f57055c96c7ce4c6c9cd1411856beba5c7d5a07417e980a39aa03da3dc", + "username_signature": "MEQCIDRvZf+3x9puA9kX7lj9va5CkJSxoAJXmXAMsT1ZsMFmAiANPPdJ4icpmQTzJ3QYHdM2OupQaWl03zyiESEgH/nzfQ==", + "public_key": "02e0b80642b8c7b3a74e4b38d9e69d4a1bea8e43bed131bbc6d05a3ac05b8eb8ad", }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", + "seed_gateway": "MEQCIGT3g6nJQjXIeYQ7PG7Nt79LPWcgGWHhjYJ3icjVzpGrAiBU8c4tgRsye0frdkckNpKyk3dw6yNuYAHRQtso8dtzEg==", } ), - Seed.from_dict( + }, + { + "ranges": [(472000, None)], # UPDATED IDENTITY INFORMATION + "node": Seed.from_dict( { - "host": "seed.hashyada.com", - "port": 8002, + "host": "seed.funckyman.xyz", + "port": 8003, "identity": { "username": "", - "username_signature": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - "public_key": "0254c7e913ebf0c49c80129c7acc306033a62ac52219ec03e41a6f0a2549b91658", + "username_signature": "MEUCIQDJVkQIx3zuLyqy5ntlisTQn4tNwLd651TieH2f5OGjjAIgAX9rG3+wW1W5YI+3qMlZiay2HrfQVMMZKQa07mJmZ3k=", + "public_key": "03557f082c201a7629f7afd5463e7df30e7feee62dd29a7cf46e559befacbc3a39", }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", + "seed_gateway": "MEQCIEMcoEkJ1k7VzipqLLFlT7RiPsM4UAgPD7IFbf+pFkz1AiAPcV1ZftxnH9MotGe0VcS9TDc0vIjhmrAtHbho7FnZ1Q==", } ), - Seed.from_dict( + }, + { + "ranges": [(477000, None)], + "node": Seed.from_dict( { - "host": "seedau.hashyada.com", - "port": 8002, + "host": "yadaseed1.hashrank.top", + "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - "public_key": "029fa1eed6c2129f2eb00729c06bd945282c193b09f4cb566738b488268ed131bf", + "username_signature": "MEUCIQD91w1mGUZD/+E4KH08LiTXkJ69cgkPnBPBWXL0DZP5nQIgLD55ep9dKQUvXjznaNJ0/t5ARSy2sChqSveKRqOmnlI=", + "public_key": "02e21f8edf6cb09d28e96e561c6fab47f3e34041a8b636154f750be04874078f49", }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", + "seed_gateway": "MEQCICH8oRaWHoZTXvkx3f2g5WCEonod0nhdzyRWJBOw8ldOAiB+6YjjDVfHmceHyg3F6ZQqpH1J4gqEpwu/ass2ul5/8g==", } ), - Seed.from_dict( + }, + { + "ranges": [(479700, None)], + "node": Seed.from_dict( { - "host": "seed.crbrain.online", + "host": "seed.supahash.com", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - "public_key": "020d96b95281506e3e7f03ae3bbb7a91ddf6a6eb573d88fca88d292923be9f9f8d", + "username_signature": "MEQCIE6I6sfqh69hy6VoPKY4kCNfYflcnW3vkOgCH9S3GFR6AiAGf+pDYzpuSywaAaoW6c6q0Rq07Kx+oFQndhPf4MRzDQ==", + "public_key": "0281d4b412373d5330620e78159744cd821f2414d6e1fc300364bd36eb062ee411", }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", + "seed_gateway": "MEUCIQCNas40A04R/y2YrC6e22dU/qYDrgCmrmuGQlbstgTmdwIgbh7dVw6KmU+ee6RRgOc2Vx81G8cLsCUOZdKHa6OBa3s=", } ), - Seed.from_dict( + }, + { + "ranges": [(480100, None)], + "node": Seed.from_dict( { - "host": "yada-alpha.mynodes.live", + "host": "seed.nephotim.co", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - "public_key": "039f52499e24b192ffd3f93d161965816d1fd41c4f8963fdd654067034e2716e93", + "username_signature": "MEQCICV3BfyeG/d3wthW5L9nWYZYejExBHAhJVlzW5iiTjs8AiAQNq0HnPNAm91ymsKu740lgfWwYcUs8gJHuiS9tz5fAA==", + "public_key": "0286fe6085cca02c0ec38b3e628b4d3392c7ee7f052b710519916d33bae3de69da", }, - "seed_gateway": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", + "seed_gateway": "MEQCICHeWBWcuQu7LsziPqX7xQI8svUskEidCJVbUYRxp+D2AiA3P9o19J6Ke6KIY+RGNFE3WPziHYBHwgB6xvyWLZ5BQg==", } ), - Seed.from_dict( + }, + { + "ranges": [(505600, None)], + "node": Seed.from_dict( { - "host": "seed.yada.toksyk.pl", + "host": "seed.rogue-miner.com", "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", - "public_key": "033bd1fea8397cd471333ddd27c43a0d580dde3d477efa7ee1ffe61a770f26e256", + "username_signature": "MEUCIQD0MsT34TkNpYL5kOhLA/4E4YY+SzFhHtIPWPzHCShVGwIgYlzAQeujWvesmU6ZWrTMRwtLFFtjePZjLJDJjTMEQlc=", + "public_key": "03c815e3160b72c0fdd98f5b9fcca5a5ead09163272bc01e4be6397d1d3dbda9b3", }, - "seed_gateway": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", + "seed_gateway": "MEUCIQC/PWvXpjny1yDGDPRtBzl6g7Lb9lcUuI0v0Kf6wxYi4AIgeRb5PtNhO2Eks6iiPEBuebKuXSeTM9euU9sWqOZYUec=", } ), - ], - 449000: [ - Seed.from_dict( + }, + ] + + Seeds.set_fork_points() + Seeds.set_nodes() + + +class SeedGateways(Nodes): + _instance = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super(SeedGateways, cls).__new__(cls) + return cls._instance + + def __init__(self): + if hasattr(self, "initialized"): + return + self.initialized = True + self._NODES = [ + { + "ranges": [(0, None)], + "node": SeedGateway.from_dict( { - "host": "yadacoin.io", + "host": "remotelyrich.com", "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - "public_key": "02fa9550f57055c96c7ce4c6c9cd1411856beba5c7d5a07417e980a39aa03da3dc", + "username_signature": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", + "public_key": "03362203ee71bc15918a7992f3c76728fc4e45f4916d2c0311c37aad0f736b26b9", }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", + "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", } ), - Seed.from_dict( + }, + { + "ranges": [(0, None)], + "node": SeedGateway.from_dict( { - "host": "seed.hashyada.com", - "port": 8002, + "host": "seedgateway.hashyada.com", + "port": 8004, "identity": { "username": "", - "username_signature": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - "public_key": "0254c7e913ebf0c49c80129c7acc306033a62ac52219ec03e41a6f0a2549b91658", + "username_signature": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", + "public_key": "0399f61da3f69d3e1600269c9a946a4c21d3a933d5362f9db613d33fb6a0cb164e", }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", + "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", } ), - Seed.from_dict( + }, + { + "ranges": [(0, None)], + "node": SeedGateway.from_dict( { - "host": "seedau.hashyada.com", - "port": 8002, + "host": "seedgatewayau.hashyada.com", + "port": 8004, "identity": { "username": "", - "username_signature": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - "public_key": "029fa1eed6c2129f2eb00729c06bd945282c193b09f4cb566738b488268ed131bf", + "username_signature": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", + "public_key": "02ea1f0f1214196f8e59616ec1b670e06f9decd250d1eaa345cf6a4667523bbecb", }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", + "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", } ), - Seed.from_dict( + }, + { + "ranges": [(443600, None)], + "node": SeedGateway.from_dict( { - "host": "seed.crbrain.online", + "host": "seedgateway.crbrain.online", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - "public_key": "020d96b95281506e3e7f03ae3bbb7a91ddf6a6eb573d88fca88d292923be9f9f8d", + "username_signature": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", + "public_key": "031a2a3d5f6c7698c20e46fd426bd31b2a30085bfaa1707b430f651899a5f2a5d9", }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", + "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", } ), - Seed.from_dict( + }, + { + "ranges": [(443700, None)], + "node": SeedGateway.from_dict( { - "host": "yada-alpha.mynodes.live", + "host": "yada-bravo.mynodes.live", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - "public_key": "039f52499e24b192ffd3f93d161965816d1fd41c4f8963fdd654067034e2716e93", + "username_signature": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", + "public_key": "03e235fcbe254c4cf4ff569f3c151083513aea0d0d226ae9d869811bfa375eacb9", }, - "seed_gateway": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", + "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", } ), - Seed.from_dict( + }, + { + "ranges": [(446400, None)], + "node": SeedGateway.from_dict( { - "host": "seed.yada.toksyk.pl", + "host": "seedgateway.yada.toksyk.pl", "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", - "public_key": "033bd1fea8397cd471333ddd27c43a0d580dde3d477efa7ee1ffe61a770f26e256", + "username_signature": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", + "public_key": "034254d690ad21ca307886c3cf5d6a37cca77520408fbc831921967f84468442cf", }, - "seed_gateway": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", + "seed": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", } ), - Seed.from_dict( + }, + { + "ranges": [(449000, None)], + "node": SeedGateway.from_dict( { - "host": "seed.darksidetx.net", + "host": "seedgateway.darksidetx.net", "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQDArjnhho8q8tCxHLmgvuDDS4qdSgQx1y7aNEGYHi/4ywIgWG/aboG4krfQQ4MS5MaPkedsc1syIbz+jfAGsg/siG4=", - "public_key": "02549a9dc415bc2fd7a4ad8d3ead9be82d051ff605590db8781f45b3f8c5ede431", + "username_signature": "MEUCIQDFjb4L3Pv0GaBqdzB0WazxMjUQ8cNG7FBY/v/n9yUgIwIgA+FFy88yMIWqM6fyIeariS4EpyZj33JChr8UJe+Ummc=", + "public_key": "03e1ab14af772224ba6cca0a8be1a8471c3deffd0745b7a911634320b30416d910", }, - "seed_gateway": "MEUCIQDFjb4L3Pv0GaBqdzB0WazxMjUQ8cNG7FBY/v/n9yUgIwIgA+FFy88yMIWqM6fyIeariS4EpyZj33JChr8UJe+Ummc=", + "seed": "MEUCIQDArjnhho8q8tCxHLmgvuDDS4qdSgQx1y7aNEGYHi/4ywIgWG/aboG4krfQQ4MS5MaPkedsc1syIbz+jfAGsg/siG4=", } ), - Seed.from_dict( + }, + { + "ranges": [(449000, None)], + "node": SeedGateway.from_dict( { - "host": "seedno.hashyada.com", - "port": 8002, + "host": "seedgatewayno.hashyada.com", + "port": 8004, "identity": { "username": "", - "username_signature": "MEUCIQCS++mJ1UNC1qywcYFr46l6rOadA0TYGchrA4RSWbsFqQIgM+VqpSkFdvsML5XHHtYFG5oXbQbjdQgXWQIHPuhfFHg=", - "public_key": "03637f6c620bac37adb03106a47682ac0c787cf6b46b5b6670f05989a6983bb1ea", + "username_signature": "MEUCIQC4unLqHmurNumWFIqyTwNJFTOttVhfIyMWxfpqDlxh2AIgHpK8UOO8geA916203XcjIb8cpbeKKjT1nKHH6f1a+ds=", + "public_key": "030efaa3bf8b3d2833aa2f30434dfde2fc89f39a12985f8c0e037f3a351f861e71", }, - "seed_gateway": "MEUCIQC4unLqHmurNumWFIqyTwNJFTOttVhfIyMWxfpqDlxh2AIgHpK8UOO8geA916203XcjIb8cpbeKKjT1nKHH6f1a+ds=", + "seed": "MEUCIQCS++mJ1UNC1qywcYFr46l6rOadA0TYGchrA4RSWbsFqQIgM+VqpSkFdvsML5XHHtYFG5oXbQbjdQgXWQIHPuhfFHg=", } ), - ], - 452000: [ - Seed.from_dict( + }, + { + "ranges": [(452000, None)], + "node": SeedGateway.from_dict( { - "host": "yadacoin.io", - "port": 8000, + "host": "seedgateway.friendspool.club", + "port": 8010, "identity": { "username": "", - "username_signature": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - "public_key": "02fa9550f57055c96c7ce4c6c9cd1411856beba5c7d5a07417e980a39aa03da3dc", + "username_signature": "MEUCIQCWPClBEn7FVXuICcLTLxgxAINccOVsjrpHftPcATFLnQIgCUYxh+SFiJhXnd0vGpjxxJq9rQGm2P7dGmqyG3VehTw=", + "public_key": "02ca31aaee2f8cda90080cbc3732f7b107cb254adee6d2efce142a59e76cd86b38", }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", + "seed": "MEUCIQDPBUWV9XpFBLkrwbWalS/NrVST87JTYwWBjiPlSZD/BwIgYdGYC/Kuy4C3CYNzUpQFg/oRC+oPvsMERyYURGN0G8I=", } ), - Seed.from_dict( + }, + { + "ranges": [(467200, None)], + "node": SeedGateway.from_dict( { - "host": "seed.hashyada.com", - "port": 8002, + "host": "seedgat.berkinyada.xyz", + "port": 8000, "identity": { "username": "", - "username_signature": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - "public_key": "0254c7e913ebf0c49c80129c7acc306033a62ac52219ec03e41a6f0a2549b91658", + "username_signature": "MEUCIQCeSYhmcosLZxrYrya2r7eyY78gQrTn6B83wjlA0ZIpjAIgec2OmwpFf5B3sLBRlAJdkzrGyioV9CSwu55xcuWtdnQ=", + "public_key": "029f5d639031ecb391c1858ef9a557b11861a1a6e44c0254db857280b42b2a0d98", }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", + "seed": "MEUCIQDNbo0Mnw7IGt8Agm6tff+3GN+pFdi/5yn0kLqfV1FSSwIgcsURlw/G2oAgQd01lKQUzrDiotIVKUMyLfjicq8syyo=", } ), - Seed.from_dict( + }, + { + "ranges": [(467700, 472000)], + "node": SeedGateway.from_dict( { - "host": "seedau.hashyada.com", - "port": 8002, + "host": "seedgateway.funckyman.xyz", + "port": 8005, "identity": { "username": "", - "username_signature": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - "public_key": "029fa1eed6c2129f2eb00729c06bd945282c193b09f4cb566738b488268ed131bf", + "username_signature": "MEQCIGT3g6nJQjXIeYQ7PG7Nt79LPWcgGWHhjYJ3icjVzpGrAiBU8c4tgRsye0frdkckNpKyk3dw6yNuYAHRQtso8dtzEg==", + "public_key": "025a3c3f7a43f9bea789d227612b8367217117175c7864bcf62d5b228571c70414", }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", + "seed": "MEQCIDRvZf+3x9puA9kX7lj9va5CkJSxoAJXmXAMsT1ZsMFmAiANPPdJ4icpmQTzJ3QYHdM2OupQaWl03zyiESEgH/nzfQ==", } ), - Seed.from_dict( + }, + { + "ranges": [(472000, None)], # UPDATED IDENTITY INFORMATION + "node": SeedGateway.from_dict( { - "host": "seed.crbrain.online", - "port": 8000, + "host": "seedgateway.funckyman.xyz", + "port": 8005, "identity": { "username": "", - "username_signature": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - "public_key": "020d96b95281506e3e7f03ae3bbb7a91ddf6a6eb573d88fca88d292923be9f9f8d", + "username_signature": "MEQCIEMcoEkJ1k7VzipqLLFlT7RiPsM4UAgPD7IFbf+pFkz1AiAPcV1ZftxnH9MotGe0VcS9TDc0vIjhmrAtHbho7FnZ1Q==", + "public_key": "02aba3f23ed5abcfd56456781e505b14a12cc836136d5392b4705bbe38ddf591ad", }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", + "seed": "MEUCIQDJVkQIx3zuLyqy5ntlisTQn4tNwLd651TieH2f5OGjjAIgAX9rG3+wW1W5YI+3qMlZiay2HrfQVMMZKQa07mJmZ3k=", } ), - Seed.from_dict( + }, + { + "ranges": [(477000, None)], + "node": SeedGateway.from_dict( { - "host": "yada-alpha.mynodes.live", + "host": "yadaseed2.hashrank.top", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - "public_key": "039f52499e24b192ffd3f93d161965816d1fd41c4f8963fdd654067034e2716e93", + "username_signature": "MEQCICH8oRaWHoZTXvkx3f2g5WCEonod0nhdzyRWJBOw8ldOAiB+6YjjDVfHmceHyg3F6ZQqpH1J4gqEpwu/ass2ul5/8g==", + "public_key": "03fb0d840b77ede1c26638fb5f60dd02e84cf06f9083b895605bd899b900b31880", }, - "seed_gateway": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", + "seed": "MEUCIQD91w1mGUZD/+E4KH08LiTXkJ69cgkPnBPBWXL0DZP5nQIgLD55ep9dKQUvXjznaNJ0/t5ARSy2sChqSveKRqOmnlI=", } ), - Seed.from_dict( + }, + { + "ranges": [(479700, None)], + "node": SeedGateway.from_dict( { - "host": "seed.yada.toksyk.pl", + "host": "seedgateway.supahash.com", "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", - "public_key": "033bd1fea8397cd471333ddd27c43a0d580dde3d477efa7ee1ffe61a770f26e256", + "username_signature": "MEUCIQCNas40A04R/y2YrC6e22dU/qYDrgCmrmuGQlbstgTmdwIgbh7dVw6KmU+ee6RRgOc2Vx81G8cLsCUOZdKHa6OBa3s=", + "public_key": "023e19a600c2a88e150fd903c12c2386831ddebca2ba51473ecb6a0fae7916f657", }, - "seed_gateway": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", + "seed": "MEQCIE6I6sfqh69hy6VoPKY4kCNfYflcnW3vkOgCH9S3GFR6AiAGf+pDYzpuSywaAaoW6c6q0Rq07Kx+oFQndhPf4MRzDQ==", } ), - Seed.from_dict( + }, + { + "ranges": [(480100, None)], + "node": SeedGateway.from_dict( { - "host": "seed.darksidetx.net", + "host": "gateway.nephotim.co", "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQDArjnhho8q8tCxHLmgvuDDS4qdSgQx1y7aNEGYHi/4ywIgWG/aboG4krfQQ4MS5MaPkedsc1syIbz+jfAGsg/siG4=", - "public_key": "02549a9dc415bc2fd7a4ad8d3ead9be82d051ff605590db8781f45b3f8c5ede431", + "username_signature": "MEQCICHeWBWcuQu7LsziPqX7xQI8svUskEidCJVbUYRxp+D2AiA3P9o19J6Ke6KIY+RGNFE3WPziHYBHwgB6xvyWLZ5BQg==", + "public_key": "0393110452c520d98ebf69bfadf8db36719c3de1b42ef31f31e81523fb87d7b8db", }, - "seed_gateway": "MEUCIQDFjb4L3Pv0GaBqdzB0WazxMjUQ8cNG7FBY/v/n9yUgIwIgA+FFy88yMIWqM6fyIeariS4EpyZj33JChr8UJe+Ummc=", + "seed": "MEQCICV3BfyeG/d3wthW5L9nWYZYejExBHAhJVlzW5iiTjs8AiAQNq0HnPNAm91ymsKu740lgfWwYcUs8gJHuiS9tz5fAA==", } ), - Seed.from_dict( + }, + { + "ranges": [(505600, None)], + "node": SeedGateway.from_dict( { - "host": "seedno.hashyada.com", + "host": "seedgateway.rogue-miner.com", "port": 8002, "identity": { "username": "", - "username_signature": "MEUCIQCS++mJ1UNC1qywcYFr46l6rOadA0TYGchrA4RSWbsFqQIgM+VqpSkFdvsML5XHHtYFG5oXbQbjdQgXWQIHPuhfFHg=", - "public_key": "03637f6c620bac37adb03106a47682ac0c787cf6b46b5b6670f05989a6983bb1ea", - }, - "seed_gateway": "MEUCIQC4unLqHmurNumWFIqyTwNJFTOttVhfIyMWxfpqDlxh2AIgHpK8UOO8geA916203XcjIb8cpbeKKjT1nKHH6f1a+ds=", - } - ), - Seed.from_dict( - { - "host": "seed.friendspool.club", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQDPBUWV9XpFBLkrwbWalS/NrVST87JTYwWBjiPlSZD/BwIgYdGYC/Kuy4C3CYNzUpQFg/oRC+oPvsMERyYURGN0G8I=", - "public_key": "034f740341e3e5d317e0284fd7420352a8f4af15e2d754f0f852c956ecd66c66c4", + "username_signature": "MEUCIQC/PWvXpjny1yDGDPRtBzl6g7Lb9lcUuI0v0Kf6wxYi4AIgeRb5PtNhO2Eks6iiPEBuebKuXSeTM9euU9sWqOZYUec=", + "public_key": "020ce4988acc611e651d539cc2064ec12e04f22b0f95f54cbdfb223174c0d6ee7f", }, - "seed_gateway": "MEUCIQCWPClBEn7FVXuICcLTLxgxAINccOVsjrpHftPcATFLnQIgCUYxh+SFiJhXnd0vGpjxxJq9rQGm2P7dGmqyG3VehTw=", + "seed": "MEUCIQD0MsT34TkNpYL5kOhLA/4E4YY+SzFhHtIPWPzHCShVGwIgYlzAQeujWvesmU6ZWrTMRwtLFFtjePZjLJDJjTMEQlc=", } ), - ], - } + }, + ] + SeedGateways.set_fork_points() + SeedGateways.set_nodes() -class SeedGateways(Nodes): + +class ServiceProviders(Nodes): _instance = None def __new__(cls): if cls._instance is None: - cls._instance = super(SeedGateways, cls).__new__(cls) + cls._instance = super(ServiceProviders, cls).__new__(cls) return cls._instance def __init__(self): if hasattr(self, "initialized"): return self.initialized = True - self.NODES = { - 0: [ - SeedGateway.from_dict( + self._NODES = [ + { + "ranges": [(0, None)], + "node": ServiceProvider.from_dict( { - "host": "remotelyrich.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "public_key": "03362203ee71bc15918a7992f3c76728fc4e45f4916d2c0311c37aad0f736b26b9", - }, - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "public_key": "0399f61da3f69d3e1600269c9a946a4c21d3a933d5362f9db613d33fb6a0cb164e", - }, - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgatewayau.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "public_key": "02ea1f0f1214196f8e59616ec1b670e06f9decd250d1eaa345cf6a4667523bbecb", - }, - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - ], - 443600: [ - SeedGateway.from_dict( - { - "host": "remotelyrich.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "public_key": "03362203ee71bc15918a7992f3c76728fc4e45f4916d2c0311c37aad0f736b26b9", - }, - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "public_key": "0399f61da3f69d3e1600269c9a946a4c21d3a933d5362f9db613d33fb6a0cb164e", - }, - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgatewayau.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "public_key": "02ea1f0f1214196f8e59616ec1b670e06f9decd250d1eaa345cf6a4667523bbecb", - }, - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.crbrain.online", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "public_key": "031a2a3d5f6c7698c20e46fd426bd31b2a30085bfaa1707b430f651899a5f2a5d9", - }, - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - } - ), - ], - 443700: [ - SeedGateway.from_dict( - { - "host": "remotelyrich.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "public_key": "03362203ee71bc15918a7992f3c76728fc4e45f4916d2c0311c37aad0f736b26b9", - }, - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "public_key": "0399f61da3f69d3e1600269c9a946a4c21d3a933d5362f9db613d33fb6a0cb164e", - }, - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgatewayau.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "public_key": "02ea1f0f1214196f8e59616ec1b670e06f9decd250d1eaa345cf6a4667523bbecb", - }, - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.crbrain.online", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "public_key": "031a2a3d5f6c7698c20e46fd426bd31b2a30085bfaa1707b430f651899a5f2a5d9", - }, - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - } - ), - SeedGateway.from_dict( - { - "host": "yada-bravo.mynodes.live", - "port": 8080, - "identity": { - "username": "", - "username_signature": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", - "public_key": "03e235fcbe254c4cf4ff569f3c151083513aea0d0d226ae9d869811bfa375eacb9", - }, - "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - } - ), - ], - 446400: [ - SeedGateway.from_dict( - { - "host": "remotelyrich.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "public_key": "03362203ee71bc15918a7992f3c76728fc4e45f4916d2c0311c37aad0f736b26b9", - }, - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "public_key": "0399f61da3f69d3e1600269c9a946a4c21d3a933d5362f9db613d33fb6a0cb164e", - }, - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgatewayau.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "public_key": "02ea1f0f1214196f8e59616ec1b670e06f9decd250d1eaa345cf6a4667523bbecb", - }, - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.crbrain.online", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "public_key": "031a2a3d5f6c7698c20e46fd426bd31b2a30085bfaa1707b430f651899a5f2a5d9", - }, - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - } - ), - SeedGateway.from_dict( - { - "host": "yada-bravo.mynodes.live", - "port": 8080, - "identity": { - "username": "", - "username_signature": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", - "public_key": "03e235fcbe254c4cf4ff569f3c151083513aea0d0d226ae9d869811bfa375eacb9", - }, - "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.yada.toksyk.pl", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", - "public_key": "034254d690ad21ca307886c3cf5d6a37cca77520408fbc831921967f84468442cf", - }, - "seed": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", - } - ), - ], - 449000: [ - SeedGateway.from_dict( - { - "host": "remotelyrich.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "public_key": "03362203ee71bc15918a7992f3c76728fc4e45f4916d2c0311c37aad0f736b26b9", - }, - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "public_key": "0399f61da3f69d3e1600269c9a946a4c21d3a933d5362f9db613d33fb6a0cb164e", - }, - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgatewayau.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "public_key": "02ea1f0f1214196f8e59616ec1b670e06f9decd250d1eaa345cf6a4667523bbecb", - }, - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.crbrain.online", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "public_key": "031a2a3d5f6c7698c20e46fd426bd31b2a30085bfaa1707b430f651899a5f2a5d9", - }, - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - } - ), - SeedGateway.from_dict( - { - "host": "yada-bravo.mynodes.live", - "port": 8080, - "identity": { - "username": "", - "username_signature": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", - "public_key": "03e235fcbe254c4cf4ff569f3c151083513aea0d0d226ae9d869811bfa375eacb9", - }, - "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.yada.toksyk.pl", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", - "public_key": "034254d690ad21ca307886c3cf5d6a37cca77520408fbc831921967f84468442cf", - }, - "seed": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.darksidetx.net", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQDFjb4L3Pv0GaBqdzB0WazxMjUQ8cNG7FBY/v/n9yUgIwIgA+FFy88yMIWqM6fyIeariS4EpyZj33JChr8UJe+Ummc=", - "public_key": "03e1ab14af772224ba6cca0a8be1a8471c3deffd0745b7a911634320b30416d910", - }, - "seed": "MEUCIQDArjnhho8q8tCxHLmgvuDDS4qdSgQx1y7aNEGYHi/4ywIgWG/aboG4krfQQ4MS5MaPkedsc1syIbz+jfAGsg/siG4=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgatewayno.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEUCIQC4unLqHmurNumWFIqyTwNJFTOttVhfIyMWxfpqDlxh2AIgHpK8UOO8geA916203XcjIb8cpbeKKjT1nKHH6f1a+ds=", - "public_key": "030efaa3bf8b3d2833aa2f30434dfde2fc89f39a12985f8c0e037f3a351f861e71", - }, - "seed": "MEUCIQCS++mJ1UNC1qywcYFr46l6rOadA0TYGchrA4RSWbsFqQIgM+VqpSkFdvsML5XHHtYFG5oXbQbjdQgXWQIHPuhfFHg=", - } - ), - ], - 452000: [ - SeedGateway.from_dict( - { - "host": "remotelyrich.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "public_key": "03362203ee71bc15918a7992f3c76728fc4e45f4916d2c0311c37aad0f736b26b9", - }, - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "public_key": "0399f61da3f69d3e1600269c9a946a4c21d3a933d5362f9db613d33fb6a0cb164e", - }, - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgatewayau.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "public_key": "02ea1f0f1214196f8e59616ec1b670e06f9decd250d1eaa345cf6a4667523bbecb", - }, - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.crbrain.online", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "public_key": "031a2a3d5f6c7698c20e46fd426bd31b2a30085bfaa1707b430f651899a5f2a5d9", - }, - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - } - ), - SeedGateway.from_dict( - { - "host": "yada-bravo.mynodes.live", - "port": 8080, - "identity": { - "username": "", - "username_signature": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", - "public_key": "03e235fcbe254c4cf4ff569f3c151083513aea0d0d226ae9d869811bfa375eacb9", - }, - "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.yada.toksyk.pl", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", - "public_key": "034254d690ad21ca307886c3cf5d6a37cca77520408fbc831921967f84468442cf", - }, - "seed": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.darksidetx.net", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQDFjb4L3Pv0GaBqdzB0WazxMjUQ8cNG7FBY/v/n9yUgIwIgA+FFy88yMIWqM6fyIeariS4EpyZj33JChr8UJe+Ummc=", - "public_key": "03e1ab14af772224ba6cca0a8be1a8471c3deffd0745b7a911634320b30416d910", - }, - "seed": "MEUCIQDArjnhho8q8tCxHLmgvuDDS4qdSgQx1y7aNEGYHi/4ywIgWG/aboG4krfQQ4MS5MaPkedsc1syIbz+jfAGsg/siG4=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgatewayno.hashyada.com", - "port": 8004, - "identity": { - "username": "", - "username_signature": "MEUCIQC4unLqHmurNumWFIqyTwNJFTOttVhfIyMWxfpqDlxh2AIgHpK8UOO8geA916203XcjIb8cpbeKKjT1nKHH6f1a+ds=", - "public_key": "030efaa3bf8b3d2833aa2f30434dfde2fc89f39a12985f8c0e037f3a351f861e71", - }, - "seed": "MEUCIQCS++mJ1UNC1qywcYFr46l6rOadA0TYGchrA4RSWbsFqQIgM+VqpSkFdvsML5XHHtYFG5oXbQbjdQgXWQIHPuhfFHg=", - } - ), - SeedGateway.from_dict( - { - "host": "seedgateway.friendspool.club", - "port": 8010, - "identity": { - "username": "", - "username_signature": "MEUCIQCWPClBEn7FVXuICcLTLxgxAINccOVsjrpHftPcATFLnQIgCUYxh+SFiJhXnd0vGpjxxJq9rQGm2P7dGmqyG3VehTw=", - "public_key": "02ca31aaee2f8cda90080cbc3732f7b107cb254adee6d2efce142a59e76cd86b38", - }, - "seed": "MEUCIQDPBUWV9XpFBLkrwbWalS/NrVST87JTYwWBjiPlSZD/BwIgYdGYC/Kuy4C3CYNzUpQFg/oRC+oPvsMERyYURGN0G8I=", - } - ), - ], - } - - -class ServiceProviders(Nodes): - _instance = None - - def __new__(cls): - if cls._instance is None: - cls._instance = super(ServiceProviders, cls).__new__(cls) - return cls._instance - - def __init__(self): - if hasattr(self, "initialized"): - return - self.initialized = True - self.NODES = { - 0: [ - ServiceProvider.from_dict( - { - "host": "centeridentity.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIC7ADPLI3VPDNpQPaXAeB8gUk2LrvZDJIdEg9C12dj5PAiB61Te/sen1D++EJAcgnGLH4iq7HTZHv/FNByuvu4PrrA==", - "public_key": "02a9aed3a4d69013246d24e25ded69855fbd590cb75b4a90fbfdc337111681feba", - }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceprovider.hashyada.com", - "port": 8006, - "identity": { - "username": "", - "username_signature": "MEQCIDs4GfdyUMFMptmtXsn2vbgQ+rIBfT50nkm++v9swNsjAiA15mHrFehtusgqszbMI5S3nIXQYBUM8Q3smZ615PjL1w==", - "public_key": "023c1bb0de2b8b10f4ff84e13dc6c8d02e113ed297b83e561ca6b302cb70377f0e", - }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceproviderau.hashyada.com", - "port": 8006, - "identity": { - "username": "", - "username_signature": "MEUCIQDvnHZnh1T5dilboTJdYhNT1Rf18SZxDLpNf6TT90RZZwIgXuIvlOVyxepRkskItsTUSaSlZdl9EkzlTP4UEFZ9zmQ=", - "public_key": "02852ea36ef2ccb1274f473d7c65f7fa59731cdfd99c2fc04fd30b097b3b457e6a", - }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - ], - 443600: [ - ServiceProvider.from_dict( - { - "host": "centeridentity.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIC7ADPLI3VPDNpQPaXAeB8gUk2LrvZDJIdEg9C12dj5PAiB61Te/sen1D++EJAcgnGLH4iq7HTZHv/FNByuvu4PrrA==", - "public_key": "02a9aed3a4d69013246d24e25ded69855fbd590cb75b4a90fbfdc337111681feba", - }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceprovider.hashyada.com", - "port": 8006, - "identity": { - "username": "", - "username_signature": "MEQCIDs4GfdyUMFMptmtXsn2vbgQ+rIBfT50nkm++v9swNsjAiA15mHrFehtusgqszbMI5S3nIXQYBUM8Q3smZ615PjL1w==", - "public_key": "023c1bb0de2b8b10f4ff84e13dc6c8d02e113ed297b83e561ca6b302cb70377f0e", - }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceproviderau.hashyada.com", - "port": 8006, - "identity": { - "username": "", - "username_signature": "MEUCIQDvnHZnh1T5dilboTJdYhNT1Rf18SZxDLpNf6TT90RZZwIgXuIvlOVyxepRkskItsTUSaSlZdl9EkzlTP4UEFZ9zmQ=", - "public_key": "02852ea36ef2ccb1274f473d7c65f7fa59731cdfd99c2fc04fd30b097b3b457e6a", - }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceprovider.crbrain.online", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQChurCpzDcki2m8qWjYrU/BZXFLXpwtUXDUltXY/B261AIgfzBQKuMm5nKrKAnA9SUCtS0vdBsVbIF592cK28Dpvfg=", - "public_key": "03e0dabdd40c7ccb6859131b5c2968e6ac6099222eee51f10ba7d3549f4ae465e3", - }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - } - ), - ], - 443700: [ - ServiceProvider.from_dict( - { - "host": "centeridentity.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIC7ADPLI3VPDNpQPaXAeB8gUk2LrvZDJIdEg9C12dj5PAiB61Te/sen1D++EJAcgnGLH4iq7HTZHv/FNByuvu4PrrA==", - "public_key": "02a9aed3a4d69013246d24e25ded69855fbd590cb75b4a90fbfdc337111681feba", - }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceprovider.hashyada.com", - "port": 8006, - "identity": { - "username": "", - "username_signature": "MEQCIDs4GfdyUMFMptmtXsn2vbgQ+rIBfT50nkm++v9swNsjAiA15mHrFehtusgqszbMI5S3nIXQYBUM8Q3smZ615PjL1w==", - "public_key": "023c1bb0de2b8b10f4ff84e13dc6c8d02e113ed297b83e561ca6b302cb70377f0e", - }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceproviderau.hashyada.com", - "port": 8006, - "identity": { - "username": "", - "username_signature": "MEUCIQDvnHZnh1T5dilboTJdYhNT1Rf18SZxDLpNf6TT90RZZwIgXuIvlOVyxepRkskItsTUSaSlZdl9EkzlTP4UEFZ9zmQ=", - "public_key": "02852ea36ef2ccb1274f473d7c65f7fa59731cdfd99c2fc04fd30b097b3b457e6a", - }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceprovider.crbrain.online", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQChurCpzDcki2m8qWjYrU/BZXFLXpwtUXDUltXY/B261AIgfzBQKuMm5nKrKAnA9SUCtS0vdBsVbIF592cK28Dpvfg=", - "public_key": "03e0dabdd40c7ccb6859131b5c2968e6ac6099222eee51f10ba7d3549f4ae465e3", - }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - } - ), - ServiceProvider.from_dict( - { - "host": "yada-charlie.mynodes.live", - "port": 8080, - "identity": { - "username": "", - "username_signature": "MEQCIG5VITo79hYorFepmBB6zRqSl/PSbRPpz5gTaSteJQlaAiAmuQnTZFCuccjTtufWJ8CI+w/ddka/AoNQgat3H+18Jw==", - "public_key": "02247e2c03792a20c6a22da086641aae3bced66c9d6a98212c77622ba9bc5476ff", - }, - "seed_gateway": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", - "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - } - ), - ], - 446400: [ - ServiceProvider.from_dict( - { - "host": "centeridentity.com", + "host": "centeridentity.com", "port": 8000, "identity": { "username": "", @@ -1135,7 +616,10 @@ def __init__(self): "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(0, None)], + "node": ServiceProvider.from_dict( { "host": "serviceprovider.hashyada.com", "port": 8006, @@ -1148,7 +632,10 @@ def __init__(self): "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(0, None)], + "node": ServiceProvider.from_dict( { "host": "serviceproviderau.hashyada.com", "port": 8006, @@ -1161,7 +648,10 @@ def __init__(self): "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(443600, None)], + "node": ServiceProvider.from_dict( { "host": "serviceprovider.crbrain.online", "port": 8000, @@ -1174,90 +664,13 @@ def __init__(self): "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(443700, None)], + "node": ServiceProvider.from_dict( { "host": "yada-charlie.mynodes.live", - "port": 8080, - "identity": { - "username": "", - "username_signature": "MEQCIG5VITo79hYorFepmBB6zRqSl/PSbRPpz5gTaSteJQlaAiAmuQnTZFCuccjTtufWJ8CI+w/ddka/AoNQgat3H+18Jw==", - "public_key": "02247e2c03792a20c6a22da086641aae3bced66c9d6a98212c77622ba9bc5476ff", - }, - "seed_gateway": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", - "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceprovider.yada.toksyk.pl", - "port": 8080, - "identity": { - "username": "", - "username_signature": "MEQCIEH/G/iTuiJSdcC0Q3tZ+HepDYetUf5kN2s195pT8SjnAiArhoo4Dm6PbNYIPNDlbuOLzcBiO/A7ONYmviBYDCTW9Q==", - "public_key": "0308531862af7ce061fa1742cba9c25d142b2535cd7cb104281196b764e79b3d4f", - }, - "seed_gateway": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", - "seed": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", - } - ), - ], - 449000: [ - ServiceProvider.from_dict( - { - "host": "centeridentity.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIC7ADPLI3VPDNpQPaXAeB8gUk2LrvZDJIdEg9C12dj5PAiB61Te/sen1D++EJAcgnGLH4iq7HTZHv/FNByuvu4PrrA==", - "public_key": "02a9aed3a4d69013246d24e25ded69855fbd590cb75b4a90fbfdc337111681feba", - }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceprovider.hashyada.com", - "port": 8006, - "identity": { - "username": "", - "username_signature": "MEQCIDs4GfdyUMFMptmtXsn2vbgQ+rIBfT50nkm++v9swNsjAiA15mHrFehtusgqszbMI5S3nIXQYBUM8Q3smZ615PjL1w==", - "public_key": "023c1bb0de2b8b10f4ff84e13dc6c8d02e113ed297b83e561ca6b302cb70377f0e", - }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceproviderau.hashyada.com", - "port": 8006, - "identity": { - "username": "", - "username_signature": "MEUCIQDvnHZnh1T5dilboTJdYhNT1Rf18SZxDLpNf6TT90RZZwIgXuIvlOVyxepRkskItsTUSaSlZdl9EkzlTP4UEFZ9zmQ=", - "public_key": "02852ea36ef2ccb1274f473d7c65f7fa59731cdfd99c2fc04fd30b097b3b457e6a", - }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", - } - ), - ServiceProvider.from_dict( - { - "host": "serviceprovider.crbrain.online", "port": 8000, - "identity": { - "username": "", - "username_signature": "MEUCIQChurCpzDcki2m8qWjYrU/BZXFLXpwtUXDUltXY/B261AIgfzBQKuMm5nKrKAnA9SUCtS0vdBsVbIF592cK28Dpvfg=", - "public_key": "03e0dabdd40c7ccb6859131b5c2968e6ac6099222eee51f10ba7d3549f4ae465e3", - }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", - } - ), - ServiceProvider.from_dict( - { - "host": "yada-charlie.mynodes.live", - "port": 8080, "identity": { "username": "", "username_signature": "MEQCIG5VITo79hYorFepmBB6zRqSl/PSbRPpz5gTaSteJQlaAiAmuQnTZFCuccjTtufWJ8CI+w/ddka/AoNQgat3H+18Jw==", @@ -1267,7 +680,10 @@ def __init__(self): "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(446400, None)], + "node": ServiceProvider.from_dict( { "host": "serviceprovider.yada.toksyk.pl", "port": 8080, @@ -1280,7 +696,10 @@ def __init__(self): "seed": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(449000, None)], + "node": ServiceProvider.from_dict( { "host": "serviceprovider.darksidetx.net", "port": 8000, @@ -1293,7 +712,10 @@ def __init__(self): "seed": "MEUCIQDArjnhho8q8tCxHLmgvuDDS4qdSgQx1y7aNEGYHi/4ywIgWG/aboG4krfQQ4MS5MaPkedsc1syIbz+jfAGsg/siG4=", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(449000, None)], + "node": ServiceProvider.from_dict( { "host": "serviceproviderno.hashyada.com", "port": 8006, @@ -1306,124 +728,135 @@ def __init__(self): "seed": "MEUCIQCS++mJ1UNC1qywcYFr46l6rOadA0TYGchrA4RSWbsFqQIgM+VqpSkFdvsML5XHHtYFG5oXbQbjdQgXWQIHPuhfFHg=", } ), - ], - 452000: [ - ServiceProvider.from_dict( - { - "host": "centeridentity.com", - "port": 8000, - "identity": { - "username": "", - "username_signature": "MEQCIC7ADPLI3VPDNpQPaXAeB8gUk2LrvZDJIdEg9C12dj5PAiB61Te/sen1D++EJAcgnGLH4iq7HTZHv/FNByuvu4PrrA==", - "public_key": "02a9aed3a4d69013246d24e25ded69855fbd590cb75b4a90fbfdc337111681feba", - }, - "seed_gateway": "MEQCIHONdT7i8K+ZTzv3PHyPAhYkaksoh6FxEJUmPLmXZqFPAiBHOnt1CjgMtNzCGdBk/0S/oikPzJVys32bgThxXtAbgQ==", - "seed": "MEUCIQCP+rF5R4sZ7pHJCBAWHxARLg9GN4dRw+/pobJ0MPmX3gIgX0RD4OxhSS9KPJTUonYI1Tr+ZI2N9uuoToZo1RGOs2M=", - } - ), - ServiceProvider.from_dict( + }, + { + "ranges": [(452000, None)], + "node": ServiceProvider.from_dict( { - "host": "serviceprovider.hashyada.com", - "port": 8006, + "host": "serviceprovider.friendspool.club", + "port": 8011, "identity": { "username": "", - "username_signature": "MEQCIDs4GfdyUMFMptmtXsn2vbgQ+rIBfT50nkm++v9swNsjAiA15mHrFehtusgqszbMI5S3nIXQYBUM8Q3smZ615PjL1w==", - "public_key": "023c1bb0de2b8b10f4ff84e13dc6c8d02e113ed297b83e561ca6b302cb70377f0e", + "username_signature": "MEUCIQDO6Nj9pcRZCo6TtOf9ayy17h0PfyKmgxVHSH81EtdITgIgM9TrMrfomG9AnIj697tbmDW4LZOz8+ao48iApGHfdXk=", + "public_key": "0388318e5a7cbfc2a0a7501d0ebad6495f17d09fb068f295efad23b90bfd572eb4", }, - "seed_gateway": "MEQCIF3Wlbk99pgxKVrb6Iqdd6L5AJMJgVhc9rrB64P+oHhKAiAfTDCx1GaSWYUyX69k+7GuctPeEclpdXCbR0vly/q77A==", - "seed": "MEQCIHrMlgx3RzvLg+8eU1LXfY5QLk2le1mOUM2JLnRSSqTRAiByXKWP7cKasX2kB9VqIm43wT004evxNRQX+YYl5I30jg==", + "seed_gateway": "MEUCIQCWPClBEn7FVXuICcLTLxgxAINccOVsjrpHftPcATFLnQIgCUYxh+SFiJhXnd0vGpjxxJq9rQGm2P7dGmqyG3VehTw=", + "seed": "MEUCIQDPBUWV9XpFBLkrwbWalS/NrVST87JTYwWBjiPlSZD/BwIgYdGYC/Kuy4C3CYNzUpQFg/oRC+oPvsMERyYURGN0G8I=", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(467200, None)], + "node": ServiceProvider.from_dict( { - "host": "serviceproviderau.hashyada.com", - "port": 8006, + "host": "servic.berkinyada.xyz", + "port": 8000, "identity": { "username": "", - "username_signature": "MEUCIQDvnHZnh1T5dilboTJdYhNT1Rf18SZxDLpNf6TT90RZZwIgXuIvlOVyxepRkskItsTUSaSlZdl9EkzlTP4UEFZ9zmQ=", - "public_key": "02852ea36ef2ccb1274f473d7c65f7fa59731cdfd99c2fc04fd30b097b3b457e6a", + "username_signature": "MEUCIQDbkNuFjpMi8YcMKFHOjpWtlpM5Ul+lnskdIiwSFRcNmAIgMbTCmXBYL/vNxxlnzoWvscAuv0jQ0J9U8biL812+O+U=", + "public_key": "03685f915435a2dbd185b3998902f59915a24ef339c35792313afc4d712acc4bd5", }, - "seed_gateway": "MEQCIAfwzpFwXbBqKpAWAK10D89EiVw4TzJZL6lnAyMzangsAiBclX/x4vn+KT0y92bDrB6vaX6zQ9otAndoOyI8wonTFw==", - "seed": "MEUCIQDndXZRuUTF/l8ANXHvOaWW4+u/8yJPHhGoo80L4AdwrgIgGJtUm+1h/PGrBaqtKwZuNVYcDh6t/yEM/aT3ryYVCMU=", + "seed_gateway": "MEUCIQCeSYhmcosLZxrYrya2r7eyY78gQrTn6B83wjlA0ZIpjAIgec2OmwpFf5B3sLBRlAJdkzrGyioV9CSwu55xcuWtdnQ=", + "seed": "MEUCIQDNbo0Mnw7IGt8Agm6tff+3GN+pFdi/5yn0kLqfV1FSSwIgcsURlw/G2oAgQd01lKQUzrDiotIVKUMyLfjicq8syyo=", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(467700, 472000)], + "node": ServiceProvider.from_dict( { - "host": "serviceprovider.crbrain.online", - "port": 8000, + "host": "serviceprovider.funckyman.xyz", + "port": 8007, "identity": { "username": "", - "username_signature": "MEUCIQChurCpzDcki2m8qWjYrU/BZXFLXpwtUXDUltXY/B261AIgfzBQKuMm5nKrKAnA9SUCtS0vdBsVbIF592cK28Dpvfg=", - "public_key": "03e0dabdd40c7ccb6859131b5c2968e6ac6099222eee51f10ba7d3549f4ae465e3", + "username_signature": "MEUCIQCJpJ8EYXEB9dgeVOTjiycxsVf8y/3yulsO1BtlryGlxAIgJzou0GBjJJZDgcym8dvr6eOPIZ8HZFXQdRzInE1eAV4=", + "public_key": "0398796055a38c4ca375f8dec793101e520c5035a0407b856b597a57d38147aa09", }, - "seed_gateway": "MEUCIQCa8eobxfvfSM4E6ipM1qRFYXJVKdj1g3NiS+ZotzdNswIgNbJwvU/g+myeyr9FWSH+jDlPTavGO/tDLyRnjLGB+vQ=", - "seed": "MEQCIE1NbKkxlr6lOAETGPL5BXmI5+pcADnieJ7Je8rHcdv9AiBcS4garwsDGhILMU4Chwd8pJAg0JFcmVTGHZ2wIA/y4Q==", + "seed_gateway": "MEQCIGT3g6nJQjXIeYQ7PG7Nt79LPWcgGWHhjYJ3icjVzpGrAiBU8c4tgRsye0frdkckNpKyk3dw6yNuYAHRQtso8dtzEg==", + "seed": "MEQCIDRvZf+3x9puA9kX7lj9va5CkJSxoAJXmXAMsT1ZsMFmAiANPPdJ4icpmQTzJ3QYHdM2OupQaWl03zyiESEgH/nzfQ==", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(472000, None)], # UPDATED IDENTITY INFORMATION + "node": ServiceProvider.from_dict( { - "host": "yada-charlie.mynodes.live", - "port": 8080, + "host": "serviceprovider.funckyman.xyz", + "port": 8007, "identity": { "username": "", - "username_signature": "MEQCIG5VITo79hYorFepmBB6zRqSl/PSbRPpz5gTaSteJQlaAiAmuQnTZFCuccjTtufWJ8CI+w/ddka/AoNQgat3H+18Jw==", - "public_key": "02247e2c03792a20c6a22da086641aae3bced66c9d6a98212c77622ba9bc5476ff", + "username_signature": "MEUCIQDSI+CA17XkAYWlCQsKRkXwWlBoz5hddxCT+/ECTTJW5AIgUvim2ZqBqtAfRRYdM2FmWIXOI/KyqH7Bgxwh09x8ads=", + "public_key": "02eda40d55a2bc1019e319bd360af79e9798c64575e010a20b8a74e3e2b825aeb3", }, - "seed_gateway": "MEQCIFvpbWRQU9Ty4JXxoGH4YXgR8RiLoLBm11RNKBVeaz4GAiAyGMbhXc+J+z5VIh2GGJi9uDsqdPpEweerViSrxpxzPQ==", - "seed": "MEQCICCXzIpmoNdU2sZsI35lqIl1bt5W1MW49NhjO95S2wlSAiAY04erBPVYvLWJ1SJCm5FtgJ3hyikVH3sw/fGlNUYuGQ==", + "seed_gateway": "MEQCIEMcoEkJ1k7VzipqLLFlT7RiPsM4UAgPD7IFbf+pFkz1AiAPcV1ZftxnH9MotGe0VcS9TDc0vIjhmrAtHbho7FnZ1Q==", + "seed": "MEUCIQDJVkQIx3zuLyqy5ntlisTQn4tNwLd651TieH2f5OGjjAIgAX9rG3+wW1W5YI+3qMlZiay2HrfQVMMZKQa07mJmZ3k=", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(477000, None)], + "node": ServiceProvider.from_dict( { - "host": "serviceprovider.yada.toksyk.pl", - "port": 8080, + "host": "yadaseed3.hashrank.top", + "port": 8000, "identity": { "username": "", - "username_signature": "MEQCIEH/G/iTuiJSdcC0Q3tZ+HepDYetUf5kN2s195pT8SjnAiArhoo4Dm6PbNYIPNDlbuOLzcBiO/A7ONYmviBYDCTW9Q==", - "public_key": "0308531862af7ce061fa1742cba9c25d142b2535cd7cb104281196b764e79b3d4f", + "username_signature": "MEUCIQDIxOMoBkry0+BkJrUm2YBS9jrXkOtnOQwaGFLBkm3fvgIgUrHT6IV7isnIBFeJCzoi6jr4NbvMJU5w4APnNAIHNaI=", + "public_key": "0273b3c11252c0b997c3936b2a3cc46f1c3245e24e8b2efff8cda8320e07b33cfb", }, - "seed_gateway": "MEQCIAvo5gGrW6Uod4L6Qo5bekaKpursERu0UII1VTCR1i8zAiAW4UeZD/GKevh3/lSezWaFHZ4+oBq5wTCggEpvCljhUA==", - "seed": "MEUCIQCOONwPlGftYSOGfzCnRGT0y5DH401G6I8nDNwbsYemfQIgBP7XketGtzfsocIR82xjyMYt06j3VY59yO6w6SXwMjk=", + "seed_gateway": "MEQCICH8oRaWHoZTXvkx3f2g5WCEonod0nhdzyRWJBOw8ldOAiB+6YjjDVfHmceHyg3F6ZQqpH1J4gqEpwu/ass2ul5/8g==", + "seed": "MEUCIQD91w1mGUZD/+E4KH08LiTXkJ69cgkPnBPBWXL0DZP5nQIgLD55ep9dKQUvXjznaNJ0/t5ARSy2sChqSveKRqOmnlI=", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(479700, None)], + "node": ServiceProvider.from_dict( { - "host": "serviceprovider.darksidetx.net", + "host": "serviceprovider.supahash.com", "port": 8000, "identity": { "username": "", - "username_signature": "MEQCICD0iFCEux94iEwHKMBQxxV665VW/ozsr9rSfktt+BRSAiB0FvEvODTVufiBKiARKOq2zSyFKIckjvGtRi52ow45Ig==", - "public_key": "0276534e0133e6ee3b1267d4ad9046d23db89dbe2b4e1ba5d18382791cf7f63a93", + "username_signature": "MEUCIQCi7PkxJrgR7T2PDK5BCxT8DJ/oLhoa/zpuPbqb0EqapwIgM4NXxuAZn4nh+cncIgb/VkJLeQAQnqj+sNj39oRWvn8=", + "public_key": "03853af02ad22e2a76fb0cf6e3f5ae5d173eb1ba2cdd2b140df266690d8063ebcf", }, - "seed_gateway": "MEUCIQDFjb4L3Pv0GaBqdzB0WazxMjUQ8cNG7FBY/v/n9yUgIwIgA+FFy88yMIWqM6fyIeariS4EpyZj33JChr8UJe+Ummc=", - "seed": "MEUCIQDArjnhho8q8tCxHLmgvuDDS4qdSgQx1y7aNEGYHi/4ywIgWG/aboG4krfQQ4MS5MaPkedsc1syIbz+jfAGsg/siG4=", + "seed_gateway": "MEUCIQCNas40A04R/y2YrC6e22dU/qYDrgCmrmuGQlbstgTmdwIgbh7dVw6KmU+ee6RRgOc2Vx81G8cLsCUOZdKHa6OBa3s=", + "seed": "MEQCIE6I6sfqh69hy6VoPKY4kCNfYflcnW3vkOgCH9S3GFR6AiAGf+pDYzpuSywaAaoW6c6q0Rq07Kx+oFQndhPf4MRzDQ==", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(480100, None)], + "node": ServiceProvider.from_dict( { - "host": "serviceproviderno.hashyada.com", - "port": 8006, + "host": "serviceprovider.nephotim.co", + "port": 8000, "identity": { "username": "", - "username_signature": "MEQCIF1qj/XOXWT8a77NLiqcz/x5mHLa19YSwk/BSY6qb3EkAiBQjo6fHUkuSWQqwp5sZUdaou9a8hMGhqpmcuP9oKbAkw==", - "public_key": "0299c1cfe9f2490f14836032f772391b3c53fb2df513f3c502790a650ec17dc105", + "username_signature": "MEQCIDLZN6Q5WLperdJbHu1mNyZsXmk7fqA6l7tXlthkArglAiAfapsk3v4s8cTLZf22R62ht2SocD2+jSX2HNc4C05SMA==", + "public_key": "021aab430ef88f35eaeb183dcf6f82128d7ad02b628b6e705c90d5708fc66f4c33", }, - "seed_gateway": "MEUCIQC4unLqHmurNumWFIqyTwNJFTOttVhfIyMWxfpqDlxh2AIgHpK8UOO8geA916203XcjIb8cpbeKKjT1nKHH6f1a+ds=", - "seed": "MEUCIQCS++mJ1UNC1qywcYFr46l6rOadA0TYGchrA4RSWbsFqQIgM+VqpSkFdvsML5XHHtYFG5oXbQbjdQgXWQIHPuhfFHg=", + "seed_gateway": "MEQCICHeWBWcuQu7LsziPqX7xQI8svUskEidCJVbUYRxp+D2AiA3P9o19J6Ke6KIY+RGNFE3WPziHYBHwgB6xvyWLZ5BQg==", + "seed": "MEQCICV3BfyeG/d3wthW5L9nWYZYejExBHAhJVlzW5iiTjs8AiAQNq0HnPNAm91ymsKu740lgfWwYcUs8gJHuiS9tz5fAA==", } ), - ServiceProvider.from_dict( + }, + { + "ranges": [(505600, None)], + "node": ServiceProvider.from_dict( { - "host": "serviceprovider.friendspool.club", - "port": 8011, + "host": "serviceprovider.rogue-miner.com", + "port": 8003, "identity": { "username": "", - "username_signature": "MEUCIQDO6Nj9pcRZCo6TtOf9ayy17h0PfyKmgxVHSH81EtdITgIgM9TrMrfomG9AnIj697tbmDW4LZOz8+ao48iApGHfdXk=", - "public_key": "0388318e5a7cbfc2a0a7501d0ebad6495f17d09fb068f295efad23b90bfd572eb4", + "username_signature": "MEUCIQDgXK4dHUpOAiqfaItWyweWijHRGez+k071wEvqSKm9rgIgZA7MJEjvHSN1FDrnMVsSKx2j74q4gaUiYcs+WYW261M=", + "public_key": "024321b0dc01c7d200e2d2f5b4f0a15883fb3dc91f7ff1df36daa7a195defcd171", }, - "seed_gateway": "MEUCIQCWPClBEn7FVXuICcLTLxgxAINccOVsjrpHftPcATFLnQIgCUYxh+SFiJhXnd0vGpjxxJq9rQGm2P7dGmqyG3VehTw=", - "seed": "MEUCIQDPBUWV9XpFBLkrwbWalS/NrVST87JTYwWBjiPlSZD/BwIgYdGYC/Kuy4C3CYNzUpQFg/oRC+oPvsMERyYURGN0G8I=", + "seed_gateway": "MEUCIQC/PWvXpjny1yDGDPRtBzl6g7Lb9lcUuI0v0Kf6wxYi4AIgeRb5PtNhO2Eks6iiPEBuebKuXSeTM9euU9sWqOZYUec=", + "seed": "MEUCIQD0MsT34TkNpYL5kOhLA/4E4YY+SzFhHtIPWPzHCShVGwIgYlzAQeujWvesmU6ZWrTMRwtLFFtjePZjLJDJjTMEQlc==", } ), - ], - } + }, + ] + ServiceProviders.set_fork_points() + ServiceProviders.set_nodes() diff --git a/yadacoin/core/peer.py b/yadacoin/core/peer.py index e41cf012..9c3959f7 100644 --- a/yadacoin/core/peer.py +++ b/yadacoin/core/peer.py @@ -246,7 +246,7 @@ async def ensure_peers_connected(self): for k, v in self.config.nodeClient.outbound_ignore[ outbound_class.__name__ ].items() - if (time.time() - v) < 30 + if (time.time() - v) < 120 } await self.connect( stream_collection, @@ -268,11 +268,11 @@ async def connect(self, stream_collection, limit, peers, ignored_peers): @staticmethod async def is_synced(): - streams = Config().peer.get_sync_peers() - async for stream in streams: - if not stream.synced: - return False - return True + streams = await Config().peer.get_outbound_streams() + for stream in streams: + if stream.synced: + return True + return False def to_dict(self): return { @@ -924,7 +924,7 @@ async def get_outbound_pending(self): @classmethod def type_limit(cls, peer): if peer == ServiceProvider: - return 3 + return 6 elif peer == User: return Config().max_peers or 100000 else: @@ -1094,4 +1094,4 @@ async def get_routes(): outbound_peer.seed_gateway ].identity.generate_rid(outbound_peer.identity.username_signature) routes.append(f"{seed_rid}:{seed_gateway_rid}:{outbound_peer.rid}") - return routes + return routes \ No newline at end of file diff --git a/yadacoin/core/processingqueue.py b/yadacoin/core/processingqueue.py index 118028eb..bc5a2240 100644 --- a/yadacoin/core/processingqueue.py +++ b/yadacoin/core/processingqueue.py @@ -1,4 +1,5 @@ from time import time +import asyncio from yadacoin.core.block import Block from yadacoin.core.blockchain import Blockchain @@ -10,6 +11,7 @@ class ProcessingQueue: num_items_processed = 0 + num_invalid_items = 0 time_sum = 0 def time_sum_start(self): @@ -21,6 +23,9 @@ def time_sum_end(self): def inc_num_items_processed(self): self.num_items_processed += 1 + def inc_num_invalid_items(self): + self.num_invalid_items += 1 + def to_dict(self): return {"queue": self.queue} @@ -102,21 +107,35 @@ def __init__(self, miner: Miner = "", stream=None, body=None): class NonceProcessingQueue(ProcessingQueue): def __init__(self): - self.queue = {} - self.last_popped = "" + self.queue = asyncio.Queue() + self.start_time = None + self.time_sum = 0 - def add(self, item: NonceProcessingQueueItem): - if (item.id, item.nonce) == self.last_popped: - return - self.queue.setdefault((item.id, item.nonce), item) - return True + async def time_sum_start(self): + self.start_time = time() - def pop(self): - if not self.queue: + async def time_sum_end(self): + if hasattr(self, 'start_time'): + self.time_sum += time() - self.start_time + + async def add(self, item: NonceProcessingQueueItem): + key = (item.id, item.nonce) + await self.queue.put(item) + + async def pop(self): + try: + item = await self.queue.get() + return item + except asyncio.QueueEmpty: return None - key, item = self.queue.popitem() - self.last_popped = key - return item + + def to_status_dict(self): + return { + "queue_item_count": self.queue.qsize(), + "average_processing_time": "%.4f" % (self.time_sum / (self.num_items_processed or 1)), + "num_items_processed": self.num_items_processed, + "num_invalid_items": self.num_invalid_items, + } class ProcessingQueues: @@ -134,5 +153,7 @@ def to_dict(self): return out def to_status_dict(self): - out = {x.__class__.__name__: x.to_status_dict() for x in self.queues} - return out + out = {} + for x in self.queues: + out[x.__class__.__name__] = x.to_status_dict() + return out \ No newline at end of file diff --git a/yadacoin/core/transaction.py b/yadacoin/core/transaction.py index 88e6b20a..5f26aad8 100644 --- a/yadacoin/core/transaction.py +++ b/yadacoin/core/transaction.py @@ -58,6 +58,10 @@ class InvalidRelationshipHashException(Exception): pass +class TooManyInputsException(Exception): + pass + + class TransactionConsts(Enum): RELATIONSHIP_MAX_SIZE = 20480 @@ -83,7 +87,8 @@ def __init__( seed_rid="", version=None, miner_signature="", - contract_generated=False, + contract_generated=None, + is_contract_generated=None, relationship_hash="", never_expire=False, private=False, @@ -172,7 +177,7 @@ async def generate( exact_match=False, version=5, miner_signature="", - contract_generated=False, + contract_generated=None, do_money=True, never_expire=False, private=False, @@ -240,14 +245,6 @@ async def generate( cls_inst.private = private return cls_inst - async def get_mempool_transaction_ids(self): - miner_transactions = self.mongo.async_db.miner_transactions.find( - {"public_key": self.public_key} - ) - async for mtxn in miner_transactions: - for mtxninput in mtxn["inputs"]: - yield mtxninput["id"] - async def do_money(self): if self.coinbase: self.inputs = [] @@ -259,7 +256,6 @@ async def do_money(self): P2PKHBitcoinAddress.from_pubkey(bytes.fromhex(self.public_key)) ) - mtxn_ids = self.get_mempool_transaction_ids() input_sum = 0 inputs = [] if self.inputs: @@ -270,7 +266,6 @@ async def do_money(self): input_sum = await self.generate_inputs( input_sum, my_address, - [x async for x in mtxn_ids], inputs, outputs_and_fee_total, ) @@ -317,10 +312,12 @@ async def evaluate_inputs( raise NotEnoughMoneyException("not enough money") async def generate_inputs( - self, input_sum, my_address, mtxn_ids, inputs, outputs_and_fee_total + self, input_sum, my_address, inputs, outputs_and_fee_total ): - async for input_txn in self.config.BU.get_wallet_unspent_transactions( - my_address, no_zeros=True, ids=mtxn_ids + async for ( + input_txn + ) in self.config.BU.get_wallet_unspent_transactions_for_spending( + my_address, inc_mempool=True ): txn = await self.config.BU.get_transaction_by_id( input_txn["id"], instance=True @@ -380,7 +377,7 @@ def from_dict(cls, txn): relationship=txn.get("relationship", ""), public_key=txn.get("public_key"), dh_public_key=txn.get("dh_public_key"), - fee=float(txn.get("fee")), + fee=float(txn.get("fee", 0)), requester_rid=txn.get("requester_rid", ""), requested_rid=txn.get("requested_rid", ""), txn_hash=txn.get("hash", ""), @@ -389,10 +386,11 @@ def from_dict(cls, txn): coinbase=txn.get("coinbase", False), version=txn.get("version"), miner_signature=txn.get("miner_signature", ""), - contract_generated=txn.get("contract_generated", ""), + contract_generated=txn.get("contract_generated"), relationship_hash=txn.get("relationship_hash", ""), private=txn.get("private", False), never_expire=txn.get("never_expire", False), + masternode_fee=float(txn.get("masternode_fee", 0)), ) def in_the_future(self): @@ -403,10 +401,17 @@ async def get_inputs(self, inputs): for x in inputs: yield x - async def is_contract_generated(self): - if await self.get_generating_contract(): - return True - return False + @property + async def contract_generated(self): + if self._contract_generated is None: + if await self.get_generating_contract(): + self._contract_generated = True + self._contract_generated = False + return self._contract_generated + + @contract_generated.setter + def contract_generated(self, value): + self._contract_generated = value async def get_generating_contract(self): from yadacoin.contracts.base import Contract @@ -436,6 +441,8 @@ def ensure_instance(txn): @staticmethod async def handle_exception(e, txn): + if isinstance(e, TooManyInputsException): + txn.inputs = [] config = Config() await config.mongo.async_db.failed_transactions.insert_one( { @@ -449,15 +456,7 @@ async def handle_exception(e, txn): ) config.app_log.warning("Exception {}".format(e)) - async def verify(self, check_input_spent=False): - from yadacoin.contracts.base import Contract - - verify_hash = await self.generate_hash() - address = str(P2PKHBitcoinAddress.from_pubkey(bytes.fromhex(self.public_key))) - - if verify_hash != self.hash: - raise InvalidTransactionException("transaction is invalid") - + def verify_signature(self, address): try: result = verify_signature( base64.b64decode(self.transaction_signature), @@ -465,7 +464,6 @@ async def verify(self, check_input_spent=False): bytes.fromhex(self.public_key), ) if not result: - print("t verify1") raise Exception() except: try: @@ -479,7 +477,6 @@ async def verify(self, check_input_spent=False): sigdecode=sigdecode_der, ) if not result: - print("t verify2") raise Exception() except: try: @@ -489,14 +486,33 @@ async def verify(self, check_input_spent=False): self.transaction_signature, ) if not result: - print("t verify3") raise except: - print("t verify3") raise InvalidTransactionSignatureException( "transaction signature did not verify" ) + async def verify( + self, + check_input_spent=False, + check_max_inputs=False, + check_masternode_fee=False, + ): + from yadacoin.contracts.base import Contract + + if check_max_inputs and len(self.inputs) > CHAIN.MAX_INPUTS: + raise TooManyInputsException( + f"Maximum inputs of {CHAIN.MAX_INPUTS} exceeded." + ) + + verify_hash = await self.generate_hash() + address = str(P2PKHBitcoinAddress.from_pubkey(bytes.fromhex(self.public_key))) + + if verify_hash != self.hash: + raise InvalidTransactionException("transaction is invalid") + + self.verify_signature(address) + relationship = self.relationship if isinstance(self.relationship, Contract): relationship = self.relationship.to_string() @@ -505,7 +521,6 @@ async def verify(self, check_input_spent=False): raise MaxRelationshipSizeExceeded( f"Relationship field cannot be greater than {TransactionConsts.RELATIONSHIP_MAX_SIZE.value} bytes" ) - # verify spend total_input = 0 exclude_recovered_ids = [] @@ -554,7 +569,6 @@ async def verify(self, check_input_spent=False): bytes.fromhex(txn_input.public_key), ) if not result: - print("t verify4") raise Exception() except: try: @@ -564,7 +578,6 @@ async def verify(self, check_input_spent=False): txn.signature, ) if not result: - print("t verify5") raise except: raise InvalidTransactionSignatureException( @@ -593,13 +606,31 @@ async def verify(self, check_input_spent=False): total_output = 0 for txn in self.outputs: total_output += float(txn.value) - - total = float(total_output) + float(self.fee) - if not equal(total_input, total): - raise TotalValueMismatchException( - "inputs and outputs sum must match %s, %s, %s, %s" - % (total_input, float(total_output), float(self.fee), total) - ) + if check_masternode_fee: + total = float(total_output) + float(self.fee) + float(self.masternode_fee) + if not equal(total_input, total): + raise TotalValueMismatchException( + "inputs and outputs sum must match %s, %s, %s, %s, %s" + % ( + total_input, + float(total_output), + float(self.fee), + float(self.masternode_fee), + total, + ) + ) + else: + total = float(total_output) + float(self.fee) + if not equal(total_input, total): + raise TotalValueMismatchException( + "inputs and outputs sum must match %s, %s, %s, %s" + % ( + total_input, + float(total_output), + float(self.fee), + total, + ) + ) async def generate_hash(self): from yadacoin.contracts.base import Contract diff --git a/yadacoin/core/transactionutils.py b/yadacoin/core/transactionutils.py index 4e729ff3..23f534fc 100644 --- a/yadacoin/core/transactionutils.py +++ b/yadacoin/core/transactionutils.py @@ -3,6 +3,7 @@ import random import sys import time +import asyncio from coincurve._libsecp256k1 import ffi from coincurve.keys import PrivateKey @@ -101,8 +102,15 @@ async def send( return {"status": "error", "message": "not enough money"} except: raise + + check_masternode_fee = False + if config.LatestBlock.block.index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + check_masternode_fee = True + try: - await transaction.verify() + await transaction.verify( + check_masternode_fee=check_masternode_fee, + ) except: return {"error": "invalid transaction"} @@ -173,7 +181,7 @@ async def clean_mempool(cls, config): config.last_mempool_clean = time.time() @classmethod - async def rebroadcast_mempool(cls, config, include_zero=False): + async def rebroadcast_mempool(cls, config, confirmed_peers, include_zero=False): from yadacoin.core.transaction import Transaction query = {"outputs.value": {"$gt": 0}} @@ -183,6 +191,12 @@ async def rebroadcast_mempool(cls, config, include_zero=False): async for txn in config.mongo.async_db.miner_transactions.find(query): x = Transaction.from_dict(txn) async for peer_stream in config.peer.get_sync_peers(): + if (peer_stream.peer.rid, "newtxn", x.transaction_signature) in confirmed_peers: + config.app_log.debug( + f"Skipping peer {peer_stream.peer.rid} in rebroadcast_mempool as it has already confirmed the transaction." + ) + continue + await config.nodeShared.write_params( peer_stream, "newtxn", {"transaction": x.to_dict()} ) @@ -190,7 +204,8 @@ async def rebroadcast_mempool(cls, config, include_zero=False): config.nodeClient.retry_messages[ (peer_stream.peer.rid, "newtxn", x.transaction_signature) ] = {"transaction": x.to_dict()} - time.sleep(0.1) + await asyncio.sleep(1) + return @classmethod async def rebroadcast_failed(cls, config, id): @@ -297,3 +312,57 @@ async def get_trigger_txns( @classmethod def get_transaction_objs_list(cls, transaction_objs): return [y for x in list(transaction_objs.values()) for y in x] + + @classmethod + async def combine_oldest_transactions(cls, config): + address = config.address + config.app_log.info("Combining oldest transactions process started.") + total_value = 0 + oldest_transactions = [] + pending_used_inputs = {} + + # Check for transactions already in mempool + mempool_txns = await config.mongo.async_db.miner_transactions.find( + {"outputs.to": address} + ).to_list(None) + + for txn in mempool_txns: + for input_tx in txn["inputs"]: + pending_used_inputs[input_tx["id"]] = txn["_id"] + + # Retrieve oldest transactions + async for txn in config.BU.get_wallet_unspent_transactions(address, no_zeros=True): + if txn["id"] not in pending_used_inputs: + oldest_transactions.append(txn) + if len(oldest_transactions) >= 100: + break + + config.app_log.info("Found {} oldest transactions for combination.".format(len(oldest_transactions))) + + # Additional check: if the number of transactions is less than 99, do not generate a transaction + if len(oldest_transactions) < 99: + config.app_log.info("Insufficient number of transactions to combine.") + return + + for txn in oldest_transactions: + for output in txn["outputs"]: + if output["to"] == address: + total_value += float(output["value"]) + + config.app_log.info("Total value of oldest transactions: {}.".format(total_value)) + + try: + result = await cls.send( + config=config, + to=address, + value=total_value, + from_address=address, + inputs=oldest_transactions, + exact_match=False, + ) + if "status" in result and result["status"] == "error": + config.app_log.error("Error combining oldest transactions: {}".format(result["message"])) + else: + config.app_log.info("Successfully combined oldest transactions.") + except Exception as e: + config.app_log.error("Error combining oldest transactions: {}".format(str(e))) diff --git a/yadacoin/http/explorer.py b/yadacoin/http/explorer.py index b421bc0b..5d02d162 100644 --- a/yadacoin/http/explorer.py +++ b/yadacoin/http/explorer.py @@ -56,27 +56,37 @@ async def get(self): class ExplorerSearchHandler(BaseHandler): + async def get_wallet_balance(self, term): re.search(r"[A-Fa-f0-9]+", term).group(0) - res = await self.config.mongo.async_db.blocks.count_documents( - {"transactions.outputs.to": term} + balance = await self.config.BU.get_wallet_balance(term) + blocks = await self.config.mongo.async_db.blocks.find( + {"transactions.outputs.to": term}, + {"_id": 0, "index": 1, "time": 1, "hash": 1, "transactions": 1}, + ).sort("index", -1).to_list(length=None) + + result = [ + { + "index": block["index"], + "time": block["time"], + "hash": block["hash"], + "transactions": [ + txn + for txn in block.get("transactions", []) + if any(output.get("to") == term for output in txn.get("outputs", [])) + ], + } + for block in blocks + ] + + return self.render_as_json( + { + "balance": "{0:.8f}".format(balance), + "resultType": "txn_outputs_to", + "searchedId": term, + "result": result, + } ) - if res: - balance = await self.config.BU.get_wallet_balance(term) - return self.render_as_json( - { - "balance": "{0:.8f}".format(balance), - "resultType": "txn_outputs_to", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - {"transactions.outputs.to": term}, {"_id": 0} - ) - .sort("index", -1) - .limit(10) - ], - } - ) async def get(self): term = self.get_argument("term", False) @@ -84,396 +94,242 @@ async def get(self): self.render_as_json({}) return - result_type = self.get_argument("result_type", False) - if result_type == "get_wallet_balance": + try: + if re.fullmatch(r"[A-Za-z0-9]{34}", term): + return await self.search_by_wallet_address(term) + + if term.isdigit(): + return await self.search_by_block_index(int(term)) + + if re.fullmatch(r"[A-Fa-f0-9]{64}", term): + return await self.search_by_block_hash(term) + try: - return await self.get_wallet_balance(term) - except Exception: - raise + base64.b64decode(term.replace(" ", "+")) + return await self.search_by_base64_id(term.replace(" ", "+")) + except Exception as e: + print(f"Error decoding base64: {e}") - try: - res = await self.config.mongo.async_db.blocks.count_documents( - {"index": int(term)} - ) - if res: - return self.render_as_json( - { - "resultType": "block_height", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - {"index": int(term)}, {"_id": 0} - ) - ], - } - ) - except: - pass - try: - res = await self.config.mongo.async_db.blocks.count_documents( - {"public_key": term} - ) - if res: - return self.render_as_json( - { - "resultType": "block_height", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - {"public_key": term}, {"_id": 0} - ) - ], - } - ) - except: - pass - try: - res = await self.config.mongo.async_db.blocks.count_documents( - {"transactions.public_key": term} - ) - if res: - return self.render_as_json( - { - "resultType": "block_height", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - {"transactions.public_key": term}, {"_id": 0} - ) - ], - } - ) - except: - pass - try: - re.search(r"[A-Fa-f0-9]{64}", term).group(0) - res = await self.config.mongo.async_db.blocks.count_documents( - {"hash": term} - ) - if res: - return self.render_as_json( - { - "resultType": "block_hash", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - {"hash": term}, {"_id": 0} - ) - ], - } - ) - except: - pass + if re.fullmatch(r"[A-Fa-f0-9]+", term): + return await self.search_by_public_key(term) - try: - base64.b64decode(term.replace(" ", "+")) - res = await self.config.mongo.async_db.blocks.count_documents( - {"id": term.replace(" ", "+")} - ) - if res: - return self.render_as_json( - { - "resultType": "block_id", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - {"id": term.replace(" ", "+")}, {"_id": 0} - ) - ], - } - ) - except: - pass + except Exception as e: + print(f"Error identifying search term: {e}") - try: - re.search(r"[A-Fa-f0-9]{64}", term).group(0) - res = await self.config.mongo.async_db.blocks.count_documents( - {"transactions.hash": term} - ) - if res: - return self.render_as_json( - { - "resultType": "txn_hash", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - {"transactions.hash": term}, {"_id": 0} - ) - ], - } - ) - except: - pass + return self.render_as_json({}) - try: - re.search(r"[A-Fa-f0-9]{64}", term).group(0) - res = await self.config.mongo.async_db.blocks.count_documents( - {"transactions.rid": term} - ) - if res: - return self.render_as_json( - { - "resultType": "txn_rid", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - {"transactions.rid": term}, {"_id": 0} - ) - ], - } - ) - except: - pass + async def search_by_wallet_address(self, wallet_address): + blocks = await self.config.mongo.async_db.blocks.find( + {"transactions.outputs.to": wallet_address}, + {"_id": 0, "index": 1, "time": 1, "hash": 1, "transactions": 1} + ).sort("index", -1).to_list(length=None) - try: - base64.b64decode(term.replace(" ", "+")) - res = await self.config.mongo.async_db.blocks.count_documents( + result = [ + { + "index": block["index"], + "time": block["time"], + "hash": block["hash"], + "transactions": [ + txn + for txn in block.get("transactions", []) + if any(output.get("to") == wallet_address for output in txn.get("outputs", [])) + ], + } + for block in blocks + ] + + if result: + return self.render_as_json({ + "resultType": "txn_outputs_to", + "searchedId": wallet_address, + "result": result, + }) + else: + return self.render_as_json({ + "resultType": "txn_outputs_to", + "searchedId": wallet_address, + "result": [], + }) + + async def search_by_block_index(self, index): + blocks = await self.config.mongo.async_db.blocks.find( + {"index": index}, {"_id": 0} + ).to_list(length=None) + + if blocks: + return self.render_as_json({ + "resultType": "block_height", + "result": [changetime(x) for x in blocks], + }) + + async def search_by_block_hash(self, block_hash): + blocks = await self.config.mongo.async_db.blocks.find( + {"hash": block_hash}, {"_id": 0} + ).to_list(length=None) + + if blocks: + return self.render_as_json({ + "resultType": "block_hash", + "result": [changetime(x) for x in blocks], + }) + + transactions = await self.config.mongo.async_db.blocks.aggregate( + [ + {"$match": {"transactions.hash": block_hash}}, + {"$unwind": "$transactions"}, + {"$match": {"transactions.hash": block_hash}}, { - "$or": [ - {"transactions.id": term.replace(" ", "+")}, - {"transactions.inputs.id": term.replace(" ", "+")}, - ] - } - ) - if res: - return self.render_as_json( - { - "resultType": "txn_id", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.blocks.find( - { - "$or": [ - {"transactions.id": term.replace(" ", "+")}, - { - "transactions.inputs.id": term.replace( - " ", "+" - ) - }, - ] - }, - {"_id": 0}, - ) - ], + "$project": { + "_id": 0, + "result": [{ + "$mergeObjects": ["$transactions", { + "blockIndex": "$index", + "blockHash": "$hash" + }] + }], } - ) - except: - pass + } + ] + ).to_list(None) + + if transactions: + return self.render_as_json({ + "resultType": "txn_hash", + "searchedId": block_hash, + "result": transactions[0]["result"], + }) + + mempool_result = await self.search_in_mempool_by_hash(block_hash) + + if mempool_result: + mempool_result["blockHash"] = "MEMPOOL" + mempool_result["blockIndex"] = "MEMPOOL" + + return self.render_as_json({ + "resultType": "txn_hash", + "searchedId": block_hash, + "result": [mempool_result], + }) - try: - res = await self.get_wallet_balance(term) - if res: - return res - except Exception: - pass + return self.render_as_json({}) - try: - base64.b64decode(term.replace(" ", "+")) - res = await self.config.mongo.async_db.miner_transactions.count_documents( - {"id": term.replace(" ", "+")} - ) - if res: - return self.render_as_json( - { - "resultType": "mempool_id", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.miner_transactions.find( - {"id": term.replace(" ", "+")}, {"_id": 0} - ) - ], - } - ) - except: - pass + async def search_by_base64_id(self, txn_id): + blocks = await self.config.mongo.async_db.blocks.find( + {"id": txn_id}, {"_id": 0} + ).to_list(length=None) - try: - re.search(r"[A-Fa-f0-9]{64}", term).group(0) - res = await self.config.mongo.async_db.miner_transactions.count_documents( - {"hash": term} - ) - if res: - return self.render_as_json( - { - "resultType": "mempool_hash", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.miner_transactions.find( - {"hash": term}, {"_id": 0} - ) - ], - } - ) - except: - pass + if blocks: + return self.render_as_json({ + "resultType": "block_id", + "result": [changetime(x) for x in blocks], + }) - try: - re.search(r"[A-Fa-f0-9]+", term).group(0) - res = await self.config.mongo.async_db.miner_transactions.count_documents( - {"outputs.to": term} - ) - if res: - return self.render_as_json( - { - "resultType": "mempool_outputs_to", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.miner_transactions.find( - {"outputs.to": term}, {"_id": 0} - ) - .sort("index", -1) - .limit(10) - ], - } - ) - except: - pass + pipeline = [ + { + "$match": { + "$or": [ + {"transactions.id": txn_id}, + {"transactions.inputs.id": txn_id}, + ] + } + }, + { + "$project": { + "_id": 0, + "blockIndex": "$index", + "blockHash": "$hash", + "transactions": { + "$filter": { + "input": "$transactions", + "as": "transaction", + "cond": { + "$or": [ + {"$eq": ["$$transaction.id", txn_id]}, + { + "$anyElementTrue": { + "$map": { + "input": "$$transaction.inputs", + "as": "input", + "in": {"$eq": ["$$input.id", txn_id]}, + } + } + }, + ] + }, + } + }, + }, + }, + {"$unwind": "$transactions"}, + { + "$project": { + "_id": 0, + "result": { + "$mergeObjects": ["$transactions", { + "blockIndex": "$blockIndex", + "blockHash": "$blockHash" + }] + }, + } + }, + ] - try: - res = await self.config.mongo.async_db.miner_transactions.count_documents( - {"public_key": term} - ) - if res: - return self.render_as_json( - { - "resultType": "mempool_public_key", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.miner_transactions.find( - {"public_key": term}, {"_id": 0} - ) - ], - } - ) - except: - pass + result = await self.config.mongo.async_db.blocks.aggregate(pipeline).to_list(length=None) + transactions = [block["result"] for block in result if block.get("result")] - try: - res = await self.config.mongo.async_db.miner_transactions.count_documents( - {"rid": term} - ) - if res: - return self.render_as_json( - { - "resultType": "mempool_rid", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.miner_transactions.find( - {"rid": term}, {"_id": 0} - ) - ], - } - ) - except: - pass + if transactions: + return self.render_as_json({ + "resultType": "txn_id", + "searchedId": txn_id, + "result": transactions, + }) - try: - base64.b64decode(term.replace(" ", "+")) - res = await self.config.mongo.async_db.failed_transactions.count_documents( - {"txn.id": term.replace(" ", "+")} - ) - if res: - return self.render_as_json( - { - "resultType": "failed_id", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.failed_transactions.find( - {"txn.id": term.replace(" ", "+")}, - {"_id": 0, "txn._id": 0}, - ) - ], - } - ) - except: - pass + mempool_result = await self.search_in_mempool_by_id(txn_id) - try: - re.search(r"[A-Fa-f0-9]{64}", term).group(0) - res = await self.config.mongo.async_db.failed_transactions.count_documents( - {"txn.hash": term} - ) - if res: - return self.render_as_json( - { - "resultType": "failed_hash", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.failed_transactions.find( - {"txn.hash": term}, - {"_id": 0, "txn._id": 0}, - ) - ], - } - ) - except: - pass + if mempool_result: + mempool_result["blockHash"] = "MEMPOOL" + mempool_result["blockIndex"] = "MEMPOOL" - try: - re.search(r"[A-Fa-f0-9]+", term).group(0) - res = await self.config.mongo.async_db.failed_transactions.count_documents( - {"txn.outputs.to": term} - ) - if res: - return self.render_as_json( - { - "resultType": "failed_outputs_to", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.failed_transactions.find( - {"txn.outputs.to": term}, - {"_id": 0, "txn._id": 0}, - ) - .sort("index", -1) - .limit(10) - ], - } - ) - except: - pass + return self.render_as_json({ + "resultType": "txn_id", + "searchedId": txn_id, + "result": [mempool_result], + }) + + return self.render_as_json({}) + async def search_by_public_key(self, public_key): + blocks = await self.config.mongo.async_db.blocks.find( + {"public_key": public_key}, {"_id": 0} + ).to_list(length=None) + + if blocks: + return self.render_as_json({ + "resultType": "block_height", + "result": [changetime(x) for x in blocks], + }) + + async def search_in_mempool_by_hash(self, block_hash): try: - res = await self.config.mongo.async_db.failed_transactions.count_documents( - {"txn.public_key": term} + result = await self.config.mongo.async_db.miner_transactions.find_one( + {"hash": block_hash}, {"_id": 0} ) - if res: - return self.render_as_json( - { - "resultType": "failed_public_key", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.failed_transactions.find( - {"txn.public_key": term}, - {"_id": 0, "txn._id": 0}, - ) - ], - } - ) - except: - pass + return result if result else None + except Exception as e: + print(f"Error searching mempool by hash: {e}") + return None + + async def search_in_mempool_by_id(self, txn_id): try: - res = await self.config.mongo.async_db.failed_transactions.count_documents( - {"txn.rid": term} + result = await self.config.mongo.async_db.miner_transactions.find_one( + {"id": txn_id}, {"_id": 0} ) - if res: - return self.render_as_json( - { - "resultType": "failed_rid", - "result": [ - changetime(x) - async for x in self.config.mongo.async_db.failed_transactions.find( - {"txn.rid": term}, - {"_id": 0, "txn._id": 0}, - ) - ], - } - ) - except: - pass - - return self.render_as_json({}) + return result if result else None + except Exception as e: + print(f"Error searching mempool by ID: {e}") + return None class ExplorerGetBalance(BaseHandler): async def get(self): @@ -496,7 +352,7 @@ async def get(self): res = await res.to_list(length=10) print(res[0]) return self.render_as_json( - {"resultType": "blocks", "result": [changetime(x) for x in res]} + {"resultType": "blocks", "result": res} ) @@ -529,6 +385,13 @@ async def get(self): return self.render_as_json(miners) +class ExplorerMempoolHandler(BaseHandler): + async def get(self): + """Returns mempool data from miner_transactions collection""" + res = await self.config.mongo.async_db.miner_transactions.find({}).to_list(None) + return self.render_as_json( + {"resultType": "mempool", "result": res} + ) EXPLORER_HANDLERS = [ (r"/api-stats", HashrateAPIHandler), @@ -537,4 +400,5 @@ async def get(self): (r"/explorer-get-balance", ExplorerGetBalance), (r"/explorer-latest", ExplorerLatestHandler), (r"/explorer-last50", ExplorerLast50), + (r"/explorer-mempool", ExplorerMempoolHandler), ] diff --git a/yadacoin/http/node.py b/yadacoin/http/node.py index e4eaf49c..7d35a0b8 100644 --- a/yadacoin/http/node.py +++ b/yadacoin/http/node.py @@ -4,6 +4,7 @@ import json import time +import tornado.web from tornado import escape @@ -11,6 +12,10 @@ from yadacoin.core.transaction import Transaction from yadacoin.core.transactionutils import TU from yadacoin.http.base import BaseHandler +from yadacoin.core.blockchain import Blockchain +from yadacoin.core.processingqueue import BlockProcessingQueueItem +from yadacoin.core.block import Block +from yadacoin.core.latestblock import LatestBlock class GetLatestBlockHandler(BaseHandler): @@ -21,6 +26,14 @@ async def get(self): block = await self.config.LatestBlock.block.copy() self.render_as_json(block.to_dict()) +class GetCurrentBlockHandler(BaseHandler): + async def get(self): + from yadacoin.core.block import Block + try: + latest_block = Block.last_generated_block + self.render_as_json(latest_block.to_dict()) + except Exception as e: + self.render_as_json({"status": "error", "message": str(e)}) class GetBlocksHandler(BaseHandler): async def get(self): @@ -202,6 +215,13 @@ async def get(self): ) return self.render_as_json({"txn_ids": [x["id"] for x in txns]}) +class GetMempoolTransactionsHandler(BaseHandler): + async def get(self): + try: + transactions = await self.config.mongo.async_db.miner_transactions.find({}).to_list(length=None) + self.render_as_json({"transactions": transactions}) + except Exception as e: + self.render_as_json({"error": str(e)}, status=500) class RebroadcastTransactions(BaseHandler): async def get(self): @@ -264,8 +284,128 @@ async def get(self): return self.render_as_json({"transactions": trigger_txns}) +class GetMonitoringHandler(BaseHandler): + async def get(self): + # Node Data + node_status = self.config.mongo.async_db.node_status.aggregate( + [ + {"$sort": {"timestamp": -1}}, + {"$limit": 1}, + { + "$project": { + "_id": 0, + "message_sender": 0, + "slow_queries": 0, + "transaction_tracker": 0, + "disconnect_tracker": 0, + "processing_queues": 0, + } + }, + ] + ) + node_data = [x async for x in node_status] + node_data = node_data[0] + + # Peer Data + inbound_peers = await self.config.peer.get_all_inbound_streams() + outbound_peers = await self.config.peer.get_all_outbound_streams() + + peer_data = { + "inbound_peers": [x.peer.to_dict() for x in inbound_peers], + "outbound_peers": [x.peer.to_dict() for x in outbound_peers], + } + + # Pool Data Calcs + await self.config.LatestBlock.block_checker() + pool_public_key = ( + self.config.pool_public_key + if hasattr(self.config, "pool_public_key") + else self.config.public_key + ) + mining_time_interval = 600 + shares_count = await self.config.mongo.async_db.shares.count_documents( + {"time": {"$gte": time.time() - mining_time_interval}} + ) + if shares_count > 0: + pool_hash_rate = ( + shares_count * self.config.pool_diff + ) / mining_time_interval + else: + pool_hash_rate = 0 + + pool_blocks_found_list = ( + await self.config.mongo.async_db.blocks.find( + {"public_key": pool_public_key}, {"_id": 0, "time": 1, "index": 1} + ) + .sort([("index", -1)]) + .to_list(5) + ) + + lbt = 0 + lbh = 0 + if pool_blocks_found_list: + lbt = pool_blocks_found_list[0]["time"] + lbh = pool_blocks_found_list[0]["index"] + + pool_data = { + "hashes_per_second": pool_hash_rate, + "last_block_time": lbt, + "last_block_height": lbh, + "fee": self.config.pool_take, + "reward": CHAIN.get_block_reward(self.config.LatestBlock.block.index), + } + + # Create output data + op_data = { + "address": self.config.address, + "node": node_data, + "peers": peer_data, + "pool": pool_data, + } + self.render_as_json(op_data, indent=4) + +class GetBlockTemplateHandler(BaseHandler): + async def get(self): + try: + block_template = await LatestBlock.get_block_template() + if block_template: + self.write(block_template) + else: + self.config.app_log.error("Failed to retrieve block template: block_template is None.") + self.set_status(500) + self.write({"error": "Failed to retrieve block template."}) + except Exception as e: + self.config.app_log.error(f"Exception occurred in GetBlockTemplateHandler: {str(e)}") + self.set_status(500) + self.write({"error": str(e)}) + +class SubmitBlockHandler(BaseHandler): + async def post(self): + try: + block_data = escape.json_decode(self.request.body) + block = await Block.from_dict(block_data) + self.config.app_log.info(f"Received block data: {block_data}") + + await self.config.consensus.insert_consensus_block(block, self.config.peer) + + self.config.processing_queues.block_queue.add( + BlockProcessingQueueItem(Blockchain(block.to_dict())) + ) + + await self.config.nodeShared.send_block_to_peers(block) + await self.config.websocketServer.send_block(block) + + self.write({"status": "success", "message": "Block accepted"}) + self.config.app_log.info(f"Block accepted: {block.hash}") + + except Exception as e: + self.write({"status": "error", "message": str(e)}) + self.config.app_log.info(f"Failed to submit block: {e}") + + NODE_HANDLERS = [ (r"/get-latest-block", GetLatestBlockHandler), + (r"/get-current-block", GetCurrentBlockHandler), (r"/get-blocks", GetBlocksHandler), (r"/get-block", GetBlockHandler), (r"/get-height|/getheight", GetBlockHeightHandler), @@ -274,6 +414,7 @@ async def get(self): (r"/get-status", GetStatusHandler), (r"/get-pending-transaction", GetPendingTransactionHandler), (r"/get-pending-transaction-ids", GetPendingTransactionIdsHandler), + (r"/get-mempool-transactions", GetMempoolTransactionsHandler), (r"/rebroadcast-transactions", RebroadcastTransactions), (r"/rebroadcast-failed-transaction", RebroadcastFailedTransactions), (r"/get-current-smart-contract-transactions", GetCurrentSmartContractTransactions), @@ -281,4 +422,7 @@ async def get(self): (r"/get-expired-smart-contract-transactions", GetExpiredSmartContractTransactions), (r"/get-expired-smart-contract-transaction", GetExpiredSmartContractTransaction), (r"/get-trigger-transactions", GetSmartContractTriggerTransaction), + (r"/get-monitoring", GetMonitoringHandler), + (r"/get-block-template", GetBlockTemplateHandler), + (r"/submitblock", SubmitBlockHandler), ] diff --git a/yadacoin/http/pool.py b/yadacoin/http/pool.py index 4773669d..e8f8c663 100644 --- a/yadacoin/http/pool.py +++ b/yadacoin/http/pool.py @@ -2,25 +2,156 @@ Handlers required by the pool operations """ +import time from yadacoin.http.base import BaseHandler +class MinerStatsHandler(BaseHandler): -class PoolSharesHandler(BaseHandler): async def get(self): address = self.get_query_argument("address") - query = {"address": address} - if "." not in address: - query = { - "$or": [ - {"address": address}, - {"address_only": address}, - ] + + miner_hashrate_seconds = 1200 + current_time = time.time() + + miner_stats_document = await self.config.mongo.async_db.miner_stats.find_one({"address": address}) + + last_updated = 0 + existing_workers = set() + worker_stats = {} + + if miner_stats_document: + last_updated = miner_stats_document.get("last_updated", 0) + worker_stats = miner_stats_document.get("workers", {}) + existing_workers = set(worker_stats.keys()) + + hashrate_query = { + "time": {"$gt": current_time - miner_hashrate_seconds}, + "$or": [{"address": address}, {"address_only": address}] + } + + hashrate_aggregation = [ + {"$match": hashrate_query}, + {"$group": { + "_id": { + "address": "$address", + "worker": {"$ifNull": [{"$arrayElemAt": [{"$split": ["$address", "."]}, 1]}, "No worker"]} + }, + "total_weight": {"$sum": "$weight"}, + "last_share_time": {"$max": "$time"} + }} + ] + + hashrate_cursor = self.config.mongo.async_db.shares.aggregate(hashrate_aggregation) + hashrate_result = await hashrate_cursor.to_list(None) + + worker_hashrate = {} + total_hashrate = 0 + + for doc in hashrate_result: + worker_name = doc["_id"]["worker"] + total_weight = doc["total_weight"] + last_share_time = doc["last_share_time"] + + worker_hashrate_individual = total_weight // miner_hashrate_seconds + total_hashrate += worker_hashrate_individual + + worker_hashrate[worker_name] = { + "worker_hashrate": worker_hashrate_individual, + "worker_share": 0, + "last_share_time": last_share_time + } + + shares_query = { + "$or": [ + {"address": address}, + {"address_only": address}, + {"address": {"$regex": f"^{address}\..*"}}, + ], + "time": {"$gt": last_updated} + } + + shares_aggregation = [ + {"$match": shares_query}, + {"$group": { + "_id": { + "address": "$address", + "worker": {"$ifNull": ["$worker", "No worker"]} + }, + "worker_share": {"$sum": 1}, + "total_weight": {"$sum": "$weight"}, + "last_share_time": {"$max": "$time"} + }} + ] + + shares_cursor = self.config.mongo.async_db.shares.aggregate(shares_aggregation) + shares_result = await shares_cursor.to_list(None) + + worker_shares = {} + total_share = 0 + + for doc in shares_result: + worker_name = doc["_id"]["worker"] + + if "." in doc["_id"]["address"]: + worker_name = doc["_id"]["address"].split(".")[-1] + + if worker_name not in worker_shares: + worker_shares[worker_name] = { + "worker_share": 0, + "last_share_time": 0 + } + + worker_shares[worker_name]["worker_share"] += doc["worker_share"] + total_share += doc["worker_share"] + worker_shares[worker_name]["last_share_time"] = max( + worker_shares[worker_name]["last_share_time"], + doc["last_share_time"] + ) + + for worker_name, worker_share_stats in worker_shares.items(): + if worker_name not in worker_stats: + worker_stats[worker_name] = { + "worker_share": 0, + "last_share_time": 0, + "worker_hashrate": 0 + } + + worker_stats[worker_name]["worker_share"] += worker_share_stats["worker_share"] + worker_stats[worker_name]["last_share_time"] = max( + worker_stats[worker_name]["last_share_time"], + worker_share_stats["last_share_time"] + ) + + worker_stats[worker_name]["worker_hashrate"] = worker_hashrate.get(worker_name, {}).get("worker_hashrate", 0) + + for missing_worker in existing_workers - set(worker_shares.keys()): + worker_stats[missing_worker] = miner_stats_document.get("workers", {}).get(missing_worker, {}) + + total_share += sum(worker_stats[worker_name]["worker_share"] for worker_name in worker_stats) + + await self.config.mongo.async_db.miner_stats.update_one( + {"address": address}, + {"$set": {"last_updated": current_time, "workers": worker_stats}}, + upsert=True + ) + + miner_stats_response = [ + { + "worker_name": worker_name, + "worker_hashrate": worker_stats["worker_hashrate"], + "worker_share": worker_stats["worker_share"], + "status": "Offline" if worker_stats["worker_hashrate"] == 0 else "Online", + "last_share_time": worker_stats["last_share_time"] } - total_share = await self.config.mongo.async_db.shares.count_documents(query) - total_hash = total_share * self.config.pool_diff - self.render_as_json({"total_hash": int(total_hash)}) + for worker_name, worker_stats in worker_stats.items() + ] + self.render_as_json({ + "miner_stats": miner_stats_response, + "total_hashrate": int(total_hashrate), + "total_share": int(total_share) + }) class PoolPayoutsHandler(BaseHandler): async def get(self): @@ -31,7 +162,7 @@ async def get(self): out = [] results = self.config.mongo.async_db.share_payout.find( {"txn.outputs.to": address}, {"_id": 0} - ).sort([("index", -1)]) + ).sort([("index", -1)]).limit(150) async for result in results: if ( await self.config.mongo.async_db.blocks.count_documents( @@ -42,56 +173,232 @@ async def get(self): out.append(result) self.render_as_json({"results": out}) +class PoolBlocksHandler(BaseHandler): + async def get(self): + page = int(self.get_argument("page", 1)) + page_size = int(self.get_argument("page_size", 10)) + + pool_blocks = ( + await self.config.mongo.async_db.pool_blocks + .find({}, { + "_id": 0, + "index": 1, + "found_time": 1, + "target": 1, + "transactions": 1, + "status": 1, + "hash": 1, + "miner_address": 1, + "effort": 1 + }) + .sort("index", -1) + .skip((page - 1) * page_size) + .limit(page_size) + .to_list(None) + ) -class PoolHashRateHandler(BaseHandler): + for block in pool_blocks: + block["reward"] = self.get_coinbase_reward(block["transactions"], self.config.address) + del block["transactions"] + + total_blocks = await self.config.mongo.async_db.pool_blocks.count_documents({}) + + pool_info = { + "pool_address": self.config.address, + "block_confirmation": self.config.block_confirmation, + } + + self.render_as_json({ + "pool_info": pool_info, + "blocks": pool_blocks, + "pagination": { + "total_blocks": total_blocks, + "page": page, + "page_size": page_size + } + }) + + def get_coinbase_reward(self, transactions, pool_address): + highest_reward = 0.0 + for txn in transactions: + if not txn["inputs"]: + for output in txn["outputs"]: + if output["to"] == pool_address: + reward = output["value"] + if reward > highest_reward: + highest_reward = reward + return highest_reward + +class PoolBlocksChartHandler(BaseHandler): async def get(self): - address = self.get_query_argument("address") - query = {"address": address} - if "." not in address: - query = { - "$or": [ - {"address": address}, - {"address_only": address}, - ] + thirty_days_ago_timestamp = time.time() - (30 * 24 * 60 * 60) + + pipeline = [ + { + "$match": { + "found_time": {"$gte": thirty_days_ago_timestamp} + } + }, + { + "$group": { + "_id": { + "$dateToString": { + "format": "%Y-%m-%d", + "date": {"$toDate": {"$multiply": ["$found_time", 1000]}} + } + }, + "count": {"$sum": 1}, + "total_effort": {"$sum": "$effort"}, + "average_effort": {"$avg": "$effort"} + } + }, + { + "$sort": {"_id": 1} } - last_share = await self.config.mongo.async_db.shares.find_one( - query, {"_id": 0}, sort=[("time", -1)] - ) - if not last_share: - return self.render_as_json({"result": 0}) - miner_hashrate_seconds = ( - self.config.miner_hashrate_seconds - if hasattr(self.config, "miner_hashrate_seconds") - else 1200 + ] + + blocks_by_date = await self.config.mongo.async_db.pool_blocks.aggregate(pipeline).to_list(None) + + total_effort = sum(block.get("total_effort", 0) for block in blocks_by_date) + + total_block_count = sum(block.get("count", 0) for block in blocks_by_date) + overall_average_effort = total_effort / total_block_count if total_block_count > 0 else 0 + + self.render_as_json({ + "blocks_by_date": blocks_by_date, + "total_effort": total_effort, + "average_effort": overall_average_effort + }) + +class PoolScanMissedPayoutsHandler(BaseHandler): + async def get(self): + start_index = self.get_query_argument("start_index", None) + index = self.get_query_argument("index", None) + + if start_index is not None: + start_index = int(start_index) + start_index_info = {"start_index": start_index, "info": "This range starts from the specified index."} + else: + start_index_info = {"info": "No start index provided. The range starts from the beginning of the blockchain."} + + if index is not None: + index = int(index) + index_info = {"index": index, "info": "This payout is specifically for the block at the specified index."} + else: + index_info = {"info": "No index provided. The payout is for the latest block in the blockchain."} + + await self.config.pp.do_payout(start_index=start_index, index=index) + + response_info = {"status": True, "start_index_info": start_index_info, "index_info": index_info} + self.render_as_json(response_info) + + +class PoolScanMissingTxnHandler(BaseHandler): + async def get(self): + pool_public_key = ( + self.config.pool_public_key + if hasattr(self.config, "pool_public_key") + else self.config.public_key ) - query = {"time": {"$gt": last_share["time"] - miner_hashrate_seconds}} - if "." in address: - query["address"] = address + self.app_log.info(f"Using pool public key: {pool_public_key}") + + start_index = self.get_query_argument("start_index", default=None) + + if start_index is not None: + try: + start_index = int(start_index) + if start_index < 0: + raise ValueError("Start index must be a non-negative integer.") + except ValueError: + error_message = "Invalid value for 'start_index'. Please provide a non-negative integer." + example_usage = "Example usage: /scan-missed-txn?start_index=0" + self.render_as_json({"error": error_message, "instruction": example_usage}) + return else: - query["$or"] = [ - {"address": address}, - {"address_only": address}, + instruction_message = "Please provide a start index. Example usage: /scan-missed-txn?start_index=0" + self.render_as_json({"instruction": instruction_message}) + return + + coinbase_txn_ids = set() + + pipeline = [ + { + "$match": { + "transactions.public_key": pool_public_key, + "transactions.inputs": [], + "index": {"$gte": start_index} + } + }, + { + "$unwind": "$transactions" + }, + { + "$match": { + "transactions.public_key": pool_public_key, + "transactions.inputs": [], + "index": {"$gte": start_index} + } + }, + { + "$project": { + "_id": 0, + "transactions.id": 1, + } + } + ] + + coinbase_txns_aggregation = await self.config.mongo.async_db.blocks.aggregate(pipeline).to_list(length=None) + + for doc in coinbase_txns_aggregation: + if "transactions" in doc: + coinbase_txn_ids.add(doc["transactions"].get("id")) + self.app_log.info(f"Coinbase Transaction ID: {doc['transactions'].get('id')}") + + missing_payouts = [] + for txn_id in coinbase_txn_ids: + used_txns = await self.already_used(txn_id, pool_public_key) + if not used_txns: + missing_payouts.append({"transaction_id": txn_id}) + + self.render_as_json({"missing_payouts": missing_payouts}) + + async def already_used(self, txn_id, pool_public_key): + results = self.config.mongo.async_db.blocks.aggregate( + [ + { + "$match": { + "transactions.inputs.id": txn_id, + } + }, + {"$unwind": "$transactions"}, + { + "$match": { + "transactions.inputs.id": txn_id, + "transactions.public_key": pool_public_key, + } + }, ] - number_of_shares = await self.config.mongo.async_db.shares.count_documents( - query ) - miner_hashrate = ( - number_of_shares * self.config.pool_diff - ) / miner_hashrate_seconds - self.render_as_json({"miner_hashrate": int(miner_hashrate)}) + return [x async for x in results] - -class PoolScanMissedPayoutsHandler(BaseHandler): +class CombineOldestTransactionsHandler(BaseHandler): async def get(self): - start_index = self.get_query_argument("start_index") - await self.config.pp.do_payout({"index": int(start_index)}) - self.render_as_json({"status": True}) + try: + await self.config.TU.combine_oldest_transactions(self.config) + self.set_status(200) + self.write("Combine oldest transactions process started.") + except Exception as e: + self.set_status(500) + self.write("Error combining oldest transactions: {}".format(str(e))) POOL_HANDLERS = [ - (r"/shares-for-address", PoolSharesHandler), + (r"/miner-stats-for-address", MinerStatsHandler), (r"/payouts-for-address", PoolPayoutsHandler), - (r"/hashrate-for-address", PoolHashRateHandler), + (r"/pool-blocks", PoolBlocksHandler), + (r"/pool-blocks-chart", PoolBlocksChartHandler), (r"/scan-missed-payouts", PoolScanMissedPayoutsHandler), + (r"/scan-missed-txn", PoolScanMissingTxnHandler), + (r"/combine-oldest-transactions", CombineOldestTransactionsHandler), ] diff --git a/yadacoin/tcpsocket/base.py b/yadacoin/tcpsocket/base.py index a869f20c..aacd93e6 100644 --- a/yadacoin/tcpsocket/base.py +++ b/yadacoin/tcpsocket/base.py @@ -2,6 +2,7 @@ import json import socket import time +import asyncio from datetime import timedelta from traceback import format_exc from uuid import uuid4 @@ -130,20 +131,22 @@ async def remove_peer(self, stream, close=True, reason=None): class RPCSocketServer(TCPServer, BaseRPC): + banned_miners = {} inbound_streams = {} inbound_pending = {} config = None async def handle_stream(self, stream, address): - stream.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - # OPTIONAL: Adjust keepalive settings if needed - if hasattr(socket, "TCP_KEEPIDLE"): - stream.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60) - if hasattr(socket, "TCP_KEEPINTVL"): - stream.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 15) - if hasattr(socket, "TCP_KEEPCNT"): - stream.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5) + self.config.app_log.info(f"New connection from {address}") + if address[0] in self.config.nodeServer.banned_miners: + ban_expiration = self.config.nodeServer.banned_miners[address[0]] + if time.time() < ban_expiration: + self.config.app_log.info(f"Connection from {address[0]} rejected: Miner is banned.") + stream.close() + return + else: + del self.config.nodeServer.banned_miners[address[0]] + self.config.app_log.info(f"Miner {address[0]} ban has expired.") stream.synced = False stream.syncing = False @@ -152,6 +155,9 @@ async def handle_stream(self, stream, address): try: data = await stream.read_until(b"\n") stream.last_activity = int(time.time()) + self.config.app_log.debug( + f"Updated last_activity for {stream} at {time.strftime('%Y-%m-%d %H:%M:%S')}" + ) self.config.health.tcp_server.last_activity = time.time() body = json.loads(data) method = body.get("method") @@ -165,6 +171,7 @@ async def handle_stream(self, stream, address): ] if not hasattr(self, method): continue + if hasattr(stream, "peer"): if hasattr(stream.peer, "host"): if ( @@ -175,6 +182,8 @@ async def handle_stream(self, stream, address): f"SERVER RECEIVED {stream.peer.host} {method} {body}" ) if hasattr(stream.peer, "address"): + await self.check_submission_limit(body, stream, address) + if ( hasattr(self.config, "tcp_traffic_debug") and self.config.tcp_traffic_debug == True @@ -182,7 +191,13 @@ async def handle_stream(self, stream, address): self.config.app_log.debug( f"SERVER RECEIVED {stream.peer.address} {method} {body}" ) + id_attr = getattr(stream.peer, stream.peer.id_attribute) + inbound_streams = self.config.nodeServer.inbound_streams + + self.config.app_log.debug( + f"Inbound Streams Dictionary: {inbound_streams}" + ) if ( id_attr not in self.config.nodeServer.inbound_streams[ @@ -197,24 +212,23 @@ async def handle_stream(self, stream, address): await self.remove_peer(stream) break await getattr(self, method)(body, stream) + except StreamClosedError: if hasattr(stream, "peer"): self.config.app_log.warning( - "Disconnected from {}: {}".format( - stream.peer.__class__.__name__, stream.peer.to_json() - ) + f"Disconnected from {stream.peer.__class__.__name__}: {stream.peer.to_json()}" ) - await self.remove_peer(stream) + await self.remove_peer(stream, reason="StreamClosedError") break - except: + except Exception as e: if hasattr(stream, "peer"): self.config.app_log.warning( - "Bad data from {}: {}".format( - stream.peer.__class__.__name__, stream.peer.to_json() - ) + f"Bad data from {stream.peer.__class__.__name__}: {stream.peer.to_json()}" ) - await self.remove_peer(stream, reason="BaseRPC: unhandled exception 2") - self.config.app_log.warning("{}".format(format_exc())) + await self.remove_peer( + stream, reason=f"Unhandled exception: {str(e)}" + ) + self.config.app_log.warning(format_exc()) self.config.app_log.warning(data) break diff --git a/yadacoin/tcpsocket/node.py b/yadacoin/tcpsocket/node.py index 439d05c6..a34c6515 100644 --- a/yadacoin/tcpsocket/node.py +++ b/yadacoin/tcpsocket/node.py @@ -28,8 +28,24 @@ from yadacoin.enums.peertypes import PEER_TYPES from yadacoin.tcpsocket.base import BaseRPC, RPCSocketClient, RPCSocketServer +class NodeServerDisconnectTracker: + by_host = {} + by_reason = {} + + def to_dict(self): + return {"by_host": self.by_host, "by_reason": self.by_reason} + -class DisconnectTracker: +class NodeServerNewTxnTracker: + by_host = {} + by_txn_id = {} + + def to_dict(self): + #return {"by_host": self.by_host, "by_txn_id": self.by_txn_id} + return {"by_host": self.by_host} + + +class NodeClientDisconnectTracker: by_host = {} by_reason = {} @@ -37,16 +53,18 @@ def to_dict(self): return {"by_host": self.by_host, "by_reason": self.by_reason} -class NewTxnTracker: +class NodeClientNewTxnTracker: by_host = {} by_txn_id = {} def to_dict(self): - return {"by_host": self.by_host, "by_txn_id": self.by_txn_id} + #return {"by_host": self.by_host, "by_txn_id": self.by_txn_id} + return {"by_host": self.by_host} class NodeRPC(BaseRPC): retry_messages = {} + confirmed_peers = set() def __init__(self): super(NodeRPC, self).__init__() @@ -193,8 +211,21 @@ async def process_transaction_queue(self): async def process_transaction_queue_item(self, item): txn = item.transaction stream = item.stream + + check_max_inputs = False + if self.config.LatestBlock.block.index > CHAIN.CHECK_MAX_INPUTS_FORK: + check_max_inputs = True + + check_masternode_fee = False + if self.config.LatestBlock.block.index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + check_masternode_fee = True + try: - await txn.verify(check_input_spent=True) + await txn.verify( + check_input_spent=True, + check_max_inputs=check_max_inputs, + check_masternode_fee=check_masternode_fee, + ) except Exception as e: await Transaction.handle_exception(e, txn) return @@ -220,6 +251,14 @@ async def make_gen(streams): async for peer_stream in self.config.peer.get_inbound_streams(): if peer_stream.peer.rid == stream.peer.rid: + self.config.app_log.debug( + f"Skipping peer {stream.peer.rid} in inbound stream as it is the sender." + ) + continue + elif (stream.peer.rid, "newtxn", txn.transaction_signature) in self.confirmed_peers: + self.config.app_log.debug( + f"Skipping peer {stream.peer.rid} in inbound stream as it has already confirmed the transaction." + ) continue if peer_stream.peer.protocol_version > 1: self.retry_messages[ @@ -230,6 +269,14 @@ async def make_gen(streams): await self.config.peer.get_outbound_streams() ): if peer_stream.peer.rid == stream.peer.rid: + self.config.app_log.debug( + f"Skipping peer {stream.peer.rid} in outbound stream as it is the sender." + ) + continue + elif (stream.peer.rid, "newtxn", txn.transaction_signature) in self.confirmed_peers: + self.config.app_log.debug( + f"Skipping peer {stream.peer.rid} in outbound stream as it has already confirmed the transaction." + ) continue if peer_stream.peer.protocol_version > 1: self.config.nodeClient.retry_messages[ @@ -249,6 +296,11 @@ async def newtxn_confirmed(self, body, stream): (stream.peer.rid, "newtxn", transaction.transaction_signature) ] + self.confirmed_peers.add((stream.peer.rid, "newtxn", transaction.transaction_signature)) + self.config.app_log.debug( + f"Transaction {transaction.transaction_signature} confirmed by peer {stream.peer.rid}. Peer added to the list of confirmed peers." + ) + async def newblock(self, body, stream): payload = body.get("params", {}).get("payload", {}) if not payload.get("block"): @@ -297,6 +349,8 @@ async def fill_gap(self, end_index, stream): start_block = await self.config.mongo.async_db.blocks.find_one( {"index": {"$lt": end_index}}, sort=[("index", -1)] ) + if end_index - 1 <= start_block["index"] + 1: + return await self.config.nodeShared.write_params( stream, "getblocks", @@ -304,10 +358,21 @@ async def fill_gap(self, end_index, stream): ) async def send_mempool(self, peer_stream): + check_max_inputs = False + if self.config.LatestBlock.block.index > CHAIN.CHECK_MAX_INPUTS_FORK: + check_max_inputs = True + + check_masternode_fee = False + if self.config.LatestBlock.block.index >= CHAIN.CHECK_MASTERNODE_FEE_FORK: + check_masternode_fee = True + async for x in self.config.mongo.async_db.miner_transactions.find({}): txn = Transaction.from_dict(x) try: - await txn.verify() + await txn.verify( + check_max_inputs=check_max_inputs, + check_masternode_fee=check_masternode_fee, + ) except Exception as e: await Transaction.handle_exception(e, txn) continue @@ -330,6 +395,9 @@ async def send_block_to_peers(self, block): async def send_block_to_peer(self, block, peer_stream): payload = {"payload": {"block": block.to_dict()}} await self.write_params(peer_stream, "newblock", payload) + self.config.app_log.info( + f"Sent block with index {block.index} to peer {peer_stream.peer.rid}." + ) if peer_stream.peer.protocol_version > 1: self.retry_messages[ (peer_stream.peer.rid, "newblock", block.hash) @@ -383,7 +451,6 @@ async def blocksresponse(self, body, stream): self.config.app_log.info(f"blocksresponse, no blocks, {stream.peer.host}") self.config.consensus.syncing = False stream.synced = True - await self.send_mempool(stream) return self.config.consensus.syncing = True blocks = [await Block.from_dict(x) for x in blocks] @@ -672,7 +739,7 @@ async def authenticate(self, body, stream): ) ) await self.send_block_to_peer(self.config.LatestBlock.block, stream) - await self.get_next_block(self.config.LatestBlock.block) + #await self.get_next_block(self.config.LatestBlock.block) else: stream.close() @@ -791,8 +858,8 @@ async def get_ws_stream(self, route): class NodeSocketServer(RPCSocketServer, NodeRPC): retry_messages = {} - newtxn_tracker = NewTxnTracker() - disconnect_tracker = DisconnectTracker() + disconnect_tracker = NodeServerDisconnectTracker() + newtxn_tracker = NodeServerNewTxnTracker() def __init__(self): super(NodeSocketServer, self).__init__() @@ -801,8 +868,8 @@ def __init__(self): class NodeSocketClient(RPCSocketClient, NodeRPC): retry_messages = {} - newtxn_tracker = NewTxnTracker() - disconnect_tracker = DisconnectTracker() + disconnect_tracker = NodeClientDisconnectTracker() + newtxn_tracker = NodeClientNewTxnTracker() def __init__(self): super(NodeSocketClient, self).__init__() @@ -870,7 +937,7 @@ async def challenge(self, body, stream): ) async def capacity(self, body, stream): - NodeSocketClient.outbound_ignore[stream.peer.__class__.__name__][ + self.config.nodeClient.outbound_ignore[stream.peer.__class__.__name__][ stream.peer.identity.username_signature ] = time.time() self.config.app_log.warning( diff --git a/yadacoin/tcpsocket/pool.py b/yadacoin/tcpsocket/pool.py index 485c250f..3bc34707 100644 --- a/yadacoin/tcpsocket/pool.py +++ b/yadacoin/tcpsocket/pool.py @@ -1,9 +1,12 @@ import json import time import traceback +import uuid +import asyncio from tornado.iostream import StreamClosedError +from collections import defaultdict from yadacoin.core.config import Config from yadacoin.core.miner import Miner from yadacoin.core.peer import Peer @@ -15,6 +18,8 @@ class StratumServer(RPCSocketServer): current_header = "" config = None + SUBMISSION_LIMIT = 5 + submission_counts = defaultdict(list) def __init__(self): super(StratumServer, self).__init__() @@ -22,17 +27,17 @@ def __init__(self): @classmethod async def block_checker(cls): - if not cls.config: - cls.config = Config() + try: + if not cls.config: + cls.config = Config() - if time.time() - cls.config.mp.block_factory.time > 600: - await cls.config.mp.refresh() + if time.time() - cls.config.mp.block_factory.time > 900: + await cls.config.mp.refresh() - if cls.current_header != cls.config.mp.block_factory.header: - try: + if cls.current_header != cls.config.mp.block_factory.header: await cls.send_jobs() - except: - cls.config.app_log.warning(traceback.format_exc()) + except Exception as e: + cls.config.app_log.warning(f"Error in block checker: {e}") @classmethod async def send_jobs(cls): @@ -47,12 +52,16 @@ async def send_jobs(cls): @classmethod async def send_job(cls, stream): - job = await cls.config.mp.block_template(stream.peer.agent) + stream.peer.calculate_new_miner_diff() + job = await cls.config.mp.block_template(stream.peer.agent, stream.peer.custom_diff, stream.peer.peer_id, stream.peer.miner_diff) stream.jobs[job.id] = job cls.current_header = cls.config.mp.block_factory.header - result = {"id": job.id, "job": job.to_dict()} - rpc_data = {"id": 1, "method": "job", "jsonrpc": 2.0, "result": result} + params = {"blob": job.blob, "job_id": job.job_id, "target": job.target, "seed_hash": job.seed_hash, "extra_nonce": job.extra_nonce, "height": job.index, "algo": job.algo} + rpc_data = {"jsonrpc": "2.0", "method": "job", "params": params} try: + cls.config.app_log.info(f"Sent job to Miner: {stream.peer.to_json()}") + cls.config.app_log.debug(f"RPC Data: {json.dumps(rpc_data)}") + cls.config.app_log.debug(f"Jobs dictionary for Peer {stream.peer.peer_id}: {stream.jobs}") await stream.write("{}\n".format(json.dumps(rpc_data)).encode()) except StreamClosedError: await StratumServer.remove_peer(stream) @@ -63,18 +72,28 @@ async def send_job(cls, stream): async def update_miner_count(cls): if not cls.config: cls.config = Config() + + unique_miner_addresses = set() + for peer_id, workers in StratumServer.inbound_streams[Miner.__name__].items(): + for (address_only, worker) in workers: + unique_miner_addresses.add(address_only) + await cls.config.mongo.async_db.pool_stats.update_one( - {"stat": "worker_count"}, + {"stat": "miner_count"}, { "$set": { - "value": len(StratumServer.inbound_streams[Miner.__name__].keys()) + "value": len(unique_miner_addresses) } }, upsert=True, ) await cls.config.mongo.async_db.pool_stats.update_one( - {"stat": "miner_count"}, - {"$set": {"value": len(await Peer.get_miner_streams())}}, + {"stat": "worker_count"}, + { + "$set": { + "value": len(await Peer.get_miner_streams()) + } + }, upsert=True, ) @@ -83,31 +102,21 @@ async def remove_peer(cls, stream, reason=None): if reason: Config().app_log.warning(f"remove_peer: {reason}") stream.close() + if not hasattr(stream, "peer"): return - if stream.peer.address_only in StratumServer.inbound_streams[Miner.__name__]: - if ( - stream.peer.worker - in StratumServer.inbound_streams[Miner.__name__][ - stream.peer.address_only - ] - ): - del StratumServer.inbound_streams[Miner.__name__][ - stream.peer.address_only - ][stream.peer.worker] + if hasattr(stream, "peer") and hasattr(stream.peer, "peer_id"): + peer_id = stream.peer.peer_id + Config().app_log.warning(f"Removing peer with peer_id: {peer_id}") + if ( - len( - StratumServer.inbound_streams[Miner.__name__][ - stream.peer.address_only - ].keys() - ) - == 0 + StratumServer.inbound_streams.get(Miner.__name__) + and peer_id in StratumServer.inbound_streams[Miner.__name__] ): - del StratumServer.inbound_streams[Miner.__name__][ - stream.peer.address_only - ] - await StratumServer.update_miner_count() + del StratumServer.inbound_streams[Miner.__name__][peer_id] + await StratumServer.update_miner_count() + async def getblocktemplate(self, body, stream): return await StratumServer.config.mp.block_template(stream.peer.info) @@ -151,9 +160,14 @@ async def get_bulk_payments(self, body, stream): return result async def submit(self, body, stream): - self.config.processing_queues.nonce_queue.add( + miner_diff = stream.peer.miner_diff + + await self.config.processing_queues.nonce_queue.add( NonceProcessingQueueItem(miner=stream.peer, stream=stream, body=body) ) + current_time = time.time() + share_info = {"miner_diff": miner_diff, "timestamp": current_time} + stream.peer.add_share_to_history(share_info) async def login(self, body, stream): if len(await Peer.get_miner_streams()) > self.config.max_miners: @@ -173,10 +187,24 @@ async def login(self, body, stream): ) await StratumServer.remove_peer(stream) return + + custom_diff = None + peer_id = str(uuid.uuid4()) + miner_diff = self.config.pool_diff + + if "@" in body["params"].get("login"): + parts = body["params"].get("login").split("@") + body["params"]["login"] = parts[0] + custom_diff = int(parts[1]) if len(parts) > 1 else 0 + await StratumServer.block_checker() - job = await StratumServer.config.mp.block_template(body["params"].get("agent")) + job = await StratumServer.config.mp.block_template( + body["params"].get("agent"), custom_diff, peer_id, miner_diff + ) + if not hasattr(stream, "jobs"): stream.jobs = {} + stream.jobs[job.id] = job result = {"id": job.id, "job": job.to_dict()} rpc_data = { @@ -188,18 +216,29 @@ async def login(self, body, stream): try: stream.peer = Miner( - address=body["params"].get("login"), agent=body["params"].get("agent") + address=body["params"].get("login"), + agent=body["params"].get("agent"), + custom_diff=custom_diff, + peer_id=peer_id, + miner_diff=self.config.pool_diff ) + stream.peer.miner_diff = self.config.pool_diff + stream.peer.custom_diff = custom_diff + stream.peer.peer_id = peer_id self.config.app_log.info(f"Connected to Miner: {stream.peer.to_json()}") + StratumServer.inbound_streams[Miner.__name__].setdefault( - stream.peer.address_only, {} + peer_id, {} ) - StratumServer.inbound_streams[Miner.__name__][stream.peer.address_only][ - stream.peer.worker + StratumServer.inbound_streams[Miner.__name__][peer_id][ + stream.peer.address_only, stream.peer.worker ] = stream + await StratumServer.update_miner_count() except: rpc_data["error"] = {"message": "Invalid wallet address or invalid format"} + + self.config.app_log.debug(f"Login RPC Data: {json.dumps(rpc_data)}") await stream.write("{}\n".format(json.dumps(rpc_data)).encode()) async def keepalived(self, body, stream): @@ -212,19 +251,36 @@ async def keepalived(self, body, stream): await stream.write("{}\n".format(json.dumps(rpc_data)).encode()) @classmethod - async def status(self): + async def status(cls): + unique_miner_addresses = set() + for peer_id, workers in StratumServer.inbound_streams[Miner.__name__].items(): + for (address_only, worker) in workers: + unique_miner_addresses.add(address_only) + return { - "miners": len( - list( - set( - [ - address - for address in StratumServer.inbound_streams[ - Miner.__name__ - ].keys() - ] - ) - ) - ), + "miners": len(unique_miner_addresses), "workers": len(await Peer.get_miner_streams()), } + + async def check_submission_limit(self, body, stream, address): + if hasattr(stream, "peer") and hasattr(stream.peer, "peer_id"): + peer_id = stream.peer.peer_id + + self.submission_counts[peer_id] = [ + ts for ts in self.submission_counts[peer_id] if time.time() - ts <= 1 + ] + + if len(self.submission_counts[peer_id]) >= self.SUBMISSION_LIMIT: + data = { + "id": body.get("id"), + "method": body.get("method"), + "jsonrpc": body.get("jsonrpc"), + } + data["error"] = {"code": "-1", "message": "Submission limit exceeded, IP banned for 60 seconds"} + await stream.write("{}\n".format(json.dumps(data)).encode()) + await self.remove_peer(stream, reason="Banned miner") + + StratumServer.banned_miners[address[0]] = time.time() + 60 + self.config.app_log.info(f"Banned Miners Dictionary: {StratumServer.banned_miners}") + else: + self.submission_counts[peer_id].append(time.time()) \ No newline at end of file