diff --git a/.gitignore b/.gitignore
index 08d1bfe..77cdc12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ __pycache__/
build/
dist/
ex/
+!_static/build
diff --git a/_static/SHA256SUMS b/_static/SHA256SUMS
new file mode 100644
index 0000000..6a7186a
--- /dev/null
+++ b/_static/SHA256SUMS
@@ -0,0 +1,877 @@
+643aec99785678fdf5eed7ec2bb4e15463da0eb82250ca0e311333f291bf4551 api/translations/all.json
+1295a6ab872892e6b2b2f063e7f7fe454c71e905b8a6be2ae2cffc51614f8711 api/translations/en.json
+ce2f463a0cdf5b8834993c479ab0a438ed1b8f0d31a4c751227d9bddcb93aa75 bootstrap.js
+f4ca9c109eea8338684c881875b1183708d68e7061a25c6ff15acf592a3922ce build/1037.51967a2.js
+97eb1c83b04e160ed0e06b6e759792231b03b79687570dc19c3144cb2e7ec647 build/1037.51967a2.js.map
+5aa9029a3ab424c87f60bd1765813e720520030aa754100972fdf18aeeec70d4 build/1079.cdbaf67.js
+7e6d508f2a794ef8099c04895a4cceaa9e7d00477673c92092c42077397e4f96 build/1079.cdbaf67.js.map
+c384f5a05f6a9f4d3fe8cec889df68ac9e27178aa24732fa32ef3a6d15c73c5a build/1084.4cd1c89.js
+4398b248ef6935613ef2a886fa0d5835092a0152ff4cbd236811a0eb6de39bf5 build/1084.4cd1c89.js.map
+0bb725eaa99fcda3b2279051c501314e225c776a6396b163a5a5e7fece17be58 build/1113.23c9417.js
+a066d321b081fc62f330fd6c2c17fe1623212900f927ae1df534b51b6acdf0d1 build/1113.23c9417.js.map
+b65ce214a0df40295043af6376efbd0971f280b0edab443cf6335b6dbcebe649 build/1125.129d070.js
+4d28776d41d91dc18dcf87168b4bb14a17f99ffa57aba72786650f407ecb8870 build/1125.129d070.js.map
+7800a818f266f7bc86e390e3a0c357577a4fe478fb5c97168dd7d35510bff522 build/1163.ac28297.js
+138beafcc9308b5c7b6cf09891bb1b9865667786aefb61d744ba313a6b025e76 build/1163.ac28297.js.map
+27d5b97d544894e0d309ed6a51b753130532798e37c0f379c6a54d7779ab5275 build/1221.c51249a.js
+3dfa17ba67f663749b29c3da5d70ca1e18b81cda43b073f21c6ebf1ae86a2b0b build/1221.c51249a.js.map
+afca34c261d2a9037bcceb1700b05a833908276123ef56279b69867a20d5dc1b build/1245.cbc7a54.js
+0f8e29a5b32de3c9afc5c98f31ed5feabd7445ae91496c27aa4b09ceba7b7353 build/1245.cbc7a54.js.map
+824d8c1fe2e5569e5b38b49480dbc06f16d99bb3e91020f4fca1fc27596ce168 build/1261.199fc1d.js
+6dd8144d88d94edd29c771a18b669d258e33c37a8f432e4b0a4b9acc073a555b build/1261.199fc1d.js.map
+93fe875a31bd3d1b8e550d8cda0ac4a0302688e9f852b8e7f1efdba9611a4ec4 build/1272.f334098.js
+6145baf6e209fe9f374b20ab752f2a3ebb0f44c3102d3c5f4e9ac93ec5c0413b build/1272.f334098.js.map
+47ed7f5b35a14c3e4863df07b3516b08bbbed31d10c941ae31ffd7cacc5cb622 build/1278.0524a4a.js
+0d8f66cd4afb566cb5b7e1540c68f43b939d3eba12ace290f18abc4f4cb53ed0 build/1278.0524a4a.js.LICENSE.txt
+b87ccc047bf69efc226a23fef896232f3797c49eeb418a03edf6b43042d4a2f7 build/1278.0524a4a.js.map
+c5082e2e545889896b2eff5253d2435a830444150bc1e8713a144ea0cc9d56b6 build/1290.3981211.js
+4be65337438c778892ffb96f8f880ef08c00fc965c51f6c2aa3a7c529625498d build/1290.3981211.js.map
+1e463b93eb6688799a2b14c49a9387d5246533b1112e9baf958b898df1f721db build/1295.46e72b8.js
+d85de4c44fea58b65b21d36085a4e5717773cfec65f7fcab17452520c540ef6b build/1295.46e72b8.js.map
+90f5f0fbf7517c282ee8eba4aa7ca934d0851473753b11253e64538c10271868 build/1310.23bbe67.js
+287f6e79ea4fd56f98ab5a14fdbebeb6a3abd8d7711149d0605b68fbe48254e7 build/1310.23bbe67.js.map
+fd89e603f6261cd9ee92476d996408a86f4f63d78268975fdb04fc03fbec4c80 build/1320.21effe3.js
+ae06b28bc64529a928acb1066dbb3dda95861cb3ef2d4533eee6838f43b03268 build/1320.21effe3.js.map
+b067dec5b15e826cd8be70f4add343edb18373a63c8b43e3247ec15e599430a5 build/1325.f76267c.js
+766e3d3a9c991af95af2c889d3319899a509abfb8c565c88305533cd2092f696 build/1325.f76267c.js.map
+0582faa38dd6efb77014aab2794105722b48112ffbbe988ba253660a5363abe6 build/1408.cf2b958.js
+f3e8918d331c6b64c5d5377a3fccce0548cf018055d92ce5d225f6f906de93a5 build/1408.cf2b958.js.map
+b0714dfc36cc32f259fbc90888d9ab202ed4334fd1d920dc906b72dccc181d7b build/1440.a9e7ea1.js
+89934bd245dcde1487e29248cdaaf9838697fe54fcf42a48715140de3d97e521 build/1440.a9e7ea1.js.map
+616d9ab0d010de3506ed2c089399af6e5eaf943ac6b4051a220b620e6408c520 build/1483.616d9ab.js
+8e6098e132c4ba9aa1632b0c56df0b4323c758fa4aaf84a4ecf1e94011e4151f build/1489.e50b6d4.js
+f2d01bda421244419e44a2c007f47b6ed04085b37daaa4fc83ab3ae4cc0b442e build/1489.e50b6d4.js.map
+0d6f3bed4e677e2daf877904c04bee180abff1c752c651155d870a1e6de84557 build/1507.5705605.js
+e5530a99389e1ac9c03bc6a122cefd3bffe7ccb5aa583672bc6704235dd177e9 build/1507.5705605.js.map
+4506b4483e3626f9de3539c8f5023d1667f0877745fc9765a8da98017bd66c8d build/152.525d460.js
+3d2af9335cd64f2967da18acbc0be4adcc449c59124601e387a3d25a05846e33 build/152.525d460.js.map
+57bcd87730341bf494745d20eefc282b1d46777d8fe93dfd0507e554e35246f8 build/1520.4e2eb21.js
+ef411c81f6140d26b3839388e4533bf3b0c25fd591faef775f9c912e5f603b36 build/1520.4e2eb21.js.map
+311df01c180b7481155e2bfeb2714fdf6a5f0c7f228f7f099f1ce057ef9e361c build/1555.e188f3f.js
+13f772e05298d93fe5db8680ae2871d13f72c69a14bdda480d0f80edc5003d35 build/1555.e188f3f.js.map
+8de2d6203e563f12a379d495289603a135735a566db3904ecba31ea98b12c1fa build/1559.7c89925.js
+3c0aa4dc3bb500bd4cec7ad8982fc7a5cc390ab60d862fdcd55f9bc62d721f83 build/1559.7c89925.js.map
+cef48215e3359942cda77d8187dfb89af71b0240cc19d0a0b2038174bc23e6f0 build/160.5f28731.js
+447d63bd88906e519f7c86decc6136f2f7fb04f6dda173d02a6d492b0cc40642 build/160.5f28731.js.map
+82041c4d746e9c2194616fa66a1057e494a7f751372baa2c91df2f91cee1089b build/1603.370a2a6.js
+ed0770cf81443af656100691a8025b9226783c5a36bc3f33494b30930b9c1aad build/1603.370a2a6.js.map
+69cc3446dedd4974cf6cd27fabf1c27d22a7ec2a2064a9d4736f7d64fbab37ee build/1644.0e49167.js
+09edc24845904b9eb210697492e55ff3115bdd41d8322c1faad40dab40b96c4a build/1644.0e49167.js.map
+f7b551819051921765b02318ec5c828f75334b7c2e4db65df0c49013464e14bb build/1667.f0afb2b.js
+252062e240f27245266ba8608690f8b5282a91eb6e7068926716b425b9a1bc34 build/1667.f0afb2b.js.map
+63518b3e2edb206e5263352864bc6918a6283efc21f7fc0ec3446d0bc3b3365b build/1687.27f1ad6.js
+a92259033da24fee2f67bf3bb88d9adff979224c826b2463b031df8593c5092c build/1687.27f1ad6.js.map
+b3b2f14e53995c59bdef573b29d8e6ff2cd5e3ed64a99d566ed628863a9fe00d build/1725.f151c33.js
+4a964350aeb4970a9b7c21c4d03621338d6daada87c11de1184fac6ba3dcaf7b build/1725.f151c33.js.map
+6babd5acf08ceb51bf24d9025b7a23ef5e26b4233b711617c2a0132be40ec083 build/1767.c8c2f26.js
+2c474c53f1816a8e46e1e0f0281eb0bee86e13d87cfc37c1485dd298b1875a82 build/1767.c8c2f26.js.map
+184016605fdaa307499282aa8b36aa5117d561e74e3819cec984b65a5db07ed5 build/1806.1aaf66b.js
+3f9ddb8457622193bd5a098c37f17cbbc9401489c05f261889bc82ed0351e82f build/1806.1aaf66b.js.map
+abe663620b7097d2e3d1bf797c4e87bfbcf8f2da34ce0f188b57922f56551333 build/1838.1202b16.js
+76a1a08ca798dfe0b8ac3705637239b9e5054c341d39d5ea6e60e4c6678a100d build/1838.1202b16.js.map
+461719f5cb270011894b21fd0003a6de7683cdcc05bd04e686057e8130a72be9 build/1909.28a2def.js
+7b83da61fee880913f5a6d1809947f821dd396e9fa4b61a041d3ab90f041f130 build/1909.28a2def.js.map
+da37ffb8f6be0e3497d79a26686dd72fa93f5e9ff35d1a9430bd616bf49e6eda build/1989.88d258f.js
+4f30347799a0a93d6fa13cce5913f1694a68722061192d93f0b361e5eff99847 build/1989.88d258f.js.map
+ed5068c1bfaf7d88cf8cf86dbf68039cd348389eaaa70b5e581f23c4a098343e build/2030.1562cc6.js
+5017c50931a1a2e51ef77c3bc0283d371bfe319f22255254049f50ca55f3f151 build/2030.1562cc6.js.map
+c7010fec8670160676ea9043e6095fc6ffd421f56f49ff94c3a7e4fa7988996a build/2047.baed97b.js
+98a827e5a96570b6040d533209eee69d28f1ac93ccd208b1b00b94e98c5fdb67 build/2047.baed97b.js.map
+51f7e69076eef60b66129ac841677e32c31b9201994b252160498863d2c82c28 build/2099.f4b6fcd.js
+1fbefe10c40e0c7c8d599b91f7eff76f1088e9e25180790bf7736a223affaa9f build/2099.f4b6fcd.js.map
+ece097c8ed65b96bc152812077c76145dd1583779d6f16ddcbcf3b68b8d77ca6 build/2118.5b65f70.js
+0b80f05f23371765ce7a891d0dcece1fa202f9aa2cf110e7163e098089125457 build/2118.5b65f70.js.map
+7bfeaaeddbb3291f6a6471cda794951aa5e7f3387242e50d530cf68e7efdc3aa build/213.5769e57.js
+3da88ad32370a519710b019879a995bcfec7a365c989ea7c7b6baf12d247a6a0 build/213.5769e57.js.map
+c3cab0b5256f534b9fca3ac5668b7458916cea96093ccb87de39e906ac0110c1 build/2161.dcb27b8.js
+9fb0deaf08132e11af80032ec43de5edcb86ffa2bd1636bdfcb9c4c178e764c3 build/2161.dcb27b8.js.map
+6bffcd40006121e8aed49d4190ce211f1ce141e8cd1e9ce750cc4e8c11318a11 build/2169.635c88e.js
+517c4442f71df66db0234b81602d74489ee2c5957b798664efae1044af0b72f8 build/2169.635c88e.js.map
+bfa4b2ebe4e1074da9972d73f0e1ead0baa6abf1d92aa4b036006c366f2b73b2 build/217.90d10e2.js
+6d8990b0eef0c260c090f8b92191fea020f18fc60be300792fcfde9cce71224d build/217.90d10e2.js.map
+fd5d0eeba1da333fb18402c30f9217246eb59ebb1c60d63619e6d98e5b483cb6 build/2212.72be094.js
+47db7d400a6f1146d1b4dd4f76d5676b2125f6888b7d9dbedb9615d53740123c build/2212.72be094.js.map
+52325cbf75c03ef926eb19b5cca9622dcd438bf3c0e7c2e80ae52c504e2c2978 build/2287.997c38e.js
+9fa92ee02006887aeac98fb55dc7569e901fec682a5c63a8691ed07315897c8f build/2287.997c38e.js.LICENSE.txt
+f6e34a04bbf9b44306ad3989dbad98affcccca37206e6df12b87a19e38bcf0e5 build/2287.997c38e.js.map
+e3a3d14e1da6eff471857cf38db8ba8306bd2dc08902cd1af5a6c344d6c6adb2 build/2303.9ff8710.js
+7db9e0e706e9162593d0c473401ea221e259a78fad23d67b5667f0184d744813 build/2303.9ff8710.js.map
+aa01824f41fe2ace111aa27f2507bc6d012d2a75d9ef76c82a585628b36ebe80 build/2319.6b4cbb7.js
+1043003962bad8e0503f807f57e0581bc3c7f8c2fb288fd85117ad1f4af8c537 build/2319.6b4cbb7.js.map
+63c3aae419a5fe137b143df4bed09b7138cd93b38daac13762113e1006878d47 build/2329.4c5ca6d.js
+8aedc7810d9816e7eb5e02050886a39e59290fb39d973492cef966cdd89a25d6 build/2329.4c5ca6d.js.map
+1e8193c336b622b8cf1f42dc33b6be876b24e20fb1de2ce9bc1d4b537a8d01bc build/2351.fbd96d8.js
+796da5171835759e8ff20a22b01c93cb23550213bf5e8a9c1a1fec4297132d77 build/2351.fbd96d8.js.map
+7cbae8ec863def6ed89eb2977fc22117756319e084177eab96b13e7fb23fb189 build/2358.d5cf7c8.js
+1f78bfea6e20d6a57207c8adfff0b2498d873213ada0159776b3a60cd6653806 build/2358.d5cf7c8.js.map
+8108fad87a4e32bef515f689471b85a75d4b766c5236ef7dd073c70aa2bfc995 build/2359.6451c3e.js
+d88ea0555ac631a38c25e42f10937428344d369d5098d8efd074b81823c62cba build/2359.6451c3e.js.map
+290d54edb34d16efccb6f259bb487066fc26936754fc2a97af7664d4521ffc3d build/237.f765e77.js
+5785b8f3f0660ad7e54d9f91386046b9524709c988a693c89df4666827000b54 build/237.f765e77.js.map
+00619d337dc2898bcdcaaf7c21e3ca021830002f1560fd5e2e810ebf1fa1bcae build/2384.71782be.js
+5dcb85d32332b2c6aed0833d005c2c1fc4e97a863fd97191242ea82db3fd6c1d build/2384.71782be.js.map
+9ace77f9eced760b0634cee015f8acd363bb5488128a974d513af87bebba0ca8 build/240.cddc46b.js
+ddbe43fad43c9329c68cbadaca65353c6ae3c39c0f87df9d00f1f7ab128af12d build/240.cddc46b.js.map
+67943af71c43e0cd8b3bac3481a6e1a6e4787abc6a76296f9aa4c4bce389420e build/2431.648d237.js
+18ec6c1590c241ae0861ec1b987d0ee17418b2772866d7010acb61fbe03d91f1 build/2431.648d237.js.map
+8cac351050fd418a6f12c224b97e2a877ced09088f3bdce6d111f4847209598f build/2546.e7c3d46.js
+ca80b9355d59c2bb599510fe0b09142db16da8ca2ab5c01b254297756ba284a8 build/2546.e7c3d46.js.map
+b7ccdbb2664dc5f8ca535b166922738a2bfc7d04e39f195d09e5d2c209090efb build/2557.e1c50fd.js
+1659d6237d9dbd3086b4e04d1d6aeae64c2f598eaa4bdefa8228a5c6578cfa46 build/2557.e1c50fd.js.map
+c8624c22da27baf96d9056e29871d6335af5bd4edd4c5658681c96369acc05df build/261.5f53c0e.js
+6faab9022d45c19c109246ca521faec6e809f11d8c13098fce18f711295ee0a4 build/261.5f53c0e.js.map
+67d6525cee17aa16af9224c71b4bfa58cf27650dfe1f17f162fdfd84ab7579af build/2629.c0e1cd6.js
+467857fb98c041fbd697367191e699697776ac5931489550ef02fa0e303b460c build/2629.c0e1cd6.js.map
+d0dac97a1f8f2f78495bb036981ad4b44c7eedb1d5f76bac53b30b43c3051cd1 build/2788.46acc8a.js
+e7bf1ca46c37f4913752d50201a5ef18d40797d9e3fbb48ceaef798f24ca6380 build/2788.46acc8a.js.map
+e66a4682a633237fa1efac8373becb742075d37b7da4e3cbd9405071e0ba0781 build/2834.942acc6.js
+42b98c49c1b16d555da24075ccd71529aed8879accacd3fa0fdb7762f5cc6ed0 build/2834.942acc6.js.map
+9ee2ecc4ad0b060d373e623a42fad24283254fffeea84ca5d274045d7b94a84d build/2887.47ba752.js
+40da7cdd86e2d3c4550474253553cc878a0ab4d7d72b5dd7995c95d24e01c9e1 build/2887.47ba752.js.map
+8d2325daeeb959761b877b810486ea038602702b0ca720013390a19d340c19d5 build/2956.8880209.js
+641aed8c09707b19986e0cd92f920e75d33656a457786a21fe7663f6139819b7 build/2956.8880209.js.map
+626eae452ade9ed1065e3128bca940fa401d1d016cf8319de6a63d5208989ede build/2973.2a51dc4.js
+9ebcac4cfe84b00d6538748e915c65e010fafa80678f5aef7c458359e7812ab0 build/2973.2a51dc4.js.map
+e2503616cbd08973e0dd118f9944672160c079ef40bf65dd20574ec1c3f92530 build/3004.255e79c.js
+aa033212431f6323aa2ef2e862e7d5e8621bca0855d284323e766eca8c0a297a build/3004.255e79c.js.map
+606a7d2d9241a46edd0c92bae2741ebc270018b360e838fd3959fba461be556c build/302.bafc132.js
+17abb127d5aaeccea40b8cd67daf712bbfe450e22045c3b96cc259ce0c2ea881 build/302.bafc132.js.map
+8789c0adb9783482f3f0a35f9302444f2d300c1e3a4de795ad681a30135b4041 build/3037.70ee38d.js
+2f4e5c4a442742d22b636fafb997646c2dda91c732d6fcf54cb3bba388f9fa71 build/3037.70ee38d.js.map
+f7376bf2a69241ae4827390d46f9d6fe87ad4f04cdd57c072276f72f31ba512b build/3042.7cfad84.js
+7c40ae5e6ba4d97c2e8c9264dae3892f3933e655544c63bdbe846c045e4da2ef build/3042.7cfad84.js.map
+1ec164c38b64f5ebe4e28d7dfd0af97ad8d79f419d3c837058725e232aa6ab7e build/3051.34fac68.js
+beaa1d4b854836577b30846fcf95bc7cb9c8e5851c6bae58268db6107248e569 build/3051.34fac68.js.map
+242e7b548b51454ae5a984796e865bbe249b68fb71a98eb95251d4f5f33156ae build/3122.2289fca.js
+0c075cd3100ae910a09bee4a1dd77c5ccd5e4e2ac15c3e75a6fbbb92ab0226dd build/3122.2289fca.js.map
+75aad444ff6cc698177de25db7cafc3f306b308d4aa43d0f9cea4eb2ef071d12 build/3151.10ef4de.js
+88df915c6c349a28cfe629b42ddaf6f6444ae21137d023a7ecc576eb636e8c2b build/3151.10ef4de.js.map
+db99ef479db5234f6d1473b929a0b49b152d3cda62b6fede7c390f425096f181 build/316.c850a76.js
+0ff89234dcb972f93fc6ada17958f7ecb44b5e1fa734ae9d53852cc210e466b2 build/316.c850a76.js.map
+e42cbfe4814474725641bf9bd756c10de747ffc2339349de9c785090bf515474 build/3196.4e35a17.js
+ca5e4a107c3a4fa03d06f9c8c1eaaa48703702e377bf59777768c81d873ae6f9 build/3196.4e35a17.js.map
+4c18bb70971f0688ff78979bd7e1931bce7bfb057b22625a2033a0b33fe5c02d build/3265.a80440a.js
+8993f6fd3daaf45720fde97eacee7ab8c0c4924255f2ea7b527e52e4ddd5da2b build/3265.a80440a.js.map
+ebbbb849ac2235cab15f4eabd1cdb7f1a7bf353d733fa835475152c426356d83 build/3277.9c04e75.js
+ac04cc21e2f7d97b0609d21bb51d14f2d42a04f4c2c9b815ddb3a1464ab3dc9e build/3277.9c04e75.js.map
+7d51ae2ac2aa861dc013d6ec67dcf72348d1cb589f35729848be1609c508385e build/330.126fa98.js
+2f6c45d80c4d513f8b799edf8d9752601834c54d5dc231f7c521e26193e70d21 build/330.126fa98.js.map
+4e17b62313310518083e7e3e7be543c097fe59cf058559bd522240e4c5ee8680 build/3392.29fe6b9.js
+a67ea5b64da91834f0106d893a6ec0f27ffd1ef6a555c077179d180bb330cf47 build/3392.29fe6b9.js.map
+9c679eb26948423f9fdd8ab16daa8d5cfc811231088f7fcf4a6a43f78a1a2063 build/3413.480a49d.js
+82ea75afe2a206a17c4d67d17bbbc556b616b3254de33e120eadfc67c5d877ff build/3413.480a49d.js.map
+de0dc025451ddce4234cec725edf79c5883ffd7c2f686f6b9e2d25fde3642caa build/3444.2b662fb.js
+1a8b05ed92149e2283d7ce403c5b942e369a768fd50400ae6ed1192f65a4b8a2 build/3444.2b662fb.js.map
+421b0ce00638e3797cb0ab71522d22205692609f3b423407409fb0e14e1c4cb4 build/3469.7d14d0b.js
+42307a82935d755264d5c4f08bcd55f048be0b5ddd58ea97fab905287afaae53 build/3469.7d14d0b.js.map
+57e23eadbd2b2a19b8ac510986f1ffba5bcc3f023f6dcd39ac327500f20ed274 build/3546.fee1bd7.js
+b909c182ae70c584baea61cd4a2d52610e60db18da61551fffd1197b8dc60506 build/3546.fee1bd7.js.map
+753f20f102d26579813c408398afba2ae242d50a1b498ea0625c36d4a79bf3df build/362.6716970.js
+13a669162c959e07051f5e1c65457c25a413c95615d5a43824489eba0368053b build/362.6716970.js.map
+040e63aaff487398ee4913fae8b32654d0e4318fda8ed6339ecd571152e401aa build/3708.410d087.js
+f3fba5b2ff060d117a9d777ff17e903ad5a5116308bb253f43c217407ff585ad build/3708.410d087.js.map
+8735345f4bb662ec6163dd6b70266b6e483ebfe2dd596b38bab81687051792dd build/3752.8735345.js
+325c12e9abde234832a32c49a2d938896d14515a6d25e45aba87f675c54a7159 build/3850.903abc2.js
+0d8f66cd4afb566cb5b7e1540c68f43b939d3eba12ace290f18abc4f4cb53ed0 build/3850.903abc2.js.LICENSE.txt
+da8ca5a5adbe5b45d7cc9f0fc7a45176931504212a10a07370868a8fcf08febe build/3850.903abc2.js.map
+867e068eaa92564d3efbe0a86798aaf736ee664b1c0a461d32148fd3d5d7aca0 build/3880.bd39dce.js
+beb38afa80b7d7eec2f5e91d2f7126e3459f6c9838d563c1ce4d7a09f525b78d build/3880.bd39dce.js.map
+f1b1eb8c3d6faccf5744d0b0f03c6538aff8e4840bae9428d1883176bdd3fe21 build/3970.236586f.js
+9c891f94a71c193246e9f87dce6aa6ddd6fa7ad1037b5aedffaded0f6392c33f build/3970.236586f.js.map
+c5c3c3ea4955763ea3a571907ebd881203d4900884470663c22d27b53205830b build/3976.58893b9.js
+30eb3d351a7525ec67c94538a2c9b690e6e3a78d2e04c7a686bbd2eefdcb3a29 build/3976.58893b9.js.LICENSE.txt
+97933d3b96e92fdc006080d113656e94148dfd84c4a790835d97f94d2aed730c build/3976.58893b9.js.map
+b46fe812e6946cace3c5d38a6248f77ca5cdb76f9720cfdd48a6fc388e8ec6ba build/3979.385527e.js
+e61780e417117a30a279225894187368236fff0cbf32562169ecf9c1f46c9a9d build/3979.385527e.js.map
+fa98353dc6be36f703afb7fcf3bb40c302f4e22585d7bfcd4f764fb734e66fb9 build/400.d72234b.js
+d6430ae77874b11f5ea938fed05352174a2eca25df144cb963f336cec5bf4a6c build/400.d72234b.js.map
+d7d050e98f58ab0fce4e709d3415b11feaa8980542b5517c7d637e04fd2bbc4d build/4018.1a35967.js
+819836ca592c1dc15500cb5c6ff1f1b87c3ccfec33b24d504a115c6975f7aff2 build/4018.1a35967.js.map
+3d91ab6510746225547c2f3b3467b4ee9bb7ba7c1e12468e8588d29b2a340a3d build/406.9b7af92.js
+ba3a8e89aa233564dbcbdb8b492d22ae2df92efb3fd7f910dd7cba6e526744ef build/406.9b7af92.js.map
+80371bf5b08d78bee387d70ebadfb9ffe7002f4939183650a02371b3bc527a8a build/4117.a8107fd.js
+d31ba5d303fd5030b08c083669b43793e618174d119086961fbbed167ed62f2a build/4117.a8107fd.js.map
+49490333c67c0f1e21bcd3897fc034dc9d793aafb6223940437408909eadfae4 build/4182.e2430f9.js
+7fd76292a42c43aeda6f99c6580a073f15c968f0802e6b626ae9113cea30dde5 build/4182.e2430f9.js.map
+83968fd55acd8241b2d916b9e9fdab6cd5155a4865bcc8cd368bd473e519cb7d build/4191.02bbea8.js
+a674220cef45836e992564b2d3c882030e2922d1b359623e33817bfd66d6e9f1 build/4191.02bbea8.js.map
+ebf1b03d03bdf8019caa3324e8ef1760c055aadcfb09ca4b11abfe05db847338 build/4197.53ab10b.js
+760eb2124c9e93e5b39e979f78ec7e2a34be6c9f58e08c0fda56b0a419f9ef40 build/4197.53ab10b.js.map
+1e4ac4882b86d65d065eb9d6daf088263f3c8e6e73b0b039231d8bcd71399054 build/4206.a5f8bb0.js
+f8dba00e78922311b50627bd1dff3b6d4a44a47360b42ce865ccf9bbeba91d9f build/4206.a5f8bb0.js.map
+79125b0cdbd3b3ec0172fb373bff16d0493cade92befe0f64ac07c6ede208428 build/4207.0d0580b.js
+344d3147d2978199698d6569cf752ad34ef7e4b03fa0f51823c53c36fda221d0 build/4207.0d0580b.js.map
+aa703d253c7c319cd5cab3422bf776b7f1931b320e803edb2d05b277174d7889 build/4262.bb73457.js
+cae29cac349ab82828adc0eb72c0d2544bdcb91175e9856252044473f0767bd5 build/4262.bb73457.js.map
+7b5cadad9cdce45fa8b3716eac7a640befb8381ce0f48157c560dfc2718bdb2a build/4298.5ee510c.js
+9f207db3c9aede26a0809cb5ed5709319555572f6912f4c49574ce5765dbd623 build/4298.5ee510c.js.map
+3251afa154efa70a67722d8cf7dde67030549391ec30933e6a784d6ca5ca0c9e build/44.0cfa785.js
+6903c5c5f8013b35f45d4dddb9598b798aabdec800b3cd94d377a4662a6e1861 build/44.0cfa785.js.LICENSE.txt
+73974350f6590d8b84be8098cd3d6f9c162643140891bebe84048397a2edde0b build/44.0cfa785.js.map
+2e187e0cf028d066cbc6dd856b7d9d7e6eb28615fcfbf23db95aa865d72c88cf build/4410.1d37235.js
+a2d40a507fa60d502cd4dc2e7423d50005cbcfe006aa41cd624ad495b8983cfe build/4410.1d37235.js.map
+a38c1c5e215c1d7248fd6a78d9830689e1e39282e3f973549f5b270f919883e1 build/4466.64d23d1.js
+0d6b88919396930d09c94542a95f7fbc82151ba8c595413dcd18488bde1452ed build/4466.64d23d1.js.map
+8b41ef4c8624880f26addcc81087523e2dfb643f6bfb3b145c9bcf612a097107 build/4507.8b41ef4.js
+57ebbc8b0b8b5afcfa0fba1726ddd8821723c068e949fc5becb7b5dbd922099d build/451.d9683ad.js
+9a05c32dbf36cce0fac515bb12fc54c7fba7977d62e7b0cd9f3b9378643e2a5a build/451.d9683ad.js.map
+98a2a7145a30ab69341e02e48ac48bb912bf8f7a516c91ebf556c64b45590ebd build/4535.34b060a.js
+150a15cf38ece12b140628ffdaa52ed198b583fbe5c18e5bf138764a3567e781 build/4535.34b060a.js.map
+724903b5ed4f35509cb8305689592c8bc5d417ed2e47d64856024734bb6b8be9 build/4565.43bdb91.js
+e1d2a437efc9633a1239a812e8c147bd5a641feee2e3ca9746e3add6f2ccb093 build/4565.43bdb91.js.map
+3908c04d46949f521fe951e18a672c59f2c5b907270392955c51440e65d347e7 build/4569.f374f9d.js
+781b44fe9519b34dfcdfcf6a347411eb752454e9a4f4f3942475290a0da02c7e build/4569.f374f9d.js.map
+237d6e7e2560b88a9d80b6b71bb7becfaced0e524f3e1c7f60244e1c93ab03bf build/4615.eb5d40a.js
+84f2844e36f975a768ac4b7996f86496176115412c4612efbe6ea35981ecf534 build/4615.eb5d40a.js.map
+92b97147542aea60250c02d07da3ab59e5929f073de56f839c1ab9a08c123221 build/4658.090d4a9.js
+7b9ad72a521593d3d19fc7103ebf247c27f3d4f69a92ddaeada7e968cee51468 build/4658.090d4a9.js.LICENSE.txt
+763fe0316dc8b1d5170d98dce308c557cdadada5e4884b7a4a155c6a5b8a3ef7 build/4658.090d4a9.js.map
+b849e60cba816b5cead3f03598a9e8c212a70b7503fb753b3c0731e177ba2c74 build/4665.aa19a41.js
+6c8c0374929553cd9ad1fe3a07c62596c2a7f2d4b6f5cf62442291d63051b69a build/4665.aa19a41.js.map
+f65690b11a002a7f7985f1b2239b892bce1ace5fe3f170f3b8a90905bf3f3eeb build/4668.f65690b.js
+bac7874c851b86521448b87ce6d38021a3384d730b2dd6a7b480051952afe994 build/4690.3dd4096.js
+adccfc3895910e64f566f25cb27ffd7c8fee4decf31da523334ec515600a0375 build/4690.3dd4096.js.map
+8c4b375355b50e7c073e665c37effa260a440a488600ff91d0eebf3e5ae09996 build/4715.e7690b9.js
+4a0f6d6b492e73520f439394613192afe8f5b6d639d5be84a556738d8decc79a build/4715.e7690b9.js.map
+feedd52f07b43018e787bedc35d0cea580b694a70c75e4021c9556ff628c40fd build/4749.46ebbb2.js
+2b494e21bcf2594b514ca86f1d9411b0a5d63868c3bb4e8cfd546e7e3400d4b9 build/4749.46ebbb2.js.map
+ac66e806a8a2fb06b022497162976daf9b0544b7d8fc7dd626a2d9e05649bd7d build/4750.56c06ab.js
+ea2fab74791647898bb5a746d55c2c90f68b8a7d8e09202c996c8b5f0afc1e25 build/4750.56c06ab.js.map
+e82c09e7e6680cbb34e7606215964beb8f25eb952ba99ce13db4e6a5180106f9 build/4856.2d7415f.js
+ca0181f6249359f376737bdc76162074cce07f15fbcc3598441cfc8d36ce3128 build/4856.2d7415f.js.map
+d89781b1a6247e324ba6b4f9867c72b79a36bdfdb7575b0c182473fa8504ccf8 build/4875.375150e.js
+201c92f1b1f25f711cef94caee669560dd33854d690a5bdbd1001ebf514a8dfa build/4875.375150e.js.map
+07c75546737014b35941da75e917e0bcccd58e5843ba23ef391b29ac071a5832 build/489.b981dea.js
+54291615678da6aea1cd22fd35dcb8ddc23cfdc1ee488f4c7a958c197967baf6 build/489.b981dea.js.map
+f7aab29a0108fa13f04eba763224297db9cea9bb8f4b5b1fa349bbb804875399 build/490.c2624d4.js
+5e82580cc414ee21a4a109b283aea62236bdb9e22fc4151ecde99d5e3ea5606c build/490.c2624d4.js.map
+d5f90b05f339cb8115c7228af3251d2c008d99d470ded50b8a3a8d49758257dc build/4905.667bf33.js
+72150e27f1825e6ce53adcc129bef411aedf4447b7416817ff97000aab245248 build/4905.667bf33.js.map
+f1aaf87e823bc64c73d980e0bce3930fab56ee57cdedd9a0c855b3a84db89cb4 build/4931.c1705a1.js
+d508f85658e69bf59592f4374a0abe37606d0c02c78f1aaadb44d6ad836c52f3 build/4931.c1705a1.js.map
+3c8a3143c64903ae83143f916bccf1220b61174418dc430edeab85f7d611a410 build/4942.b96c164.js
+4797ed33c711c455738db5ef51041735a4da7a086813fd308ef237feede1f637 build/4942.b96c164.js.map
+8182b6fbeef398b1afd86f0974d2d972f0e663b12b05583e52350d1f0093b819 build/5016.dd2fe83.js
+bc89b5f031043b7061a9777384cdab22744943db2ebb0e2f07d9139ca982fb34 build/5016.dd2fe83.js.map
+1745b267e9c9a0f311676199c0b57ce0c4e02a2fcdbed6f42e10ef22f5fba45c build/5072.733a1b5.js
+b5190d72deea88864311272538813fa3c49d5badc52527a6cb5f5b81ef9758ba build/5072.733a1b5.js.map
+acdf5a13ccbc70d0db4da15746f02eb1a8433b1fb33e9f68f921cc29646844a7 build/509.6448878.js
+f883be81d20bf6b2f74ee517d042f9842c5fe32c054ca9aacf359f36af2885ed build/509.6448878.js.map
+1c8d0db57788e90797aa3162ff3c0b4d4fcbf471a49a12ab041c951e0bd8421e build/5096.8ed0d8e.js
+1340335cd2f2207721deecc3da0b4a157da429b33d7373b1f318dae25c66df8d build/5096.8ed0d8e.js.map
+dd548b1b681b2c403f166230d2f09feb0da78c45bc06e4cae9b478d835055464 build/5126.eecad7a.js
+2f4cd7101ecf932c508657cfaa58e3bda89cbee3a976189164e6167790a82f4d build/5126.eecad7a.js.map
+2f1961b896f7a89848ea764868652e904bdc5de3efe80bfb9381d7a017cfd575 build/5129.1ba4763.js
+2841b206c536acb6e0ed72dca94f089f25fb42e9f8791a3b3b6e7350acb5a637 build/5129.1ba4763.js.map
+a7f40211187a5be9b104541e5ef83cfd512b5938ae981ab3789d27b6e0c04650 build/5153.763d8fa.js
+498ecd65d8f769dac7edd448d2db33449c6dfd1e35a3d993a435b29bcc7ac3d3 build/5153.763d8fa.js.map
+e94a3c25fb4fd9d1f11d9ac3e5e67f9864b3ed3422010e9a7095d3963967c274 build/5155.06b4ea9.js
+b103847f867449a3eb38968c5cbe988a07cc4225d8585e01dd894a9afcd41641 build/5155.06b4ea9.js.map
+bbc450a242d25d1c84525ad1f977fd011e2bfab65b7b295dc6fb2c410d0847e1 build/5193.e9f6866.js
+74898265c2368025541cf30eccd9310783b07115e16f9f5d5f85d3c62f7b1feb build/5193.e9f6866.js.map
+49d36b0b291674b36671f53debe2465812ada3f978b513260f9d52591d6db436 build/5213.3e1a360.js
+c51604c275b614ab73786e68c0dcdf380bc21e20468e586a22283c2d41582040 build/5213.3e1a360.js.map
+0d840e7b079919ffce06fbb6b3d5dddc215a0736e5b78728075826fe4de47cfc build/5227.8c8acd8.js
+be23d4a0b2dd3e0902139059641643a459e8400b7c0eaa35ed465d78a75b1265 build/5227.8c8acd8.js.map
+104c9aa8f583e492aedadca921e0c3e1550e0d275d1fbdad742159b454881478 build/5238.02db84e.js
+c3188f683b94476242ecb51db3aaaf4fcc18c3e6bef33d3ed915bd2ba0ab0526 build/5238.02db84e.js.map
+a6f98b92c92531bcf65378d80f39c17240f2c7a7058c72271927edcda65344b2 build/528.2262cb0.js
+97662ab108e4f67f3cbff8e39c8a4bab780502444b2ded81cf988641eab08c83 build/528.2262cb0.js.map
+2640de724bcb1afeb11e31b1002c8af774bac987f53785f3f852734bd8420e7c build/5292.79d4aba.js
+779955e3dd2e8dc9d0a09197f85a9f96a763f094c933b4bf5861145e09e367a7 build/5292.79d4aba.js.map
+1fd054a2daf94b76c62b458dede35659a65ceebff0b67958f2989ae4e9990575 build/5437.31236f7.js
+a045c459140104cd1270bd1a203e18273a661ecff4260a6260b02c1c83e2da6e build/5437.31236f7.js.map
+473083f1320d2de04a4aa09a8ba3cacd8142f0d10e15bda7ee9229daa1d6bf72 build/5489.848a8cf.js
+e8f335eb6c46bbfd09fa77b38fa9cf6daf113f85ea7052c01ab400ad7a285c21 build/5489.848a8cf.js.map
+7a4828113a2ca7c3443336ce6e627cb7444c262d75a4c83efe9f2ca1147668b8 build/5508.317fca3.js
+1b3b41cd0ebe77af0815a87352e81c2985d6aac99f6f2e1746f31b8651f472ff build/5508.317fca3.js.map
+54250d2cbca9f5777c83da0098217d20791522fbbb2c8a6c878fcee2725dc924 build/554.ac98303.js
+40abdfa00f9130015494b53ed629d968ad9aa76ed647e36ac77aad6a2cae0c84 build/554.ac98303.js.map
+2bc0ecc6870bd2d656e6efc735449350bd16cdeb9f61f54fed9160514f94a553 build/555.2cd31dd.js
+ada72fb8a1ea37398de4fe1487d00e2ea14e4b464273b3ec8cc9a5e0334e96be build/555.2cd31dd.js.map
+041cb76b896ad1b0b717ff0227414eef6d7b758d5a38553fd8374e89ede3413c build/5573.ebcdb93.js
+0428d9d06d663c0c671785064f94e64e4c352f5c98891e22af6d408d5278ec7e build/5573.ebcdb93.js.map
+ca52042c0646295da3105fd5f116b6e18bc14c6eb9223e3e2e2ddf6221c7d398 build/5666.c5e5324.js
+13df7a566f02a1610414880b20238e2064e40e4c5bc39b225288e1a504ce47b7 build/5666.c5e5324.js.map
+2c6eccd90d7016b0122a6288b4ca5883bdf40fd61b050b62a5efa1efe09918fb build/5710.70d0b1d.js
+d083f68ee383dd4d887adf28013a4c5fc648cedfcd6188e30e3a5fa3098da0ca build/5710.70d0b1d.js.map
+c30b3098e396424b17585b08594afa616256d485713d422fb532d3e39d2758ff build/5747.94ad626.js
+c24097597d0b0b066f800aa25f603d1c5e0dbb4fb06149b16c4d69af582fb24a build/5747.94ad626.js.map
+02743daeee845dfa2fce1b29dfdc9fe1a11dff41a924e021d07b1415d314a82d build/582.21b8e7d.js
+ae5a40311962dcac697f0e4cfa785e8276b34f483e37070b715bf0e24b942ab7 build/582.21b8e7d.js.map
+eca484a25b7b849cbf551f154333a35ec1e0a48aa147f84dba2d2905ec029a51 build/5823.5045bdb.js
+7d4c5598fb428d87048bb4f1e18d4fbe45e04b17899c8f8f0fed36b81e501dd2 build/5823.5045bdb.js.map
+68f7152f6b46ca3411c13f7bfcec9b6d9530fc749380fe40b02372d97486589e build/5851.30b7b2a.js
+4437e3b5051c029ee877e28f410a69d7588c12791a8ee74975225331ce3b9e30 build/5851.30b7b2a.js.map
+5fe04839bfdcba0bc407c17448e1ece36c1037c30b04741719de36bdba07b162 build/5878.32d92fa.js
+e402942e71643ddffb0e9e881524bfdd0f35a92ff89795ceb0a273031c5243d0 build/5878.32d92fa.js.map
+60ad585467f798ae51bf3448095dccfbc2671c691e2f5947b4a4fed5beb833e4 build/5880.68f975b.js
+9eaba5417c611c2740f1e487f8ae50a74167ca229e506c8952e0246ffdf26a7f build/5880.68f975b.js.map
+120b3449eddbd95d8d3ea232efcc7aa9911a5c7317afedb826ed09db057573e1 build/5955.88508f7.js
+ba1d8dd0793f735ef5518b8bda5d46a8637088092f3f2cc4278db6e6db1f4819 build/5955.88508f7.js.map
+babd66eeff2066813bcb9704f76cb3e757bb120688ac0093f7986e5c3c63e237 build/5971.88c5642.js
+4fb6b27424b724d5dce23d949253c40fbe381fda2bc6ec9214f6ed6795e1a29a build/5971.88c5642.js.map
+25e854eb6a69a6cd59a20d759a560233eb30eaa814fdf9624151d5e17fb55ef0 build/6080.aa0ff24.js
+77f10f1347f53599e2164020bdb017d342fd8eaa830a77bc87eb67facf4d6b6a build/6080.aa0ff24.js.map
+05acf74f20a89dfdb33c2fb467835f074108fd251608db1363967e9a4f642b33 build/61.2808a0d.js
+45130cc9691c84525aaf4f1e360dae373b828884dd12c25b0a46229cbea72cd9 build/61.2808a0d.js.map
+50db1bb044280716aa33b9a91f1a73ca435722d25da398d0b0bf487f28346352 build/6136.b8ba2b2.js
+f0ebad3032aa348bd139521094b4f5eb8786b018f25b2ade970d88224c725162 build/6136.b8ba2b2.js.map
+2dad1a74ff43a519be7d853b2db1c76379091cc990827e104e0316e3be9df777 build/6141.9831d58.js
+e88245a0fda0b525cf5330021ba78959cad8d0a82ea4c8726d8afd54aa08256e build/6141.9831d58.js.map
+9ea2c1c72cd80ddd89f3751b02dc32481d30b3de2dc88f253ed364c20969e820 build/6475.7ee8de7.js
+877e13ea5690073f5bb981c45774c33ea65707684d7fb4d9952b86e59bd5275c build/6475.7ee8de7.js.map
+7ff66a526cd5dc7562ea69fd0f5bfff721953401f6fbeeca7edd3aed7870c569 build/6493.d796aa5.js
+e62795f492a59d4fecbb0c231df31f1f42f38d1385ed6ca92ab13bd8f08fccd8 build/6493.d796aa5.js.map
+11bb30f28b67381070f06f49a75f596bd27e6e8d108b80ace0da6f9cd35ea690 build/6556.b3d9293.js
+866610c4f82646b5a2d44fd09a6cd13ea064307c41fa95e44c2aea064e6b2ba8 build/6556.b3d9293.js.map
+7e959c51a16cc3612ca0c02317400809b45dc1692de63fb6b793880cb22af91f build/6571.2c8884e.js
+add3578e9e523c31e00a4eb200a04662bb3d3bf1e0bc5e8043abde3369cce9ec build/6571.2c8884e.js.map
+7ccaba657950e9c52780b20c233cfb2fad3686d7d6b489aa5f71f5821eab8734 build/6576.3ea568e.js
+784c143c44a191f171b3a99c31b123c6582b5db955f8c09d1d91477f688a6f75 build/6576.3ea568e.js.map
+b05aa7648e3adf170c899b796494f5a9f246cd5ff0d9df3f76b35fdfd46db9f1 build/6591.94ed352.js
+bf943f1815ef70e8286568541e16610b99d3e5951a1ef1d91f54ac257ce03424 build/6591.94ed352.js.map
+86b623c1080187aeb316195620130a816813e033c02d5adde28e095e3773841a build/6612.1632879.js
+add15b0f81268b3cc73d0fab5c27417fa4b2d1f79bdeacf22a3671a53401ed54 build/6612.1632879.js.map
+c6a7605e0e37df9fbc06473a84e042122e2c1461ca4400d1e96bf6b59696e94e build/6623.ae3b3cc.js
+d49fb5cb77f2f622f79fbfee49eec4d3dab51570ad119d054242acd0535b98d7 build/6623.ae3b3cc.js.LICENSE.txt
+f533c360a0be4ab7b71beb8506c65db1056ade4ba7b6d1ea99240e2ade812d73 build/6623.ae3b3cc.js.map
+9f6b5ee8ac5e126ca600d268a1e07cb24af1228df7c5a067086c3b595fdc9f8e build/6664.2160109.js
+c9943e3d916a9408d1b59613bef925b98a8f2df9335d7eb565127ae06c7a7e77 build/6664.2160109.js.map
+f3c00bb563528b0b3e0ed9bfca19c2a0753c8e037e44bf467c5924ece2ed1379 build/6747.47be7f5.js
+15a42992fbff1ee407ac190cddd2e410feff87f6d9ee8c864a40ca8ea2b192a1 build/6747.47be7f5.js.map
+a75617ba7a428304dc4c2b1e2c5b776e4515466c8926bef82727129a9bd29481 build/6748.be68f5f.js
+8d2a7329d6c636928f2a3728be38527ef789e9297fda183ec20b8b1809fb8ffc build/6748.be68f5f.js.map
+779c49ac2caf85a2dcd9c37d3c4a4932ea649b528cb9317fb6ff12c86462bb9b build/6870.7940288.js
+58eb540fa6709dac6acee4d79d1671f1ae845ecc582cdb48fdd8934b7e9ce79c build/6870.7940288.js.map
+3387ce924f57d5123a4f2db85d1a52bf14d0027dc5ef54b3e2da6960b3449b18 build/6879.c8367a5.js
+ff0e03577425d8a15b996ea503c99d2125074f8126d1341546fd9a283584f92d build/6879.c8367a5.js.map
+634186e47ba3a8f40ed58fb265939c578aeffdb561c1fa1d43ad95de7c018894 build/6898.9bbc12a.js
+1e42c23d91a8f025434b31eac089bb0f29d4084e3cb8dfb8ef628cd11a055b2f build/6898.9bbc12a.js.map
+9ffb67e780561ace6457013e3a4d8da27df33e9d1a542af9f4d36cf7782dc670 build/6952.f68b818.js
+85760f6da97c38e6d4d98801776b93dfa88308e519c00c5045f113ea1f41979a build/6952.f68b818.js.map
+e8e7208267d461b5bca2c00e3c73c7b590d621b29c885372b8c02bec37e212d8 build/6985.321ad92.js
+34575c35fabf5f8b93e1690274644513adb7e3b3af96a9d295e67ed1cf8204ca build/6985.321ad92.js.map
+f94a1e43d98d2e263e97d461c5bec90341433e60623b05cc39be4d1528cf74ff build/6993.32cf9a6.js
+db6e87bfc089f705f5cbcf248bf5dd1b72831bff6d9f8627f6c1b8e5930cbcbb build/6993.32cf9a6.js.map
+a75a11cf14621c1a98e2679a66708b489088cd1c6828d4a2aefd7a2961e88369 build/6997.b06fe71.js
+b26d8417556e5197f03683128e4e9429cec2be9c51f9f77357d368f12578c377 build/6997.b06fe71.js.map
+8a3f0c5bed429982b358569e7767efb554e2a30fcc8ac1b4843ac65c86bbc3dd build/7041.d4f561e.js
+76af22c7022cfb74f517fdb54f067ec1bcd9ac764ca8a0cdb38e64d6014259cb build/7041.d4f561e.js.map
+501e5aa74ff7a33f65f78e25d8cd4f0fcfa5ffbf80e0eba86aa6b924576a727d build/7058.805c88e.js
+7f120b36a6d7ef14095f9914b827edc456ef54f2c096a4cb2d7b98e797a25982 build/7058.805c88e.js.LICENSE.txt
+9fe62eef4fecf57a82a864766f9fc3845d2b4de09f70cc87b888776f199e71bf build/7058.805c88e.js.map
+4aaf038913e59b7ecc9dd11f2df591e1acae9df6c154e30d99f26bb2108e5a4e build/7174.6c45206.js
+57d4b765f4547a52d7b2671bd8920808e0713e6fb2f6011268763c773a2b1c5d build/7174.6c45206.js.map
+671cb3ccd42fa8aa474bf7495fea6c64f42a7b3e1772c3fe14cb47f7f9ed94c9 build/7334.8859b1b.js
+255c6b7af347796e91dfc8ff07c7a1e5eab5a99746eab143499bca4fac87078f build/7334.8859b1b.js.map
+4046ac8bee7d15b84ed3efeb73b953dc79aaee68c340de65875e7478cd34a554 build/7359.6ee65ec.js
+eb980fa5afd908d9a497dd72ce84013f5b8a93fc7b083b549291a510a618d39e build/7359.6ee65ec.js.map
+a46360fd759da579f56d3dccfc7509b5dcaa6e75325f0749c13edc716def0109 build/7364.195178b.js
+29de108eceee63d38bc92310db240891720021aa85ddbe78d99f12b9379f1c5e build/7364.195178b.js.map
+016530ae96aaf332d1ad800d5cdc3c57dd754ce3c97d3babe34ca3828c4ba4fb build/7380.58a4413.js
+e9e6c393f47fad8b761007579295636096bcc112627e599288dfa4260088631b build/7380.58a4413.js.map
+7ac1a12154dcf09739ab13222aaa775968fb62f5df40f882ae49c42408670338 build/7427.f9c2017.js
+a0afb13901feb154dfc10c9a6abe98149a16665a1dd5855ad83a098eeb4adbf6 build/7427.f9c2017.js.LICENSE.txt
+791da271c1b010ec5d920a09f14459a302d3703206bba7af01acbe2587f2be5d build/7427.f9c2017.js.map
+985dc12ccbb69f640bb03bfa4057d991a0ac427f4bc1cce1cdf47310aa6fb2d9 build/7463.18fd278.js
+f5c14603ad615a06dcb1d2b5cfdef0b51df5d1e9f884c100708f5af8dd6d6611 build/7463.18fd278.js.map
+f94fd6b5cbc7d3fc4353d8c31545c5a7e7b71849596aa6bb6d86450bb6247118 build/7509.1e0189e.js
+5073d746d1ebd56359de9d88aded231e1284d62a906099380791de056d4a4515 build/7509.1e0189e.js.map
+1f85382a081402c17e50ef728f69b197de9c23a32574b1e0d029ab65b6b663c4 build/7526.1a303e5.js
+8a6d66b9178c6a46ed7c7e280a8cb78fde0e6a5a8ded075366587808088536a3 build/7526.1a303e5.js.map
+aa580b136f6705480d042d54e5be7510e20958ae5040def650778896f07ef0b9 build/7537.1323a15.js
+34d96f6cd55e74d6766805fcbd1a26e851f8aab4087fcd4da39f475870fe71c3 build/7537.1323a15.js.map
+9ef3968e08a684a689126c6f96e3858503c970d2caedc1714269fe1e4eb9c0ab build/7692.33d5169.js
+5bd9b9baa1c01ae771bd84d33ea13897cd5dfe24586e3a551f69a5674b1a3a94 build/7692.33d5169.js.map
+2ff1ab5388124eaba64f0d22b6c89e19c01f406ff4213f12987ac04f5311a64d build/7746.5908d29.js
+c6b8b57c82098386f0e723e64459fa5e1181952fa2d9bfff47828caf94ce3b98 build/7746.5908d29.js.map
+2cfa2efef6a5ca80b5bb2b7da48be98f5a47ac5c6b63c704deaf4e2e54687b7e build/7808.1d582a2.js
+602b21b3e6602348131f08ce0c3bd9704ea58dfcc21778a3ba456c29e0cd10b1 build/7808.1d582a2.js.map
+106f9a50144cb39fec16d2aa2ae6e2c5f22d426ea652bb2324a4f051462bd394 build/783.c156751.js
+63a1ad3a29fc59445751722b179712a4f57a2da980b284fefbf800e3c471a9a0 build/783.c156751.js.map
+63853469c0416bbb8a8993e457ddb0c360511263a71658826efc93f17aca3cf1 build/7858.2386e4d.js
+32503c4ac7a0aa6294032bfa6e3fa6e2b51394090e51a1daeb8446ee2a74ea87 build/7858.2386e4d.js.map
+9f25f11502c396b8a1f3764bf37bea29f924757605f943049483789da1fe4ff5 build/7941.01ea680.js
+59a810e7ebed1ea35a7d53d191320b5c904d9ebc66b60c8fc523099503ae4ba9 build/7941.01ea680.js.map
+4dbaea0c9c4de4fb35af4a5708205aeaf2f7b31266467fcb5e69e6caf22c83a7 build/8005.c5ad7b2.js
+e9bab61ab3694df23f685f24f616d56da82a3e3c34eae5094784cad99bb12bdc build/8005.c5ad7b2.js.map
+73839702a7d7f64d833c852dd1148715561767a2851950c1f0b52ac1c1800449 build/8028.39e2fa1.js
+fbbf7fb9db8f8e300a120e196529998679be6c259e5a46eb7f4b74c91143b467 build/8028.39e2fa1.js.map
+252f2bf5c5f7bbb6610b2e16683b4881f9c377b4939a1bcdaba45e613745135a build/8061.cc62561.js
+7f42790aeb4c4aaddf41b55ff69eabefefc7fe86ebd05b5d9581b40993660e27 build/8061.cc62561.js.map
+da4b699fbc3d2a394013cc1b02a94f23d9475e4e00d9c9715f79792f51ca8f8e build/8101.cf46d02.js
+03ebf59709ae217d43a4d275303cca0cc5afedffdde9c8c794638212fb6185d6 build/8101.cf46d02.js.LICENSE.txt
+57c0b0450b9db2f03e93e66d7260d647d1e17e572e909de7717f9b0705f7c37d build/8101.cf46d02.js.map
+12c270c4e8f40fc7b2289a1ba5f5ad8eeb747d55c7ab4683d4d266b52c3fc369 build/812.9b0e86e.js
+90d36c771659b101e4fc329c486213d8bca06b99b52babb6288922290c810695 build/812.9b0e86e.js.map
+203990eeaaab300144c1ced2e11f998c2771a0440671873b63fb8185f0180a46 build/816.c8050f2.js
+ebde904f597a981846d8cd74689098dae699fa50bc3ea0cd69f111166f0050b8 build/816.c8050f2.js.map
+ffb416f99582a26899ad34ef3cda453f544aba27266c61be5b5932834790cf9b build/8165.b2c3285.js
+6590c6674fc4a28e3b852f03d379b4a52a87890c00fe7d05d4f4f68fc33d2b51 build/8165.b2c3285.js.map
+f7ed762a94d0f9e0c7de384506510cdfc4bdba93584927b1253a3ea039b6bea7 build/8232.a578bf9.js
+63ae4ad79e5d1c57c800585106ae9fe16b3725d93dd861c23612d4d819f95e95 build/8232.a578bf9.js.map
+021bdb6ad541965b1a3ce0ebe31509b63f80f57d67465f232d55742dbde98bf9 build/824.8678196.js
+7b5b4077105647b185e0314f8326a48a8839217db8d4934df7d1474ff1150ad9 build/824.8678196.js.map
+554faaa95aaf5a9c8792f88230b6e5c8a8f96950291dcb927e51aaa072331e9e build/8270.89fe7e1.js
+c5cd8be08cf1c3978387487e8502ae4f02e9e78883ae69ead81ef70254d3eed1 build/8270.89fe7e1.js.map
+33680ba40f130ee75b7b411425642790f259ea78b145a7a6f4f7954032ad60b4 build/833.9cc6653.js
+627c32c0292fc9879aede9c55ac100fd5a2eb31eae56fa62bb23cfc7e36dfe50 build/833.9cc6653.js.map
+2a701878e6fe9fe5b1b8acd0afff453e968ce90d190d62e25c440325db0483dd build/8370.6b181f4.js
+709c1432f85b74efb932f4a99c34afdaa655b7ce851acf592ef1392b2fef5fd5 build/8370.6b181f4.js.map
+5957595b8e169918319868537b163db5fb874cfb5db19d77de2cba8921230b89 build/8373.96b0b3a.js
+4364971a345ef424f2440afb2d42979a93da35573be6fefdb5c0c5057c694128 build/8373.96b0b3a.js.map
+c820fd107ea3e60b4ec76657b8b034ed77f386f52fcea4b542e0d6ae2fd0acd8 build/8389.ffe031f.js
+4a0f8a1c1a6879d61441f108a63f018e407e8f143b520910900facf19a159ec8 build/8389.ffe031f.js.map
+d5920e471722e23452814cf64c766c873f583461bb41ecaae9cc494bc8aaf0fc build/8412.1528057.js
+b0925b2238c3463cc278affc0500eff4a2016921b539572ea6245ef81b04ea21 build/8412.1528057.js.map
+57e1ccee85538415e946d45cc7f3907054226c0d3d7839af204bdd885fa79e05 build/8427.4923f43.js
+f433d104cf4c35243f3b8807d22e6a134c075e8b18735dea7d0f1a436c13908e build/8427.4923f43.js.map
+bc97d0e95fb8c9bdd64bde216598e4806ee4740e71b8d8f67d27953a74b4cdc8 build/8542.027afdc.js
+8f13586ef52c1bb28b85b746a3c5490316d122bf670089c22a7327d03105acdf build/8542.027afdc.js.map
+6c04cc19f8fcfc8fdcfee6c896dc677230e29eb1b5d83b2d013c85e8ab63c44e build/8594.0112f03.js
+5da8ee2fd2f4046a6839c4f54ec273a081a1055d91d47a7e4fa6a3e65fddefd0 build/8594.0112f03.js.map
+f92e200aeec98e838b3e916ef8a565a76875f2c5f413b3ae8f092bffe4bc8e12 build/8656.d5b8e92.js
+60696b23568f07b514bf38f75ec2c80c9915130c499333c07d4b4041f8422a34 build/8656.d5b8e92.js.map
+d85a5586b9e259ac6aa69ac1e83099472dac7a44d60cb9638b35d40de51c0869 build/8685.8a50bd1.js
+8373df9d65bb024be221618dcb79506bd43134fa6c707315ee752797f7084049 build/8685.8a50bd1.js.map
+3b039dffc86c2c3b68db4985dee67ba7e3108e19d39c5ec4372aeacb340d226e build/8698.9817d75.js
+9710fc58938e74288ca7aa8beb670e19c350f448b3e25c0535246cc8106a8854 build/8698.9817d75.js.map
+6c76f179fe137a3a274e742acdec3d2d19a80f138b8d3fe37c63eb2b587180c2 build/8732.d449cc9.js
+e96a278cf4fd05fc3fc91ae1dd4b1886a58dc36b226f57d94692f5e62bae1466 build/8732.d449cc9.js.map
+b138cb8e0586313a12fdd21b502d705a1a9c65a3a95419a124fa058e28664742 build/8741.b138cb8.js
+cc97634c2e2d542db97aa9eb5bf6f04e9a96e3298a47b1d464867c42692399aa build/8785.cf4fe95.js
+9d1899c9d42af9af0b8fed2e9c96fbaec94b7327db905fecbebb0c9249b6b4ed build/8785.cf4fe95.js.map
+2ec3374462981030ec981d9fce8bd873620015a5b6b1b0997e37e808fa409229 build/8828.77c71d0.js
+0063a1fa3cf3e476b9ebff2e470348b0937fcb29bd7dc6ec4fe3d791cc867687 build/8828.77c71d0.js.map
+eba6a241d50e6f19221ecee0986c0c5aa523d9bd4127189abd996580c128c17d build/8883.80c7b63.js
+e434e6ba55a7ab443213bb39a6fc4201e75c90993ce75f21259c72a05bc6d560 build/8883.80c7b63.js.map
+184318a09f9a7c0832e2fab2d3052f6a77eb81d370de31f1f4863e527f9f8f11 build/8976.3816942.js
+205d42a7df07e9dd40cff6201277524084a77164a1f29b326e3ab2f7059e8961 build/8976.3816942.js.map
+2808470023360aff0236b14cc5f5b9538fe04a3fb261d2dcdbc5069d6b467b06 build/8981.99a4275.js
+d1de41d3d873b8d66021d802e3ee6503dd6b56211f5dfd8916b1ce421f870d26 build/8981.99a4275.js.map
+63f1bc27c26f82d45803a29c4ae5d54af11fe4b038a2e28d3a20aa5231000f4d build/8990.2a453cf.js
+9fc234af2692e6dcc784a8afad2d2f8c431f37e8e755e2a6969cf5842d18843e build/8990.2a453cf.js.map
+f803b87cccc049d9b186c4eb3edda31fb0e130ab86b36f9e57fe66846439ebba build/9035.1e45c1b.js
+f93fce7db59578b64e060404d3bddb160d9fd83c765d0c8266a4812b04cd6be6 build/9035.1e45c1b.js.map
+2d8e3877dd06aa364c8b6e7c9a23fc62ec7c77b6a21a3d1a51bd75afcdac4753 build/9053.45b77fc.js
+255ae03515f7cf842fae3c2335aed5cccb923b56dbc8ac962aeb01b9317c7a7d build/9053.45b77fc.js.map
+ce703881030737441e834d0153367413115f8a96ba13a9dde0a94df2de5d1d06 build/9077.fefb6ca.js
+36b450e9bd58532b97b2a354ba16f14d5af4d1ce6566286a0be29c09dbbb52b9 build/9077.fefb6ca.js.map
+e03f9b893ba7852e00d0682c3ab5a658d99bb5527c3894ccc0954da63782fd74 build/9128.b8fa6f0.js
+5e9ae9cb76ad31385cb4372dabe876702e0a81cccdcb9a511d22c88606b709f5 build/9128.b8fa6f0.js.map
+c7afcbfc465e60457b27b44e964f90c48bfe6a4cc5cc94d10067f4ae4596d0ce build/9156.0cefbd3.js
+94f6e4d36aaa507834ed2d45c9bbe6bf318a6f8ff0f13874c1f7cbfcde20a43e build/9156.0cefbd3.js.map
+814938987503021e9388ed87540bf3c21d932a4ae5c6ae9c5da8a5d5c62ceb39 build/9170.0023587.js
+71677bb6d06018337605173a4f0c1452b03401f78e15f68fb0ebdf5468f38b0e build/9170.0023587.js.map
+b9e15c8536c77699a9408cb7a08f46f2b34561b98f1f19c4bca936babd61342a build/9196.315f9f9.js
+000007cf9d6ab7a4f6e8269bdeb0793ca865a3ae004e9583a39635980225eaf8 build/9196.315f9f9.js.map
+4b8ee1fc8b84f82f1e9706bbf0b27cb89c9321dc468b7b0cffe67a1f299523fc build/9198.9971d70.js
+79d49ed1e5d7cf350fcb7333594056498ebad54f8d3119af791fa66bf64611f4 build/9198.9971d70.js.map
+618b74797460e5bf21cb70dd0748224da33eee57a9fe19214758ee7ad20d20f1 build/920.d15c177.js
+bb915fa8648400c1d26103f46e3dcbca746e7de9fda39a8c1e1bf62b3580c5fc build/920.d15c177.js.map
+21cdc8bc583b7fa74102cdef22e0378b43ec754789d5b59971d10467080c8be0 build/9253.0b31caa.js
+ef169e62b2d9b2e6f7437c504f76a2b2407570cf492706fd9f917528c5a72366 build/9253.0b31caa.js.map
+9a6f7c297004e49653ac364f5d1aa9b2de56b36fd231dbd1b06879f4e255eccc build/9266.bacd0dd.js
+9c99273931b44bf6c29147944ecb87fb339668fcc28f84fe1d051f17cf65402b build/9266.bacd0dd.js.map
+dafa6c72c7ef3becbd24e550ef75e988892f9c9c84d5c95700d8a0a93cf8986a build/9307.c3a00ed.js
+f6605e47fc21dde5b6ded5f4639d9ea3ae12347874862e166b9ef012eb686863 build/9307.c3a00ed.js.map
+22011576542849de4061859243e420594852eb1243f990009ac3fbe999ee7729 build/9321.869e413.js
+31f221b8003248ea45bbe40e521a131b7671d67980ea0b0287d29752abe14bdc build/9321.869e413.js.map
+00f7673feca4df66ad26736b043585ef1e7a7815941a2be1fa3de38f54f06dff build/9344.ba0abcf.js
+aafb8f37bd7b60fc34c201e8f64e72c08be648e6b3808d0ae41c687a87957150 build/9344.ba0abcf.js.map
+4b54856bca8b58174931915dd60c690e8899492324a9a15dcebd257ef9bb2117 build/9382.5b58f02.js
+2b8ae8f5806f6cbc65306727370b5c1e7be7c206c82e7a596bda627f81d0b328 build/9382.5b58f02.js.map
+62a51ee08a3af948e5c465e7ef63587377220e23ba870d305fe3875a3f473120 build/9440.1b10b8f.js
+843c744616c171f24616375dfbdbc61c8c66f37e7dfd33f901bba90842db8b24 build/9440.1b10b8f.js.LICENSE.txt
+520b2eb1860b18e47198e388957ad2f38f71d4b94857015e9a8c1672035ca3ea build/9440.1b10b8f.js.map
+a3facd11353c49e96b3d3628182d20231fd86cdf116cd0d1770a8cf95f1f741b build/9464.79e6ac5.js
+10fff342bc1553de9d2244c8fdc577d9fa8e7b72923309d15217e733444cbee4 build/9464.79e6ac5.js.map
+9e5dccd0963179dfdf30b7120e18bc04eeadae2821a3c4c62921d881fc2f1893 build/9502.9a24831.js
+87c8e2c61da4d24ab1b2f1be8112441cbbabc8ae63e20bf8b8bc295ab5589a49 build/9502.9a24831.js.map
+38f665d461c6e977237a41757cbd633a679ad7126d9bf4adb9aa76202371f8bc build/9507.1e6cc5d.js
+78e9ef279920ed86b0468a8f35f166842a36475995943127f9e85ad493f3b6c9 build/9507.1e6cc5d.js.map
+8fa49aec4dc5dbd43e42f6f1625d7cf668bacba50630ef99e96eaf4e7dc08948 build/9602.62bf0f1.js
+8f88fb7216de3d9750f8a9e0e35fb0b36448ab588367c415055c49a017434488 build/9602.62bf0f1.js.map
+967a0636955f244597879ea2de7edb9a3d77531d36a78a357435255acbbfdbdd build/9621.e2e8b5d.js
+05474ad0514612b7896340739673e8d4517db4639291780991b8cbb7fffc8c1e build/9621.e2e8b5d.js.map
+1a69c2f04118a01f9bcb49dc25e1c14a25a93bdf218567617e02c81acdf67994 build/9622.ccab065.js
+c1cd076ca876f330554e4b3341ca894e39d8f92925b5f6ae4d63b5968e37f236 build/9622.ccab065.js.map
+1cf0b08a3aa6628d180e42a31177ea9d14f81f29448184fa9df40e206fc397d7 build/9626.a178bd0.js
+0d70588427dbdbb85f749c1039bc7fb44f35c540da549feec6513d121421507d build/9626.a178bd0.js.map
+9e1fdd688620dba1c948fa59b02546f2f8e936b337c9a53a02fca1de500961e0 build/9647.ed91993.js
+0391fbd79b113ac8038b43653a9ff483afb002729634bad60db4f71e961674bd build/9647.ed91993.js.map
+b641a1298c3752878d969d1a87e02ccbd6b151005b5924b19d69d2f940e9b63a build/9657.bc5c60e.js
+428f2fc979117e87f9314ea66f1f79d874302384265b8988336c24450e347d96 build/9657.bc5c60e.js.map
+592f85e5a250bacddc9f25f3d816d81b2a313296e1d26cb0e1c34765d3ce7bba build/97.ad126b0.js
+2a915695565457539d881a53e0199c295e83e3b06f2920e3e74229a03f8360a3 build/97.ad126b0.js.map
+4821274c86c04d478c43582b682e8d48e87f4a04cbd0e80b18e35ac978b90c6b build/9712.796a0a1.js
+351e73d11800170dd7a17b53e90ddb3b0e3c2555a6eb13cd4cca50f3f4b93aa8 build/9712.796a0a1.js.map
+368766b2be298f113971d32be75b7a7cf7e39047d16d699977234e6fb2d588ef build/9733.a3b2a7f.js
+f06bbe36fc4a0a3968c0c211f0ef84c8cdf863050f976fabc93d32f9a4f40793 build/9733.a3b2a7f.js.map
+234889f90a071f1ff1ca59edc951472e116b02e374e0a66feb55fb88bdbe378d build/9737.7dc8f98.js
+b358318637a0f9e69a2c80a6a00c5ee3e8e73bc161dd1b1f05ee2b06c3e448ab build/9737.7dc8f98.js.map
+74bb9771c8aa3f79b77eaa16d785743a9eb207d6986794f7e4a88f439200d4a7 build/9777.0b8a504.js
+30bd06e603aadd22816000c2adcb0e2aea8a14e38c526596b094e3a88dfe4f23 build/9777.0b8a504.js.map
+1ce0ff59575ee245c6946c376a38cc4d8a5410e0e835280079d57fcd1f95d4a4 build/9793.6d63a85.js
+4a2789d3df48b9d894f60459fd0f0bae784771508ba29e885e8e1b4f649b7f20 build/9793.6d63a85.js.map
+de3ad4a3ec7baffa3c07d236eeb4c00df22ccea0fee7959db640ecedcb612bad build/9806.652c162.js
+852479e1908494e56a9c01ef12e10aa33b2ddba8e9665c5bdc2d4051f1f23490 build/9806.652c162.js.map
+15dcf40ab9ebec562fb413ef4f6c55a9ff185a1de38b74cb7d6575cc4cfb278f build/9865.2e3db6f.js
+96a525187855637cf799c57eb13c11119466d4a43b99a4a257af869bc45240d6 build/9865.2e3db6f.js.LICENSE.txt
+1fe0e95a979780a81fe3147b137799043653898127e8814973f510b33bbbc496 build/9865.2e3db6f.js.map
+08b69393ee3c561e05347547320dc73606cb2957fd49573f6a374b21f4d165e6 build/989.bcca86a.js
+2fb43bad26d0264fc8daadeb055de47f16813430e1eb11cad465e5de87b1ad62 build/989.bcca86a.js.map
+2ea755356257426e9cc4b9852ad09b80e428affd7debf78a3640946f8a562243 build/9943.f3f35c7.js
+1f356ac7a0c6924c6f2d482e1b9875da59fec42fd38fb79366bc547a126313a2 build/9943.f3f35c7.js.map
+ffa4102e95e4ff876c6246b39923849f8f4da9f97239d003b4f6b99ac22a0e80 build/9958.25c8c06.js
+03665c03e05c7d13600d19ab5a45ddc1bc730fc6e18fa324e04782ed288b6c5a build/9958.25c8c06.js.map
+b59004ad6e0c710cf47b5c4932ecf5ba9e6f9fc48b19a061b8ebd5897dfa905d build/9960.d19737e.js
+9e5373f80797be8e97109ec0ac8bcd971bbf8a2ccf5f80f164977332f36a4ac8 build/9960.d19737e.js.map
+0c2df17764062a60c2fd20687699f6386d36de39aa9e1c158df96f5f2898cf68 build/add-above.svg
+a15568e80ab2b45d19c42c0b80c2c5f172d00138339414eadc672bb3f5de1ed5 build/add-below.svg
+5e00a10a1b8060e9a43242fa489058744c152d3ce73538f7d2a4b775f45d4521 build/add.svg
+8ad0ef31c2194ea8a2572c101bb6a4c61f004d54603c0be1bbb5bc9d3cdc82fc build/bug-dot.svg
+bd7f8d0382810fde64c938032dbbe91dd952646388240d8e75fcf6a5ba350836 build/bug.svg
+e174fa1adefca3935ccf38fe13105ddab550175f2d1a4a6f87efdb7d5dc6f313 build/build.svg
+3a59008d8543ce4088e4954b414405dc76e5993ca1b26b32a25e603bf3e35030 build/caret-down-empty-thin.svg
+a3be83ad25a313791a9f7c3673c37104141e7cbf0eaaa619e94d7cd57c7a5514 build/caret-down-empty.svg
+2098b629a60282e11d8919c877d4d094816d838451c6a2fa9bd3789061d0fff3 build/caret-down.svg
+3fa65f0c6ead6581587fc3be184c213e65992ee8c7f55371e636e4e0a4858506 build/caret-left.svg
+2550dcac78f8766bb3f5b1afcbc0059cc47abc7920a727285867ca9a253dc66b build/caret-right.svg
+134c2412c9aa693309d7498b4fcd1901f4578b21091d4444f9bb0eb5da69be0b build/caret-up-empty-thin.svg
+a78b8c310c431866aecbd8b4a15a25f8410df013b9946cc6c759a5fbdf817b76 build/caret-up.svg
+ffbcfc49cc33cd818faeab1a9d3d81a4db38ae21fb4b6d0e97b49a4b83479549 build/case-sensitive.svg
+8cf0a319cc3e61da9e3abbd52394100b9a82920e6088f20d4480c0506760a904 build/check.svg
+4c13d7d5044a5214b655afd65d9997862333e52544eccd612aca6d52e7de9d32 build/circle-empty.svg
+0c1b4f69e1fb8f791242b4181f30c875a5891ecfe510eb3fe6f5426bc2972d9a build/circle.svg
+b0c4b1fb273df5114a20e97b4fe1a16719f2daa8ce2d3e79c141077932bc1f32 build/clear.svg
+6639b72597c5faa8d32a75773836240f2ff9da7d930fc65710abae57e2fcfebb build/close.svg
+af11436eeec513ce562cfd7ae4ba237e7614b3dbb3d10e30e94124f5dd9c5677 build/code.svg
+73db818a7308d7a36739336211784d95b4ca1acc0f49d6a383e31a72404773af build/console.svg
+720e54c372e18d5fcd1a0df3d4f1b4f15115dee124ebf8439d9f4be552724421 build/copy.svg
+72c77705a1bc4ff840b481b5fe338cf22ed28acfcde6dd9d3503afd166f3deec build/copyright.svg
+ddc41a2acfbf731680242a50c4cac65a968551ede8b59776cf30c8aab562acbf build/cut.svg
+b407b521a69db3e8772ebf0f3c008e49f987f11ef782fae18b3c085abf8b2551 build/delete.svg
+c6229b0469fa8459a9a4728a8046f7963216460de6f37903224402b50d5ef7dc build/download.svg
+70621935621d6a94e1299af79d3a3e0a2efce0641fb118f000c8209c9867c2d3 build/duplicate.svg
+5e091df2a2de56237b74fbdef8d0db15c189d457682d99d3e83b3d89f999ecfc build/edit.svg
+3be025043c8bdd7381861b7f3bb9fa85e6e78781ff39d9696ac3f0d3cf38f0cd build/ellipses.svg
+cc247abdc6143e55439ae9d90507e3ddf5da2a9607155b7b737eed1a59efed01 build/extension.svg
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-brands-400.eot
+9c128cb74751b338c6504e4283d3d3c0fcd1b7801350a94d838e61714799403e build/fa-brands-400.svg
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-brands-400.ttf
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-brands-400.woff
+8ea8791754915a898a3100e63e32978a6d1763be6df8e73a39d3a90d691cdeef build/fa-brands-400.woff2
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-regular-400.eot
+9c128cb74751b338c6504e4283d3d3c0fcd1b7801350a94d838e61714799403e build/fa-regular-400.svg
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-regular-400.ttf
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-regular-400.woff
+e42a88444448ac3d60549cc7c1ff2c8a9cac721034c073d80a14a44e79730cca build/fa-regular-400.woff2
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-solid-900.eot
+9c128cb74751b338c6504e4283d3d3c0fcd1b7801350a94d838e61714799403e build/fa-solid-900.svg
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-solid-900.ttf
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/fa-solid-900.woff
+9834b82ad26e2a37583d22676a12dd2eb0fe7c80356a2114d0db1aa8b3899537 build/fa-solid-900.woff2
+dc6dc1dd2dcc319e8db2c1ca1b22b1bcf7840809683cd0f238fd42e9a5dbc88e build/fast-forward.svg
+cd3ac22c9e8d503ee640c149b79782d7ea6dad2217ed995d4ad882f5f1ca977c build/file-upload.svg
+56188326604b0eca0be114e49907fa2450efdcf7faa22764fbaecd0c4183c489 build/file.svg
+f7cc89877d7a638c6a05c330582f24fb4a08c17b664114019137fe8eb022bb46 build/filter-list.svg
+ae79069093daabafc80dd55e181640586487d0d50980717af0ba2bf0e59e2bde build/folder-favorite.svg
+20dd249fad61f0610158aabf8729a3cb66d1eea0d252cde37c21d866b61307b7 build/folder.svg
+b70daff35fb9c3cec7876173dd529123485d6e8475adfc2deb00d39d93da9357 build/home.svg
+33cbcbdb7fe54344679337f7cc46d173edb2a6a6f01916d64ee63fb82954d1c8 build/html5.svg
+08f372cc3dc6e8921b30fefcdb365f1edba20ea1cdc39464e77a42b829b1582b build/image.svg
+8ac582c501c50cb341521d9773bce3b2db2c74a519647a442e895913f336cd9c build/inspector.svg
+dfd38979810f2f0e0f890bc1779465a8671427a5262ca36d3e58e038dac5e2df build/json.svg
+dc34902b53bd10ba37e54d6529e7749df9a0ee4a43ea8336d4f9d0472b743b9b build/julia.svg
+5501dc4661c6b1162fcebedf48df0f098ee5dfe55b20dbd5b0408ed54d100a5c build/jupyter-favicon.svg
+3930328020ae48beed1cf536340f23616e5dd0f11f13539bd93eb20621da201d build/jupyter.svg
+a64b9680911c83b90a3dbfccb939b792224a6f7337812cb6e366cc1ff9d1dde9 build/jupyterlab-wordmark.svg
+8bc9342024209d99c77e2230ce823b217d5129555f52eeedfe3fa9f05f340dd6 build/kernel.svg
+6ea926b81e21de44929cbf26581de450b1427fa8ba65f90773650b4999fb8d98 build/keyboard.svg
+f5272e3860b1001a893010d4ce45584f7db8ed569cb356672892a688a1697917 build/lab/bundle.js
+f06522a1bb1cdbfbd1657223a0e611f7e0fef134ab22a550b8e858dd3f40de5b build/lab/bundle.js.map
+79ec7b541ef25b3e269e8258bc95ec53b3f216b3ba4a6fa537b7346aa4e01238 build/launch.svg
+1dd581e3d231e75a46097b61b5c46f4fa0e6cf89c8d6769d06cd885a17431836 build/launcher.svg
+6f3edfe931c37532c4cb1c12f3140d42a8c2ccd2467fdb69ca6b363980a6ecfa build/line-form.svg
+61ede0a5ca157048d3bf6b9dd1036d1b54d0297c84e5c090848fe56ca240169f build/link.svg
+9ca335b2041216adcfaddbf7fe8bd081b7ea2f8d6395d948ff8b80ce36758c4c build/list.svg
+4b6c542bd4cb0ae4f5d4b460fcf7849ae827f7ecaeda872066ed16848f656240 build/listings-info.svg
+cab40005074fa2527dec9e7373316c27b54f0fc9b9eff0f01b155dd619a75baf build/markdown.svg
+624908d61efc39c02b5d8c9d2139852d6042628269e516c092f9964e9150cee5 build/move-down.svg
+e5e5223124e06a3873456bb5be246e23f64e7688d8dd0a42328c1cc8aa587289 build/move-up.svg
+be7d553eeaaf7c569583530c49f05757a4b07b08566004c786aa0150b3008039 build/new-folder.svg
+ffa0589f9abdf5e4ea2571abfc8f106b7e9971990319f0f62f1179cbee43b887 build/not-trusted.svg
+efa632fe37fb153c431c7532a6e268471291c6b12b9dc1571beabfc44cbdd952 build/notebook.svg
+39ded3eb0c2eb5dd02fbc866a3bf6cca4ca08e3d0523a77ce1a65899cfaf8186 build/numbering.svg
+2f25d41694f8276df79b763bb5a1fa9bf19f6ab01579fa7e1a13c4fa23827bea build/offline-bolt.svg
+1c93a0af7e3ceb4b344b00aa1094d94145bfac0461d06845aed0f836e795cb57 build/palette.svg
+0c64af16ebe9ca2ff0525ef99f7dcedda376f7098b1b78e9c5d40e5a576ffb19 build/paste.svg
+b96a2b495e025a89ed75fc119f9e5c0780aec3362b07027d504ef2d286631811 build/pdf.svg
+f3b45526d22813f25bf284074cc4622bb60fa3f883996490f580f77bf46bbfe7 build/python.svg
+6860751a10a8458b540eee2002bc8eab9b04d667e0ab23c4ad9d137ca6820958 build/r-kernel.svg
+d9ef28b461f4cd6379e796060ae19b1ea4e47070b4257bf6dd199302cb9a46b3 build/react.svg
+da00a00f0e63be2e3cc19a1c11ab18126d3913f6c6b820fdc41f1e41d5e4aa54 build/redo.svg
+f80bcf80473101f4a080ec9d80c45e373f12a2aaa7895f9c6b1ff6e781354b92 build/refresh.svg
+3b7ac0de4cdbd19157e43aa55e020fe42f13959354d37f12db2033b73046c47b build/regex.svg
+1efb41b2378bda0abda9a59ca26a583a9224cf8b9c848a3d4a574d0abd91e06a build/repl/bundle.js
+dff06f2f226c3844248b7f6e86546fe3e4d177944aabd1222339135b17715bf0 build/repl/bundle.js.map
+43f85cab9ddd805a17b1aef76841f2c9675f50fdfc3846f3d19357c8ef843b3a build/retro/bundle.js
+ed058653aa696df1f0f62bbe86645a3237b2e5f1859ced160545164a7d1de64e build/retro/bundle.js.map
+0c805a2aa444bd6a109d1d0fc75c8db278bf53b3d6f0dd5755d66b9ea1008f58 build/run.svg
+27231479e33894c3acb5c46d579eab09191a091cc9553f2510b5dae27b629d4c build/running.svg
+0dc7fec7ff3cb09831584a4c9b3c1823aff0169caef9504f1e33984e3cb6402e build/save.svg
+70fa12214dd1ed7b5100972d12f9b0a0ff3a71508261c5c44e1c6478f3cdf26c build/schemas/@jupyterlab/application-extension/commands.json
+aff548698a6470ac392e67f88218c851df04e95653d3f69a4f4a23ef9aa9c6cc build/schemas/@jupyterlab/application-extension/context-menu.json
+f26a2852ce97f31a57a654ca45e5f93c8db72939bf3d358e538f80c37cc0c556 build/schemas/@jupyterlab/application-extension/shell.json
+35455cafc50ddd05ce4eee495cbe355980a882d36662994f6c5c5d90373d6f69 build/schemas/@jupyterlab/application-extension/sidebar.json
+61138fe9d61aca464ac5060fc422e8966d0dd477f092322d5324fa655fc70540 build/schemas/@jupyterlab/apputils-extension/palette.json
+04a906bfcf7cb6a7ab3ef1af6e8cb64d925f7f09b44b1b12cd5ebf70b8942957 build/schemas/@jupyterlab/apputils-extension/print.json
+9c812520940790d75cf6418922850e27e02d104303b4ac67080e0efa070f2bc8 build/schemas/@jupyterlab/apputils-extension/themes.json
+4524b552dab7c2afb6aa513c821a52f75e5787a1f6ed9f29899e0ea0d549feb4 build/schemas/@jupyterlab/apputils-extension/workspaces.json
+d188b0dfafff34139a4c06be340fe067f3adcabf3ab975abb820b4c59f22c454 build/schemas/@jupyterlab/cell-toolbar-extension/plugin.json
+9fb92d7773284d531e8a207b2cb17cacb8dd7d2fb826a7d556af54cef711ed21 build/schemas/@jupyterlab/codemirror-extension/commands.json
+1b734292e664b2017eab4b1fdd503436df1a70a2a64afaaae6b9b8e9c59f8403 build/schemas/@jupyterlab/completer-extension/consoles.json
+58bbc3d4e452846a52d45705e3a69278e4a61ebc50d93bbeddef2b996544d82a build/schemas/@jupyterlab/completer-extension/files.json
+66cafd20d981c8205eec5284cb512b4f7d274c808e8a9a1f899df68997c68a1e build/schemas/@jupyterlab/completer-extension/notebooks.json
+fea945ea574f795c6a29ef45398cfa2d04ba265e7580d039c2a4db2820c5f573 build/schemas/@jupyterlab/console-extension/foreign.json
+71a8e8c43253df0a17bb0ce50afbda61265873698a886ae19be345832a035356 build/schemas/@jupyterlab/console-extension/tracker.json
+6107e6ba7f9d0ea86465ccba26cae314df1f37693db675e038a6ba515d327246 build/schemas/@jupyterlab/csvviewer-extension/csv.json
+1886198620e2bc8d78861c99eff74e63692529bd42c2e2ea48af8c8f7739d367 build/schemas/@jupyterlab/csvviewer-extension/tsv.json
+9672bf1b954a58bd40b1e4875d7656aaa4a4f65ac5752578150cf64ab141faa6 build/schemas/@jupyterlab/docmanager-extension/download.json
+c98fae25e8710d00788a6fc34c1acb1f93ea419f4c05521912b0f007f74ff9f2 build/schemas/@jupyterlab/docmanager-extension/plugin.json
+8a0b0daf3e7897f2cb67346fa96b64a3ebd113ca57a47bed36753e02339ffae7 build/schemas/@jupyterlab/documentsearch-extension/plugin.json
+ab130ef2241350164912d6f906321d3cd620bc9a0bb7ce6bd5b2825859bdc902 build/schemas/@jupyterlab/filebrowser-extension/browser.json
+2f8d328a68633c0bcaf6bd9bc2ed7a46527d64d769b5570b26a873772677dd72 build/schemas/@jupyterlab/filebrowser-extension/download.json
+adc0a22f6b1c80d20bc2485f9e828a4ad2d9971022d073226bd29c48a379719e build/schemas/@jupyterlab/filebrowser-extension/open-browser-tab.json
+9c673b810cbaf79d5220df635a7a19825c464c9668ba75bb156f458289b139b3 build/schemas/@jupyterlab/filebrowser-extension/open-with.json
+2f21b93dff01305c10d4b59d8a44d41c1210897897274ce96f2dccee25f62ef0 build/schemas/@jupyterlab/filebrowser-extension/widget.json
+2373fabc4e9694b115c01192bd770bd039cc9c8cb53441981b6d15356110dcb4 build/schemas/@jupyterlab/fileeditor-extension/plugin.json
+c95b0e4cfa435d30fd1ea47103aafd102d0fa0618cee23704eabc08cf83b746a build/schemas/@jupyterlab/help-extension/about.json
+166bf15c61d4a0d6cdb55da436132bbf5a6741bddb87cb567630ede3a995019a build/schemas/@jupyterlab/help-extension/jupyter-forum.json
+011cd9216eadda0deb9def1157268586e9e533b6586fe80232b27900f8c06401 build/schemas/@jupyterlab/help-extension/launch-classic.json
+fb12887f41b9fd9235bfb67decf477c4a41499ce23a443a75825bc3930bb2a7e build/schemas/@jupyterlab/htmlviewer-extension/plugin.json
+6d8187f70daacc1c575520933b9295e6c6d159af3f02653b3117fadffed73c46 build/schemas/@jupyterlab/imageviewer-extension/plugin.json
+6456b35953b7d1857549872c7fa6bcd3fc0d222e3f444dcc89b548ca05c7397b build/schemas/@jupyterlab/inspector-extension/consoles.json
+0a8fc7c0da4d868d88bd987020065b10fd5d6b4880b294eb32dc4c89d84aa5e3 build/schemas/@jupyterlab/inspector-extension/inspector.json
+7a170f748f1e0650df894bfc98f0b6e987e2039c7ca17b6cb4c22f85585963fa build/schemas/@jupyterlab/inspector-extension/notebooks.json
+783a4550eb8dd3752f19ac0ac8f545a42ccbf56da69973bf14dddf92cd0cfdef build/schemas/@jupyterlab/launcher-extension/plugin.json
+62b706bb1c5bc55c0f05d67cbb2d3f60fd9fe2a663728cd9c5240be4cfd0652b build/schemas/@jupyterlab/logconsole-extension/plugin.json
+d27da8d1a369c6dcb31dfe0dee63f949b19f90383099a8510adb58ba421bad3e build/schemas/@jupyterlab/mainmenu-extension/plugin.json
+09c8b09620f3475a000a365b9acebde5bcac5c1ed4ea9a61833ab000c47a6965 build/schemas/@jupyterlab/markdownviewer-extension/plugin.json
+f4da53118f40492d6c44ab0f658ab410cf6c7a600d056253d04da01b954240a1 build/schemas/@jupyterlab/notebook-extension/export.json
+a9d125cb73cf275ffd0096b99b2210b9b4221284ebd6009d8d069f66268dbae4 build/schemas/@jupyterlab/notebook-extension/panel.json
+4d1464dae5d2d8c24a050db181d709bd840366f38c05ad5f77ffb73c89a62d87 build/schemas/@jupyterlab/notebook-extension/tracker.json
+cf6642d8ef9602c6fcf7a802c73b8048ca1f2596daccc24af167993cc9c2084d build/schemas/@jupyterlab/settingeditor-extension/form-ui.json
+79c45056b7d0cd230a03719640da12ea1497bcec9d18b882426afe4364298f04 build/schemas/@jupyterlab/settingeditor-extension/plugin.json
+23bd7735d4427f0910d3629adad33ad53e463a4733283a3f697dd8364deb256a build/schemas/@jupyterlab/shortcuts-extension/shortcuts.json
+cc07fee421176d935575609413d04ff6b9650f8637422f9f66ffebf6906af2ae build/schemas/@jupyterlab/statusbar-extension/plugin.json
+f2b7515898bcb464b531055fde546d610935206e3aa502ad1eabcfe19d2d743a build/schemas/@jupyterlab/toc-extension/plugin.json
+8a52789021f4122a008ef492aebd50fc7bf1c74a4355b328dc810ef49ccf97b1 build/schemas/@jupyterlab/tooltip-extension/consoles.json
+c04fa1aa038c0ad04c4e0b19a216ebc7a300d36fc8f141cf4e2a5c116f8a2bcd build/schemas/@jupyterlab/tooltip-extension/files.json
+f04fda8d54ecc1ebbb057cd326554c317363872d72ab3a63ba9eee7406f80e8e build/schemas/@jupyterlab/tooltip-extension/notebooks.json
+141a725afe37e903782b8743a2b8309e5899cf95d2dde4c32a4e4df13547fde6 build/schemas/@jupyterlab/translation-extension/plugin.json
+9b903e229678225d7fbd53d0e1f92a9b7a7b5831551c849c6508c3baeb7b8129 build/schemas/@retrolab/application-extension/menus.json
+6b1291f821e379822fc7a377c0f9612ffb01dc0bc4b174930e244cc8bd59fab9 build/schemas/@retrolab/application-extension/top.json
+87e8fe92ef779f51dcb82158ea17b225258546367570cb732ca1ce9cf8ff7014 build/schemas/@retrolab/notebook-extension/scroll-output.json
+101195c0c3ad212613d79dfbf453aa0ad6d34bbf651ed078898184b44bc816a6 build/schemas/all.json
+66c7eb68b20726cf10aa11b7a86c9d225ce4d899970551c3d1052fa3befe47a1 build/search.svg
+ddb3ca2dce51cba09f2ffdb7574ec246498965a37ba83e816f5bb76f3e6a7ef2 build/service-worker-f7de73d.js
+b491b64f790535a118c05185f2c36cd48ef046fdfc79191bdf2da8101e287174 build/settings.svg
+f7c216723a6ba934c2d028cf341778a2ae9bdcca9186f5e9d65af7b19e753eee build/spreadsheet.svg
+ab7304c0cea575ef112b42a485afd9579218221786f663cbbb7eea1d54b9aea6 build/stop.svg
+fdb37ffe258addac93a81f5123d473859eaea88db88ad186cca090eb3bc73016 build/tab.svg
+e70bd242cfda4beac94495da24504af6dcb0caeb6c676f3950bc8c03080580d9 build/table-rows.svg
+593033f4e563befd73c014b0b502919f19e7a2938714d3b96a7fd3205f354141 build/tag.svg
+a400f277bcb0fac961e6757953fbf2320f4cc620fab557630e7d23dc90c7e399 build/terminal.svg
+135e2465dd622e2aba35d88c424869e5bf72ec34fc8161861fbe2b14b8097ff4 build/text-editor.svg
+c36d92594fd377db7a5405604099eb47f006ea4c3f93ba77211df9d89e1e2176 build/themes/@jupyterlab/theme-dark-extension/index.css
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/themes/@jupyterlab/theme-dark-extension/index.js
+2a5ae4987f03b8ff6a735ba883286369084b973e9e6eb2d725712620c7bf4687 build/themes/@jupyterlab/theme-light-extension/index.css
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 build/themes/@jupyterlab/theme-light-extension/index.js
+3d6315eb6bcbd99e3622c636b11628fb0dca4a118efc426eb2108cf349f3e4fc build/third-party-licenses.json
+273a32ab58ae98baf02e34d50d7b9078df2e0fa005d097782805e620b40de594 build/toc.svg
+0b71143ce8dc345aa9aa6dc99e0c0618d3186eab2f8af134ec34ce36ad2dd2b1 build/tree-view.svg
+d391bffb612724fa631d94e870d8856feeb9625e4a8feee3320bc02153c3accc build/trusted.svg
+6a516cd43724837b4bcd947c694f9708e8fd511b25667d147e41ab9b883aa26d build/undo.svg
+d47522dd19827a2fc19cdb8686623f5b73c813c7c47d48e7464b397eaea68bc2 build/vega.svg
+c710e6e371738fcd75078eb1b46418456ed87a4523efe5ff216bf8800b660d62 build/yaml.svg
+8b92f7f5829a9e0648e9675739987617af3a958aa6da798228b249b762ad4df4 config-utils.js
+3ab603499031b6ab9dd6933bd1cc2ef0a27580407fbc8b15a1553ff187cc9d6f doc/workspaces/index.html
+7bae4a70336d75a038699805d662c7221c1aa08ce91fd2e652e786e22258988d extensions/@jupyter-widgets/jupyterlab-manager/install.json
+9a6daf572b5b89b6f7d99947ad64543a6bdfac709bd303a4a94a6c3686988ca4 extensions/@jupyter-widgets/jupyterlab-manager/package.json
+607b7ece973cd45610fdbde8ac8e2a4f9f81a15cd88d81691edd0d4aa59863f0 extensions/@jupyter-widgets/jupyterlab-manager/schemas/@jupyter-widgets/jupyterlab-manager/package.json.orig
+2163419819be1930130abce16b99be2a1d06b7a1f82b31ac9f372e4a2823c760 extensions/@jupyter-widgets/jupyterlab-manager/schemas/@jupyter-widgets/jupyterlab-manager/plugin.json
+2b4b51b83ad10b166559d5c7d9874a3863ebdf31951bf614bcf0f9f892e08698 extensions/@jupyter-widgets/jupyterlab-manager/static/113.6113d19fca7ff66ccc66.js
+d49fb5cb77f2f622f79fbfee49eec4d3dab51570ad119d054242acd0535b98d7 extensions/@jupyter-widgets/jupyterlab-manager/static/113.6113d19fca7ff66ccc66.js.LICENSE.txt
+b4eddbb09f5fd50a4007476b0ffb9c2a164f27a64831267a3e4631353d073787 extensions/@jupyter-widgets/jupyterlab-manager/static/134.b4eddbb09f5fd50a4007.js
+e0174b46b7467c2a21f4f06475bcbed8b28476de16f162132759bcee2a1bf5fc extensions/@jupyter-widgets/jupyterlab-manager/static/291.cff5ef71b29e18850479.js
+b396f13a41869ccc527fffdb79ea357e45cd433fdaf81763aff596b2a2a1b72b extensions/@jupyter-widgets/jupyterlab-manager/static/291.cff5ef71b29e18850479.js.LICENSE.txt
+9f709c2076672b1bfe2be8dfcac6cbfbc0161d47081036620dc2e7dabd585c25 extensions/@jupyter-widgets/jupyterlab-manager/static/336.9f709c2076672b1bfe2b.js
+17494fea1ff555b262947b3dccbe226300596810dbded0805b37a5db1a9d90c5 extensions/@jupyter-widgets/jupyterlab-manager/static/345.17494fea1ff555b26294.js
+b58859516292ffe4bc96bb11321c5de8f93b2260e80307bdbe40a9412b571cd1 extensions/@jupyter-widgets/jupyterlab-manager/static/495.b58859516292ffe4bc96.js
+942a65706d9bc281d5ca3459e1268c1a385331a6ac5131e039f73ab390f2bc63 extensions/@jupyter-widgets/jupyterlab-manager/static/595.942a65706d9bc281d5ca.js
+1f32fb4ed861227b46e2045c5857a52d634e8c406f68784da60a88a17ac4a46c extensions/@jupyter-widgets/jupyterlab-manager/static/596.1f32fb4ed861227b46e2.js
+21f571face17e35076c20654e3204ab75578f9b288c58ca1eb1ceb24d1899d48 extensions/@jupyter-widgets/jupyterlab-manager/static/61.21f571face17e35076c2.js
+52a1098a3a5f3e45abffc93fcbdc2c3b6eb50e15bcd4714a991e3ee89bc61310 extensions/@jupyter-widgets/jupyterlab-manager/static/644.52a1098a3a5f3e45abff.js
+e966b1425a7d4e8c3f4edee3d263961685d0932b80ee6423d9d5cec53947efeb extensions/@jupyter-widgets/jupyterlab-manager/static/699.e966b1425a7d4e8c3f4e.js
+22fa53da8ad2a8da593af81b78a34b857720c4bac349c78588e18c89eec8d613 extensions/@jupyter-widgets/jupyterlab-manager/static/965.22fa53da8ad2a8da593a.js
+98b8a827bfc5f86e95d231d95867abb0b095a7ebd5c02ebaaf5ce40360d8bdd8 extensions/@jupyter-widgets/jupyterlab-manager/static/remoteEntry.98b8a827bfc5f86e95d2.js
+f8242dd194cf6824efad188b7339f17e501b7ef20a94e5738cea2cfa6b9a5d0f extensions/@jupyter-widgets/jupyterlab-manager/static/style.js
+5d82912ac7805954a8930e251b2618a705f6aa25a8e35edd74e9b282811287cc extensions/@jupyter-widgets/jupyterlab-manager/static/third-party-licenses.json
+2b5174ed859fdc907d41de03c7a62f634dbd50abed56780868b57c55c880e6c3 extensions/@jupyterlite/javascript-kernel-extension/package.json
+b17cfbc4c662a8c3822a18182e256b662a7812105bc0a400db4ea7fcae7e12bd extensions/@jupyterlite/javascript-kernel-extension/static/102.b17cfbc4c662a8c3822a.js
+d3baa4e12f728a48f3c408d5cc7f2f8787d983ca9fda2208fa04d68e4ab1f6fd extensions/@jupyterlite/javascript-kernel-extension/static/290.d3baa4e12f728a48f3c4.js
+e1bac0e80e50f9e303dc34c56aa235d87493540f4f83d6ab83b8cc914ca39725 extensions/@jupyterlite/javascript-kernel-extension/static/322.e1bac0e80e50f9e303dc.js
+4368412449ba90ea922550b4b272e4255d281dbde40c6d90c148cbb31434e340 extensions/@jupyterlite/javascript-kernel-extension/static/441.4368412449ba90ea9225.js
+97f5f068dbbebd2b6486cc9500f47327c89197bd2f13bcc3d970b26b0137e331 extensions/@jupyterlite/javascript-kernel-extension/static/568.97f5f068dbbebd2b6486.js
+1ce3c77b50c9eb671961b6cb9f8e6bb2c8be1dc7a19130c571316edf8ac4aa6d extensions/@jupyterlite/javascript-kernel-extension/static/866.1ce3c77b50c9eb671961.js
+e75039073a726197e8476a01b4c504314b78b51319dbde1de9b88c13759d966c extensions/@jupyterlite/javascript-kernel-extension/static/remoteEntry.e75039073a726197e847.js
+f8242dd194cf6824efad188b7339f17e501b7ef20a94e5738cea2cfa6b9a5d0f extensions/@jupyterlite/javascript-kernel-extension/static/style.js
+15e7bdf13bf5a0f177893cf82e71bccfd565e685c35832349e0e18f96de2f3d1 extensions/@jupyterlite/javascript-kernel-extension/static/third-party-licenses.json
+71789b00a8b1daf7e4a1118976e81d13c7a902f036abb69c3b90803f26845c35 extensions/@jupyterlite/pyodide-kernel-extension/install.json
+1132873be0a42a20d918a89743dec72a5e9f1dc4d8921a7d27916460fabf534b extensions/@jupyterlite/pyodide-kernel-extension/package.json
+7b3e47af604cc5639fcd7a2e1039a4cc25dc580cace20d0a3d058e16b39f5720 extensions/@jupyterlite/pyodide-kernel-extension/static/460.f65c68deb6893d389ad8.js
+dba78b782510f3d51a4915d2f0ecc6996a5504a1aa7836848b0bf8e5fae6ba99 extensions/@jupyterlite/pyodide-kernel-extension/static/460.f65c68deb6893d389ad8.js.LICENSE.txt
+0c22b468fb9908d7b090f15f0d9f9cf98b88d5191e97e33b316382f2953c8470 extensions/@jupyterlite/pyodide-kernel-extension/static/460.f65c68deb6893d389ad8.js.map
+31d74886d1b5a5348c204bad4075ae03ccfc7eeebaa17e11ffa49c2d028b1869 extensions/@jupyterlite/pyodide-kernel-extension/static/568.a366db64685210602f09.js
+dba78b782510f3d51a4915d2f0ecc6996a5504a1aa7836848b0bf8e5fae6ba99 extensions/@jupyterlite/pyodide-kernel-extension/static/568.a366db64685210602f09.js.LICENSE.txt
+26c07741ccf2b5bffabed218a3bd6ce106121f41b50b81e33c64164fdd733f08 extensions/@jupyterlite/pyodide-kernel-extension/static/568.a366db64685210602f09.js.map
+b544c6395c91e449f5eb81b2432e826e4d27b0a7108c97d9467be4358bfb75c9 extensions/@jupyterlite/pyodide-kernel-extension/static/652.9eeb1d40d049d5db167c.js
+c306d494fac55f1e10249796f697e85f3c6ab8fb54b16f43ec0b12013555db8b extensions/@jupyterlite/pyodide-kernel-extension/static/652.9eeb1d40d049d5db167c.js.map
+6aa84550825e26ebf7fe1fc4de30bb03e9f5471db92b80d4f81492384448fd85 extensions/@jupyterlite/pyodide-kernel-extension/static/951.f415b4c2ffe9eaeaa16c.js
+bb3456f1d11e2eef78615f5abe5934892a7adb44f38239b807e002781dd44b8a extensions/@jupyterlite/pyodide-kernel-extension/static/951.f415b4c2ffe9eaeaa16c.js.LICENSE.txt
+289f7bc51d003abf79df2dc217ecb845d06c9fed4e6c42848c65687bb6c80888 extensions/@jupyterlite/pyodide-kernel-extension/static/951.f415b4c2ffe9eaeaa16c.js.map
+5e9ce9e49c39bfa29aa60dbee0e272614a3111b97116f8902630cf36bdc58634 extensions/@jupyterlite/pyodide-kernel-extension/static/pypi/all.json
+3024d4ac0f91cb909d0d74e8be144ab2edf2c8b3a8c46df68c3efd910b15699f extensions/@jupyterlite/pyodide-kernel-extension/static/pypi/ipykernel-6.9.2-py3-none-any.whl
+95ec2f128ad4e1c7d8bde13bb5261b669c72746094e128297c478e75adf24b5e extensions/@jupyterlite/pyodide-kernel-extension/static/pypi/piplite-0.1.1-py3-none-any.whl
+cf50220493bf2bd6f1dfc5f0c10c64476c5c5fb93c5bab154fac0fe5f47f968a extensions/@jupyterlite/pyodide-kernel-extension/static/pypi/pyodide_kernel-0.1.1-py3-none-any.whl
+d5ca0fd4e1aac03f5abd4935e621e5cfc110b3c7e8433e117079bbe44057cad9 extensions/@jupyterlite/pyodide-kernel-extension/static/pypi/widgetsnbextension-3.6.4-py3-none-any.whl
+5fd374049672a5350eb999956f3051dde5523983f8a611b11a6ffabc32a794df extensions/@jupyterlite/pyodide-kernel-extension/static/pypi/widgetsnbextension-4.0.7-py3-none-any.whl
+82f439ec4ae1584dabb2215b0b1a331f53de4aee8b82e42e49bc55ddbb1e6f64 extensions/@jupyterlite/pyodide-kernel-extension/static/remoteEntry.1c8491cf58b5de6123d1.js
+c8c6ca2a166f5435d755e0ffb21936354207df8a9ceaa62e6593fac4e66ff3cd extensions/@jupyterlite/pyodide-kernel-extension/static/remoteEntry.1c8491cf58b5de6123d1.js.map
+b3010ace24cc998869207487f69981721d9e66f58ac82cc04278d9a7d20ebdde extensions/@jupyterlite/pyodide-kernel-extension/static/schema/kernel.v0.schema.json
+e91c4ab11ed48f751bf84d4ab289c5f7b532899e29d2d257df2ac7718e60c291 extensions/@jupyterlite/pyodide-kernel-extension/static/schema/piplite.v0.schema.json
+f8242dd194cf6824efad188b7339f17e501b7ef20a94e5738cea2cfa6b9a5d0f extensions/@jupyterlite/pyodide-kernel-extension/static/style.js
+b19e51182d991edc6883acad162adcb6ddf7392aa8ab4bbd47c55bb41f237e36 extensions/@jupyterlite/pyodide-kernel-extension/static/third-party-licenses.json
+23e02b053b495eff9a22fd7da42e3ddaaaa614d550a61c12ef5ebb23d747f190 extensions/bqplot/install.json
+73735f231807f3b29fc2452da7d77bf703bbba1a13be8d517f4fddde018a183b extensions/bqplot/package.json
+184b7ff4eeea6053c218cae688aa6f8859f700444ac66ea6447d036ac1ceb55c extensions/bqplot/static/133.184b7ff4eeea6053c218.js
+9b9dd2ec059faa78e980c7dbad332f8dd97ae37d59095c411913e9659bbc557a extensions/bqplot/static/212.898d3b3da016aa77edc1.js
+2355fa961337587bcf330cdd5fffa4bc73fb8758b9a62b43cfb618aea465f125 extensions/bqplot/static/212.898d3b3da016aa77edc1.js.LICENSE.txt
+6c13f92ce49688bde79047502f171a9e101a8602fb277f363748a161419a5651 extensions/bqplot/static/501.6c13f92ce49688bde790.js
+9ad93b156f9ecf44191d8ac02e337320766c36f3a51077f04fa20d8a966bfe4e extensions/bqplot/static/568.9ad93b156f9ecf44191d.js
+d928d9e888427c5996be9ad6a35a5b5e7bdd7d9b7970fad38ddb5a3e77cf1397 extensions/bqplot/static/662.d928d9e888427c5996be.js
+8d6261fd8a7307e156f7513414a42767652c35f9083f6ab7f71bec34d08744aa extensions/bqplot/static/794.8d6261fd8a7307e156f7.js
+4fcd9a1489787115f9300f18231f15d4571bcda0e83c58a07195484100bab776 extensions/bqplot/static/815.4fcd9a1489787115f930.js
+a94bbf6f3349e982fb8bbd6629f21f57388066982f747c466f3b443151a11c15 extensions/bqplot/static/842.a94bbf6f3349e982fb8b.js
+cc5d175e0ffc0d125bd53e3fdbc9a876a6b3ab9ac6aca2fe9ed30ada87ca24b2 extensions/bqplot/static/87.cc5d175e0ffc0d125bd5.js
+3eb8076dae15637e508741491e31341f0c423b3c45a52e126cef67f4afb48e29 extensions/bqplot/static/981.3f93685e278b785a3338.js
+a5575483e0d910f7e5ca737628948a4144ca883fed7ac486dbc5d50153ab1272 extensions/bqplot/static/981.3f93685e278b785a3338.js.LICENSE.txt
+ade722230aea9b7793b20ad5f512dba58e17ba124c9ef47c4372ad1508dbe4ee extensions/bqplot/static/remoteEntry.ade722230aea9b7793b2.js
+f8242dd194cf6824efad188b7339f17e501b7ef20a94e5738cea2cfa6b9a5d0f extensions/bqplot/static/style.js
+c4bdaec4ecbff0cf4a304985dfea87bf60f8ec2cc8b7807cc1d93cb75bc6515a extensions/bqplot/static/third-party-licenses.json
+219afdf31ba8c346ebbc0e33887849d44d60bea65a31b1782e4c3679ba5d9570 extensions/ipydatagrid/package.json
+1627bbe6e3bd1b150cfb8dbd89e0a82f1b223aaa8497d9d0a08ecfa3fde2169b extensions/ipydatagrid/static/130.1627bbe6e3bd1b150cfb.js
+025e64e0cbb8aa528385a8e6c9ad3d4bce27abd02b9d4633865deca5ec6ea1cc extensions/ipydatagrid/static/142.025e64e0cbb8aa528385.js
+171db67c9b56d395ae64227d5b80dd1da60f543b26084a5535caac6b0c503f60 extensions/ipydatagrid/static/143.171db67c9b56d395ae64.js
+14ad542071f6e259fbe218923136e6938d56b0d52702bb294907b3b8b0ecf38e extensions/ipydatagrid/static/14ad542071f6e259fbe218923136e6938d56b0d52702bb294907b3b8b0ecf38e.png
+c6d995708c863e1b27ed73e64db9a0ae7f0ea3d4fff024be7f522c848b12cd2e extensions/ipydatagrid/static/271.c6d995708c863e1b27ed.js
+a4aab9e3718f10fd8b66cde977aeb8cbbe57b327869b4ab118640a959dec93fd extensions/ipydatagrid/static/284.a4aab9e3718f10fd8b66.js
+372e5eec3c9010a57cf38e1356d7244c95aba8047ef08dde396cdb01c3b281dc extensions/ipydatagrid/static/351.372e5eec3c9010a57cf3.js
+3546b939aba74f121f34a2f20ee7b20488e8365680c595d22bd5d6f4a5ed9d19 extensions/ipydatagrid/static/3546b939aba74f121f34a2f20ee7b20488e8365680c595d22bd5d6f4a5ed9d19.png
+95b73fc6eb3f120b823f262e72367999f75509886a45d2b66e182bc8d94ae4ca extensions/ipydatagrid/static/400.95b73fc6eb3f120b823f.js
+afd75d5e116998d22e5655a2948817cc1a50a2c698aa7011e6cb36dacb39faab extensions/ipydatagrid/static/456.afd75d5e116998d22e56.js
+68e4d74f02bf2411528e870f0b8bd2291688929708143fb3b1df26b8fdd30bef extensions/ipydatagrid/static/462.68e4d74f02bf2411528e.js
+732e43cec274cf5b8cf585d96e881bcb68825aa01dc2b27984e6fae6767e67a2 extensions/ipydatagrid/static/48.732e43cec274cf5b8cf5.js
+1335093f4212d0224bd57c484e819d87f85cfe9bb439dd33732441b6d8749506 extensions/ipydatagrid/static/480.1335093f4212d0224bd5.js
+911a23288443c8041987b6acd3fe7e5faa67fbbac98ef3f44c0141e1e4faae22 extensions/ipydatagrid/static/481.911a23288443c8041987.js
+fa08f8a94327ef47fd438e050fecd24d27e9bb9e05fab09a7fd1f7c636949fce extensions/ipydatagrid/static/498.fa08f8a94327ef47fd43.js
+2205a874de0a8daf2fd24b69757c04b93974fbfc828ec002e676298a4bf36145 extensions/ipydatagrid/static/568.2205a874de0a8daf2fd2.js
+82c436d9ed33fa1eeb09f8e0152b99de1d43b038880ca205424ae873bc38cf82 extensions/ipydatagrid/static/57.82c436d9ed33fa1eeb09.js
+5b5469a81198fb5e6aa1696bf25b1d138202b839d81ba71d00158edaa4467f79 extensions/ipydatagrid/static/5b5469a81198fb5e6aa1696bf25b1d138202b839d81ba71d00158edaa4467f79.png
+730227a42292c5f89120f6e7f0dd38a53699b42f8421d1e7ffb48068562cbd24 extensions/ipydatagrid/static/642.730227a42292c5f89120.js
+efe59705c1680a8f8b3ac87f573075990d53829fdeeeb39a0c044fc64c4ee6bc extensions/ipydatagrid/static/683.efe59705c1680a8f8b3a.js
+c2c94fc61e0f066974fe50d9ac4f8ce530a9227e6a991591c9831564ea98641c extensions/ipydatagrid/static/700.c2c94fc61e0f066974fe.js
+03b63c4ddca5a6c51239c7084c2a5deb82d40d12267c34d5254d2dde1865afd5 extensions/ipydatagrid/static/723.03b63c4ddca5a6c51239.js
+733684aa1ae47c885305752829814da98236533c8dc93c663bc1ca1428f93b7e extensions/ipydatagrid/static/733684aa1ae47c885305752829814da98236533c8dc93c663bc1ca1428f93b7e.png
+99660434599c02f0b72d43a6ce3f1ad255c5790aed2012040663e46392334281 extensions/ipydatagrid/static/76.99660434599c02f0b72d.js
+8e42ab14a450aebad588434c801201e9d930e0cea8a9fac613cab33fdfa7b4fa extensions/ipydatagrid/static/762.65f6f1cb96cf372620f3.js
+03ebf59709ae217d43a4d275303cca0cc5afedffdde9c8c794638212fb6185d6 extensions/ipydatagrid/static/762.65f6f1cb96cf372620f3.js.LICENSE.txt
+c7bdeaec10d13ee80dac097f574d47440a09870b95e244500929bbc050cb4a58 extensions/ipydatagrid/static/778.c7bdeaec10d13ee80dac.js
+ef3f9c2a235c4a40bdc002a4dcc241450bd60826a8d6e0ed3c7197edc24344e2 extensions/ipydatagrid/static/781.ef3f9c2a235c4a40bdc0.js
+171fd32dda5eb9ad0c25a4beed46edfb58f493643122f47e7f66a582b544aeb4 extensions/ipydatagrid/static/787.171fd32dda5eb9ad0c25.js
+d7c23e15137c8752365eb06b4a30cba6e5661a1fe859a56cfb1ad0fc935fd572 extensions/ipydatagrid/static/794.d7c23e15137c8752365e.js
+a135ebc21be585e6d76d1b550a853b281f10568fe3f1769fdef3cb233b638b4a extensions/ipydatagrid/static/811.a135ebc21be585e6d76d.js
+18e09aad57c7797df9875cffe2a778d139281d6a7c28b5d7f7c6c4e84e97b0b7 extensions/ipydatagrid/static/823.18e09aad57c7797df987.js
+3c908c99565b9239edc610fc02d258b330b99d21bf216e9e410a6f46282e6000 extensions/ipydatagrid/static/84.3c908c99565b9239edc6.js
+581e914499b9bc9d538edf1ef9d4e6e295fee6da1b277c6d83f6be5afc892859 extensions/ipydatagrid/static/847.581e914499b9bc9d538e.js
+b972bc5b41fae8990bff4ba5230860bc98f6e86050486a12d4ec391c1fb1749d extensions/ipydatagrid/static/917.b972bc5b41fae8990bff.js
+23c8b1f0eb18afd531e9730c611a6801adff267ac60817bfa30eaed72a01167f extensions/ipydatagrid/static/941.23c8b1f0eb18afd531e9.js
+e35c256305f259cdaeb99b17a01d451a3afb44a8eda7c32d3024d0ad3f57a1a8 extensions/ipydatagrid/static/990.e35c256305f259cdaeb9.js
+e66d09bd2a32f6ddaf26a16693deaedf6f07414d31638ac6ebcc113d17fe9071 extensions/ipydatagrid/static/999.e66d09bd2a32f6ddaf26.js
+61e8508824209171af0b4919328ce8713feeb696ae74877315c7a8bc9bb3c3d0 extensions/ipydatagrid/static/remoteEntry.61e8508824209171af0b.js
+f8242dd194cf6824efad188b7339f17e501b7ef20a94e5738cea2cfa6b9a5d0f extensions/ipydatagrid/static/style.js
+f3e79c8a1e9a5940c0d9cccd236aa0f1c2ed4fff34e9de9773c75e96c83ff15a extensions/ipydatagrid/static/third-party-licenses.json
+00d92172f8ab893b0a973ba1b30a21ab8927665f4c3fb45256ac989e212dc54d extensions/ipylab/install.json
+b20cf87e6e1c4066cb3f50a5f8fc606f56d33ddbf3ebd5d86ded08fc0ebef2ef extensions/ipylab/package.json
+65104e3518cc2846229afae38ec12d58c35d967dc37e78f4eebd74b99f2ea20a extensions/ipylab/static/223.65104e3518cc2846229a.js
+16044a8abb039e4c2a69d17baf15d4a6c791d1f0d26b7d696b9100885ef3c839 extensions/ipylab/static/480.16044a8abb039e4c2a69.js
+9ba08c8aad161a412b389898fd76db0182ae2f9810e454c85930c497ddf99421 extensions/ipylab/static/568.9ba08c8aad161a412b38.js
+fdad245823675affa79e13289f122809a6d03c29880ecc6392f803eef6f819c2 extensions/ipylab/static/755.097126830783dc2ceab2.js
+90df5fb90a66efeeba4a18886bb6c62bdc1389f8ea14d8e1531acd42f160d344 extensions/ipylab/static/755.097126830783dc2ceab2.js.LICENSE.txt
+bae6a35721d5e73092282521884e97b5b7a01da332b0c35bd46c94d994f2f308 extensions/ipylab/static/78.bae6a35721d5e7309228.js
+9dc62dfa1fc2e1667e5a9f73bfc4e1ac112d5bdbcef0c852b2b60255dd0d536e extensions/ipylab/static/856.9dc62dfa1fc2e1667e5a.js
+1c9b77c557d03a2498f48d3fb030eeb821165a49c08e1c0cd737ccc28491ec83 extensions/ipylab/static/remoteEntry.1c9b77c557d03a2498f4.js
+b918b1c5b96c9496ab148177dcb9a02bb5b80486013eec2213b4cc04152d38b2 extensions/ipylab/static/style.js
+6103eefb6e2f3b43ef69b933adf6d494408db940d5023d15d8440d963bfc8b85 extensions/ipylab/static/third-party-licenses.json
+5b90c1a3c707e0358fbf90b5708a606bd2462d82bb68a99efc8c471527e23cac extensions/jupyterlab_pygments/install.json
+767f13b688136457613b8a92042d27458da3dea128ae5e89415f54e5ea293ae1 extensions/jupyterlab_pygments/package.json
+1e2faa2ba0bbe59c478051deae97846f78131976aa98eb4ffdfa24b62624d8ef extensions/jupyterlab_pygments/static/568.1e2faa2ba0bbe59c4780.js
+8eb3ddccc7ec4987bff977b8d08cd6363d18d9358865fb9859dfb88218a854ca extensions/jupyterlab_pygments/static/747.8eb3ddccc7ec4987bff9.js
+aa1060b2d1221f8e56881edb9c97f25c237d6a8c23e6f85e9a6435831fbfbafd extensions/jupyterlab_pygments/static/remoteEntry.aa1060b2d1221f8e5688.js
+e3b0092f744dcfb50677cb8ef548ba825c2c39c593cd0888260434bf03744636 extensions/jupyterlab_pygments/static/style.js
+3ff5632ca092319dec5ee3dc920f1b0f207c5e7f090fb12c888a11aaf48fde1d extensions/jupyterlab_pygments/static/third-party-licenses.json
+61107269d3d589dce6276bea9d431b1e5f9617cc7c1e4e6ab721ca6f8a802596 icon-120x120.png
+00e924b892be5ab55bcae0723af5b58b9a112be5581333a2f22fc1d8fc03a823 icon-512x512.png
+18686b756f0d484c2cacd6341bcaf11838c27545afc63365fea999549e2a6706 index.html
+a0be8c339022b0274d470e9cad95a2219990e9a52e3546fa1cfb03796e7ca271 jupyter-lite.ipynb
+9794f42766e978662c479c0016bf9ece08bfd60a3558a7e6cee348946ad6cb2d jupyter-lite.json
+07c6b7f64a85cdfea5711c7e1ca3d1bb85677e900ede823e5c67dc8f9236358d jupyterlite.schema.v0.json
+77ac37c2dddf508511cbde591c04669dee88b674e5a96c55346ab0c3859c3a44 kernelspecs/javascript.svg
+269dbffc9f6da7ec050f8842545913297253a0b1948c2096d4a1125eb726a1f0 lab/favicon.ico
+2f53d6455a90296e127ab47009406b886ac034c1395a85d0f35bdd71cf74658f lab/index.html
+a0be8c339022b0274d470e9cad95a2219990e9a52e3546fa1cfb03796e7ca271 lab/jupyter-lite.ipynb
+16af44981003cdcacf052ea97053d74433898b3e4b3cfefddc8b76308a914199 lab/jupyter-lite.json
+a2699c5d16d89cb45f07e1a6c89d32b5e020ef1062bda54ed2708cc9b7bb503a lab/package.json
+a7895c1613b4b5f7d8862ec913159d71175145d6ad1f43bbb87cc0d37a888292 lab/tree/index.html
+00c81a3b301fcee4ede5803e68a238348adbe096ac3000e62c6b7e44756903b5 lab/workspaces/index.html
+914311af1964b53158390d84b5fb130814a8d6015d81d13169c07d78d979fe10 manifest.webmanifest
+bdc9953d2d1269811c8c036354fc55cd7ee8a1ddc7cfe7e9ec539d339da91a02 package.json
+a0f333b61345deb7991d26ff5d00d7d75b69e91cbfe23eebff8e45bc47019524 repl/index.html
+a0be8c339022b0274d470e9cad95a2219990e9a52e3546fa1cfb03796e7ca271 repl/jupyter-lite.ipynb
+16af44981003cdcacf052ea97053d74433898b3e4b3cfefddc8b76308a914199 repl/jupyter-lite.json
+9e3d4935e10d93927d486c2f2880bd33b163f5a8fc130b269e8b612087ee8238 repl/package.json
+4f3790b5ffd133fcabb8601cfd1b2b193e192d2c4561ee2e6893e2e473222e01 retro/consoles/favicon.ico
+e6ad1a2bb87f7e1bf49f2cc1ff2d95d31c3a136ccdacd10d107fcb0a6975d8d2 retro/consoles/index.html
+a0be8c339022b0274d470e9cad95a2219990e9a52e3546fa1cfb03796e7ca271 retro/consoles/jupyter-lite.ipynb
+9b5af5ec9240a4f92845d8679eeb693113d5e2fdf094addd8a75346b10ad4605 retro/consoles/jupyter-lite.json
+8d19ae451c9f411a6c60124ac750e3bee8719ff26f405de1c5abff629c51b329 retro/edit/favicon.ico
+ed66eb70af1bd8bf499714aed4d0d21439e7d3468c590d6f2ebe611aa4965789 retro/edit/index.html
+a0be8c339022b0274d470e9cad95a2219990e9a52e3546fa1cfb03796e7ca271 retro/edit/jupyter-lite.ipynb
+7d1c468f1718e46075aee33164848a0a3e7db3efbc37c62280ca1093748cf0f3 retro/edit/jupyter-lite.json
+c2638a89fde3633617ec624088730c1dbe4daf18d4f2e44729ece89df3e60176 retro/favicon.ico
+8f8d0a6cc71ce3687662b5f4c9f1c73afa71046a6a8a86dc665e6bd056c5965c retro/index.html
+a0be8c339022b0274d470e9cad95a2219990e9a52e3546fa1cfb03796e7ca271 retro/jupyter-lite.ipynb
+f99c3873115ee2185aca6e974bacfb56cbd3089932a8acb7a07c197d18546729 retro/jupyter-lite.json
+e3d7b23e611172246668523675a107764d13fe65d0110de3d399de851515fe1c retro/notebooks/favicon.ico
+c22d29a7057ef601200e04bedc675ba3ba73ae9dd90d3a7c4fc73c809d43232d retro/notebooks/index.html
+a0be8c339022b0274d470e9cad95a2219990e9a52e3546fa1cfb03796e7ca271 retro/notebooks/jupyter-lite.ipynb
+694291933e0ebaa2512ecec7094dbf922d452964bffec062aa1313004698b70f retro/notebooks/jupyter-lite.json
+c2fa8471b09dcaeac91f0537d37ddda8a0ea8909ce12c8edd78e799de689a056 retro/package.json
+eaabb3eb432669ed2cf9768b639368447e24c0736245a23cbfe7de74a4ac6c3e retro/tree/index.html
+a0be8c339022b0274d470e9cad95a2219990e9a52e3546fa1cfb03796e7ca271 retro/tree/jupyter-lite.ipynb
+103c611e51e2af5b51a2b5984c3e0831063b548a65f0ba511d955024fc7c57ff retro/tree/jupyter-lite.json
+ddb3ca2dce51cba09f2ffdb7574ec246498965a37ba83e816f5bb76f3e6a7ef2 service-worker-f7de73d.js
+667f3e9f1646657dba450cd8bb05eb315e955c116152a20bf23cb7bdc46e5755 tree/index.html
\ No newline at end of file
diff --git a/_static/api/translations/all.json b/_static/api/translations/all.json
new file mode 100644
index 0000000..0f1a90e
--- /dev/null
+++ b/_static/api/translations/all.json
@@ -0,0 +1,9 @@
+{
+ "data": {
+ "en": {
+ "displayName": "English",
+ "nativeName": "English"
+ }
+ },
+ "message": ""
+}
\ No newline at end of file
diff --git a/_static/api/translations/en.json b/_static/api/translations/en.json
new file mode 100644
index 0000000..2d378ee
--- /dev/null
+++ b/_static/api/translations/en.json
@@ -0,0 +1,4 @@
+{
+ "data": {},
+ "message": ""
+}
\ No newline at end of file
diff --git a/_static/bootstrap.js b/_static/bootstrap.js
new file mode 100644
index 0000000..917b4f5
--- /dev/null
+++ b/_static/bootstrap.js
@@ -0,0 +1,93 @@
+/*-----------------------------------------------------------------------------
+| Copyright (c) Jupyter Development Team.
+| Distributed under the terms of the Modified BSD License.
+|----------------------------------------------------------------------------*/
+
+// We copy some of the pageconfig parsing logic in @jupyterlab/coreutils
+// below, since this must run before any other files are loaded (including
+// @jupyterlab/coreutils).
+
+/**
+ * Get global configuration data for the Jupyter application.
+ *
+ * @param name - The name of the configuration option.
+ *
+ * @returns The config value or an empty string if not found.
+ *
+ * #### Notes
+ * All values are treated as strings. For browser based applications, it is
+ * assumed that the page HTML includes a script tag with the id
+ * `jupyter-config-data` containing the configuration as valid JSON.
+ */
+
+let _CONFIG_DATA = null;
+function getOption(name) {
+ if (_CONFIG_DATA === null) {
+ let configData = {};
+ // Use script tag if available.
+ if (typeof document !== 'undefined' && document) {
+ const el = document.getElementById('jupyter-config-data');
+
+ if (el) {
+ configData = JSON.parse(el.textContent || '{}');
+ }
+ }
+ _CONFIG_DATA = configData;
+ }
+
+ return _CONFIG_DATA[name] || '';
+}
+
+// eslint-disable-next-line no-undef
+__webpack_public_path__ = getOption('fullStaticUrl') + '/';
+
+function loadScript(url) {
+ return new Promise((resolve, reject) => {
+ const newScript = document.createElement('script');
+ newScript.onerror = reject;
+ newScript.onload = resolve;
+ newScript.async = true;
+ document.head.appendChild(newScript);
+ newScript.src = url;
+ });
+}
+
+async function loadComponent(url, scope) {
+ await loadScript(url);
+
+ // From https://webpack.js.org/concepts/module-federation/#dynamic-remote-containers
+ await __webpack_init_sharing__('default');
+ const container = window._JUPYTERLAB[scope];
+ // Initialize the container, it may provide shared modules and may need ours
+ await container.init(__webpack_share_scopes__.default);
+}
+
+void (async function bootstrap() {
+ // This is all the data needed to load and activate plugins. This should be
+ // gathered by the server and put onto the initial page template.
+ const extension_data = getOption('federated_extensions');
+
+ // We first load all federated components so that the shared module
+ // deduplication can run and figure out which shared modules from all
+ // components should be actually used. We have to do this before importing
+ // and using the module that actually uses these components so that all
+ // dependencies are initialized.
+ let labExtensionUrl = getOption('fullLabextensionsUrl');
+ const extensions = await Promise.allSettled(
+ extension_data.map(async data => {
+ await loadComponent(`${labExtensionUrl}/${data.name}/${data.load}`, data.name);
+ })
+ );
+
+ extensions.forEach(p => {
+ if (p.status === 'rejected') {
+ // There was an error loading the component
+ console.error(p.reason);
+ }
+ });
+
+ // Now that all federated containers are initialized with the main
+ // container, we can import the main function.
+ let main = (await import('./index.js')).main;
+ void main();
+})();
diff --git a/_static/build/1037.51967a2.js b/_static/build/1037.51967a2.js
new file mode 100644
index 0000000..b0afdf0
--- /dev/null
+++ b/_static/build/1037.51967a2.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunk_JUPYTERLAB_CORE_OUTPUT=self.webpackChunk_JUPYTERLAB_CORE_OUTPUT||[]).push([[1037,9321],{49321:(t,e,s)=>{s.r(e),s.d(e,{IInspector:()=>C,InspectionHandler:()=>c,InspectorPanel:()=>u,KernelConnector:()=>g});var n=s(55941),i=s(20040),o=s(26169),r=s(61313),d=s(70942);class c{constructor(t){this._cleared=new d.Signal(this),this._disposed=new d.Signal(this),this._editor=null,this._inspected=new d.Signal(this),this._isDisposed=!1,this._pending=0,this._standby=!0,this._lastInspectedReply=null,this._connector=t.connector,this._rendermime=t.rendermime,this._debouncer=new r.Debouncer(this.onEditorChange.bind(this),250)}get cleared(){return this._cleared}get disposed(){return this._disposed}get inspected(){return this._inspected}get editor(){return this._editor}set editor(t){if(t===this._editor)return;d.Signal.disconnectReceiver(this);const e=this._editor=t;e&&(this._cleared.emit(void 0),this.onEditorChange(),e.model.selections.changed.connect(this._onChange,this),e.model.value.changed.connect(this._onChange,this))}get standby(){return this._standby}set standby(t){this._standby=t}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,this._debouncer.dispose(),this._disposed.emit(void 0),d.Signal.clearData(this))}onEditorChange(t){if(this._standby)return;const e=this.editor;if(!e)return;const s=t||e.model.value.text,r=e.getCursorPosition(),d=n.Text.jsIndexToCharIndex(e.getOffsetAt(r),s),c={content:null},a=++this._pending;this._connector.fetch({offset:d,text:s}).then((t=>{if(!t||this.isDisposed||a!==this._pending)return this._lastInspectedReply=null,void this._inspected.emit(c);const{data:e}=t;if(this._lastInspectedReply&&o.JSONExt.deepEqual(this._lastInspectedReply,e))return;const s=this._rendermime.preferredMimeType(e);if(s){const t=this._rendermime.createRenderer(s),n=new i.MimeModel({data:e});t.renderModel(n),c.content=t}this._lastInspectedReply=t.data,this._inspected.emit(c)})).catch((t=>{this._lastInspectedReply=null,this._inspected.emit(c)}))}_onChange(){this._debouncer.invoke()}}var a=s(2814),h=s(4265),l=s(94519);const p="jp-Inspector-content";class u extends l.Panel{constructor(t={}){super(),this._source=null,this.translator=t.translator||h.nullTranslator,this._trans=this.translator.load("jupyterlab"),t.initialContent instanceof l.Widget?this._content=t.initialContent:"string"==typeof t.initialContent?this._content=u._generateContentWidget(`
${t.initialContent}
`):this._content=u._generateContentWidget(""+this._trans.__("Click on a function to see documentation.")+"
"),this.addClass("jp-Inspector"),this.layout.addWidget(this._content)}[a.Printing.symbol](){return()=>a.Printing.printWidget(this)}get source(){return this._source}set source(t){this._source!==t&&(this._source&&(this._source.standby=!0,this._source.inspected.disconnect(this.onInspectorUpdate,this),this._source.disposed.disconnect(this.onSourceDisposed,this)),t&&t.isDisposed&&(t=null),this._source=t,this._source&&(this._source.standby=!1,this._source.inspected.connect(this.onInspectorUpdate,this),this._source.disposed.connect(this.onSourceDisposed,this)))}dispose(){this.isDisposed||(this.source=null,super.dispose())}onInspectorUpdate(t,e){const{content:s}=e;s&&s!==this._content&&(this._content.dispose(),this._content=s,s.addClass(p),this.layout.addWidget(s))}onSourceDisposed(t,e){this.source=null}static _generateContentWidget(t){const e=new l.Widget;return e.node.innerHTML=t,e.addClass(p),e.addClass("jp-Inspector-default-content"),e}}var _=s(63050);class g extends _.DataConnector{constructor(t){super(),this._sessionContext=t.sessionContext}fetch(t){var e;const s=null===(e=this._sessionContext.session)||void 0===e?void 0:e.kernel;if(!s)return Promise.reject(new Error("Inspection fetch requires a kernel."));const n={code:t.text,cursor_pos:t.offset,detail_level:1};return s.requestInspect(n).then((t=>{const e=t.content;if("ok"!==e.status||!e.found)throw new Error("Inspection fetch failed to return successfully.");return{data:e.data,metadata:e.metadata}}))}}const C=new o.Token("@jupyterlab/inspector:IInspector")}}]);
+//# sourceMappingURL=1037.51967a2.js.map
\ No newline at end of file
diff --git a/_static/build/1037.51967a2.js.map b/_static/build/1037.51967a2.js.map
new file mode 100644
index 0000000..7820d18
--- /dev/null
+++ b/_static/build/1037.51967a2.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"1037.51967a2.js","mappings":"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","sources":["webpack://_JUPYTERLAB.CORE_OUTPUT/../src/handler.ts","webpack://_JUPYTERLAB.CORE_OUTPUT/../src/inspector.ts","webpack://_JUPYTERLAB.CORE_OUTPUT/../src/kernelconnector.ts","webpack://_JUPYTERLAB.CORE_OUTPUT/../src/tokens.ts"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/build/1079.cdbaf67.js b/_static/build/1079.cdbaf67.js
new file mode 100644
index 0000000..7b23c00
--- /dev/null
+++ b/_static/build/1079.cdbaf67.js
@@ -0,0 +1,2 @@
+(self.webpackChunk_JUPYTERLAB_CORE_OUTPUT=self.webpackChunk_JUPYTERLAB_CORE_OUTPUT||[]).push([[1079],{11079:function(t,e,o){!function(t){"use strict";var e="undefined"!=typeof window?window:void 0!==o.g?o.g:"undefined"!=typeof self?self:{},r=function(t,e){if(e=e.split(":")[0],!(t=+t))return!1;switch(e){case"http":case"ws":return 80!==t;case"https":case"wss":return 443!==t;case"ftp":return 21!==t;case"gopher":return 70!==t;case"file":return!1}return 0!==t},n=Object.prototype.hasOwnProperty;function i(t){try{return decodeURIComponent(t.replace(/\+/g," "))}catch(t){return null}}function s(t){try{return encodeURIComponent(t)}catch(t){return null}}var a={stringify:function(t,e){e=e||"";var o,r,i=[];for(r in"string"!=typeof e&&(e="?"),t)if(n.call(t,r)){if((o=t[r])||null!=o&&!isNaN(o)||(o=""),r=s(r),o=s(o),null===r||null===o)continue;i.push(r+"="+o)}return i.length?e+i.join("&"):""},parse:function(t){for(var e,o=/([^=?#&]+)=?([^&]*)/g,r={};e=o.exec(t);){var n=i(e[1]),s=i(e[2]);null===n||null===s||n in r||(r[n]=s)}return r}},c=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,p=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,u=new RegExp("^[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]+");function h(t){return(t||"").toString().replace(u,"")}var l=[["#","hash"],["?","query"],function(t,e){return y(e.protocol)?t.replace(/\\/g,"/"):t},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d+)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],f={hash:1,query:1};function d(t){var o,r=("undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{}).location||{},n={},i=typeof(t=t||r);if("blob:"===t.protocol)n=new E(unescape(t.pathname),{});else if("string"===i)for(o in n=new E(t,{}),f)delete n[o];else if("object"===i){for(o in t)o in f||(n[o]=t[o]);void 0===n.slashes&&(n.slashes=c.test(t.href))}return n}function y(t){return"file:"===t||"ftp:"===t||"http:"===t||"https:"===t||"ws:"===t||"wss:"===t}function v(t,e){t=h(t),e=e||{};var o,r=p.exec(t),n=r[1]?r[1].toLowerCase():"",i=!!r[2],s=!!r[3],a=0;return i?s?(o=r[2]+r[3]+r[4],a=r[2].length+r[3].length):(o=r[2]+r[4],a=r[2].length):s?(o=r[3]+r[4],a=r[3].length):o=r[4],"file:"===n?a>=2&&(o=o.slice(2)):y(n)?o=r[4]:n?i&&(o=o.slice(2)):a>=2&&y(e.protocol)&&(o=r[4]),{protocol:n,slashes:i||y(n),slashesCount:a,rest:o}}function E(t,e,o){if(t=h(t),!(this instanceof E))return new E(t,e,o);var n,i,s,c,p,u,f=l.slice(),b=typeof e,g=this,m=0;for("object"!==b&&"string"!==b&&(o=e,e=null),o&&"function"!=typeof o&&(o=a.parse),n=!(i=v(t||"",e=d(e))).protocol&&!i.slashes,g.slashes=i.slashes||n&&e.slashes,g.protocol=i.protocol||e.protocol||"",t=i.rest,("file:"===g.protocol||!i.slashes&&(i.protocol||i.slashesCount<2||!y(g.protocol)))&&(f[3]=[/(.*)/,"pathname"]);m=0?t.slice(0,e):t}w.prototype.addEventListener=function(t,e){"function"==typeof e&&(Array.isArray(this.listeners[t])||(this.listeners[t]=[]),0===function(t,e){void 0===t&&(t=[]);var o=[];return t.forEach((function(t){e(t)&&o.push(t)})),o}(this.listeners[t],(function(t){return t===e})).length&&this.listeners[t].push(e))},w.prototype.removeEventListener=function(t,e){var o=this.listeners[t];this.listeners[t]=S(o,(function(t){return t===e}))},w.prototype.dispatchEvent=function(t){for(var e=this,o=[],r=arguments.length-1;r-- >0;)o[r]=arguments[r+1];var n=t.type,i=this.listeners[n];return!!Array.isArray(i)&&(i.forEach((function(r){o.length>0?r.apply(e,o):r.call(e,t)})),!0)};var C=function(){this.urlMap={}};C.prototype.attachWebSocket=function(t,e){var o=O(e),r=this.urlMap[o];if(r&&r.server&&-1===r.websockets.indexOf(t))return r.websockets.push(t),r.server},C.prototype.addMembershipToRoom=function(t,e){var o=this.urlMap[O(t.url)];o&&o.server&&-1!==o.websockets.indexOf(t)&&(o.roomMemberships[e]||(o.roomMemberships[e]=[]),o.roomMemberships[e].push(t))},C.prototype.attachServer=function(t,e){var o=O(e);if(!this.urlMap[o])return this.urlMap[o]={server:t,websockets:[],roomMemberships:{}},t},C.prototype.serverLookup=function(t){var e=O(t),o=this.urlMap[e];if(o)return o.server},C.prototype.websocketsLookup=function(t,e,o){var r,n=O(t),i=this.urlMap[n];return r=i?i.websockets:[],e&&(r=i.roomMemberships[e]||[]),o?r.filter((function(t){return t!==o})):r},C.prototype.removeServer=function(t){delete this.urlMap[O(t)]},C.prototype.removeWebSocket=function(t,e){var o=O(e),r=this.urlMap[o];r&&(r.websockets=S(r.websockets,(function(e){return e===t})))},C.prototype.removeMembershipFromRoom=function(t,e){var o=this.urlMap[O(t.url)],r=o.roomMemberships[e];o&&null!==r&&(o.roomMemberships[e]=S(r,(function(e){return e===t})))};var k=new C,L=1e3,R=1005,T=1006,N={CONSTRUCTOR_ERROR:"Failed to construct 'WebSocket':",CLOSE_ERROR:"Failed to execute 'close' on 'WebSocket':",EVENT:{CONSTRUCT:"Failed to construct 'Event':",MESSAGE:"Failed to construct 'MessageEvent':",CLOSE:"Failed to construct 'CloseEvent':"}},_=function(){};_.prototype.stopPropagation=function(){},_.prototype.stopImmediatePropagation=function(){},_.prototype.initEvent=function(t,e,o){void 0===t&&(t="undefined"),void 0===e&&(e=!1),void 0===o&&(o=!1),this.type=""+t,this.bubbles=Boolean(e),this.cancelable=Boolean(o)};var A=function(t){function e(e,o){if(void 0===o&&(o={}),t.call(this),!e)throw new TypeError(N.EVENT_ERROR+" 1 argument required, but only 0 present.");if("object"!=typeof o)throw new TypeError(N.EVENT_ERROR+" parameter 2 ('eventInitDict') is not an object.");var r=o.bubbles,n=o.cancelable;this.type=""+e,this.timeStamp=Date.now(),this.target=null,this.srcElement=null,this.returnValue=!0,this.isTrusted=!1,this.eventPhase=0,this.defaultPrevented=!1,this.currentTarget=null,this.cancelable=!!n&&Boolean(n),this.cancelBubble=!1,this.bubbles=!!r&&Boolean(r)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(_),I=function(t){function e(e,o){if(void 0===o&&(o={}),t.call(this),!e)throw new TypeError(N.EVENT.MESSAGE+" 1 argument required, but only 0 present.");if("object"!=typeof o)throw new TypeError(N.EVENT.MESSAGE+" parameter 2 ('eventInitDict') is not an object");var r=o.bubbles,n=o.cancelable,i=o.data,s=o.origin,a=o.lastEventId,c=o.ports;this.type=""+e,this.timeStamp=Date.now(),this.target=null,this.srcElement=null,this.returnValue=!0,this.isTrusted=!1,this.eventPhase=0,this.defaultPrevented=!1,this.currentTarget=null,this.cancelable=!!n&&Boolean(n),this.canncelBubble=!1,this.bubbles=!!r&&Boolean(r),this.origin=""+s,this.ports=void 0===c?null:c,this.data=void 0===i?null:i,this.lastEventId=""+(a||"")}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(_),P=function(t){function e(e,o){if(void 0===o&&(o={}),t.call(this),!e)throw new TypeError(N.EVENT.CLOSE+" 1 argument required, but only 0 present.");if("object"!=typeof o)throw new TypeError(N.EVENT.CLOSE+" parameter 2 ('eventInitDict') is not an object");var r=o.bubbles,n=o.cancelable,i=o.code,s=o.reason,a=o.wasClean;this.type=""+e,this.timeStamp=Date.now(),this.target=null,this.srcElement=null,this.returnValue=!0,this.isTrusted=!1,this.eventPhase=0,this.defaultPrevented=!1,this.currentTarget=null,this.cancelable=!!n&&Boolean(n),this.cancelBubble=!1,this.bubbles=!!r&&Boolean(r),this.code="number"==typeof i?parseInt(i,10):0,this.reason=""+(s||""),this.wasClean=!!a&&Boolean(a)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(_);function j(t){var e=t.type,o=t.target,r=new A(e);return o&&(r.target=o,r.srcElement=o,r.currentTarget=o),r}function W(t){var e=t.type,o=t.origin,r=t.data,n=t.target,i=new I(e,{data:r,origin:o});return n&&(i.target=n,i.srcElement=n,i.currentTarget=n),i}function x(t){var e=t.code,o=t.reason,r=t.type,n=t.target,i=t.wasClean;i||(i=e===L||e===R);var s=new P(r,{code:e,reason:o,wasClean:i});return n&&(s.target=n,s.srcElement=n,s.currentTarget=n),s}function M(t,e,o){t.readyState=B.CLOSING;var r=k.serverLookup(t.url),n=x({type:"close",target:t.target,code:e,reason:o}),i=x({type:"server::close",target:t,code:e,reason:o});g((function(){k.removeWebSocket(t,t.url),t.readyState=B.CLOSED,t.dispatchEvent(n),t.dispatchEvent(i),r&&r.dispatchEvent(n,r)}),t)}function D(t){return"[object Blob]"===Object.prototype.toString.call(t)||t instanceof ArrayBuffer||(t=String(t)),t}var U=new WeakMap;function G(t){if(U.has(t))return U.get(t);var e=new Proxy(t,{get:function(o,r){return"close"===r?function(t){void 0===t&&(t={});var o=t.code||L,r=t.reason||"";M(e,o,r)}:"send"===r?function(e){e=D(e),t.dispatchEvent(W({type:"message",data:e,origin:this.url,target:t}))}:"on"===r?function(e,o){t.addEventListener("server::"+e,o)}:"target"===r?t:o[r]}});return U.set(t,e),e}var B=function(t){function e(o,r){t.call(this),this._onopen=null,this._onmessage=null,this._onerror=null,this._onclose=null,this.url=function(t){var e=new b(t),o=e.pathname,r=e.protocol,n=e.hash;if(!t)throw new TypeError(N.CONSTRUCTOR_ERROR+" 1 argument required, but only 0 present.");if(o||(e.pathname="/"),""===r)throw new SyntaxError(N.CONSTRUCTOR_ERROR+" The URL '"+e.toString()+"' is invalid.");if("ws:"!==r&&"wss:"!==r)throw new SyntaxError(N.CONSTRUCTOR_ERROR+" The URL's scheme must be either 'ws' or 'wss'. '"+r+"' is not allowed.");if(""!==n)throw new SyntaxError(N.CONSTRUCTOR_ERROR+" The URL contains a fragment identifier ('"+n+"'). Fragment identifiers are not allowed in WebSocket URLs.");return e.toString()}(o),r=function(t){if(void 0===t&&(t=[]),!Array.isArray(t)&&"string"!=typeof t)throw new SyntaxError(N.CONSTRUCTOR_ERROR+" The subprotocol '"+t.toString()+"' is invalid.");"string"==typeof t&&(t=[t]);var e=t.map((function(t){return{count:1,protocol:t}})).reduce((function(t,e){return t[e.protocol]=(t[e.protocol]||0)+e.count,t}),{}),o=Object.keys(e).filter((function(t){return e[t]>1}));if(o.length>0)throw new SyntaxError(N.CONSTRUCTOR_ERROR+" The subprotocol '"+o[0]+"' is duplicated.");return t}(r),this.protocol=r[0]||"",this.binaryType="blob",this.readyState=e.CONNECTING;var n=G(this),i=k.attachWebSocket(n,this.url);g((function(){if(i)if(i.options.verifyClient&&"function"==typeof i.options.verifyClient&&!i.options.verifyClient())this.readyState=e.CLOSED,m("error","WebSocket connection to '"+this.url+"' failed: HTTP Authentication failed; no valid credentials available"),k.removeWebSocket(n,this.url),this.dispatchEvent(j({type:"error",target:this})),this.dispatchEvent(x({type:"close",target:this,code:L}));else{if(i.options.selectProtocol&&"function"==typeof i.options.selectProtocol){var t=i.options.selectProtocol(r),o=""!==t,s=-1!==r.indexOf(t);if(o&&!s)return this.readyState=e.CLOSED,m("error","WebSocket connection to '"+this.url+"' failed: Invalid Sub-Protocol"),k.removeWebSocket(n,this.url),this.dispatchEvent(j({type:"error",target:this})),void this.dispatchEvent(x({type:"close",target:this,code:L}));this.protocol=t}this.readyState=e.OPEN,this.dispatchEvent(j({type:"open",target:this})),i.dispatchEvent(j({type:"connection"}),n)}else this.readyState=e.CLOSED,this.dispatchEvent(j({type:"error",target:this})),this.dispatchEvent(x({type:"close",target:this,code:L})),m("error","WebSocket connection to '"+this.url+"' failed")}),this)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var o={onopen:{},onmessage:{},onclose:{},onerror:{}};return o.onopen.get=function(){return this._onopen},o.onmessage.get=function(){return this._onmessage},o.onclose.get=function(){return this._onclose},o.onerror.get=function(){return this._onerror},o.onopen.set=function(t){this.removeEventListener("open",this._onopen),this._onopen=t,this.addEventListener("open",t)},o.onmessage.set=function(t){this.removeEventListener("message",this._onmessage),this._onmessage=t,this.addEventListener("message",t)},o.onclose.set=function(t){this.removeEventListener("close",this._onclose),this._onclose=t,this.addEventListener("close",t)},o.onerror.set=function(t){this.removeEventListener("error",this._onerror),this._onerror=t,this.addEventListener("error",t)},e.prototype.send=function(t){var o=this;if(this.readyState===e.CLOSING||this.readyState===e.CLOSED)throw new Error("WebSocket is already in CLOSING or CLOSED state");var r=W({type:"server::message",origin:this.url,data:D(t)}),n=k.serverLookup(this.url);n&&g((function(){o.dispatchEvent(r,t)}),n)},e.prototype.close=function(t,o){if(void 0!==t&&("number"!=typeof t||1e3!==t&&(t<3e3||t>4999)))throw new TypeError(N.CLOSE_ERROR+" The code must be either 1000, or between 3000 and 4999. "+t+" is neither.");if(void 0!==o&&(r=o,n=encodeURIComponent(r).match(/%[89ABab]/g),r.length+(n?n.length:0)>123))throw new SyntaxError(N.CLOSE_ERROR+" The message must not be greater than 123 bytes.");var r,n;if(this.readyState!==e.CLOSING&&this.readyState!==e.CLOSED){var i=G(this);this.readyState===e.CONNECTING?function(t,e,o){t.readyState=B.CLOSING;var r=k.serverLookup(t.url),n=x({type:"close",target:t.target,code:e,reason:o,wasClean:!1}),i=x({type:"server::close",target:t,code:e,reason:o,wasClean:!1}),s=j({type:"error",target:t.target});g((function(){k.removeWebSocket(t,t.url),t.readyState=B.CLOSED,t.dispatchEvent(s),t.dispatchEvent(n),t.dispatchEvent(i),r&&r.dispatchEvent(n,r)}),t)}(i,t||T,o):M(i,t||R,o)}},Object.defineProperties(e.prototype,o),e}(w);B.CONNECTING=0,B.prototype.CONNECTING=B.CONNECTING,B.OPEN=1,B.prototype.OPEN=B.OPEN,B.CLOSING=2,B.prototype.CLOSING=B.CLOSING,B.CLOSED=3,B.prototype.CLOSED=B.CLOSED;function q(){return"undefined"!=typeof window?window:"object"==typeof o.g?o.g:this}var F={mock:!0,verifyClient:null,selectProtocol:null},V=function(t){function e(e,o){void 0===o&&(o=F),t.call(this);var r=new b(e);if(r.pathname||(r.pathname="/"),this.url=r.toString(),this.originalWebSocket=null,!k.attachServer(this,this.url))throw this.dispatchEvent(j({type:"error"})),new Error("A mock server is already listening on this url");this.options=Object.assign({},F,o),this.options.mock&&this.mockWebsocket()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.mockWebsocket=function(){var t=q();this.originalWebSocket=t.WebSocket,t.WebSocket=B},e.prototype.restoreWebsocket=function(){var t=q();null!==this.originalWebSocket&&(t.WebSocket=this.originalWebSocket),this.originalWebSocket=null},e.prototype.stop=function(t){void 0===t&&(t=function(){}),this.options.mock&&this.restoreWebsocket(),k.removeServer(this.url),"function"==typeof t&&t()},e.prototype.on=function(t,e){this.addEventListener(t,e)},e.prototype.close=function(t){void 0===t&&(t={});var e=t.code,o=t.reason,r=t.wasClean,n=k.websocketsLookup(this.url);k.removeServer(this.url),n.forEach((function(t){t.readyState=B.CLOSED,t.dispatchEvent(x({type:"close",target:t.target,code:e||L,reason:o||"",wasClean:r}))})),this.dispatchEvent(x({type:"close"}),this)},e.prototype.emit=function(t,e,o){var r=this;void 0===o&&(o={});var n=o.websockets;n||(n=k.websocketsLookup(this.url)),e="object"!=typeof o||arguments.length>3?(e=Array.prototype.slice.call(arguments,1,arguments.length)).map((function(t){return D(t)})):D(e),n.forEach((function(o){Array.isArray(e)?o.dispatchEvent.apply(o,[W({type:t,data:e,origin:r.url,target:o.target})].concat(e)):o.dispatchEvent(W({type:t,data:e,origin:r.url,target:o.target}))}))},e.prototype.clients=function(){return k.websocketsLookup(this.url)},e.prototype.to=function(t,e,o){var r=this;void 0===o&&(o=[]);var n=this,i=o.concat(k.websocketsLookup(this.url,t,e)).reduce((function(t,e){return t.indexOf(e)>-1?t:t.concat(e)}),[]);return{to:function(t,e){return r.to.call(r,t,e,i)},emit:function(t,e){n.emit(t,e,{websockets:i})}}},e.prototype.in=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];return this.to.apply(null,t)},e.prototype.simulate=function(t){var e=k.websocketsLookup(this.url);"error"===t&&e.forEach((function(t){t.readyState=B.CLOSED,t.dispatchEvent(j({type:"error"}))}))},e}(w);V.of=function(t){return new V(t)};var z=function(t){function e(o,r){var n=this;void 0===o&&(o="socket.io"),void 0===r&&(r=""),t.call(this),this.binaryType="blob";var i=new b(o);i.pathname||(i.pathname="/"),this.url=i.toString(),this.readyState=e.CONNECTING,this.protocol="",this.target=this,"string"==typeof r||"object"==typeof r&&null!==r?this.protocol=r:Array.isArray(r)&&r.length>0&&(this.protocol=r[0]);var s=k.attachWebSocket(this,this.url);g((function(){s?(this.readyState=e.OPEN,s.dispatchEvent(j({type:"connection"}),s,this),s.dispatchEvent(j({type:"connect"}),s,this),this.dispatchEvent(j({type:"connect",target:this}))):(this.readyState=e.CLOSED,this.dispatchEvent(j({type:"error",target:this})),this.dispatchEvent(x({type:"close",target:this,code:L})),m("error","Socket.io connection to '"+this.url+"' failed"))}),this),this.addEventListener("close",(function(t){n.dispatchEvent(x({type:"disconnect",target:t.target,code:t.code}))}))}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var o={broadcast:{}};return e.prototype.close=function(){if(this.readyState===e.OPEN){var t=k.serverLookup(this.url);return k.removeWebSocket(this,this.url),this.readyState=e.CLOSED,this.dispatchEvent(x({type:"close",target:this,code:L})),t&&t.dispatchEvent(x({type:"disconnect",target:this,code:L}),t),this}},e.prototype.disconnect=function(){return this.close()},e.prototype.emit=function(t){for(var o=[],r=arguments.length-1;r-- >0;)o[r]=arguments[r+1];if(this.readyState!==e.OPEN)throw new Error("SocketIO is already in CLOSING or CLOSED state");var n=W({type:t,origin:this.url,data:o}),i=k.serverLookup(this.url);return i&&i.dispatchEvent.apply(i,[n].concat(o)),this},e.prototype.send=function(t){return this.emit("message",t),this},o.broadcast.get=function(){if(this.readyState!==e.OPEN)throw new Error("SocketIO is already in CLOSING or CLOSED state");var t=this,o=k.serverLookup(this.url);if(!o)throw new Error("SocketIO can not find a server at the specified URL ("+this.url+")");return{emit:function(e,r){return o.emit(e,r,{websockets:k.websocketsLookup(t.url,null,t)}),t},to:function(e){return o.to(e,t)},in:function(e){return o.in(e,t)}}},e.prototype.on=function(t,e){return this.addEventListener(t,e),this},e.prototype.off=function(t,e){this.removeEventListener(t,e)},e.prototype.hasListeners=function(t){var e=this.listeners[t];return!!Array.isArray(e)&&!!e.length},e.prototype.join=function(t){k.addMembershipToRoom(this,t)},e.prototype.leave=function(t){k.removeMembershipFromRoom(this,t)},e.prototype.to=function(t){return this.broadcast.to(t)},e.prototype.in=function(){return this.to.apply(null,arguments)},e.prototype.dispatchEvent=function(t){for(var e=this,o=[],r=arguments.length-1;r-- >0;)o[r]=arguments[r+1];var n=t.type,i=this.listeners[n];if(!Array.isArray(i))return!1;i.forEach((function(r){o.length>0?r.apply(e,o):r.call(e,t.data?t.data:t)}))},Object.defineProperties(e.prototype,o),e}(w);z.CONNECTING=0,z.OPEN=1,z.CLOSING=2,z.CLOSED=3;var J=function(t,e){return new z(t,e)};J.connect=function(t,e){return J(t,e)};var Y=V,Z=B,$=J;t.Server=Y,t.WebSocket=Z,t.SocketIO=$,Object.defineProperty(t,"__esModule",{value:!0})}(e)}}]);
+//# sourceMappingURL=1079.cdbaf67.js.map
\ No newline at end of file
diff --git a/_static/build/1079.cdbaf67.js.map b/_static/build/1079.cdbaf67.js.map
new file mode 100644
index 0000000..26731cc
--- /dev/null
+++ b/_static/build/1079.cdbaf67.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"1079.cdbaf67.js","mappings":"6HAIQ,SAAWA,GAAW,aAE9B,IAAIC,EAAmC,oBAAXC,OAAyBA,YAA2B,IAAX,EAAAC,EAAyB,EAAAA,EAAyB,oBAATC,KAAuBA,KAAO,CAAC,EAWzIC,EAAe,SAAkBC,EAAMC,GAIzC,GAHAA,EAAWA,EAASC,MAAM,KAAK,KAC/BF,GAAQA,GAEK,OAAO,EAEpB,OAAQC,GACN,IAAK,OACL,IAAK,KACL,OAAgB,KAATD,EAEP,IAAK,QACL,IAAK,MACL,OAAgB,MAATA,EAEP,IAAK,MACL,OAAgB,KAATA,EAEP,IAAK,SACL,OAAgB,KAATA,EAEP,IAAK,OACL,OAAO,EAGT,OAAgB,IAATA,CACT,EAEIG,EAAMC,OAAOC,UAAUC,eAU3B,SAASC,EAAOC,GACd,IACE,OAAOC,mBAAmBD,EAAME,QAAQ,MAAO,KAGjD,CAFE,MAAOC,GACP,OAAO,IACT,CACF,CASA,SAASC,EAAOJ,GACd,IACE,OAAOK,mBAAmBL,EAG5B,CAFE,MAAOG,GACP,OAAO,IACT,CACF,CAmFA,IAGIG,EAAmB,CACtBC,UA9CD,SAAwBC,EAAKC,GAC3BA,EAASA,GAAU,GAEnB,IACIC,EACAC,EAFAC,EAAQ,GASZ,IAAKD,IAFD,iBAAoBF,IAAUA,EAAS,KAE/BD,EACV,GAAIb,EAAIkB,KAAKL,EAAKG,GAAM,CAkBtB,IAjBAD,EAAQF,EAAIG,KAMGD,UAAqCI,MAAMJ,KACxDA,EAAQ,IAGVC,EAAMP,EAAOO,GACbD,EAAQN,EAAOM,GAMH,OAARC,GAA0B,OAAVD,EAAkB,SACtCE,EAAMG,KAAKJ,EAAK,IAAKD,EACvB,CAGF,OAAOE,EAAMI,OAASP,EAASG,EAAMK,KAAK,KAAO,EACnD,EAUCC,MA/ED,SAAqBC,GAKnB,IAJA,IAEIC,EAFAC,EAAS,uBACTC,EAAS,CAAC,EAGPF,EAAOC,EAAOE,KAAKJ,IAAQ,CAChC,IAAIR,EAAMZ,EAAOqB,EAAK,IAClBV,EAAQX,EAAOqB,EAAK,IAUZ,OAART,GAA0B,OAAVD,GAAkBC,KAAOW,IAC7CA,EAAOX,GAAOD,EAChB,CAEA,OAAOY,CACT,GA4DIE,EAAU,gCACVC,EAAa,mDAEbC,EAAO,IAAIC,OAAO,gLAQtB,SAASC,EAASC,GAChB,OAAQA,GAAY,IAAIC,WAAW5B,QAAQwB,EAAM,GACnD,CAcA,IAAIK,EAAQ,CACV,CAAC,IAAK,QACN,CAAC,IAAK,SACN,SAAkBC,EAASC,GACzB,OAAOC,EAAUD,EAAIxC,UAAYuC,EAAQ9B,QAAQ,MAAO,KAAO8B,CACjE,EACA,CAAC,IAAK,YACN,CAAC,IAAK,OAAQ,GACd,CAACG,IAAK,YAAQC,EAAW,EAAG,GAC5B,CAAC,UAAW,YAAQA,EAAW,GAC/B,CAACD,IAAK,gBAAYC,EAAW,EAAG,IAW9BC,EAAS,CAAEC,KAAM,EAAGnB,MAAO,GAc/B,SAASoB,EAAUC,GACjB,IAYI7B,EALA8B,GALkB,oBAAXrD,OAAsCA,YACd,IAAnBD,EAA8CA,EACrC,oBAATG,KAAoCA,KACjC,CAAC,GAEKmD,UAAY,CAAC,EAGlCC,EAAmB,CAAC,EACpBC,SAHJH,EAAMA,GAAOC,GAMb,GAAI,UAAYD,EAAI/C,SAClBiD,EAAmB,IAAIE,EAAIC,SAASL,EAAIM,UAAW,CAAC,QAC/C,GAAI,WAAaH,EAEtB,IAAKhC,KADL+B,EAAmB,IAAIE,EAAIJ,EAAK,CAAC,GACrBH,SAAiBK,EAAiB/B,QACzC,GAAI,WAAagC,EAAM,CAC5B,IAAKhC,KAAO6B,EACN7B,KAAO0B,IACXK,EAAiB/B,GAAO6B,EAAI7B,SAGGyB,IAA7BM,EAAiBlB,UACnBkB,EAAiBlB,QAAUA,EAAQuB,KAAKP,EAAIQ,MAEhD,CAEA,OAAON,CACT,CASA,SAASR,EAAUe,GACjB,MACa,UAAXA,GACW,SAAXA,GACW,UAAXA,GACW,WAAXA,GACW,QAAXA,GACW,SAAXA,CAEJ,CAkBA,SAASC,EAAgBlB,EAASS,GAChCT,EAAUJ,EAASI,GACnBS,EAAWA,GAAY,CAAC,EAExB,IAKIU,EALAC,EAAQ3B,EAAWF,KAAKS,GACxBvC,EAAW2D,EAAM,GAAKA,EAAM,GAAGC,cAAgB,GAC/CC,IAAmBF,EAAM,GACzBG,IAAiBH,EAAM,GACvBI,EAAe,EAkCnB,OA/BIF,EACEC,GACFJ,EAAOC,EAAM,GAAKA,EAAM,GAAKA,EAAM,GACnCI,EAAeJ,EAAM,GAAGpC,OAASoC,EAAM,GAAGpC,SAE1CmC,EAAOC,EAAM,GAAKA,EAAM,GACxBI,EAAeJ,EAAM,GAAGpC,QAGtBuC,GACFJ,EAAOC,EAAM,GAAKA,EAAM,GACxBI,EAAeJ,EAAM,GAAGpC,QAExBmC,EAAOC,EAAM,GAIA,UAAb3D,EACE+D,GAAgB,IAClBL,EAAOA,EAAKM,MAAM,IAEXvB,EAAUzC,GACnB0D,EAAOC,EAAM,GACJ3D,EACL6D,IACFH,EAAOA,EAAKM,MAAM,IAEXD,GAAgB,GAAKtB,EAAUO,EAAShD,YACjD0D,EAAOC,EAAM,IAGR,CACL3D,SAAUA,EACV+B,QAAS8B,GAAkBpB,EAAUzC,GACrC+D,aAAcA,EACdL,KAAMA,EAEV,CAoDA,SAASP,EAAIZ,EAASS,EAAUpB,GAG9B,GAFAW,EAAUJ,EAASI,KAEb0B,gBAAgBd,GACpB,OAAO,IAAIA,EAAIZ,EAASS,EAAUpB,GAGpC,IAAIsC,EAAUC,EAAW1C,EAAO2C,EAAaC,EAAOnD,EAChDoD,EAAehC,EAAM0B,QACrBd,SAAcF,EACdR,EAAMyB,KACNM,EAAI,EA6CR,IAhCI,WAAarB,GAAQ,WAAaA,IACpCtB,EAASoB,EACTA,EAAW,MAGTpB,GAAU,mBAAsBA,IAAUA,EAASf,EAAiBY,OAQxEyC,IADAC,EAAYV,EAAgBlB,GAAW,GALvCS,EAAWF,EAAUE,KAMChD,WAAamE,EAAUpC,QAC7CS,EAAIT,QAAUoC,EAAUpC,SAAWmC,GAAYlB,EAASjB,QACxDS,EAAIxC,SAAWmE,EAAUnE,UAAYgD,EAAShD,UAAY,GAC1DuC,EAAU4B,EAAUT,MAOD,UAAjBlB,EAAIxC,WACFmE,EAAUpC,UACToC,EAAUnE,UACTmE,EAAUJ,aAAe,IACxBtB,EAAUD,EAAIxC,cAEnBsE,EAAa,GAAK,CAAC,OAAQ,aAGtBC,EAAID,EAAa/C,OAAQgD,IAGH,mBAF3BH,EAAcE,EAAaC,KAO3B9C,EAAQ2C,EAAY,GACpBlD,EAAMkD,EAAY,GAEd3C,GAAUA,EACZe,EAAItB,GAAOqB,EACF,iBAAoBd,IACvB4C,EAAQ9B,EAAQiC,QAAQ/C,MACxB,iBAAoB2C,EAAY,IAClC5B,EAAItB,GAAOqB,EAAQyB,MAAM,EAAGK,GAC5B9B,EAAUA,EAAQyB,MAAMK,EAAQD,EAAY,MAE5C5B,EAAItB,GAAOqB,EAAQyB,MAAMK,GACzB9B,EAAUA,EAAQyB,MAAM,EAAGK,MAGrBA,EAAQ5C,EAAMK,KAAKS,MAC7BC,EAAItB,GAAOmD,EAAM,GACjB9B,EAAUA,EAAQyB,MAAM,EAAGK,EAAMA,QAGnC7B,EAAItB,GAAOsB,EAAItB,IACbgD,GAAYE,EAAY,IAAKpB,EAAS9B,IAAa,GAOjDkD,EAAY,KAAM5B,EAAItB,GAAOsB,EAAItB,GAAK0C,gBAhCxCrB,EAAU6B,EAAY7B,EAASC,GAwC/BZ,IAAUY,EAAId,MAAQE,EAAOY,EAAId,QAMjCwC,GACClB,EAASjB,SACkB,MAA3BS,EAAIa,SAASoB,OAAO,KACF,KAAjBjC,EAAIa,UAAyC,KAAtBL,EAASK,YAEpCb,EAAIa,SAzJR,SAAiBa,EAAUQ,GACzB,GAAiB,KAAbR,EAAmB,OAAOQ,EAQ9B,IANA,IAAIC,GAAQD,GAAQ,KAAKzE,MAAM,KAAK+D,MAAM,GAAI,GAAGY,OAAOV,EAASjE,MAAM,MACnEsE,EAAII,EAAKpD,OACTsD,EAAOF,EAAKJ,EAAI,GAChBO,GAAU,EACVC,EAAK,EAEFR,KACW,MAAZI,EAAKJ,GACPI,EAAKK,OAAOT,EAAG,GACM,OAAZI,EAAKJ,IACdI,EAAKK,OAAOT,EAAG,GACfQ,KACSA,IACC,IAANR,IAAWO,GAAU,GACzBH,EAAKK,OAAOT,EAAG,GACfQ,KAOJ,OAHID,GAAWH,EAAKG,QAAQ,IACf,MAATD,GAAyB,OAATA,GAAiBF,EAAKrD,KAAK,IAExCqD,EAAKnD,KAAK,IACnB,CA+HmByD,CAAQzC,EAAIa,SAAUL,EAASK,WAOjB,MAA3Bb,EAAIa,SAASoB,OAAO,IAAchC,EAAUD,EAAIxC,YAClDwC,EAAIa,SAAW,IAAMb,EAAIa,UAQtBvD,EAAa0C,EAAIzC,KAAMyC,EAAIxC,YAC9BwC,EAAI0C,KAAO1C,EAAI2C,SACf3C,EAAIzC,KAAO,IAMbyC,EAAI4C,SAAW5C,EAAI6C,SAAW,GAC1B7C,EAAI8C,OACNlB,EAAc5B,EAAI8C,KAAKrF,MAAM,KAC7BuC,EAAI4C,SAAWhB,EAAY,IAAM,GACjC5B,EAAI6C,SAAWjB,EAAY,IAAM,IAGnC5B,EAAI+C,OAA0B,UAAjB/C,EAAIxC,UAAwByC,EAAUD,EAAIxC,WAAawC,EAAI0C,KACpE1C,EAAIxC,SAAU,KAAMwC,EAAI0C,KACxB,OAKJ1C,EAAIe,KAAOf,EAAIH,UACjB,CAgIAc,EAAI/C,UAAY,CAAEoF,IAjHlB,SAAa7D,EAAMV,EAAOwE,GACxB,IAAIjD,EAAMyB,KAEV,OAAQtC,GACN,IAAK,QACC,iBAAoBV,GAASA,EAAMM,SACrCN,GAASwE,GAAM5E,EAAiBY,OAAOR,IAGzCuB,EAAIb,GAAQV,EACZ,MAEF,IAAK,OACHuB,EAAIb,GAAQV,EAEPnB,EAAamB,EAAOuB,EAAIxC,UAGlBiB,IACTuB,EAAI0C,KAAO1C,EAAI2C,SAAU,IAAKlE,IAH9BuB,EAAI0C,KAAO1C,EAAI2C,SACf3C,EAAIb,GAAQ,IAKd,MAEF,IAAK,WACHa,EAAIb,GAAQV,EAERuB,EAAIzC,OAAQkB,GAAS,IAAKuB,EAAIzC,MAClCyC,EAAI0C,KAAOjE,EACX,MAEF,IAAK,OACHuB,EAAIb,GAAQV,EAER,QAAQqC,KAAKrC,IACfA,EAAQA,EAAMhB,MAAM,KACpBuC,EAAIzC,KAAOkB,EAAMyE,MACjBlD,EAAI2C,SAAWlE,EAAMO,KAAK,OAE1BgB,EAAI2C,SAAWlE,EACfuB,EAAIzC,KAAO,IAGb,MAEF,IAAK,WACHyC,EAAIxC,SAAWiB,EAAM2C,cACrBpB,EAAIT,SAAW0D,EACf,MAEF,IAAK,WACL,IAAK,OACH,GAAIxE,EAAO,CACT,IAAI0E,EAAgB,aAAThE,EAAsB,IAAM,IACvCa,EAAIb,GAAQV,EAAMwD,OAAO,KAAOkB,EAAOA,EAAO1E,EAAQA,CACxD,MACEuB,EAAIb,GAAQV,EAEd,MAEF,QACEuB,EAAIb,GAAQV,EAGhB,IAAK,IAAIsD,EAAI,EAAGA,EAAIjC,EAAMf,OAAQgD,IAAK,CACrC,IAAIqB,EAAMtD,EAAMiC,GAEZqB,EAAI,KAAMpD,EAAIoD,EAAI,IAAMpD,EAAIoD,EAAI,IAAIhC,cAC1C,CAQA,OANApB,EAAI+C,OAA0B,UAAjB/C,EAAIxC,UAAwByC,EAAUD,EAAIxC,WAAawC,EAAI0C,KACpE1C,EAAIxC,SAAU,KAAMwC,EAAI0C,KACxB,OAEJ1C,EAAIe,KAAOf,EAAIH,WAERG,CACT,EAoC4BH,SA3B5B,SAAkBvB,GACXA,GAAa,mBAAsBA,IAAaA,EAAYD,EAAiBC,WAElF,IAAIY,EACAc,EAAMyB,KACNjE,EAAWwC,EAAIxC,SAEfA,GAAqD,MAAzCA,EAASyE,OAAOzE,EAASuB,OAAS,KAAcvB,GAAY,KAE5E,IAAI6B,EAAS7B,GAAYwC,EAAIT,SAAWU,EAAUD,EAAIxC,UAAY,KAAO,IAezE,OAbIwC,EAAI4C,WACNvD,GAAUW,EAAI4C,SACV5C,EAAI6C,WAAYxD,GAAU,IAAKW,EAAI6C,UACvCxD,GAAU,KAGZA,GAAUW,EAAI0C,KAAO1C,EAAIa,UAEzB3B,EAAQ,iBAAoBc,EAAId,MAAQZ,EAAU0B,EAAId,OAASc,EAAId,SACtDG,GAAU,MAAQH,EAAM+C,OAAO,GAAK,IAAK/C,EAAQA,GAE1Dc,EAAIK,OAAQhB,GAAUW,EAAIK,MAEvBhB,CACT,GAQAsB,EAAIM,gBAAkBA,EACtBN,EAAIH,SAAWF,EACfK,EAAIhB,SAAWA,EACfgB,EAAI0C,GAAKhF,EAET,IAAIiF,EAAW3C,EAUf,SAAS4C,EAAMC,EAAUC,GACvBC,YAAW,SAAUC,GAAkB,OAAOH,EAAS5E,KAAK+E,EAAiB,GAAG,EAAGF,EACrF,CAEA,SAASG,EAAIC,EAAQC,GAGjBC,QAAQF,GAAQjF,KAAK,KAAMkF,EAG/B,CAEA,SAASE,EAAOC,EAAOT,QACN,IAAVS,IAAmBA,EAAQ,IAEhC,IAAIC,EAAU,GAOd,OANAD,EAAME,SAAQ,SAAUC,GACjBZ,EAASY,IACZF,EAAQpF,KAAKsF,EAEjB,IAEOF,CACT,CAqBA,IAAIG,EAAc,WAChB5C,KAAK6C,UAAY,CAAC,CACpB,EAgEA,SAASC,EAAqBvE,GAC5B,IAAIwE,EAAaxE,EAAIgC,QAAQ,KAC7B,OAAOwC,GAAc,EAAIxE,EAAIwB,MAAM,EAAGgD,GAAcxE,CACtD,CAzDAqE,EAAYzG,UAAU6G,iBAAmB,SAA2B/D,EAAMgE,GAChD,mBAAbA,IACJC,MAAMC,QAAQnD,KAAK6C,UAAU5D,MAChCe,KAAK6C,UAAU5D,GAAQ,IAIkE,IAtC/F,SAAgBuD,EAAOT,QACN,IAAVS,IAAmBA,EAAQ,IAEhC,IAAIC,EAAU,GAOd,OANAD,EAAME,SAAQ,SAAUC,GAClBZ,EAASY,IACXF,EAAQpF,KAAKsF,EAEjB,IAEOF,CACT,CA2BQW,CAAOpD,KAAK6C,UAAU5D,IAAO,SAAUoE,GAAQ,OAAOA,IAASJ,CAAU,IAAG3F,QAC9E0C,KAAK6C,UAAU5D,GAAM5B,KAAK4F,GAGhC,EASAL,EAAYzG,UAAUmH,oBAAsB,SAA8BrE,EAAMsE,GAC9E,IAAIC,EAAmBxD,KAAK6C,UAAU5D,GACtCe,KAAK6C,UAAU5D,GAAQsD,EAAOiB,GAAkB,SAAUP,GAAY,OAAOA,IAAaM,CAAkB,GAC9G,EAQAX,EAAYzG,UAAUsH,cAAgB,SAAwBC,GAG1D,IAFA,IAAIC,EAAS3D,KACT4D,EAAkB,GAAIC,EAAMC,UAAUxG,OAAS,EAC3CuG,KAAQ,GAAID,EAAiBC,GAAQC,UAAWD,EAAM,GAEhE,IAAIE,EAAYL,EAAMzE,KAClB4D,EAAY7C,KAAK6C,UAAUkB,GAE/B,QAAKb,MAAMC,QAAQN,KAInBA,EAAUH,SAAQ,SAAUO,GACtBW,EAAgBtG,OAAS,EAC3B2F,EAASe,MAAML,EAAQC,GAEvBX,EAAS9F,KAAKwG,EAAQD,EAE1B,KAEO,EACT,EAYA,IAAIO,EAAgB,WAClBjE,KAAKkE,OAAS,CAAC,CACjB,EASAD,EAAc9H,UAAUgI,gBAAkB,SAA0BC,EAAW7F,GAC7E,IAAI8F,EAAYvB,EAAqBvE,GACjC+F,EAAmBtE,KAAKkE,OAAOG,GAEnC,GAAIC,GAAoBA,EAAiBC,SAA8D,IAApDD,EAAiBE,WAAWjE,QAAQ6D,GAErF,OADAE,EAAiBE,WAAWnH,KAAK+G,GAC1BE,EAAiBC,MAE5B,EAKAN,EAAc9H,UAAUsI,oBAAsB,SAA8BL,EAAWM,GACrF,IAAIJ,EAAmBtE,KAAKkE,OAAOpB,EAAqBsB,EAAU7F,MAE9D+F,GAAoBA,EAAiBC,SAA8D,IAApDD,EAAiBE,WAAWjE,QAAQ6D,KAChFE,EAAiBK,gBAAgBD,KACpCJ,EAAiBK,gBAAgBD,GAAQ,IAG3CJ,EAAiBK,gBAAgBD,GAAMrH,KAAK+G,GAEhD,EASAH,EAAc9H,UAAUyI,aAAe,SAAuBL,EAAQhG,GACpE,IAAIsG,EAAY/B,EAAqBvE,GAGrC,IAFuByB,KAAKkE,OAAOW,GASjC,OANA7E,KAAKkE,OAAOW,GAAa,CACvBN,OAAQA,EACRC,WAAY,GACZG,gBAAiB,CAAC,GAGbJ,CAEX,EAOAN,EAAc9H,UAAU2I,aAAe,SAAuBvG,GAC5D,IAAI8F,EAAYvB,EAAqBvE,GACjC+F,EAAmBtE,KAAKkE,OAAOG,GAEnC,GAAIC,EACF,OAAOA,EAAiBC,MAE5B,EASAN,EAAc9H,UAAU4I,iBAAmB,SAA2BxG,EAAKmG,EAAMM,GAC/E,IACIR,EADAH,EAAYvB,EAAqBvE,GAEjC+F,EAAmBtE,KAAKkE,OAAOG,GASnC,OAPAG,EAAaF,EAAmBA,EAAiBE,WAAa,GAE1DE,IAEFF,EADcF,EAAiBK,gBAAgBD,IACvB,IAGnBM,EAAcR,EAAWpB,QAAO,SAAUgB,GAAa,OAAOA,IAAcY,CAAa,IAAKR,CACvG,EAOAP,EAAc9H,UAAU8I,aAAe,SAAuB1G,UACrDyB,KAAKkE,OAAOpB,EAAqBvE,GAC1C,EAQA0F,EAAc9H,UAAU+I,gBAAkB,SAA0Bd,EAAW7F,GAC7E,IAAI8F,EAAYvB,EAAqBvE,GACjC+F,EAAmBtE,KAAKkE,OAAOG,GAE/BC,IACFA,EAAiBE,WAAajC,EAAO+B,EAAiBE,YAAY,SAAUW,GAAU,OAAOA,IAAWf,CAAW,IAEvH,EAKAH,EAAc9H,UAAUiJ,yBAA2B,SAAmChB,EAAWM,GAC/F,IAAIJ,EAAmBtE,KAAKkE,OAAOpB,EAAqBsB,EAAU7F,MAC9D8G,EAAcf,EAAiBK,gBAAgBD,GAE/CJ,GAAoC,OAAhBe,IACtBf,EAAiBK,gBAAgBD,GAAQnC,EAAO8C,GAAa,SAAUF,GAAU,OAAOA,IAAWf,CAAW,IAElH,EAEA,IAAIkB,EAAgB,IAAIrB,EAKpBsB,EACY,IADZA,EAKe,KALfA,EAMc,KAWdC,EAAe,CACjBC,kBAAmB,mCACnBC,YAAa,4CACbC,MAAO,CACLC,UAAW,+BACXC,QAAS,sCACTC,MAAO,sCAIPC,EAAiB,WAA4B,EAEjDA,EAAe5J,UAAU6J,gBAAkB,WAA6B,EACxED,EAAe5J,UAAU8J,yBAA2B,WAAsC,EAI1FF,EAAe5J,UAAU+J,UAAY,SAAoBjH,EAAMkH,EAASC,QACtD,IAATnH,IAAkBA,EAAO,kBACb,IAAZkH,IAAqBA,GAAU,QAChB,IAAfC,IAAwBA,GAAa,GAE5CpG,KAAKf,KAAO,GAAKA,EACjBe,KAAKmG,QAAUE,QAAQF,GACvBnG,KAAKoG,WAAaC,QAAQD,EAC5B,EAEA,IAAIE,EAAS,SAAUC,GACrB,SAASD,EAAMrH,EAAMuH,GAKnB,QAJyB,IAApBA,IAA6BA,EAAkB,CAAC,GAErDD,EAAkBpJ,KAAK6C,OAElBf,EACH,MAAM,IAAIwH,UAAYjB,EAAwB,YAAI,6CAGpD,GAA+B,iBAApBgB,EACT,MAAM,IAAIC,UAAYjB,EAAwB,YAAI,oDAGpD,IAAIW,EAAUK,EAAgBL,QAC1BC,EAAaI,EAAgBJ,WAEjCpG,KAAKf,KAAO,GAAKA,EACjBe,KAAK0G,UAAYC,KAAKC,MACtB5G,KAAK6G,OAAS,KACd7G,KAAK8G,WAAa,KAClB9G,KAAK+G,aAAc,EACnB/G,KAAKgH,WAAY,EACjBhH,KAAKiH,WAAa,EAClBjH,KAAKkH,kBAAmB,EACxBlH,KAAKmH,cAAgB,KACrBnH,KAAKoG,aAAaA,GAAaC,QAAQD,GACvCpG,KAAKoH,cAAe,EACpBpH,KAAKmG,UAAUA,GAAUE,QAAQF,EACnC,CAMA,OAJKI,IAAoBD,EAAMe,UAAYd,GAC3CD,EAAMnK,UAAYD,OAAOoL,OAAQf,GAAqBA,EAAkBpK,WACxEmK,EAAMnK,UAAUoL,YAAcjB,EAEvBA,CACT,CApCY,CAoCVP,GAEEyB,EAAgB,SAAUjB,GAC5B,SAASiB,EAAavI,EAAMuH,GAK1B,QAJyB,IAApBA,IAA6BA,EAAkB,CAAC,GAErDD,EAAkBpJ,KAAK6C,OAElBf,EACH,MAAM,IAAIwH,UAAYjB,EAAaG,MAAa,QAAI,6CAGtD,GAA+B,iBAApBa,EACT,MAAM,IAAIC,UAAYjB,EAAaG,MAAa,QAAI,mDAGtD,IAAIQ,EAAUK,EAAgBL,QAC1BC,EAAaI,EAAgBJ,WAC7BqB,EAAOjB,EAAgBiB,KACvBnG,EAASkF,EAAgBlF,OACzBoG,EAAclB,EAAgBkB,YAC9BC,EAAQnB,EAAgBmB,MAE5B3H,KAAKf,KAAO,GAAKA,EACjBe,KAAK0G,UAAYC,KAAKC,MACtB5G,KAAK6G,OAAS,KACd7G,KAAK8G,WAAa,KAClB9G,KAAK+G,aAAc,EACnB/G,KAAKgH,WAAY,EACjBhH,KAAKiH,WAAa,EAClBjH,KAAKkH,kBAAmB,EACxBlH,KAAKmH,cAAgB,KACrBnH,KAAKoG,aAAaA,GAAaC,QAAQD,GACvCpG,KAAK4H,eAAgB,EACrB5H,KAAKmG,UAAUA,GAAUE,QAAQF,GACjCnG,KAAKsB,OAAS,GAAKA,EACnBtB,KAAK2H,WAAyB,IAAVA,EAAwB,KAAOA,EACnD3H,KAAKyH,UAAuB,IAATA,EAAuB,KAAOA,EACjDzH,KAAK0H,YAAc,IAAMA,GAAe,GAC1C,CAMA,OAJKnB,IAAoBiB,EAAaH,UAAYd,GAClDiB,EAAarL,UAAYD,OAAOoL,OAAQf,GAAqBA,EAAkBpK,WAC/EqL,EAAarL,UAAUoL,YAAcC,EAE9BA,CACT,CA5CmB,CA4CjBzB,GAEE8B,EAAc,SAAUtB,GAC1B,SAASsB,EAAW5I,EAAMuH,GAKxB,QAJyB,IAApBA,IAA6BA,EAAkB,CAAC,GAErDD,EAAkBpJ,KAAK6C,OAElBf,EACH,MAAM,IAAIwH,UAAYjB,EAAaG,MAAW,MAAI,6CAGpD,GAA+B,iBAApBa,EACT,MAAM,IAAIC,UAAYjB,EAAaG,MAAW,MAAI,mDAGpD,IAAIQ,EAAUK,EAAgBL,QAC1BC,EAAaI,EAAgBJ,WAC7B0B,EAAOtB,EAAgBsB,KACvBC,EAASvB,EAAgBuB,OACzBC,EAAWxB,EAAgBwB,SAE/BhI,KAAKf,KAAO,GAAKA,EACjBe,KAAK0G,UAAYC,KAAKC,MACtB5G,KAAK6G,OAAS,KACd7G,KAAK8G,WAAa,KAClB9G,KAAK+G,aAAc,EACnB/G,KAAKgH,WAAY,EACjBhH,KAAKiH,WAAa,EAClBjH,KAAKkH,kBAAmB,EACxBlH,KAAKmH,cAAgB,KACrBnH,KAAKoG,aAAaA,GAAaC,QAAQD,GACvCpG,KAAKoH,cAAe,EACpBpH,KAAKmG,UAAUA,GAAUE,QAAQF,GACjCnG,KAAK8H,KAAuB,iBAATA,EAAoBG,SAASH,EAAM,IAAM,EAC5D9H,KAAK+H,OAAS,IAAMA,GAAU,IAC9B/H,KAAKgI,WAAWA,GAAW3B,QAAQ2B,EACrC,CAMA,OAJKzB,IAAoBsB,EAAWR,UAAYd,GAChDsB,EAAW1L,UAAYD,OAAOoL,OAAQf,GAAqBA,EAAkBpK,WAC7E0L,EAAW1L,UAAUoL,YAAcM,EAE5BA,CACT,CA1CiB,CA0Cf9B,GAQF,SAASmC,EAAYC,GACnB,IAAIlJ,EAAOkJ,EAAOlJ,KACd4H,EAASsB,EAAOtB,OAChBuB,EAAc,IAAI9B,EAAMrH,GAQ5B,OANI4H,IACFuB,EAAYvB,OAASA,EACrBuB,EAAYtB,WAAaD,EACzBuB,EAAYjB,cAAgBN,GAGvBuB,CACT,CAQA,SAASC,EAAmBF,GAC1B,IAAIlJ,EAAOkJ,EAAOlJ,KACdqC,EAAS6G,EAAO7G,OAChBmG,EAAOU,EAAOV,KACdZ,EAASsB,EAAOtB,OAChByB,EAAe,IAAId,EAAavI,EAAM,CACxCwI,KAAMA,EACNnG,OAAQA,IASV,OANIuF,IACFyB,EAAazB,OAASA,EACtByB,EAAaxB,WAAaD,EAC1ByB,EAAanB,cAAgBN,GAGxByB,CACT,CAQA,SAASC,EAAiBJ,GACxB,IAAIL,EAAOK,EAAOL,KACdC,EAASI,EAAOJ,OAChB9I,EAAOkJ,EAAOlJ,KACd4H,EAASsB,EAAOtB,OAChBmB,EAAWG,EAAOH,SAEjBA,IACHA,EAAWF,IAASvC,GAA4BuC,IAASvC,GAG3D,IAAIiD,EAAa,IAAIX,EAAW5I,EAAM,CACpC6I,KAAMA,EACNC,OAAQA,EACRC,SAAUA,IASZ,OANInB,IACF2B,EAAW3B,OAASA,EACpB2B,EAAW1B,WAAaD,EACxB2B,EAAWrB,cAAgBN,GAGtB2B,CACT,CAEA,SAASC,EAAyBzG,EAAS8F,EAAMC,GAC/C/F,EAAQ0G,WAAaC,EAAYC,QAEjC,IAAIrE,EAASe,EAAcR,aAAa9C,EAAQzD,KAC5CiK,EAAaD,EAAiB,CAChCtJ,KAAM,QACN4H,OAAQ7E,EAAQ6E,OAChBiB,KAAMA,EACNC,OAAQA,IAENc,EAAmBN,EAAiB,CACtCtJ,KAAM,gBACN4H,OAAQ7E,EACR8F,KAAMA,EACNC,OAAQA,IAGVjG,GAAM,WACJwD,EAAcJ,gBAAgBlD,EAASA,EAAQzD,KAE/CyD,EAAQ0G,WAAaC,EAAYG,OACjC9G,EAAQyB,cAAc+E,GACtBxG,EAAQyB,cAAcoF,GAElBtE,GACFA,EAAOd,cAAc+E,EAAYjE,EAErC,GAAGvC,EACL,CAwCA,SAAS+G,EAAkBtB,GAKzB,MAJ6C,kBAAzCvL,OAAOC,UAAUiC,SAASjB,KAAKsK,IAA+BA,aAAgBuB,cAChFvB,EAAOwB,OAAOxB,IAGTA,CACT,CAEA,IAAIyB,EAAU,IAAIC,QAElB,SAASC,EAAavC,GACpB,GAAIqC,EAAQjN,IAAI4K,GACd,OAAOqC,EAAQG,IAAIxC,GAGrB,IAAIyC,EAAQ,IAAIC,MAAM1C,EAAQ,CAC5BwC,IAAK,SAAavM,EAAK0M,GACrB,MAAa,UAATA,EACK,SAAeC,QACH,IAAZA,IAAqBA,EAAU,CAAC,GAErC,IAAI3B,EAAO2B,EAAQ3B,MAAQvC,EACvBwC,EAAS0B,EAAQ1B,QAAU,GAE/BU,EAAyBa,EAAOxB,EAAMC,EACxC,EAGW,SAATyB,EACK,SAAc/B,GACnBA,EAAOsB,EAAkBtB,GAEzBZ,EAAOpD,cACL4E,EAAmB,CACjBpJ,KAAM,UACNwI,KAAMA,EACNnG,OAAQtB,KAAKzB,IACbsI,OAAQA,IAGd,EAGW,OAAT2C,EACK,SAAmBvK,EAAMyK,GAC9B7C,EAAO7D,iBAAkB,WAAa/D,EAAOyK,EAC/C,EAGW,WAATF,EACK3C,EAGF/J,EAAI0M,EACb,IAIF,OAFAN,EAAQ3H,IAAIsF,EAAQyC,GAEbA,CACT,CA4EA,IAAIX,EAAe,SAAUgB,GAC3B,SAASC,EAAUrL,EAAKsL,GACtBF,EAAexM,KAAK6C,MAEpBA,KAAK8J,QAAU,KACf9J,KAAK+J,WAAa,KAClB/J,KAAKgK,SAAW,KAChBhK,KAAKiK,SAAW,KAEhBjK,KAAKzB,IA7ET,SAAyBA,GACvB,IAAI2L,EAAY,IAAIrI,EAAStD,GACzBa,EAAW8K,EAAU9K,SACrBrD,EAAWmO,EAAUnO,SACrB6C,EAAOsL,EAAUtL,KAErB,IAAKL,EACH,MAAM,IAAIkI,UAAYjB,EAA8B,kBAAI,6CAO1D,GAJKpG,IACH8K,EAAU9K,SAAW,KAGN,KAAbrD,EACF,MAAM,IAAIoO,YAAc3E,EAA8B,kBAAI,aAAgB0E,EAAU9L,WAAc,iBAGpG,GAAiB,QAAbrC,GAAmC,SAAbA,EACxB,MAAM,IAAIoO,YACN3E,EAA8B,kBAAI,oDAAsDzJ,EAAW,qBAIzG,GAAa,KAAT6C,EAEF,MAAM,IAAIuL,YACN3E,EAA8B,kBAAI,6CAA+C5G,EAAO,+DAK9F,OAAOsL,EAAU9L,UACnB,CA4CegM,CAAgB7L,GAC3BsL,EA3CJ,SAA8BA,GAG5B,QAFmB,IAAdA,IAAuBA,EAAY,KAEnC3G,MAAMC,QAAQ0G,IAAmC,iBAAdA,EACtC,MAAM,IAAIM,YAAc3E,EAA8B,kBAAI,qBAAwBqE,EAAUzL,WAAc,iBAGnF,iBAAdyL,IACTA,EAAY,CAACA,IAGf,IAAIQ,EAAOR,EACRS,KAAI,SAAUC,GAAK,MAAO,CAAGC,MAAO,EAAGzO,SAAUwO,EAAM,IACvDE,QAAO,SAAUC,EAAGC,GAEnB,OADAD,EAAEC,EAAE5O,WAAa2O,EAAEC,EAAE5O,WAAa,GAAK4O,EAAEH,MAClCE,CACT,GAAG,CAAC,GAEFE,EAAa1O,OAAO2O,KAAKR,GAAMjH,QAAO,SAAUsH,GAAK,OAAOL,EAAKK,GAAK,CAAG,IAE7E,GAAIE,EAAWtN,OAAS,EACtB,MAAM,IAAI6M,YAAc3E,EAA8B,kBAAI,qBAAwBoF,EAAW,GAAM,oBAGrG,OAAOf,CACT,CAkBgBiB,CAAqBjB,GACjC7J,KAAKjE,SAAW8N,EAAU,IAAM,GAEhC7J,KAAK+K,WAAa,OAClB/K,KAAK0I,WAAakB,EAAUoB,WAE5B,IAAIC,EAAS7B,EAAapJ,MACtBuE,EAASe,EAAcnB,gBAAgB8G,EAAQjL,KAAKzB,KAgBxDuD,GAAM,WACJ,GAAIyC,EACF,GACEA,EAAOkF,QAAQyB,cACwB,mBAAhC3G,EAAOkF,QAAQyB,eACrB3G,EAAOkF,QAAQyB,eAEhBlL,KAAK0I,WAAakB,EAAUd,OAE5B3G,EACE,QACC,4BAA+BnC,KAAQ,IAAI,wEAG9CsF,EAAcJ,gBAAgB+F,EAAQjL,KAAKzB,KAC3CyB,KAAKyD,cAAcyE,EAAY,CAAEjJ,KAAM,QAAS4H,OAAQ7G,QACxDA,KAAKyD,cAAc8E,EAAiB,CAAEtJ,KAAM,QAAS4H,OAAQ7G,KAAM8H,KAAMvC,SACpE,CACL,GAAIhB,EAAOkF,QAAQ0B,gBAA2D,mBAAlC5G,EAAOkF,QAAQ0B,eAA+B,CACxF,IAAIC,EAAmB7G,EAAOkF,QAAQ0B,eAAetB,GACjDwB,EAAgC,KAArBD,EACXE,GAAuD,IAAzCzB,EAAUtJ,QAAQ6K,GACpC,GAAIC,IAAaC,EAQf,OAPAtL,KAAK0I,WAAakB,EAAUd,OAE5B3G,EAAI,QAAU,4BAA+BnC,KAAQ,IAAI,kCAEzDsF,EAAcJ,gBAAgB+F,EAAQjL,KAAKzB,KAC3CyB,KAAKyD,cAAcyE,EAAY,CAAEjJ,KAAM,QAAS4H,OAAQ7G,aACxDA,KAAKyD,cAAc8E,EAAiB,CAAEtJ,KAAM,QAAS4H,OAAQ7G,KAAM8H,KAAMvC,KAG3EvF,KAAKjE,SAAWqP,CAClB,CACApL,KAAK0I,WAAakB,EAAU2B,KAC5BvL,KAAKyD,cAAcyE,EAAY,CAAEjJ,KAAM,OAAQ4H,OAAQ7G,QACvDuE,EAAOd,cAAcyE,EAAY,CAAEjJ,KAAM,eAAiBgM,EAC5D,MAEAjL,KAAK0I,WAAakB,EAAUd,OAC5B9I,KAAKyD,cAAcyE,EAAY,CAAEjJ,KAAM,QAAS4H,OAAQ7G,QACxDA,KAAKyD,cAAc8E,EAAiB,CAAEtJ,KAAM,QAAS4H,OAAQ7G,KAAM8H,KAAMvC,KAEzEpD,EAAI,QAAU,4BAA+BnC,KAAQ,IAAI,WAE7D,GAAGA,KACL,CAEK2J,IAAiBC,EAAUvC,UAAYsC,GAC5CC,EAAUzN,UAAYD,OAAOoL,OAAQqC,GAAkBA,EAAexN,WACtEyN,EAAUzN,UAAUoL,YAAcqC,EAElC,IAAI4B,EAAqB,CAAEC,OAAQ,CAAC,EAAEC,UAAW,CAAC,EAAEC,QAAS,CAAC,EAAEC,QAAS,CAAC,GAiG1E,OA/FAJ,EAAmBC,OAAOpC,IAAM,WAC9B,OAAOrJ,KAAK8J,OACd,EAEA0B,EAAmBE,UAAUrC,IAAM,WACjC,OAAOrJ,KAAK+J,UACd,EAEAyB,EAAmBG,QAAQtC,IAAM,WAC/B,OAAOrJ,KAAKiK,QACd,EAEAuB,EAAmBI,QAAQvC,IAAM,WAC/B,OAAOrJ,KAAKgK,QACd,EAEAwB,EAAmBC,OAAOlK,IAAM,SAAU0B,GACxCjD,KAAKsD,oBAAoB,OAAQtD,KAAK8J,SACtC9J,KAAK8J,QAAU7G,EACfjD,KAAKgD,iBAAiB,OAAQC,EAChC,EAEAuI,EAAmBE,UAAUnK,IAAM,SAAU0B,GAC3CjD,KAAKsD,oBAAoB,UAAWtD,KAAK+J,YACzC/J,KAAK+J,WAAa9G,EAClBjD,KAAKgD,iBAAiB,UAAWC,EACnC,EAEAuI,EAAmBG,QAAQpK,IAAM,SAAU0B,GACzCjD,KAAKsD,oBAAoB,QAAStD,KAAKiK,UACvCjK,KAAKiK,SAAWhH,EAChBjD,KAAKgD,iBAAiB,QAASC,EACjC,EAEAuI,EAAmBI,QAAQrK,IAAM,SAAU0B,GACzCjD,KAAKsD,oBAAoB,QAAStD,KAAKgK,UACvChK,KAAKgK,SAAW/G,EAChBjD,KAAKgD,iBAAiB,QAASC,EACjC,EAEA2G,EAAUzN,UAAU0P,KAAO,SAAepE,GACxC,IAAI9D,EAAS3D,KAEb,GAAIA,KAAK0I,aAAekB,EAAUhB,SAAW5I,KAAK0I,aAAekB,EAAUd,OACzE,MAAM,IAAIgD,MAAM,mDAKlB,IAAIxD,EAAeD,EAAmB,CACpCpJ,KAAM,kBACNqC,OAAQtB,KAAKzB,IACbkJ,KAAMsB,EAAkBtB,KAGtBlD,EAASe,EAAcR,aAAa9E,KAAKzB,KAEzCgG,GACFzC,GAAM,WACJ6B,EAAOF,cAAc6E,EAAcb,EACrC,GAAGlD,EAEP,EAEAqF,EAAUzN,UAAU4P,MAAQ,SAAgBjE,EAAMC,GAChD,QAAarJ,IAAToJ,IACkB,iBAATA,GAA+B,MAATA,IAAkBA,EAAO,KAAQA,EAAO,OACvE,MAAM,IAAIrB,UACNjB,EAAwB,YAAI,4DAA8DsC,EAAO,gBAKzG,QAAepJ,IAAXqJ,IA1OmB5J,EA2OU4J,EAzO/BiE,EAAIrP,mBAAmBwB,GAAKuB,MAAM,cAC/BvB,EAAIb,QAAU0O,EAAIA,EAAE1O,OAAS,GA0OnB,KACX,MAAM,IAAI6M,YAAc3E,EAAwB,YAAI,oDA9O5D,IAA2BrH,EAErB6N,EAgPF,GAAIhM,KAAK0I,aAAekB,EAAUhB,SAAW5I,KAAK0I,aAAekB,EAAUd,OAA3E,CAIA,IAAImC,EAAS7B,EAAapJ,MACtBA,KAAK0I,aAAekB,EAAUoB,WA1VtC,SAAiChJ,EAAS8F,EAAMC,GAC9C/F,EAAQ0G,WAAaC,EAAYC,QAEjC,IAAIrE,EAASe,EAAcR,aAAa9C,EAAQzD,KAC5CiK,EAAaD,EAAiB,CAChCtJ,KAAM,QACN4H,OAAQ7E,EAAQ6E,OAChBiB,KAAMA,EACNC,OAAQA,EACRC,UAAU,IAERa,EAAmBN,EAAiB,CACtCtJ,KAAM,gBACN4H,OAAQ7E,EACR8F,KAAMA,EACNC,OAAQA,EACRC,UAAU,IAGRiE,EAAa/D,EAAY,CAC3BjJ,KAAM,QACN4H,OAAQ7E,EAAQ6E,SAGlB/E,GAAM,WACJwD,EAAcJ,gBAAgBlD,EAASA,EAAQzD,KAE/CyD,EAAQ0G,WAAaC,EAAYG,OACjC9G,EAAQyB,cAAcwI,GACtBjK,EAAQyB,cAAc+E,GACtBxG,EAAQyB,cAAcoF,GAElBtE,GACFA,EAAOd,cAAc+E,EAAYjE,EAErC,GAAGvC,EACL,CAuTMkK,CAAwBjB,EAAQnD,GAAQvC,EAA4BwC,GAEpEU,EAAyBwC,EAAQnD,GAAQvC,EAA6BwC,EANxE,CAQF,EAEA7L,OAAOiQ,iBAAkBvC,EAAUzN,UAAWqP,GAEvC5B,CACT,CAvLkB,CAuLhBhH,GAEF+F,EAAYqC,WAAa,EACzBrC,EAAYxM,UAAU6O,WAAarC,EAAYqC,WAC/CrC,EAAY4C,KAAO,EACnB5C,EAAYxM,UAAUoP,KAAO5C,EAAY4C,KACzC5C,EAAYC,QAAU,EACtBD,EAAYxM,UAAUyM,QAAUD,EAAYC,QAC5CD,EAAYG,OAAS,EACrBH,EAAYxM,UAAU2M,OAASH,EAAYG,OAO3C,SAASsD,IACP,MAAsB,oBAAX1Q,OACFA,OAGgF,iBAAX,EAAAC,EAAsB,EAAAA,EAASqE,IAC/G,CAEA,IAAIqM,EAAiB,CACnBC,MAAM,EACNpB,aAAc,KACdC,eAAgB,MAGdoB,EAAY,SAAU5C,GACxB,SAAS6C,EAAOjO,EAAKkL,QACF,IAAZA,IAAqBA,EAAU4C,GAEpC1C,EAAexM,KAAK6C,MACpB,IAAIkK,EAAY,IAAIrI,EAAStD,GAW7B,GATK2L,EAAU9K,WACb8K,EAAU9K,SAAW,KAGvBY,KAAKzB,IAAM2L,EAAU9L,WAErB4B,KAAKyM,kBAAoB,MACZnH,EAAcV,aAAa5E,KAAMA,KAAKzB,KAIjD,MADAyB,KAAKyD,cAAcyE,EAAY,CAAEjJ,KAAM,WACjC,IAAI6M,MAAM,kDAGlB9L,KAAKyJ,QAAUvN,OAAOwQ,OAAO,CAAC,EAAGL,EAAgB5C,GAE7CzJ,KAAKyJ,QAAQ6C,MACftM,KAAK2M,eAET,CA8LA,OA5LKhD,IAAiB6C,EAAOnF,UAAYsC,GACzC6C,EAAOrQ,UAAYD,OAAOoL,OAAQqC,GAAkBA,EAAexN,WACnEqQ,EAAOrQ,UAAUoL,YAAciF,EAK/BA,EAAOrQ,UAAUwQ,cAAgB,WAC/B,IAAIC,EAAYR,IAEhBpM,KAAKyM,kBAAoBG,EAAUhD,UACnCgD,EAAUhD,UAAYjB,CACxB,EAKA6D,EAAOrQ,UAAU0Q,iBAAmB,WAClC,IAAID,EAAYR,IAEe,OAA3BpM,KAAKyM,oBACPG,EAAUhD,UAAY5J,KAAKyM,mBAG7BzM,KAAKyM,kBAAoB,IAC3B,EAMAD,EAAOrQ,UAAU2Q,KAAO,SAAe/K,QACnB,IAAbA,IAAsBA,EAAW,WAAa,GAE/C/B,KAAKyJ,QAAQ6C,MACftM,KAAK6M,mBAGPvH,EAAcL,aAAajF,KAAKzB,KAER,mBAAbwD,GACTA,GAEJ,EAUAyK,EAAOrQ,UAAU4Q,GAAK,SAAa9N,EAAM8C,GACvC/B,KAAKgD,iBAAiB/D,EAAM8C,EAC9B,EASAyK,EAAOrQ,UAAU4P,MAAQ,SAAgBtC,QACtB,IAAZA,IAAqBA,EAAU,CAAC,GAErC,IAAI3B,EAAO2B,EAAQ3B,KACfC,EAAS0B,EAAQ1B,OACjBC,EAAWyB,EAAQzB,SACnBnF,EAAYyC,EAAcP,iBAAiB/E,KAAKzB,KAIpD+G,EAAcL,aAAajF,KAAKzB,KAEhCsE,EAAUH,SAAQ,SAAUyC,GAC1BA,EAAOuD,WAAaC,EAAYG,OAChC3D,EAAO1B,cACL8E,EAAiB,CACftJ,KAAM,QACN4H,OAAQ1B,EAAO0B,OACfiB,KAAMA,GAAQvC,EACdwC,OAAQA,GAAU,GAClBC,SAAUA,IAGhB,IAEAhI,KAAKyD,cAAc8E,EAAiB,CAAEtJ,KAAM,UAAYe,KAC1D,EAKAwM,EAAOrQ,UAAU6Q,KAAO,SAAetJ,EAAO+D,EAAMgC,GAClD,IAAI9F,EAAS3D,UACI,IAAZyJ,IAAqBA,EAAU,CAAC,GAErC,IAAIjF,EAAaiF,EAAQjF,WAEpBA,IACHA,EAAac,EAAcP,iBAAiB/E,KAAKzB,MAKjDkJ,EAFqB,iBAAZgC,GAAwB3F,UAAUxG,OAAS,GACpDmK,EAAOvE,MAAM/G,UAAU4D,MAAM5C,KAAK2G,UAAW,EAAGA,UAAUxG,SAC9CgN,KAAI,SAAUjH,GAAQ,OAAO0F,EAAkB1F,EAAO,IAE3D0F,EAAkBtB,GAG3BjD,EAAW9B,SAAQ,SAAUyC,GACvBjC,MAAMC,QAAQsE,GAChBtC,EAAO1B,cAAcO,MACnBmB,EAAQ,CAAEkD,EAAmB,CAC3BpJ,KAAMyE,EACN+D,KAAMA,EACNnG,OAAQqC,EAAOpF,IACfsI,OAAQ1B,EAAO0B,UACZlG,OAAQ8G,IAGftC,EAAO1B,cACL4E,EAAmB,CACjBpJ,KAAMyE,EACN+D,KAAMA,EACNnG,OAAQqC,EAAOpF,IACfsI,OAAQ1B,EAAO0B,SAIvB,GACF,EAMA2F,EAAOrQ,UAAU8Q,QAAU,WACzB,OAAO3H,EAAcP,iBAAiB/E,KAAKzB,IAC7C,EAOAiO,EAAOrQ,UAAU+Q,GAAK,SAAaxI,EAAMM,EAAamI,GACpD,IAAIxJ,EAAS3D,UACU,IAAlBmN,IAA2BA,EAAgB,IAEhD,IAAIvR,EAAOoE,KACPwE,EAAoB2I,EAAcxM,OAAO2E,EAAcP,iBAAiB/E,KAAKzB,IAAKmG,EAAMM,IAxMvDyF,QAAO,SAAU2C,EAASzC,GAC/D,OAAIyC,EAAQ7M,QAAQoK,IAAM,EAAYyC,EAC/BA,EAAQzM,OAAOgK,EACxB,GAAG,IAuMD,MAAO,CACLuC,GAAI,SAAUG,EAAaC,GAAsB,OAAO3J,EAAOuJ,GAAG/P,KAAKwG,EAAQ0J,EAAaC,EAAoB9I,EAAa,EAC7HwI,KAAM,SAActJ,EAAO+D,GACzB7L,EAAKoR,KAAKtJ,EAAO+D,EAAM,CAAEjD,WAAYA,GACvC,EAEJ,EAKAgI,EAAOrQ,UAAUoR,GAAK,WAEpB,IADA,IAAIC,EAAO,GAAI3J,EAAMC,UAAUxG,OACvBuG,KAAQ2J,EAAM3J,GAAQC,UAAWD,GAEzC,OAAO7D,KAAKkN,GAAGlJ,MAAM,KAAMwJ,EAC7B,EAMAhB,EAAOrQ,UAAUsR,SAAW,SAAmB/J,GAC7C,IAAIb,EAAYyC,EAAcP,iBAAiB/E,KAAKzB,KAEtC,UAAVmF,GACFb,EAAUH,SAAQ,SAAUyC,GAC1BA,EAAOuD,WAAaC,EAAYG,OAChC3D,EAAO1B,cAAcyE,EAAY,CAAEjJ,KAAM,UAC3C,GAEJ,EAEOuN,CACT,CAzNe,CAyNb5J,GAOF2J,EAASmB,GAAK,SAAYnP,GACxB,OAAO,IAAIgO,EAAShO,EACtB,EAOA,IAAIoP,EAAc,SAAUhE,GAC1B,SAASiE,EAASrP,EAAKxC,GACrB,IAAI4H,EAAS3D,UACA,IAARzB,IAAiBA,EAAM,kBACV,IAAbxC,IAAsBA,EAAW,IAEtC4N,EAAexM,KAAK6C,MAEpBA,KAAK+K,WAAa,OAClB,IAAIb,EAAY,IAAIrI,EAAStD,GAExB2L,EAAU9K,WACb8K,EAAU9K,SAAW,KAGvBY,KAAKzB,IAAM2L,EAAU9L,WACrB4B,KAAK0I,WAAakF,EAAS5C,WAC3BhL,KAAKjE,SAAW,GAChBiE,KAAK6G,OAAS7G,KAEU,iBAAbjE,GAA8C,iBAAbA,GAAsC,OAAbA,EACnEiE,KAAKjE,SAAWA,EACPmH,MAAMC,QAAQpH,IAAaA,EAASuB,OAAS,IACtD0C,KAAKjE,SAAWA,EAAS,IAG3B,IAAIwI,EAASe,EAAcnB,gBAAgBnE,KAAMA,KAAKzB,KAKtDuD,GAAM,WACAyC,GACFvE,KAAK0I,WAAakF,EAASrC,KAC3BhH,EAAOd,cAAcyE,EAAY,CAAEjJ,KAAM,eAAiBsF,EAAQvE,MAClEuE,EAAOd,cAAcyE,EAAY,CAAEjJ,KAAM,YAAcsF,EAAQvE,MAC/DA,KAAKyD,cAAcyE,EAAY,CAAEjJ,KAAM,UAAW4H,OAAQ7G,UAE1DA,KAAK0I,WAAakF,EAAS9E,OAC3B9I,KAAKyD,cAAcyE,EAAY,CAAEjJ,KAAM,QAAS4H,OAAQ7G,QACxDA,KAAKyD,cACH8E,EAAiB,CACftJ,KAAM,QACN4H,OAAQ7G,KACR8H,KAAMvC,KAIVpD,EAAI,QAAU,4BAA+BnC,KAAQ,IAAI,YAE7D,GAAGA,MAKHA,KAAKgD,iBAAiB,SAAS,SAAUU,GACvCC,EAAOF,cACL8E,EAAiB,CACftJ,KAAM,aACN4H,OAAQnD,EAAMmD,OACdiB,KAAMpE,EAAMoE,OAGlB,GACF,CAEK6B,IAAiBiE,EAASvG,UAAYsC,GAC3CiE,EAASzR,UAAYD,OAAOoL,OAAQqC,GAAkBA,EAAexN,WACrEyR,EAASzR,UAAUoL,YAAcqG,EAEjC,IAAIpC,EAAqB,CAAEqC,UAAW,CAAC,GA2MvC,OArMAD,EAASzR,UAAU4P,MAAQ,WACzB,GAAI/L,KAAK0I,aAAekF,EAASrC,KAAjC,CAIA,IAAIhH,EAASe,EAAcR,aAAa9E,KAAKzB,KAuB7C,OAtBA+G,EAAcJ,gBAAgBlF,KAAMA,KAAKzB,KAEzCyB,KAAK0I,WAAakF,EAAS9E,OAC3B9I,KAAKyD,cACH8E,EAAiB,CACftJ,KAAM,QACN4H,OAAQ7G,KACR8H,KAAMvC,KAINhB,GACFA,EAAOd,cACL8E,EAAiB,CACftJ,KAAM,aACN4H,OAAQ7G,KACR8H,KAAMvC,IAERhB,GAIGvE,IAzBP,CA0BF,EAOA4N,EAASzR,UAAU2R,WAAa,WAC9B,OAAO9N,KAAK+L,OACd,EAKA6B,EAASzR,UAAU6Q,KAAO,SAAetJ,GAEvC,IADA,IAAI+D,EAAO,GAAI5D,EAAMC,UAAUxG,OAAS,EAChCuG,KAAQ,GAAI4D,EAAM5D,GAAQC,UAAWD,EAAM,GAEnD,GAAI7D,KAAK0I,aAAekF,EAASrC,KAC/B,MAAM,IAAIO,MAAM,kDAGlB,IAAIxD,EAAeD,EAAmB,CACpCpJ,KAAMyE,EACNpC,OAAQtB,KAAKzB,IACbkJ,KAAMA,IAGJlD,EAASe,EAAcR,aAAa9E,KAAKzB,KAM7C,OAJIgG,GACFA,EAAOd,cAAcO,MAAMO,EAAQ,CAAE+D,GAAe3H,OAAQ8G,IAGvDzH,IACT,EASA4N,EAASzR,UAAU0P,KAAO,SAAepE,GAEvC,OADAzH,KAAKgN,KAAK,UAAWvF,GACdzH,IACT,EAQAwL,EAAmBqC,UAAUxE,IAAM,WACjC,GAAIrJ,KAAK0I,aAAekF,EAASrC,KAC/B,MAAM,IAAIO,MAAM,kDAGlB,IAAIlQ,EAAOoE,KACPuE,EAASe,EAAcR,aAAa9E,KAAKzB,KAC7C,IAAKgG,EACH,MAAM,IAAIuH,MAAO,wDAA2D9L,KAAQ,IAAI,KAG1F,MAAO,CACLgN,KAAM,SAActJ,EAAO+D,GAEzB,OADAlD,EAAOyI,KAAKtJ,EAAO+D,EAAM,CAAEjD,WAAYc,EAAcP,iBAAiBnJ,EAAK2C,IAAK,KAAM3C,KAC/EA,CACT,EACAsR,GAAI,SAAYxI,GACd,OAAOH,EAAO2I,GAAGxI,EAAM9I,EACzB,EACA2R,GAAI,SAAc7I,GAChB,OAAOH,EAAOgJ,GAAG7I,EAAM9I,EACzB,EAEJ,EAKAgS,EAASzR,UAAU4Q,GAAK,SAAa9N,EAAM8C,GAEzC,OADA/B,KAAKgD,iBAAiB/D,EAAM8C,GACrB/B,IACT,EAOA4N,EAASzR,UAAU4R,IAAM,SAAc9O,EAAM8C,GAC3C/B,KAAKsD,oBAAoBrE,EAAM8C,EACjC,EAOA6L,EAASzR,UAAU6R,aAAe,SAAuB/O,GACvD,IAAI4D,EAAY7C,KAAK6C,UAAU5D,GAC/B,QAAKiE,MAAMC,QAAQN,MAGVA,EAAUvF,MACrB,EAOAsQ,EAASzR,UAAUoB,KAAO,SAAemH,GACvCY,EAAcb,oBAAoBzE,KAAM0E,EAC1C,EAOAkJ,EAASzR,UAAU8R,MAAQ,SAAgBvJ,GACzCY,EAAcF,yBAAyBpF,KAAM0E,EAC/C,EAEAkJ,EAASzR,UAAU+Q,GAAK,SAAaxI,GACnC,OAAO1E,KAAK6N,UAAUX,GAAGxI,EAC3B,EAEAkJ,EAASzR,UAAUoR,GAAK,WACtB,OAAOvN,KAAKkN,GAAGlJ,MAAM,KAAMF,UAC7B,EAQA8J,EAASzR,UAAUsH,cAAgB,SAAwBC,GAGzD,IAFA,IAAIC,EAAS3D,KACT4D,EAAkB,GAAIC,EAAMC,UAAUxG,OAAS,EAC3CuG,KAAQ,GAAID,EAAiBC,GAAQC,UAAWD,EAAM,GAE9D,IAAIE,EAAYL,EAAMzE,KAClB4D,EAAY7C,KAAK6C,UAAUkB,GAE/B,IAAKb,MAAMC,QAAQN,GACjB,OAAO,EAGTA,EAAUH,SAAQ,SAAUO,GACtBW,EAAgBtG,OAAS,EAC3B2F,EAASe,MAAML,EAAQC,GAKvBX,EAAS9F,KAAKwG,EAAQD,EAAM+D,KAAO/D,EAAM+D,KAAO/D,EAEpD,GACF,EAEAxH,OAAOiQ,iBAAkByB,EAASzR,UAAWqP,GAEtCoC,CACT,CAlRiB,CAkRfhL,GAEF+K,EAAW3C,WAAa,EACxB2C,EAAWpC,KAAO,EAClBoC,EAAW/E,QAAU,EACrB+E,EAAW7E,OAAS,EAKpB,IAAIoF,EAAK,SAAuB3P,EAAKxC,GACnC,OAAO,IAAI4R,EAAWpP,EAAKxC,EAC7B,EAKAmS,EAAGC,QAAU,SAAmB5P,EAAKxC,GAEnC,OAAOmS,EAAG3P,EAAKxC,EAEjB,EAEA,IAAIyQ,EAASD,EACT3C,EAAYjB,EACZiF,EAAWM,EAEf1S,EAAQgR,OAASA,EACjBhR,EAAQoO,UAAYA,EACpBpO,EAAQoS,SAAWA,EAEnB1R,OAAOkS,eAAe5S,EAAS,aAAc,CAAEwB,OAAO,GAErD,CA3mE+DqR,CAAQ7S,E","sources":["webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/mock-socket/dist/mock-socket.js"],"sourcesContent":["(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.Mock = global.Mock || {})));\n}(this, (function (exports) { 'use strict';\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nvar requiresPort = function required(port, protocol) {\n protocol = protocol.split(':')[0];\n port = +port;\n\n if (!port) { return false; }\n\n switch (protocol) {\n case 'http':\n case 'ws':\n return port !== 80;\n\n case 'https':\n case 'wss':\n return port !== 443;\n\n case 'ftp':\n return port !== 21;\n\n case 'gopher':\n return port !== 70;\n\n case 'file':\n return false;\n }\n\n return port !== 0;\n};\n\nvar has = Object.prototype.hasOwnProperty;\nvar undef;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String|Null} The decoded string.\n * @api private\n */\nfunction decode(input) {\n try {\n return decodeURIComponent(input.replace(/\\+/g, ' '));\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Attempts to encode a given input.\n *\n * @param {String} input The string that needs to be encoded.\n * @returns {String|Null} The encoded string.\n * @api private\n */\nfunction encode(input) {\n try {\n return encodeURIComponent(input);\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n var parser = /([^=?#&]+)=?([^&]*)/g\n , result = {}\n , part;\n\n while (part = parser.exec(query)) {\n var key = decode(part[1])\n , value = decode(part[2]);\n\n //\n // Prevent overriding of existing properties. This ensures that build-in\n // methods like `toString` or __proto__ are not overriden by malicious\n // querystrings.\n //\n // In the case if failed decoding, we want to omit the key/value pairs\n // from the result.\n //\n if (key === null || value === null || key in result) { continue; }\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n prefix = prefix || '';\n\n var pairs = []\n , value\n , key;\n\n //\n // Optionally prefix with a '?' if needed\n //\n if ('string' !== typeof prefix) { prefix = '?'; }\n\n for (key in obj) {\n if (has.call(obj, key)) {\n value = obj[key];\n\n //\n // Edge cases where we actually want to encode the value to an empty\n // string instead of the stringified value.\n //\n if (!value && (value === null || value === undef || isNaN(value))) {\n value = '';\n }\n\n key = encode(key);\n value = encode(value);\n\n //\n // If we failed to encode the strings, we should bail out as we don't\n // want to add invalid strings to the query.\n //\n if (key === null || value === null) { continue; }\n pairs.push(key +'='+ value);\n }\n }\n\n return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nvar stringify = querystringify;\nvar parse = querystring;\n\nvar querystringify_1 = {\n\tstringify: stringify,\n\tparse: parse\n};\n\nvar slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//;\nvar protocolre = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\\\/]+)?([\\S\\s]*)/i;\nvar whitespace = '[\\\\x09\\\\x0A\\\\x0B\\\\x0C\\\\x0D\\\\x20\\\\xA0\\\\u1680\\\\u180E\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200A\\\\u202F\\\\u205F\\\\u3000\\\\u2028\\\\u2029\\\\uFEFF]';\nvar left = new RegExp('^'+ whitespace +'+');\n\n/**\n * Trim a given string.\n *\n * @param {String} str String to trim.\n * @public\n */\nfunction trimLeft(str) {\n return (str ? str : '').toString().replace(left, '');\n}\n\n/**\n * These are the parse rules for the URL parser, it informs the parser\n * about:\n *\n * 0. The char it Needs to parse, if it's a string it should be done using\n * indexOf, RegExp using exec and NaN means set as current value.\n * 1. The property we should set when parsing this value.\n * 2. Indication if it's backwards or forward parsing, when set as number it's\n * the value of extra chars that should be split off.\n * 3. Inherit from location if non existing in the parser.\n * 4. `toLowerCase` the resulting value.\n */\nvar rules = [\n ['#', 'hash'], // Extract from the back.\n ['?', 'query'], // Extract from the back.\n function sanitize(address, url) { // Sanitize what is left of the address\n return isSpecial(url.protocol) ? address.replace(/\\\\/g, '/') : address;\n },\n ['/', 'pathname'], // Extract from the back.\n ['@', 'auth', 1], // Extract from the front.\n [NaN, 'host', undefined, 1, 1], // Set left over value.\n [/:(\\d+)$/, 'port', undefined, 1], // RegExp the back.\n [NaN, 'hostname', undefined, 1, 1] // Set left over.\n];\n\n/**\n * These properties should not be copied or inherited from. This is only needed\n * for all non blob URL's as a blob URL does not include a hash, only the\n * origin.\n *\n * @type {Object}\n * @private\n */\nvar ignore = { hash: 1, query: 1 };\n\n/**\n * The location object differs when your code is loaded through a normal page,\n * Worker or through a worker using a blob. And with the blobble begins the\n * trouble as the location object will contain the URL of the blob, not the\n * location of the page where our code is loaded in. The actual origin is\n * encoded in the `pathname` so we can thankfully generate a good \"default\"\n * location from it so we can generate proper relative URL's again.\n *\n * @param {Object|String} loc Optional default location object.\n * @returns {Object} lolcation object.\n * @public\n */\nfunction lolcation(loc) {\n var globalVar;\n\n if (typeof window !== 'undefined') { globalVar = window; }\n else if (typeof commonjsGlobal !== 'undefined') { globalVar = commonjsGlobal; }\n else if (typeof self !== 'undefined') { globalVar = self; }\n else { globalVar = {}; }\n\n var location = globalVar.location || {};\n loc = loc || location;\n\n var finaldestination = {}\n , type = typeof loc\n , key;\n\n if ('blob:' === loc.protocol) {\n finaldestination = new Url(unescape(loc.pathname), {});\n } else if ('string' === type) {\n finaldestination = new Url(loc, {});\n for (key in ignore) { delete finaldestination[key]; }\n } else if ('object' === type) {\n for (key in loc) {\n if (key in ignore) { continue; }\n finaldestination[key] = loc[key];\n }\n\n if (finaldestination.slashes === undefined) {\n finaldestination.slashes = slashes.test(loc.href);\n }\n }\n\n return finaldestination;\n}\n\n/**\n * Check whether a protocol scheme is special.\n *\n * @param {String} The protocol scheme of the URL\n * @return {Boolean} `true` if the protocol scheme is special, else `false`\n * @private\n */\nfunction isSpecial(scheme) {\n return (\n scheme === 'file:' ||\n scheme === 'ftp:' ||\n scheme === 'http:' ||\n scheme === 'https:' ||\n scheme === 'ws:' ||\n scheme === 'wss:'\n );\n}\n\n/**\n * @typedef ProtocolExtract\n * @type Object\n * @property {String} protocol Protocol matched in the URL, in lowercase.\n * @property {Boolean} slashes `true` if protocol is followed by \"//\", else `false`.\n * @property {String} rest Rest of the URL that is not part of the protocol.\n */\n\n/**\n * Extract protocol information from a URL with/without double slash (\"//\").\n *\n * @param {String} address URL we want to extract from.\n * @param {Object} location\n * @return {ProtocolExtract} Extracted information.\n * @private\n */\nfunction extractProtocol(address, location) {\n address = trimLeft(address);\n location = location || {};\n\n var match = protocolre.exec(address);\n var protocol = match[1] ? match[1].toLowerCase() : '';\n var forwardSlashes = !!match[2];\n var otherSlashes = !!match[3];\n var slashesCount = 0;\n var rest;\n\n if (forwardSlashes) {\n if (otherSlashes) {\n rest = match[2] + match[3] + match[4];\n slashesCount = match[2].length + match[3].length;\n } else {\n rest = match[2] + match[4];\n slashesCount = match[2].length;\n }\n } else {\n if (otherSlashes) {\n rest = match[3] + match[4];\n slashesCount = match[3].length;\n } else {\n rest = match[4];\n }\n }\n\n if (protocol === 'file:') {\n if (slashesCount >= 2) {\n rest = rest.slice(2);\n }\n } else if (isSpecial(protocol)) {\n rest = match[4];\n } else if (protocol) {\n if (forwardSlashes) {\n rest = rest.slice(2);\n }\n } else if (slashesCount >= 2 && isSpecial(location.protocol)) {\n rest = match[4];\n }\n\n return {\n protocol: protocol,\n slashes: forwardSlashes || isSpecial(protocol),\n slashesCount: slashesCount,\n rest: rest\n };\n}\n\n/**\n * Resolve a relative URL pathname against a base URL pathname.\n *\n * @param {String} relative Pathname of the relative URL.\n * @param {String} base Pathname of the base URL.\n * @return {String} Resolved pathname.\n * @private\n */\nfunction resolve(relative, base) {\n if (relative === '') { return base; }\n\n var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))\n , i = path.length\n , last = path[i - 1]\n , unshift = false\n , up = 0;\n\n while (i--) {\n if (path[i] === '.') {\n path.splice(i, 1);\n } else if (path[i] === '..') {\n path.splice(i, 1);\n up++;\n } else if (up) {\n if (i === 0) { unshift = true; }\n path.splice(i, 1);\n up--;\n }\n }\n\n if (unshift) { path.unshift(''); }\n if (last === '.' || last === '..') { path.push(''); }\n\n return path.join('/');\n}\n\n/**\n * The actual URL instance. Instead of returning an object we've opted-in to\n * create an actual constructor as it's much more memory efficient and\n * faster and it pleases my OCD.\n *\n * It is worth noting that we should not use `URL` as class name to prevent\n * clashes with the global URL instance that got introduced in browsers.\n *\n * @constructor\n * @param {String} address URL we want to parse.\n * @param {Object|String} [location] Location defaults for relative paths.\n * @param {Boolean|Function} [parser] Parser for the query string.\n * @private\n */\nfunction Url(address, location, parser) {\n address = trimLeft(address);\n\n if (!(this instanceof Url)) {\n return new Url(address, location, parser);\n }\n\n var relative, extracted, parse, instruction, index, key\n , instructions = rules.slice()\n , type = typeof location\n , url = this\n , i = 0;\n\n //\n // The following if statements allows this module two have compatibility with\n // 2 different API:\n //\n // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments\n // where the boolean indicates that the query string should also be parsed.\n //\n // 2. The `URL` interface of the browser which accepts a URL, object as\n // arguments. The supplied object will be used as default values / fall-back\n // for relative paths.\n //\n if ('object' !== type && 'string' !== type) {\n parser = location;\n location = null;\n }\n\n if (parser && 'function' !== typeof parser) { parser = querystringify_1.parse; }\n\n location = lolcation(location);\n\n //\n // Extract protocol information before running the instructions.\n //\n extracted = extractProtocol(address || '', location);\n relative = !extracted.protocol && !extracted.slashes;\n url.slashes = extracted.slashes || relative && location.slashes;\n url.protocol = extracted.protocol || location.protocol || '';\n address = extracted.rest;\n\n //\n // When the authority component is absent the URL starts with a path\n // component.\n //\n if (\n url.protocol === 'file:' ||\n (!extracted.slashes &&\n (extracted.protocol ||\n extracted.slashesCount < 2 ||\n !isSpecial(url.protocol)))\n ) {\n instructions[3] = [/(.*)/, 'pathname'];\n }\n\n for (; i < instructions.length; i++) {\n instruction = instructions[i];\n\n if (typeof instruction === 'function') {\n address = instruction(address, url);\n continue;\n }\n\n parse = instruction[0];\n key = instruction[1];\n\n if (parse !== parse) {\n url[key] = address;\n } else if ('string' === typeof parse) {\n if (~(index = address.indexOf(parse))) {\n if ('number' === typeof instruction[2]) {\n url[key] = address.slice(0, index);\n address = address.slice(index + instruction[2]);\n } else {\n url[key] = address.slice(index);\n address = address.slice(0, index);\n }\n }\n } else if ((index = parse.exec(address))) {\n url[key] = index[1];\n address = address.slice(0, index.index);\n }\n\n url[key] = url[key] || (\n relative && instruction[3] ? location[key] || '' : ''\n );\n\n //\n // Hostname, host and protocol should be lowercased so they can be used to\n // create a proper `origin`.\n //\n if (instruction[4]) { url[key] = url[key].toLowerCase(); }\n }\n\n //\n // Also parse the supplied query string in to an object. If we're supplied\n // with a custom parser as function use that instead of the default build-in\n // parser.\n //\n if (parser) { url.query = parser(url.query); }\n\n //\n // If the URL is relative, resolve the pathname against the base URL.\n //\n if (\n relative\n && location.slashes\n && url.pathname.charAt(0) !== '/'\n && (url.pathname !== '' || location.pathname !== '')\n ) {\n url.pathname = resolve(url.pathname, location.pathname);\n }\n\n //\n // Default to a / for pathname if none exists. This normalizes the URL\n // to always have a /\n //\n if (url.pathname.charAt(0) !== '/' && isSpecial(url.protocol)) {\n url.pathname = '/' + url.pathname;\n }\n\n //\n // We should not add port numbers if they are already the default port number\n // for a given protocol. As the host also contains the port number we're going\n // override it with the hostname which contains no port number.\n //\n if (!requiresPort(url.port, url.protocol)) {\n url.host = url.hostname;\n url.port = '';\n }\n\n //\n // Parse down the `auth` for the username and password.\n //\n url.username = url.password = '';\n if (url.auth) {\n instruction = url.auth.split(':');\n url.username = instruction[0] || '';\n url.password = instruction[1] || '';\n }\n\n url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n ? url.protocol +'//'+ url.host\n : 'null';\n\n //\n // The href is just the compiled result.\n //\n url.href = url.toString();\n}\n\n/**\n * This is convenience method for changing properties in the URL instance to\n * insure that they all propagate correctly.\n *\n * @param {String} part Property we need to adjust.\n * @param {Mixed} value The newly assigned value.\n * @param {Boolean|Function} fn When setting the query, it will be the function\n * used to parse the query.\n * When setting the protocol, double slash will be\n * removed from the final url if it is true.\n * @returns {URL} URL instance for chaining.\n * @public\n */\nfunction set(part, value, fn) {\n var url = this;\n\n switch (part) {\n case 'query':\n if ('string' === typeof value && value.length) {\n value = (fn || querystringify_1.parse)(value);\n }\n\n url[part] = value;\n break;\n\n case 'port':\n url[part] = value;\n\n if (!requiresPort(value, url.protocol)) {\n url.host = url.hostname;\n url[part] = '';\n } else if (value) {\n url.host = url.hostname +':'+ value;\n }\n\n break;\n\n case 'hostname':\n url[part] = value;\n\n if (url.port) { value += ':'+ url.port; }\n url.host = value;\n break;\n\n case 'host':\n url[part] = value;\n\n if (/:\\d+$/.test(value)) {\n value = value.split(':');\n url.port = value.pop();\n url.hostname = value.join(':');\n } else {\n url.hostname = value;\n url.port = '';\n }\n\n break;\n\n case 'protocol':\n url.protocol = value.toLowerCase();\n url.slashes = !fn;\n break;\n\n case 'pathname':\n case 'hash':\n if (value) {\n var char = part === 'pathname' ? '/' : '#';\n url[part] = value.charAt(0) !== char ? char + value : value;\n } else {\n url[part] = value;\n }\n break;\n\n default:\n url[part] = value;\n }\n\n for (var i = 0; i < rules.length; i++) {\n var ins = rules[i];\n\n if (ins[4]) { url[ins[1]] = url[ins[1]].toLowerCase(); }\n }\n\n url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n ? url.protocol +'//'+ url.host\n : 'null';\n\n url.href = url.toString();\n\n return url;\n}\n\n/**\n * Transform the properties back in to a valid and full URL string.\n *\n * @param {Function} stringify Optional query stringify function.\n * @returns {String} Compiled version of the URL.\n * @public\n */\nfunction toString(stringify) {\n if (!stringify || 'function' !== typeof stringify) { stringify = querystringify_1.stringify; }\n\n var query\n , url = this\n , protocol = url.protocol;\n\n if (protocol && protocol.charAt(protocol.length - 1) !== ':') { protocol += ':'; }\n\n var result = protocol + (url.slashes || isSpecial(url.protocol) ? '//' : '');\n\n if (url.username) {\n result += url.username;\n if (url.password) { result += ':'+ url.password; }\n result += '@';\n }\n\n result += url.host + url.pathname;\n\n query = 'object' === typeof url.query ? stringify(url.query) : url.query;\n if (query) { result += '?' !== query.charAt(0) ? '?'+ query : query; }\n\n if (url.hash) { result += url.hash; }\n\n return result;\n}\n\nUrl.prototype = { set: set, toString: toString };\n\n//\n// Expose the URL parser and some additional properties that might be useful for\n// others or testing.\n//\nUrl.extractProtocol = extractProtocol;\nUrl.location = lolcation;\nUrl.trimLeft = trimLeft;\nUrl.qs = querystringify_1;\n\nvar urlParse = Url;\n\n/*\n * This delay allows the thread to finish assigning its on* methods\n * before invoking the delay callback. This is purely a timing hack.\n * http://geekabyte.blogspot.com/2014/01/javascript-effect-of-setting-settimeout.html\n *\n * @param {callback: function} the callback which will be invoked after the timeout\n * @parma {context: object} the context in which to invoke the function\n */\nfunction delay(callback, context) {\n setTimeout(function (timeoutContext) { return callback.call(timeoutContext); }, 4, context);\n}\n\nfunction log(method, message) {\n /* eslint-disable no-console */\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n console[method].call(null, message);\n }\n /* eslint-enable no-console */\n}\n\nfunction reject(array, callback) {\n if ( array === void 0 ) array = [];\n\n var results = [];\n array.forEach(function (itemInArray) {\n if (!callback(itemInArray)) {\n results.push(itemInArray);\n }\n });\n\n return results;\n}\n\nfunction filter(array, callback) {\n if ( array === void 0 ) array = [];\n\n var results = [];\n array.forEach(function (itemInArray) {\n if (callback(itemInArray)) {\n results.push(itemInArray);\n }\n });\n\n return results;\n}\n\n/*\n * EventTarget is an interface implemented by objects that can\n * receive events and may have listeners for them.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget\n */\nvar EventTarget = function EventTarget() {\n this.listeners = {};\n};\n\n/*\n * Ties a listener function to an event type which can later be invoked via the\n * dispatchEvent method.\n *\n * @param {string} type - the type of event (ie: 'open', 'message', etc.)\n * @param {function} listener - callback function to invoke when an event is dispatched matching the type\n * @param {boolean} useCapture - N/A TODO: implement useCapture functionality\n */\nEventTarget.prototype.addEventListener = function addEventListener (type, listener /* , useCapture */) {\n if (typeof listener === 'function') {\n if (!Array.isArray(this.listeners[type])) {\n this.listeners[type] = [];\n }\n\n // Only add the same function once\n if (filter(this.listeners[type], function (item) { return item === listener; }).length === 0) {\n this.listeners[type].push(listener);\n }\n }\n};\n\n/*\n * Removes the listener so it will no longer be invoked via the dispatchEvent method.\n *\n * @param {string} type - the type of event (ie: 'open', 'message', etc.)\n * @param {function} listener - callback function to invoke when an event is dispatched matching the type\n * @param {boolean} useCapture - N/A TODO: implement useCapture functionality\n */\nEventTarget.prototype.removeEventListener = function removeEventListener (type, removingListener /* , useCapture */) {\n var arrayOfListeners = this.listeners[type];\n this.listeners[type] = reject(arrayOfListeners, function (listener) { return listener === removingListener; });\n};\n\n/*\n * Invokes all listener functions that are listening to the given event.type property. Each\n * listener will be passed the event as the first argument.\n *\n * @param {object} event - event object which will be passed to all listeners of the event.type property\n */\nEventTarget.prototype.dispatchEvent = function dispatchEvent (event) {\n var this$1 = this;\n var customArguments = [], len = arguments.length - 1;\n while ( len-- > 0 ) customArguments[ len ] = arguments[ len + 1 ];\n\n var eventName = event.type;\n var listeners = this.listeners[eventName];\n\n if (!Array.isArray(listeners)) {\n return false;\n }\n\n listeners.forEach(function (listener) {\n if (customArguments.length > 0) {\n listener.apply(this$1, customArguments);\n } else {\n listener.call(this$1, event);\n }\n });\n\n return true;\n};\n\nfunction trimQueryPartFromURL(url) {\n var queryIndex = url.indexOf('?');\n return queryIndex >= 0 ? url.slice(0, queryIndex) : url;\n}\n\n/*\n * The network bridge is a way for the mock websocket object to 'communicate' with\n * all available servers. This is a singleton object so it is important that you\n * clean up urlMap whenever you are finished.\n */\nvar NetworkBridge = function NetworkBridge() {\n this.urlMap = {};\n};\n\n/*\n * Attaches a websocket object to the urlMap hash so that it can find the server\n * it is connected to and the server in turn can find it.\n *\n * @param {object} websocket - websocket object to add to the urlMap hash\n * @param {string} url\n */\nNetworkBridge.prototype.attachWebSocket = function attachWebSocket (websocket, url) {\n var serverURL = trimQueryPartFromURL(url);\n var connectionLookup = this.urlMap[serverURL];\n\n if (connectionLookup && connectionLookup.server && connectionLookup.websockets.indexOf(websocket) === -1) {\n connectionLookup.websockets.push(websocket);\n return connectionLookup.server;\n }\n};\n\n/*\n * Attaches a websocket to a room\n */\nNetworkBridge.prototype.addMembershipToRoom = function addMembershipToRoom (websocket, room) {\n var connectionLookup = this.urlMap[trimQueryPartFromURL(websocket.url)];\n\n if (connectionLookup && connectionLookup.server && connectionLookup.websockets.indexOf(websocket) !== -1) {\n if (!connectionLookup.roomMemberships[room]) {\n connectionLookup.roomMemberships[room] = [];\n }\n\n connectionLookup.roomMemberships[room].push(websocket);\n }\n};\n\n/*\n * Attaches a server object to the urlMap hash so that it can find a websockets\n * which are connected to it and so that websockets can in turn can find it.\n *\n * @param {object} server - server object to add to the urlMap hash\n * @param {string} url\n */\nNetworkBridge.prototype.attachServer = function attachServer (server, url) {\n var serverUrl = trimQueryPartFromURL(url);\n var connectionLookup = this.urlMap[serverUrl];\n\n if (!connectionLookup) {\n this.urlMap[serverUrl] = {\n server: server,\n websockets: [],\n roomMemberships: {}\n };\n\n return server;\n }\n};\n\n/*\n * Finds the server which is 'running' on the given url.\n *\n * @param {string} url - the url to use to find which server is running on it\n */\nNetworkBridge.prototype.serverLookup = function serverLookup (url) {\n var serverURL = trimQueryPartFromURL(url);\n var connectionLookup = this.urlMap[serverURL];\n\n if (connectionLookup) {\n return connectionLookup.server;\n }\n};\n\n/*\n * Finds all websockets which is 'listening' on the given url.\n *\n * @param {string} url - the url to use to find all websockets which are associated with it\n * @param {string} room - if a room is provided, will only return sockets in this room\n * @param {class} broadcaster - socket that is broadcasting and is to be excluded from the lookup\n */\nNetworkBridge.prototype.websocketsLookup = function websocketsLookup (url, room, broadcaster) {\n var serverURL = trimQueryPartFromURL(url);\n var websockets;\n var connectionLookup = this.urlMap[serverURL];\n\n websockets = connectionLookup ? connectionLookup.websockets : [];\n\n if (room) {\n var members = connectionLookup.roomMemberships[room];\n websockets = members || [];\n }\n\n return broadcaster ? websockets.filter(function (websocket) { return websocket !== broadcaster; }) : websockets;\n};\n\n/*\n * Removes the entry associated with the url.\n *\n * @param {string} url\n */\nNetworkBridge.prototype.removeServer = function removeServer (url) {\n delete this.urlMap[trimQueryPartFromURL(url)];\n};\n\n/*\n * Removes the individual websocket from the map of associated websockets.\n *\n * @param {object} websocket - websocket object to remove from the url map\n * @param {string} url\n */\nNetworkBridge.prototype.removeWebSocket = function removeWebSocket (websocket, url) {\n var serverURL = trimQueryPartFromURL(url);\n var connectionLookup = this.urlMap[serverURL];\n\n if (connectionLookup) {\n connectionLookup.websockets = reject(connectionLookup.websockets, function (socket) { return socket === websocket; });\n }\n};\n\n/*\n * Removes a websocket from a room\n */\nNetworkBridge.prototype.removeMembershipFromRoom = function removeMembershipFromRoom (websocket, room) {\n var connectionLookup = this.urlMap[trimQueryPartFromURL(websocket.url)];\n var memberships = connectionLookup.roomMemberships[room];\n\n if (connectionLookup && memberships !== null) {\n connectionLookup.roomMemberships[room] = reject(memberships, function (socket) { return socket === websocket; });\n }\n};\n\nvar networkBridge = new NetworkBridge(); // Note: this is a singleton\n\n/*\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent\n */\nvar CLOSE_CODES = {\n CLOSE_NORMAL: 1000,\n CLOSE_GOING_AWAY: 1001,\n CLOSE_PROTOCOL_ERROR: 1002,\n CLOSE_UNSUPPORTED: 1003,\n CLOSE_NO_STATUS: 1005,\n CLOSE_ABNORMAL: 1006,\n UNSUPPORTED_DATA: 1007,\n POLICY_VIOLATION: 1008,\n CLOSE_TOO_LARGE: 1009,\n MISSING_EXTENSION: 1010,\n INTERNAL_ERROR: 1011,\n SERVICE_RESTART: 1012,\n TRY_AGAIN_LATER: 1013,\n TLS_HANDSHAKE: 1015\n};\n\nvar ERROR_PREFIX = {\n CONSTRUCTOR_ERROR: \"Failed to construct 'WebSocket':\",\n CLOSE_ERROR: \"Failed to execute 'close' on 'WebSocket':\",\n EVENT: {\n CONSTRUCT: \"Failed to construct 'Event':\",\n MESSAGE: \"Failed to construct 'MessageEvent':\",\n CLOSE: \"Failed to construct 'CloseEvent':\"\n }\n};\n\nvar EventPrototype = function EventPrototype () {};\n\nEventPrototype.prototype.stopPropagation = function stopPropagation () {};\nEventPrototype.prototype.stopImmediatePropagation = function stopImmediatePropagation () {};\n\n// if no arguments are passed then the type is set to \"undefined\" on\n// chrome and safari.\nEventPrototype.prototype.initEvent = function initEvent (type, bubbles, cancelable) {\n if ( type === void 0 ) type = 'undefined';\n if ( bubbles === void 0 ) bubbles = false;\n if ( cancelable === void 0 ) cancelable = false;\n\n this.type = \"\" + type;\n this.bubbles = Boolean(bubbles);\n this.cancelable = Boolean(cancelable);\n};\n\nvar Event = (function (EventPrototype$$1) {\n function Event(type, eventInitConfig) {\n if ( eventInitConfig === void 0 ) eventInitConfig = {};\n\n EventPrototype$$1.call(this);\n\n if (!type) {\n throw new TypeError(((ERROR_PREFIX.EVENT_ERROR) + \" 1 argument required, but only 0 present.\"));\n }\n\n if (typeof eventInitConfig !== 'object') {\n throw new TypeError(((ERROR_PREFIX.EVENT_ERROR) + \" parameter 2 ('eventInitDict') is not an object.\"));\n }\n\n var bubbles = eventInitConfig.bubbles;\n var cancelable = eventInitConfig.cancelable;\n\n this.type = \"\" + type;\n this.timeStamp = Date.now();\n this.target = null;\n this.srcElement = null;\n this.returnValue = true;\n this.isTrusted = false;\n this.eventPhase = 0;\n this.defaultPrevented = false;\n this.currentTarget = null;\n this.cancelable = cancelable ? Boolean(cancelable) : false;\n this.cancelBubble = false;\n this.bubbles = bubbles ? Boolean(bubbles) : false;\n }\n\n if ( EventPrototype$$1 ) Event.__proto__ = EventPrototype$$1;\n Event.prototype = Object.create( EventPrototype$$1 && EventPrototype$$1.prototype );\n Event.prototype.constructor = Event;\n\n return Event;\n}(EventPrototype));\n\nvar MessageEvent = (function (EventPrototype$$1) {\n function MessageEvent(type, eventInitConfig) {\n if ( eventInitConfig === void 0 ) eventInitConfig = {};\n\n EventPrototype$$1.call(this);\n\n if (!type) {\n throw new TypeError(((ERROR_PREFIX.EVENT.MESSAGE) + \" 1 argument required, but only 0 present.\"));\n }\n\n if (typeof eventInitConfig !== 'object') {\n throw new TypeError(((ERROR_PREFIX.EVENT.MESSAGE) + \" parameter 2 ('eventInitDict') is not an object\"));\n }\n\n var bubbles = eventInitConfig.bubbles;\n var cancelable = eventInitConfig.cancelable;\n var data = eventInitConfig.data;\n var origin = eventInitConfig.origin;\n var lastEventId = eventInitConfig.lastEventId;\n var ports = eventInitConfig.ports;\n\n this.type = \"\" + type;\n this.timeStamp = Date.now();\n this.target = null;\n this.srcElement = null;\n this.returnValue = true;\n this.isTrusted = false;\n this.eventPhase = 0;\n this.defaultPrevented = false;\n this.currentTarget = null;\n this.cancelable = cancelable ? Boolean(cancelable) : false;\n this.canncelBubble = false;\n this.bubbles = bubbles ? Boolean(bubbles) : false;\n this.origin = \"\" + origin;\n this.ports = typeof ports === 'undefined' ? null : ports;\n this.data = typeof data === 'undefined' ? null : data;\n this.lastEventId = \"\" + (lastEventId || '');\n }\n\n if ( EventPrototype$$1 ) MessageEvent.__proto__ = EventPrototype$$1;\n MessageEvent.prototype = Object.create( EventPrototype$$1 && EventPrototype$$1.prototype );\n MessageEvent.prototype.constructor = MessageEvent;\n\n return MessageEvent;\n}(EventPrototype));\n\nvar CloseEvent = (function (EventPrototype$$1) {\n function CloseEvent(type, eventInitConfig) {\n if ( eventInitConfig === void 0 ) eventInitConfig = {};\n\n EventPrototype$$1.call(this);\n\n if (!type) {\n throw new TypeError(((ERROR_PREFIX.EVENT.CLOSE) + \" 1 argument required, but only 0 present.\"));\n }\n\n if (typeof eventInitConfig !== 'object') {\n throw new TypeError(((ERROR_PREFIX.EVENT.CLOSE) + \" parameter 2 ('eventInitDict') is not an object\"));\n }\n\n var bubbles = eventInitConfig.bubbles;\n var cancelable = eventInitConfig.cancelable;\n var code = eventInitConfig.code;\n var reason = eventInitConfig.reason;\n var wasClean = eventInitConfig.wasClean;\n\n this.type = \"\" + type;\n this.timeStamp = Date.now();\n this.target = null;\n this.srcElement = null;\n this.returnValue = true;\n this.isTrusted = false;\n this.eventPhase = 0;\n this.defaultPrevented = false;\n this.currentTarget = null;\n this.cancelable = cancelable ? Boolean(cancelable) : false;\n this.cancelBubble = false;\n this.bubbles = bubbles ? Boolean(bubbles) : false;\n this.code = typeof code === 'number' ? parseInt(code, 10) : 0;\n this.reason = \"\" + (reason || '');\n this.wasClean = wasClean ? Boolean(wasClean) : false;\n }\n\n if ( EventPrototype$$1 ) CloseEvent.__proto__ = EventPrototype$$1;\n CloseEvent.prototype = Object.create( EventPrototype$$1 && EventPrototype$$1.prototype );\n CloseEvent.prototype.constructor = CloseEvent;\n\n return CloseEvent;\n}(EventPrototype));\n\n/*\n * Creates an Event object and extends it to allow full modification of\n * its properties.\n *\n * @param {object} config - within config you will need to pass type and optionally target\n */\nfunction createEvent(config) {\n var type = config.type;\n var target = config.target;\n var eventObject = new Event(type);\n\n if (target) {\n eventObject.target = target;\n eventObject.srcElement = target;\n eventObject.currentTarget = target;\n }\n\n return eventObject;\n}\n\n/*\n * Creates a MessageEvent object and extends it to allow full modification of\n * its properties.\n *\n * @param {object} config - within config: type, origin, data and optionally target\n */\nfunction createMessageEvent(config) {\n var type = config.type;\n var origin = config.origin;\n var data = config.data;\n var target = config.target;\n var messageEvent = new MessageEvent(type, {\n data: data,\n origin: origin\n });\n\n if (target) {\n messageEvent.target = target;\n messageEvent.srcElement = target;\n messageEvent.currentTarget = target;\n }\n\n return messageEvent;\n}\n\n/*\n * Creates a CloseEvent object and extends it to allow full modification of\n * its properties.\n *\n * @param {object} config - within config: type and optionally target, code, and reason\n */\nfunction createCloseEvent(config) {\n var code = config.code;\n var reason = config.reason;\n var type = config.type;\n var target = config.target;\n var wasClean = config.wasClean;\n\n if (!wasClean) {\n wasClean = code === CLOSE_CODES.CLOSE_NORMAL || code === CLOSE_CODES.CLOSE_NO_STATUS;\n }\n\n var closeEvent = new CloseEvent(type, {\n code: code,\n reason: reason,\n wasClean: wasClean\n });\n\n if (target) {\n closeEvent.target = target;\n closeEvent.srcElement = target;\n closeEvent.currentTarget = target;\n }\n\n return closeEvent;\n}\n\nfunction closeWebSocketConnection(context, code, reason) {\n context.readyState = WebSocket$1.CLOSING;\n\n var server = networkBridge.serverLookup(context.url);\n var closeEvent = createCloseEvent({\n type: 'close',\n target: context.target,\n code: code,\n reason: reason\n });\n var serverCloseEvent = createCloseEvent({\n type: 'server::close',\n target: context,\n code: code,\n reason: reason\n });\n\n delay(function () {\n networkBridge.removeWebSocket(context, context.url);\n\n context.readyState = WebSocket$1.CLOSED;\n context.dispatchEvent(closeEvent);\n context.dispatchEvent(serverCloseEvent);\n\n if (server) {\n server.dispatchEvent(closeEvent, server);\n }\n }, context);\n}\n\nfunction failWebSocketConnection(context, code, reason) {\n context.readyState = WebSocket$1.CLOSING;\n\n var server = networkBridge.serverLookup(context.url);\n var closeEvent = createCloseEvent({\n type: 'close',\n target: context.target,\n code: code,\n reason: reason,\n wasClean: false\n });\n var serverCloseEvent = createCloseEvent({\n type: 'server::close',\n target: context,\n code: code,\n reason: reason,\n wasClean: false\n });\n\n var errorEvent = createEvent({\n type: 'error',\n target: context.target\n });\n\n delay(function () {\n networkBridge.removeWebSocket(context, context.url);\n\n context.readyState = WebSocket$1.CLOSED;\n context.dispatchEvent(errorEvent);\n context.dispatchEvent(closeEvent);\n context.dispatchEvent(serverCloseEvent);\n\n if (server) {\n server.dispatchEvent(closeEvent, server);\n }\n }, context);\n}\n\nfunction normalizeSendData(data) {\n if (Object.prototype.toString.call(data) !== '[object Blob]' && !(data instanceof ArrayBuffer)) {\n data = String(data);\n }\n\n return data;\n}\n\nvar proxies = new WeakMap();\n\nfunction proxyFactory(target) {\n if (proxies.has(target)) {\n return proxies.get(target);\n }\n\n var proxy = new Proxy(target, {\n get: function get(obj, prop) {\n if (prop === 'close') {\n return function close(options) {\n if ( options === void 0 ) options = {};\n\n var code = options.code || CLOSE_CODES.CLOSE_NORMAL;\n var reason = options.reason || '';\n\n closeWebSocketConnection(proxy, code, reason);\n };\n }\n\n if (prop === 'send') {\n return function send(data) {\n data = normalizeSendData(data);\n\n target.dispatchEvent(\n createMessageEvent({\n type: 'message',\n data: data,\n origin: this.url,\n target: target\n })\n );\n };\n }\n\n if (prop === 'on') {\n return function onWrapper(type, cb) {\n target.addEventListener((\"server::\" + type), cb);\n };\n }\n\n if (prop === 'target') {\n return target;\n }\n\n return obj[prop];\n }\n });\n proxies.set(target, proxy);\n\n return proxy;\n}\n\nfunction lengthInUtf8Bytes(str) {\n // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.\n var m = encodeURIComponent(str).match(/%[89ABab]/g);\n return str.length + (m ? m.length : 0);\n}\n\nfunction urlVerification(url) {\n var urlRecord = new urlParse(url);\n var pathname = urlRecord.pathname;\n var protocol = urlRecord.protocol;\n var hash = urlRecord.hash;\n\n if (!url) {\n throw new TypeError(((ERROR_PREFIX.CONSTRUCTOR_ERROR) + \" 1 argument required, but only 0 present.\"));\n }\n\n if (!pathname) {\n urlRecord.pathname = '/';\n }\n\n if (protocol === '') {\n throw new SyntaxError(((ERROR_PREFIX.CONSTRUCTOR_ERROR) + \" The URL '\" + (urlRecord.toString()) + \"' is invalid.\"));\n }\n\n if (protocol !== 'ws:' && protocol !== 'wss:') {\n throw new SyntaxError(\n ((ERROR_PREFIX.CONSTRUCTOR_ERROR) + \" The URL's scheme must be either 'ws' or 'wss'. '\" + protocol + \"' is not allowed.\")\n );\n }\n\n if (hash !== '') {\n /* eslint-disable max-len */\n throw new SyntaxError(\n ((ERROR_PREFIX.CONSTRUCTOR_ERROR) + \" The URL contains a fragment identifier ('\" + hash + \"'). Fragment identifiers are not allowed in WebSocket URLs.\")\n );\n /* eslint-enable max-len */\n }\n\n return urlRecord.toString();\n}\n\nfunction protocolVerification(protocols) {\n if ( protocols === void 0 ) protocols = [];\n\n if (!Array.isArray(protocols) && typeof protocols !== 'string') {\n throw new SyntaxError(((ERROR_PREFIX.CONSTRUCTOR_ERROR) + \" The subprotocol '\" + (protocols.toString()) + \"' is invalid.\"));\n }\n\n if (typeof protocols === 'string') {\n protocols = [protocols];\n }\n\n var uniq = protocols\n .map(function (p) { return ({ count: 1, protocol: p }); })\n .reduce(function (a, b) {\n a[b.protocol] = (a[b.protocol] || 0) + b.count;\n return a;\n }, {});\n\n var duplicates = Object.keys(uniq).filter(function (a) { return uniq[a] > 1; });\n\n if (duplicates.length > 0) {\n throw new SyntaxError(((ERROR_PREFIX.CONSTRUCTOR_ERROR) + \" The subprotocol '\" + (duplicates[0]) + \"' is duplicated.\"));\n }\n\n return protocols;\n}\n\n/*\n * The main websocket class which is designed to mimick the native WebSocket class as close\n * as possible.\n *\n * https://html.spec.whatwg.org/multipage/web-sockets.html\n */\nvar WebSocket$1 = (function (EventTarget$$1) {\n function WebSocket(url, protocols) {\n EventTarget$$1.call(this);\n\n this._onopen = null;\n this._onmessage = null;\n this._onerror = null;\n this._onclose = null;\n\n this.url = urlVerification(url);\n protocols = protocolVerification(protocols);\n this.protocol = protocols[0] || '';\n\n this.binaryType = 'blob';\n this.readyState = WebSocket.CONNECTING;\n\n var client = proxyFactory(this);\n var server = networkBridge.attachWebSocket(client, this.url);\n\n /*\n * This delay is needed so that we dont trigger an event before the callbacks have been\n * setup. For example:\n *\n * var socket = new WebSocket('ws://localhost');\n *\n * If we dont have the delay then the event would be triggered right here and this is\n * before the onopen had a chance to register itself.\n *\n * socket.onopen = () => { // this would never be called };\n *\n * and with the delay the event gets triggered here after all of the callbacks have been\n * registered :-)\n */\n delay(function delayCallback() {\n if (server) {\n if (\n server.options.verifyClient &&\n typeof server.options.verifyClient === 'function' &&\n !server.options.verifyClient()\n ) {\n this.readyState = WebSocket.CLOSED;\n\n log(\n 'error',\n (\"WebSocket connection to '\" + (this.url) + \"' failed: HTTP Authentication failed; no valid credentials available\")\n );\n\n networkBridge.removeWebSocket(client, this.url);\n this.dispatchEvent(createEvent({ type: 'error', target: this }));\n this.dispatchEvent(createCloseEvent({ type: 'close', target: this, code: CLOSE_CODES.CLOSE_NORMAL }));\n } else {\n if (server.options.selectProtocol && typeof server.options.selectProtocol === 'function') {\n var selectedProtocol = server.options.selectProtocol(protocols);\n var isFilled = selectedProtocol !== '';\n var isRequested = protocols.indexOf(selectedProtocol) !== -1;\n if (isFilled && !isRequested) {\n this.readyState = WebSocket.CLOSED;\n\n log('error', (\"WebSocket connection to '\" + (this.url) + \"' failed: Invalid Sub-Protocol\"));\n\n networkBridge.removeWebSocket(client, this.url);\n this.dispatchEvent(createEvent({ type: 'error', target: this }));\n this.dispatchEvent(createCloseEvent({ type: 'close', target: this, code: CLOSE_CODES.CLOSE_NORMAL }));\n return;\n }\n this.protocol = selectedProtocol;\n }\n this.readyState = WebSocket.OPEN;\n this.dispatchEvent(createEvent({ type: 'open', target: this }));\n server.dispatchEvent(createEvent({ type: 'connection' }), client);\n }\n } else {\n this.readyState = WebSocket.CLOSED;\n this.dispatchEvent(createEvent({ type: 'error', target: this }));\n this.dispatchEvent(createCloseEvent({ type: 'close', target: this, code: CLOSE_CODES.CLOSE_NORMAL }));\n\n log('error', (\"WebSocket connection to '\" + (this.url) + \"' failed\"));\n }\n }, this);\n }\n\n if ( EventTarget$$1 ) WebSocket.__proto__ = EventTarget$$1;\n WebSocket.prototype = Object.create( EventTarget$$1 && EventTarget$$1.prototype );\n WebSocket.prototype.constructor = WebSocket;\n\n var prototypeAccessors = { onopen: {},onmessage: {},onclose: {},onerror: {} };\n\n prototypeAccessors.onopen.get = function () {\n return this._onopen;\n };\n\n prototypeAccessors.onmessage.get = function () {\n return this._onmessage;\n };\n\n prototypeAccessors.onclose.get = function () {\n return this._onclose;\n };\n\n prototypeAccessors.onerror.get = function () {\n return this._onerror;\n };\n\n prototypeAccessors.onopen.set = function (listener) {\n this.removeEventListener('open', this._onopen);\n this._onopen = listener;\n this.addEventListener('open', listener);\n };\n\n prototypeAccessors.onmessage.set = function (listener) {\n this.removeEventListener('message', this._onmessage);\n this._onmessage = listener;\n this.addEventListener('message', listener);\n };\n\n prototypeAccessors.onclose.set = function (listener) {\n this.removeEventListener('close', this._onclose);\n this._onclose = listener;\n this.addEventListener('close', listener);\n };\n\n prototypeAccessors.onerror.set = function (listener) {\n this.removeEventListener('error', this._onerror);\n this._onerror = listener;\n this.addEventListener('error', listener);\n };\n\n WebSocket.prototype.send = function send (data) {\n var this$1 = this;\n\n if (this.readyState === WebSocket.CLOSING || this.readyState === WebSocket.CLOSED) {\n throw new Error('WebSocket is already in CLOSING or CLOSED state');\n }\n\n // TODO: handle bufferedAmount\n\n var messageEvent = createMessageEvent({\n type: 'server::message',\n origin: this.url,\n data: normalizeSendData(data)\n });\n\n var server = networkBridge.serverLookup(this.url);\n\n if (server) {\n delay(function () {\n this$1.dispatchEvent(messageEvent, data);\n }, server);\n }\n };\n\n WebSocket.prototype.close = function close (code, reason) {\n if (code !== undefined) {\n if (typeof code !== 'number' || (code !== 1000 && (code < 3000 || code > 4999))) {\n throw new TypeError(\n ((ERROR_PREFIX.CLOSE_ERROR) + \" The code must be either 1000, or between 3000 and 4999. \" + code + \" is neither.\")\n );\n }\n }\n\n if (reason !== undefined) {\n var length = lengthInUtf8Bytes(reason);\n\n if (length > 123) {\n throw new SyntaxError(((ERROR_PREFIX.CLOSE_ERROR) + \" The message must not be greater than 123 bytes.\"));\n }\n }\n\n if (this.readyState === WebSocket.CLOSING || this.readyState === WebSocket.CLOSED) {\n return;\n }\n\n var client = proxyFactory(this);\n if (this.readyState === WebSocket.CONNECTING) {\n failWebSocketConnection(client, code || CLOSE_CODES.CLOSE_ABNORMAL, reason);\n } else {\n closeWebSocketConnection(client, code || CLOSE_CODES.CLOSE_NO_STATUS, reason);\n }\n };\n\n Object.defineProperties( WebSocket.prototype, prototypeAccessors );\n\n return WebSocket;\n}(EventTarget));\n\nWebSocket$1.CONNECTING = 0;\nWebSocket$1.prototype.CONNECTING = WebSocket$1.CONNECTING;\nWebSocket$1.OPEN = 1;\nWebSocket$1.prototype.OPEN = WebSocket$1.OPEN;\nWebSocket$1.CLOSING = 2;\nWebSocket$1.prototype.CLOSING = WebSocket$1.CLOSING;\nWebSocket$1.CLOSED = 3;\nWebSocket$1.prototype.CLOSED = WebSocket$1.CLOSED;\n\nvar dedupe = function (arr) { return arr.reduce(function (deduped, b) {\n if (deduped.indexOf(b) > -1) { return deduped; }\n return deduped.concat(b);\n }, []); };\n\nfunction retrieveGlobalObject() {\n if (typeof window !== 'undefined') {\n return window;\n }\n\n return typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this;\n}\n\nvar defaultOptions = {\n mock: true,\n verifyClient: null,\n selectProtocol: null\n};\n\nvar Server$1 = (function (EventTarget$$1) {\n function Server(url, options) {\n if ( options === void 0 ) options = defaultOptions;\n\n EventTarget$$1.call(this);\n var urlRecord = new urlParse(url);\n\n if (!urlRecord.pathname) {\n urlRecord.pathname = '/';\n }\n\n this.url = urlRecord.toString();\n\n this.originalWebSocket = null;\n var server = networkBridge.attachServer(this, this.url);\n\n if (!server) {\n this.dispatchEvent(createEvent({ type: 'error' }));\n throw new Error('A mock server is already listening on this url');\n }\n\n this.options = Object.assign({}, defaultOptions, options);\n\n if (this.options.mock) {\n this.mockWebsocket();\n }\n }\n\n if ( EventTarget$$1 ) Server.__proto__ = EventTarget$$1;\n Server.prototype = Object.create( EventTarget$$1 && EventTarget$$1.prototype );\n Server.prototype.constructor = Server;\n\n /*\n * Attaches the mock websocket object to the global object\n */\n Server.prototype.mockWebsocket = function mockWebsocket () {\n var globalObj = retrieveGlobalObject();\n\n this.originalWebSocket = globalObj.WebSocket;\n globalObj.WebSocket = WebSocket$1;\n };\n\n /*\n * Removes the mock websocket object from the global object\n */\n Server.prototype.restoreWebsocket = function restoreWebsocket () {\n var globalObj = retrieveGlobalObject();\n\n if (this.originalWebSocket !== null) {\n globalObj.WebSocket = this.originalWebSocket;\n }\n\n this.originalWebSocket = null;\n };\n\n /**\n * Removes itself from the urlMap so another server could add itself to the url.\n * @param {function} callback - The callback is called when the server is stopped\n */\n Server.prototype.stop = function stop (callback) {\n if ( callback === void 0 ) callback = function () {};\n\n if (this.options.mock) {\n this.restoreWebsocket();\n }\n\n networkBridge.removeServer(this.url);\n\n if (typeof callback === 'function') {\n callback();\n }\n };\n\n /*\n * This is the main function for the mock server to subscribe to the on events.\n *\n * ie: mockServer.on('connection', function() { console.log('a mock client connected'); });\n *\n * @param {string} type - The event key to subscribe to. Valid keys are: connection, message, and close.\n * @param {function} callback - The callback which should be called when a certain event is fired.\n */\n Server.prototype.on = function on (type, callback) {\n this.addEventListener(type, callback);\n };\n\n /*\n * Closes the connection and triggers the onclose method of all listening\n * websockets. After that it removes itself from the urlMap so another server\n * could add itself to the url.\n *\n * @param {object} options\n */\n Server.prototype.close = function close (options) {\n if ( options === void 0 ) options = {};\n\n var code = options.code;\n var reason = options.reason;\n var wasClean = options.wasClean;\n var listeners = networkBridge.websocketsLookup(this.url);\n\n // Remove server before notifications to prevent immediate reconnects from\n // socket onclose handlers\n networkBridge.removeServer(this.url);\n\n listeners.forEach(function (socket) {\n socket.readyState = WebSocket$1.CLOSED;\n socket.dispatchEvent(\n createCloseEvent({\n type: 'close',\n target: socket.target,\n code: code || CLOSE_CODES.CLOSE_NORMAL,\n reason: reason || '',\n wasClean: wasClean\n })\n );\n });\n\n this.dispatchEvent(createCloseEvent({ type: 'close' }), this);\n };\n\n /*\n * Sends a generic message event to all mock clients.\n */\n Server.prototype.emit = function emit (event, data, options) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n var websockets = options.websockets;\n\n if (!websockets) {\n websockets = networkBridge.websocketsLookup(this.url);\n }\n\n if (typeof options !== 'object' || arguments.length > 3) {\n data = Array.prototype.slice.call(arguments, 1, arguments.length);\n data = data.map(function (item) { return normalizeSendData(item); });\n } else {\n data = normalizeSendData(data);\n }\n\n websockets.forEach(function (socket) {\n if (Array.isArray(data)) {\n socket.dispatchEvent.apply(\n socket, [ createMessageEvent({\n type: event,\n data: data,\n origin: this$1.url,\n target: socket.target\n }) ].concat( data )\n );\n } else {\n socket.dispatchEvent(\n createMessageEvent({\n type: event,\n data: data,\n origin: this$1.url,\n target: socket.target\n })\n );\n }\n });\n };\n\n /*\n * Returns an array of websockets which are listening to this server\n * TOOD: this should return a set and not be a method\n */\n Server.prototype.clients = function clients () {\n return networkBridge.websocketsLookup(this.url);\n };\n\n /*\n * Prepares a method to submit an event to members of the room\n *\n * e.g. server.to('my-room').emit('hi!');\n */\n Server.prototype.to = function to (room, broadcaster, broadcastList) {\n var this$1 = this;\n if ( broadcastList === void 0 ) broadcastList = [];\n\n var self = this;\n var websockets = dedupe(broadcastList.concat(networkBridge.websocketsLookup(this.url, room, broadcaster)));\n\n return {\n to: function (chainedRoom, chainedBroadcaster) { return this$1.to.call(this$1, chainedRoom, chainedBroadcaster, websockets); },\n emit: function emit(event, data) {\n self.emit(event, data, { websockets: websockets });\n }\n };\n };\n\n /*\n * Alias for Server.to\n */\n Server.prototype.in = function in$1 () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return this.to.apply(null, args);\n };\n\n /*\n * Simulate an event from the server to the clients. Useful for\n * simulating errors.\n */\n Server.prototype.simulate = function simulate (event) {\n var listeners = networkBridge.websocketsLookup(this.url);\n\n if (event === 'error') {\n listeners.forEach(function (socket) {\n socket.readyState = WebSocket$1.CLOSED;\n socket.dispatchEvent(createEvent({ type: 'error' }));\n });\n }\n };\n\n return Server;\n}(EventTarget));\n\n/*\n * Alternative constructor to support namespaces in socket.io\n *\n * http://socket.io/docs/rooms-and-namespaces/#custom-namespaces\n */\nServer$1.of = function of(url) {\n return new Server$1(url);\n};\n\n/*\n * The socket-io class is designed to mimick the real API as closely as possible.\n *\n * http://socket.io/docs/\n */\nvar SocketIO$1 = (function (EventTarget$$1) {\n function SocketIO(url, protocol) {\n var this$1 = this;\n if ( url === void 0 ) url = 'socket.io';\n if ( protocol === void 0 ) protocol = '';\n\n EventTarget$$1.call(this);\n\n this.binaryType = 'blob';\n var urlRecord = new urlParse(url);\n\n if (!urlRecord.pathname) {\n urlRecord.pathname = '/';\n }\n\n this.url = urlRecord.toString();\n this.readyState = SocketIO.CONNECTING;\n this.protocol = '';\n this.target = this;\n\n if (typeof protocol === 'string' || (typeof protocol === 'object' && protocol !== null)) {\n this.protocol = protocol;\n } else if (Array.isArray(protocol) && protocol.length > 0) {\n this.protocol = protocol[0];\n }\n\n var server = networkBridge.attachWebSocket(this, this.url);\n\n /*\n * Delay triggering the connection events so they can be defined in time.\n */\n delay(function delayCallback() {\n if (server) {\n this.readyState = SocketIO.OPEN;\n server.dispatchEvent(createEvent({ type: 'connection' }), server, this);\n server.dispatchEvent(createEvent({ type: 'connect' }), server, this); // alias\n this.dispatchEvent(createEvent({ type: 'connect', target: this }));\n } else {\n this.readyState = SocketIO.CLOSED;\n this.dispatchEvent(createEvent({ type: 'error', target: this }));\n this.dispatchEvent(\n createCloseEvent({\n type: 'close',\n target: this,\n code: CLOSE_CODES.CLOSE_NORMAL\n })\n );\n\n log('error', (\"Socket.io connection to '\" + (this.url) + \"' failed\"));\n }\n }, this);\n\n /**\n Add an aliased event listener for close / disconnect\n */\n this.addEventListener('close', function (event) {\n this$1.dispatchEvent(\n createCloseEvent({\n type: 'disconnect',\n target: event.target,\n code: event.code\n })\n );\n });\n }\n\n if ( EventTarget$$1 ) SocketIO.__proto__ = EventTarget$$1;\n SocketIO.prototype = Object.create( EventTarget$$1 && EventTarget$$1.prototype );\n SocketIO.prototype.constructor = SocketIO;\n\n var prototypeAccessors = { broadcast: {} };\n\n /*\n * Closes the SocketIO connection or connection attempt, if any.\n * If the connection is already CLOSED, this method does nothing.\n */\n SocketIO.prototype.close = function close () {\n if (this.readyState !== SocketIO.OPEN) {\n return undefined;\n }\n\n var server = networkBridge.serverLookup(this.url);\n networkBridge.removeWebSocket(this, this.url);\n\n this.readyState = SocketIO.CLOSED;\n this.dispatchEvent(\n createCloseEvent({\n type: 'close',\n target: this,\n code: CLOSE_CODES.CLOSE_NORMAL\n })\n );\n\n if (server) {\n server.dispatchEvent(\n createCloseEvent({\n type: 'disconnect',\n target: this,\n code: CLOSE_CODES.CLOSE_NORMAL\n }),\n server\n );\n }\n\n return this;\n };\n\n /*\n * Alias for Socket#close\n *\n * https://github.com/socketio/socket.io-client/blob/master/lib/socket.js#L383\n */\n SocketIO.prototype.disconnect = function disconnect () {\n return this.close();\n };\n\n /*\n * Submits an event to the server with a payload\n */\n SocketIO.prototype.emit = function emit (event) {\n var data = [], len = arguments.length - 1;\n while ( len-- > 0 ) data[ len ] = arguments[ len + 1 ];\n\n if (this.readyState !== SocketIO.OPEN) {\n throw new Error('SocketIO is already in CLOSING or CLOSED state');\n }\n\n var messageEvent = createMessageEvent({\n type: event,\n origin: this.url,\n data: data\n });\n\n var server = networkBridge.serverLookup(this.url);\n\n if (server) {\n server.dispatchEvent.apply(server, [ messageEvent ].concat( data ));\n }\n\n return this;\n };\n\n /*\n * Submits a 'message' event to the server.\n *\n * Should behave exactly like WebSocket#send\n *\n * https://github.com/socketio/socket.io-client/blob/master/lib/socket.js#L113\n */\n SocketIO.prototype.send = function send (data) {\n this.emit('message', data);\n return this;\n };\n\n /*\n * For broadcasting events to other connected sockets.\n *\n * e.g. socket.broadcast.emit('hi!');\n * e.g. socket.broadcast.to('my-room').emit('hi!');\n */\n prototypeAccessors.broadcast.get = function () {\n if (this.readyState !== SocketIO.OPEN) {\n throw new Error('SocketIO is already in CLOSING or CLOSED state');\n }\n\n var self = this;\n var server = networkBridge.serverLookup(this.url);\n if (!server) {\n throw new Error((\"SocketIO can not find a server at the specified URL (\" + (this.url) + \")\"));\n }\n\n return {\n emit: function emit(event, data) {\n server.emit(event, data, { websockets: networkBridge.websocketsLookup(self.url, null, self) });\n return self;\n },\n to: function to(room) {\n return server.to(room, self);\n },\n in: function in$1(room) {\n return server.in(room, self);\n }\n };\n };\n\n /*\n * For registering events to be received from the server\n */\n SocketIO.prototype.on = function on (type, callback) {\n this.addEventListener(type, callback);\n return this;\n };\n\n /*\n * Remove event listener\n *\n * https://github.com/component/emitter#emitteroffevent-fn\n */\n SocketIO.prototype.off = function off (type, callback) {\n this.removeEventListener(type, callback);\n };\n\n /*\n * Check if listeners have already been added for an event\n *\n * https://github.com/component/emitter#emitterhaslistenersevent\n */\n SocketIO.prototype.hasListeners = function hasListeners (type) {\n var listeners = this.listeners[type];\n if (!Array.isArray(listeners)) {\n return false;\n }\n return !!listeners.length;\n };\n\n /*\n * Join a room on a server\n *\n * http://socket.io/docs/rooms-and-namespaces/#joining-and-leaving\n */\n SocketIO.prototype.join = function join (room) {\n networkBridge.addMembershipToRoom(this, room);\n };\n\n /*\n * Get the websocket to leave the room\n *\n * http://socket.io/docs/rooms-and-namespaces/#joining-and-leaving\n */\n SocketIO.prototype.leave = function leave (room) {\n networkBridge.removeMembershipFromRoom(this, room);\n };\n\n SocketIO.prototype.to = function to (room) {\n return this.broadcast.to(room);\n };\n\n SocketIO.prototype.in = function in$1 () {\n return this.to.apply(null, arguments);\n };\n\n /*\n * Invokes all listener functions that are listening to the given event.type property. Each\n * listener will be passed the event as the first argument.\n *\n * @param {object} event - event object which will be passed to all listeners of the event.type property\n */\n SocketIO.prototype.dispatchEvent = function dispatchEvent (event) {\n var this$1 = this;\n var customArguments = [], len = arguments.length - 1;\n while ( len-- > 0 ) customArguments[ len ] = arguments[ len + 1 ];\n\n var eventName = event.type;\n var listeners = this.listeners[eventName];\n\n if (!Array.isArray(listeners)) {\n return false;\n }\n\n listeners.forEach(function (listener) {\n if (customArguments.length > 0) {\n listener.apply(this$1, customArguments);\n } else {\n // Regular WebSockets expect a MessageEvent but Socketio.io just wants raw data\n // payload instanceof MessageEvent works, but you can't isntance of NodeEvent\n // for now we detect if the output has data defined on it\n listener.call(this$1, event.data ? event.data : event);\n }\n });\n };\n\n Object.defineProperties( SocketIO.prototype, prototypeAccessors );\n\n return SocketIO;\n}(EventTarget));\n\nSocketIO$1.CONNECTING = 0;\nSocketIO$1.OPEN = 1;\nSocketIO$1.CLOSING = 2;\nSocketIO$1.CLOSED = 3;\n\n/*\n * Static constructor methods for the IO Socket\n */\nvar IO = function ioConstructor(url, protocol) {\n return new SocketIO$1(url, protocol);\n};\n\n/*\n * Alias the raw IO() constructor\n */\nIO.connect = function ioConnect(url, protocol) {\n /* eslint-disable new-cap */\n return IO(url, protocol);\n /* eslint-enable new-cap */\n};\n\nvar Server = Server$1;\nvar WebSocket = WebSocket$1;\nvar SocketIO = IO;\n\nexports.Server = Server;\nexports.WebSocket = WebSocket;\nexports.SocketIO = SocketIO;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"],"names":["exports","commonjsGlobal","window","g","self","requiresPort","port","protocol","split","has","Object","prototype","hasOwnProperty","decode","input","decodeURIComponent","replace","e","encode","encodeURIComponent","querystringify_1","stringify","obj","prefix","value","key","pairs","call","isNaN","push","length","join","parse","query","part","parser","result","exec","slashes","protocolre","left","RegExp","trimLeft","str","toString","rules","address","url","isSpecial","NaN","undefined","ignore","hash","lolcation","loc","location","finaldestination","type","Url","unescape","pathname","test","href","scheme","extractProtocol","rest","match","toLowerCase","forwardSlashes","otherSlashes","slashesCount","slice","this","relative","extracted","instruction","index","instructions","i","indexOf","charAt","base","path","concat","last","unshift","up","splice","resolve","host","hostname","username","password","auth","origin","set","fn","pop","char","ins","qs","urlParse","delay","callback","context","setTimeout","timeoutContext","log","method","message","console","reject","array","results","forEach","itemInArray","EventTarget","listeners","trimQueryPartFromURL","queryIndex","addEventListener","listener","Array","isArray","filter","item","removeEventListener","removingListener","arrayOfListeners","dispatchEvent","event","this$1","customArguments","len","arguments","eventName","apply","NetworkBridge","urlMap","attachWebSocket","websocket","serverURL","connectionLookup","server","websockets","addMembershipToRoom","room","roomMemberships","attachServer","serverUrl","serverLookup","websocketsLookup","broadcaster","removeServer","removeWebSocket","socket","removeMembershipFromRoom","memberships","networkBridge","CLOSE_CODES","ERROR_PREFIX","CONSTRUCTOR_ERROR","CLOSE_ERROR","EVENT","CONSTRUCT","MESSAGE","CLOSE","EventPrototype","stopPropagation","stopImmediatePropagation","initEvent","bubbles","cancelable","Boolean","Event","EventPrototype$$1","eventInitConfig","TypeError","timeStamp","Date","now","target","srcElement","returnValue","isTrusted","eventPhase","defaultPrevented","currentTarget","cancelBubble","__proto__","create","constructor","MessageEvent","data","lastEventId","ports","canncelBubble","CloseEvent","code","reason","wasClean","parseInt","createEvent","config","eventObject","createMessageEvent","messageEvent","createCloseEvent","closeEvent","closeWebSocketConnection","readyState","WebSocket$1","CLOSING","serverCloseEvent","CLOSED","normalizeSendData","ArrayBuffer","String","proxies","WeakMap","proxyFactory","get","proxy","Proxy","prop","options","cb","EventTarget$$1","WebSocket","protocols","_onopen","_onmessage","_onerror","_onclose","urlRecord","SyntaxError","urlVerification","uniq","map","p","count","reduce","a","b","duplicates","keys","protocolVerification","binaryType","CONNECTING","client","verifyClient","selectProtocol","selectedProtocol","isFilled","isRequested","OPEN","prototypeAccessors","onopen","onmessage","onclose","onerror","send","Error","close","m","errorEvent","failWebSocketConnection","defineProperties","retrieveGlobalObject","defaultOptions","mock","Server$1","Server","originalWebSocket","assign","mockWebsocket","globalObj","restoreWebsocket","stop","on","emit","clients","to","broadcastList","deduped","chainedRoom","chainedBroadcaster","in","args","simulate","of","SocketIO$1","SocketIO","broadcast","disconnect","off","hasListeners","leave","IO","connect","defineProperty","factory"],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/build/1084.4cd1c89.js b/_static/build/1084.4cd1c89.js
new file mode 100644
index 0000000..e504736
--- /dev/null
+++ b/_static/build/1084.4cd1c89.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunk_JUPYTERLAB_CORE_OUTPUT=self.webpackChunk_JUPYTERLAB_CORE_OUTPUT||[]).push([[1084],{51084:(e,t,r)=>{r.r(t),r.d(t,{Drag:()=>i});var n,o=r(43231),i=function(){function e(e){var t=this;this._onScrollFrame=function(){if(t._scrollTarget){var e=t._scrollTarget,r=e.element,o=e.edge,i=e.distance,s=n.SCROLL_EDGE_SIZE-i,a=Math.pow(s/n.SCROLL_EDGE_SIZE,2),d=Math.max(1,Math.round(a*n.SCROLL_EDGE_SIZE));switch(o){case"top":r.scrollTop-=d;break;case"left":r.scrollLeft-=d;break;case"right":r.scrollLeft+=d;break;case"bottom":r.scrollTop+=d}requestAnimationFrame(t._onScrollFrame)}},this._disposed=!1,this._dropAction="none",this._override=null,this._currentTarget=null,this._currentElement=null,this._promise=null,this._scrollTarget=null,this._resolve=null,this.document=e.document||document,this.mimeData=e.mimeData,this.dragImage=e.dragImage||null,this.proposedAction=e.proposedAction||"copy",this.supportedActions=e.supportedActions||"all",this.source=e.source||null}return e.prototype.dispose=function(){if(!this._disposed){if(this._disposed=!0,this._currentTarget){var e=n.createMouseEvent("pointerup",-1,-1);n.dispatchDragLeave(this,this._currentTarget,null,e)}this._finalize("none")}},Object.defineProperty(e.prototype,"isDisposed",{get:function(){return this._disposed},enumerable:!0,configurable:!0}),e.prototype.start=function(e,t){var r=this;if(this._disposed)return Promise.resolve("none");if(this._promise)return this._promise;this._addListeners(),this._attachDragImage(e,t),this._promise=new Promise((function(e,t){r._resolve=e}));var o=n.createMouseEvent("pointermove",e,t);return document.dispatchEvent(o),this._promise},e.prototype.handleEvent=function(e){switch(e.type){case"mousemove":case"pointermove":this._evtMouseMove(e);break;case"mouseup":case"pointerup":this._evtMouseUp(e);break;case"keydown":this._evtKeyDown(e);break;default:e.preventDefault(),e.stopPropagation()}},e.prototype.moveDragImage=function(e,t){if(this.dragImage){var r=this.dragImage.style;r.top=t+"px",r.left=e+"px"}},e.prototype._evtMouseMove=function(e){e.preventDefault(),e.stopPropagation(),this._updateCurrentTarget(e),this._updateDragScroll(e),this.moveDragImage(e.clientX,e.clientY)},e.prototype._evtMouseUp=function(e){if(e.preventDefault(),e.stopPropagation(),0===e.button)if(this._updateCurrentTarget(e),this._currentTarget){if("none"===this._dropAction)return n.dispatchDragLeave(this,this._currentTarget,null,e),void this._finalize("none");var t=n.dispatchDrop(this,this._currentTarget,e);this._finalize(t)}else this._finalize("none")},e.prototype._evtKeyDown=function(e){e.preventDefault(),e.stopPropagation(),27===e.keyCode&&this.dispose()},e.prototype._addListeners=function(){document.addEventListener("mousedown",this,!0),document.addEventListener("mousemove",this,!0),document.addEventListener("mouseup",this,!0),document.addEventListener("mouseenter",this,!0),document.addEventListener("mouseleave",this,!0),document.addEventListener("mouseover",this,!0),document.addEventListener("mouseout",this,!0),document.addEventListener("pointerdown",this,!0),document.addEventListener("pointermove",this,!0),document.addEventListener("pointerup",this,!0),document.addEventListener("pointerenter",this,!0),document.addEventListener("pointerleave",this,!0),document.addEventListener("pointerover",this,!0),document.addEventListener("pointerout",this,!0),document.addEventListener("keydown",this,!0),document.addEventListener("keyup",this,!0),document.addEventListener("keypress",this,!0),document.addEventListener("contextmenu",this,!0)},e.prototype._removeListeners=function(){document.removeEventListener("mousedown",this,!0),document.removeEventListener("mousemove",this,!0),document.removeEventListener("mouseup",this,!0),document.removeEventListener("mouseenter",this,!0),document.removeEventListener("mouseleave",this,!0),document.removeEventListener("mouseover",this,!0),document.removeEventListener("mouseout",this,!0),document.removeEventListener("pointerdown",this,!0),document.removeEventListener("pointermove",this,!0),document.removeEventListener("pointerup",this,!0),document.removeEventListener("pointerenter",this,!0),document.removeEventListener("pointerleave",this,!0),document.removeEventListener("pointerover",this,!0),document.removeEventListener("pointerout",this,!0),document.removeEventListener("keydown",this,!0),document.removeEventListener("keyup",this,!0),document.removeEventListener("keypress",this,!0),document.removeEventListener("contextmenu",this,!0)},e.prototype._updateDragScroll=function(e){var t=n.findScrollTarget(e);(this._scrollTarget||t)&&(this._scrollTarget||setTimeout(this._onScrollFrame,500),this._scrollTarget=t)},e.prototype._updateCurrentTarget=function(e){var t=this._currentTarget,r=this._currentTarget,o=this._currentElement,i=this.document.elementFromPoint(e.clientX,e.clientY);this._currentElement=i,i!==o&&i!==r&&n.dispatchDragExit(this,r,i,e),i!==o&&i!==r&&(r=n.dispatchDragEnter(this,i,r,e)),r!==t&&(this._currentTarget=r,n.dispatchDragLeave(this,t,r,e));var s=n.dispatchDragOver(this,r,e);this._setDropAction(s)},e.prototype._attachDragImage=function(e,t){if(this.dragImage){this.dragImage.classList.add("lm-mod-drag-image"),this.dragImage.classList.add("p-mod-drag-image");var r=this.dragImage.style;r.pointerEvents="none",r.position="fixed",r.top=t+"px",r.left=e+"px",(this.document instanceof Document?this.document.body:this.document.firstElementChild).appendChild(this.dragImage)}},e.prototype._detachDragImage=function(){if(this.dragImage){var e=this.dragImage.parentNode;e&&e.removeChild(this.dragImage)}},e.prototype._setDropAction=function(t){if(t=n.validateAction(t,this.supportedActions),!this._override||this._dropAction!==t)switch(t){case"none":this._dropAction=t,this._override=e.overrideCursor("no-drop",this.document);break;case"copy":this._dropAction=t,this._override=e.overrideCursor("copy",this.document);break;case"link":this._dropAction=t,this._override=e.overrideCursor("alias",this.document);break;case"move":this._dropAction=t,this._override=e.overrideCursor("move",this.document)}},e.prototype._finalize=function(e){var t=this._resolve;this._removeListeners(),this._detachDragImage(),this._override&&(this._override.dispose(),this._override=null),this.mimeData.clear(),this._disposed=!0,this._dropAction="none",this._currentTarget=null,this._currentElement=null,this._scrollTarget=null,this._promise=null,this._resolve=null,t&&t(e)},e}();!function(e){e.overrideCursor=function(e,r){void 0===r&&(r=document);var n=++t,i=r instanceof Document?r.body:r.firstElementChild;return i.style.cursor=e,i.classList.add("lm-mod-override-cursor"),i.classList.add("p-mod-override-cursor"),new o.DisposableDelegate((function(){n===t&&(i.style.cursor="",i.classList.remove("lm-mod-override-cursor"),i.classList.remove("p-mod-override-cursor"))}))};var t=0}(i||(i={})),function(e){e.SCROLL_EDGE_SIZE=20,e.validateAction=function(e,n){return t[e]&r[n]?e:"none"},e.createMouseEvent=function(e,t,r){var n=document.createEvent("MouseEvent");return n.initMouseEvent(e,!0,!0,window,0,0,0,t,r,!1,!1,!1,!1,0,null),n},e.findScrollTarget=function(t){for(var r=t.clientX,n=t.clientY,o=document.elementFromPoint(r,n);o;o=o.parentElement){var i=o.hasAttribute("data-lm-dragscroll");if(i=i||o.hasAttribute("data-p-dragscroll")){var s=0,a=0;o===document.body&&(s=window.pageXOffset,a=window.pageYOffset);var d=o.getBoundingClientRect(),c=d.top+a,u=d.left+s,p=u+d.width,h=c+d.height;if(!(r=p||n=h)){var l=r-u+1,m=n-c+1,v=p-r,g=h-n,_=Math.min(l,m,v,g);if(!(_>e.SCROLL_EDGE_SIZE)){var f=void 0;switch(_){case g:f="bottom";break;case m:f="top";break;case v:f="right";break;case l:f="left";break;default:throw"unreachable"}var E=o.scrollWidth-o.clientWidth,L=o.scrollHeight-o.clientHeight,y=void 0;switch(f){case"top":y=L>0&&o.scrollTop>0;break;case"left":y=E>0&&o.scrollLeft>0;break;case"right":y=E>0&&o.scrollLeft0&&o.scrollTop {\n // If the drag object is already disposed, resolve to `None`.\n if (this._disposed) {\n return Promise.resolve('none' as DropAction);\n }\n\n // If the drag has already been started, return the promise.\n if (this._promise) {\n return this._promise;\n }\n\n // Install the document listeners for the drag object.\n this._addListeners();\n\n // Attach the drag image at the specified client position.\n this._attachDragImage(clientX, clientY);\n\n // Create the promise which will be resolved on completion.\n this._promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n });\n\n // Trigger a fake move event to kick off the drag operation.\n let event = Private.createMouseEvent('pointermove', clientX, clientY);\n document.dispatchEvent(event);\n\n // Return the pending promise for the drag operation.\n return this._promise;\n }\n\n /**\n * Handle the DOM events for the drag operation.\n *\n * @param event - The DOM event sent to the drag object.\n *\n * #### Notes\n * This method implements the DOM `EventListener` interface and is\n * called in response to events on the document. It should not be\n * called directly by user code.\n */\n handleEvent(event: Event): void {\n switch (event.type) {\n case 'mousemove': // \n this._evtMouseMove(event as MouseEvent);\n break;\n case 'mouseup': // \n this._evtMouseUp(event as MouseEvent);\n break;\n case 'pointermove':\n this._evtMouseMove(event as MouseEvent);\n break;\n case 'pointerup':\n this._evtMouseUp(event as MouseEvent);\n break;\n case 'keydown':\n this._evtKeyDown(event as KeyboardEvent);\n break;\n default:\n // Stop all other events during drag-drop.\n event.preventDefault();\n event.stopPropagation();\n break;\n }\n }\n\n /**\n * Move the drag image element to the specified location.\n *\n * This is a no-op if there is no drag image element.\n */\n protected moveDragImage(clientX: number, clientY: number): void {\n if (!this.dragImage) {\n return;\n }\n let style = this.dragImage.style;\n style.top = `${clientY}px`;\n style.left = `${clientX}px`;\n }\n\n /**\n * Handle the `'mousemove'` event for the drag object.\n */\n private _evtMouseMove(event: MouseEvent): void {\n // Stop all input events during drag-drop.\n event.preventDefault();\n event.stopPropagation();\n\n // Update the current target node and dispatch enter/leave events.\n this._updateCurrentTarget(event);\n\n // Update the drag scroll element.\n this._updateDragScroll(event);\n\n // Move the drag image to the specified client position. This is\n // performed *after* dispatching to prevent unnecessary reflows.\n this.moveDragImage(event.clientX, event.clientY);\n }\n\n /**\n * Handle the `'mouseup'` event for the drag object.\n */\n private _evtMouseUp(event: MouseEvent): void {\n // Stop all input events during drag-drop.\n event.preventDefault();\n event.stopPropagation();\n\n // Do nothing if the left button is not released.\n if (event.button !== 0) {\n return;\n }\n\n // Update the current target node and dispatch enter/leave events.\n // This prevents a subtle issue where the DOM mutates under the\n // cursor after the last move event but before the drop event.\n this._updateCurrentTarget(event);\n\n // If there is no current target, finalize with `'none'`.\n if (!this._currentTarget) {\n this._finalize('none');\n return;\n }\n\n // If the last drop action was `'none'`, dispatch a leave event\n // to the current target and finalize the drag with `'none'`.\n if (this._dropAction === 'none') {\n Private.dispatchDragLeave(this, this._currentTarget, null, event);\n this._finalize('none');\n return;\n }\n\n // Dispatch the drop event at the current target and finalize\n // with the resulting drop action.\n let action = Private.dispatchDrop(this, this._currentTarget, event);\n this._finalize(action);\n }\n\n /**\n * Handle the `'keydown'` event for the drag object.\n */\n private _evtKeyDown(event: KeyboardEvent): void {\n // Stop all input events during drag-drop.\n event.preventDefault();\n event.stopPropagation();\n\n // Cancel the drag if `Escape` is pressed.\n if (event.keyCode === 27) {\n this.dispose();\n }\n }\n\n /**\n * Add the document event listeners for the drag object.\n */\n private _addListeners(): void {\n document.addEventListener('mousedown', this, true); // \n document.addEventListener('mousemove', this, true); // \n document.addEventListener('mouseup', this, true); // \n document.addEventListener('mouseenter', this, true); // \n document.addEventListener('mouseleave', this, true); // \n document.addEventListener('mouseover', this, true); // \n document.addEventListener('mouseout', this, true); // \n document.addEventListener('pointerdown', this, true);\n document.addEventListener('pointermove', this, true);\n document.addEventListener('pointerup', this, true);\n document.addEventListener('pointerenter', this, true);\n document.addEventListener('pointerleave', this, true);\n document.addEventListener('pointerover', this, true);\n document.addEventListener('pointerout', this, true);\n document.addEventListener('keydown', this, true);\n document.addEventListener('keyup', this, true);\n document.addEventListener('keypress', this, true);\n document.addEventListener('contextmenu', this, true);\n }\n\n /**\n * Remove the document event listeners for the drag object.\n */\n private _removeListeners(): void {\n document.removeEventListener('mousedown', this, true); // \n document.removeEventListener('mousemove', this, true); // \n document.removeEventListener('mouseup', this, true); // \n document.removeEventListener('mouseenter', this, true); // \n document.removeEventListener('mouseleave', this, true); // \n document.removeEventListener('mouseover', this, true); // \n document.removeEventListener('mouseout', this, true); // \n document.removeEventListener('pointerdown', this, true);\n document.removeEventListener('pointermove', this, true);\n document.removeEventListener('pointerup', this, true);\n document.removeEventListener('pointerenter', this, true);\n document.removeEventListener('pointerleave', this, true);\n document.removeEventListener('pointerover', this, true);\n document.removeEventListener('pointerout', this, true);\n document.removeEventListener('keydown', this, true);\n document.removeEventListener('keyup', this, true);\n document.removeEventListener('keypress', this, true);\n document.removeEventListener('contextmenu', this, true);\n }\n\n /**\n * Update the drag scroll element under the mouse.\n */\n private _updateDragScroll(event: MouseEvent): void {\n // Find the scroll target under the mouse.\n let target = Private.findScrollTarget(event);\n\n // Bail if there is nothing to scroll.\n if (!this._scrollTarget && !target) {\n return;\n }\n\n // Start the scroll loop if needed.\n if (!this._scrollTarget) {\n setTimeout(this._onScrollFrame, 500);\n }\n\n // Update the scroll target.\n this._scrollTarget = target;\n }\n\n /**\n * Update the current target node using the given mouse event.\n */\n private _updateCurrentTarget(event: MouseEvent): void {\n // Fetch common local state.\n let prevTarget = this._currentTarget;\n let currTarget = this._currentTarget;\n let prevElem = this._currentElement;\n\n // Find the current indicated element at the given position.\n let currElem = this.document.elementFromPoint(event.clientX, event.clientY);\n\n // Update the current element reference.\n this._currentElement = currElem;\n\n // If the indicated element changes from the previous iteration,\n // and is different from the current target, dispatch the exit\n // event to the target.\n if (currElem !== prevElem && currElem !== currTarget) {\n Private.dispatchDragExit(this, currTarget, currElem, event);\n }\n\n // If the indicated element changes from the previous iteration,\n // and is different from the current target, dispatch the enter\n // event and compute the new target element.\n if (currElem !== prevElem && currElem !== currTarget) {\n currTarget = Private.dispatchDragEnter(this, currElem, currTarget, event);\n }\n\n // If the current target element has changed, update the current\n // target reference and dispatch the leave event to the old target.\n if (currTarget !== prevTarget) {\n this._currentTarget = currTarget;\n Private.dispatchDragLeave(this, prevTarget, currTarget, event);\n }\n\n // Dispatch the drag over event and update the drop action.\n let action = Private.dispatchDragOver(this, currTarget, event);\n this._setDropAction(action);\n }\n\n /**\n * Attach the drag image element at the specified location.\n *\n * This is a no-op if there is no drag image element.\n */\n private _attachDragImage(clientX: number, clientY: number): void {\n if (!this.dragImage) {\n return;\n }\n this.dragImage.classList.add('lm-mod-drag-image');\n /* */\n this.dragImage.classList.add('p-mod-drag-image');\n /* */\n let style = this.dragImage.style;\n style.pointerEvents = 'none';\n style.position = 'fixed';\n style.top = `${clientY}px`;\n style.left = `${clientX}px`;\n const body =\n this.document instanceof Document\n ? this.document.body\n : (this.document.firstElementChild as HTMLElement);\n body.appendChild(this.dragImage);\n }\n\n /**\n * Detach the drag image element from the DOM.\n *\n * This is a no-op if there is no drag image element.\n */\n private _detachDragImage(): void {\n if (!this.dragImage) {\n return;\n }\n let parent = this.dragImage.parentNode;\n if (!parent) {\n return;\n }\n parent.removeChild(this.dragImage);\n }\n\n /**\n * Set the internal drop action state and update the drag cursor.\n */\n private _setDropAction(action: DropAction): void {\n action = Private.validateAction(action, this.supportedActions);\n if (this._override && this._dropAction === action) {\n return;\n }\n switch (action) {\n case 'none':\n this._dropAction = action;\n this._override = Drag.overrideCursor('no-drop', this.document);\n break;\n case 'copy':\n this._dropAction = action;\n this._override = Drag.overrideCursor('copy', this.document);\n break;\n case 'link':\n this._dropAction = action;\n this._override = Drag.overrideCursor('alias', this.document);\n break;\n case 'move':\n this._dropAction = action;\n this._override = Drag.overrideCursor('move', this.document);\n break;\n }\n }\n\n /**\n * Finalize the drag operation and resolve the drag promise.\n */\n private _finalize(action: DropAction): void {\n // Store the resolve function as a temp variable.\n let resolve = this._resolve;\n\n // Remove the document event listeners.\n this._removeListeners();\n\n // Detach the drag image.\n this._detachDragImage();\n\n // Dispose of the cursor override.\n if (this._override) {\n this._override.dispose();\n this._override = null;\n }\n\n // Clear the mime data.\n this.mimeData.clear();\n\n // Clear the rest of the internal drag state.\n this._disposed = true;\n this._dropAction = 'none';\n this._currentTarget = null;\n this._currentElement = null;\n this._scrollTarget = null;\n this._promise = null;\n this._resolve = null;\n\n // Finally, resolve the promise to the given drop action.\n if (resolve) {\n resolve(action);\n }\n }\n\n /**\n * The scroll loop handler function.\n */\n private _onScrollFrame = () => {\n // Bail early if there is no scroll target.\n if (!this._scrollTarget) {\n return;\n }\n\n // Unpack the scroll target.\n let { element, edge, distance } = this._scrollTarget;\n\n // Calculate the scroll delta using nonlinear acceleration.\n let d = Private.SCROLL_EDGE_SIZE - distance;\n let f = Math.pow(d / Private.SCROLL_EDGE_SIZE, 2);\n let s = Math.max(1, Math.round(f * Private.SCROLL_EDGE_SIZE));\n\n // Scroll the element in the specified direction.\n switch (edge) {\n case 'top':\n element.scrollTop -= s;\n break;\n case 'left':\n element.scrollLeft -= s;\n break;\n case 'right':\n element.scrollLeft += s;\n break;\n case 'bottom':\n element.scrollTop += s;\n break;\n }\n\n // Request the next cycle of the scroll loop.\n requestAnimationFrame(this._onScrollFrame);\n };\n\n private _disposed = false;\n private _dropAction: DropAction = 'none';\n private _override: IDisposable | null = null;\n private _currentTarget: Element | null = null;\n private _currentElement: Element | null = null;\n private _promise: Promise | null = null;\n private _scrollTarget: Private.IScrollTarget | null = null;\n private _resolve: ((value: DropAction) => void) | null = null;\n}\n\n/**\n * The namespace for the `Drag` class statics.\n */\nexport namespace Drag {\n /**\n * An options object for initializing a `Drag` object.\n */\n export interface IOptions {\n /**\n * The root element for dragging DOM artifacts (defaults to document).\n */\n document?: Document | ShadowRoot;\n\n /**\n * The populated mime data for the drag operation.\n */\n mimeData: MimeData;\n\n /**\n * An optional drag image which follows the mouse cursor.\n *\n * #### Notes\n * The drag image can be any DOM element. It is not limited to\n * image or canvas elements as with the native drag-drop APIs.\n *\n * If provided, this will be positioned at the mouse cursor on each\n * mouse move event. A CSS transform can be used to offset the node\n * from its specified position.\n *\n * The drag image will automatically have the `lm-mod-drag-image`\n * class name added.\n *\n * The default value is `null`.\n */\n dragImage?: HTMLElement;\n\n /**\n * The optional proposed drop action for the drag operation.\n *\n * #### Notes\n * This can be provided as a hint to the drop targets as to which\n * drop action is preferred.\n *\n * The default value is `'copy'`.\n */\n proposedAction?: DropAction;\n\n /**\n * The drop actions supported by the drag initiator.\n *\n * #### Notes\n * A drop target must indicate that it intends to perform one of the\n * supported actions in order to receive a drop event. However, it is\n * not required to *actually* perform that action when handling the\n * drop event. Therefore, the initiator must be prepared to handle\n * any drop action performed by a drop target.\n *\n * The default value is `'all'`.\n */\n supportedActions?: SupportedActions;\n\n /**\n * An optional object which indicates the source of the drag.\n *\n * #### Notes\n * For advanced applications, the drag initiator may wish to expose\n * a source object to the drop targets. That object can be specified\n * here and will be carried along with the drag events.\n *\n * The default value is `null`.\n */\n source?: any;\n }\n\n /**\n * Override the cursor icon for the entire document.\n *\n * @param cursor - The string representing the cursor style.\n *\n * @returns A disposable which will clear the override when disposed.\n *\n * #### Notes\n * The most recent call to `overrideCursor` takes precedence.\n * Disposing an old override has no effect on the current override.\n *\n * This utility function is used by the `Drag` class to override the\n * mouse cursor during a drag-drop operation, but it can also be used\n * by other classes to fix the cursor icon during normal mouse drags.\n *\n * #### Example\n * ```typescript\n * import { Drag } from '@lumino/dragdrop';\n *\n * // Force the cursor to be 'wait' for the entire document.\n * let override = Drag.overrideCursor('wait');\n *\n * // Clear the override by disposing the return value.\n * override.dispose();\n * ```\n */\n export function overrideCursor(\n cursor: string,\n doc: Document | ShadowRoot = document\n ): IDisposable {\n let id = ++overrideCursorID;\n const body =\n doc instanceof Document\n ? doc.body\n : (doc.firstElementChild as HTMLElement);\n body.style.cursor = cursor;\n body.classList.add('lm-mod-override-cursor');\n /* */\n body.classList.add('p-mod-override-cursor');\n /* */\n return new DisposableDelegate(() => {\n if (id === overrideCursorID) {\n body.style.cursor = '';\n body.classList.remove('lm-mod-override-cursor');\n /* */\n body.classList.remove('p-mod-override-cursor');\n /* */\n }\n });\n }\n\n /**\n * The internal id for the active cursor override.\n */\n let overrideCursorID = 0;\n}\n\n/**\n * The namespace for the module implementation details.\n */\nnamespace Private {\n /**\n * The size of a drag scroll edge, in pixels.\n */\n export const SCROLL_EDGE_SIZE = 20;\n\n /**\n * Validate the given action is one of the supported actions.\n *\n * Returns the given action or `'none'` if the action is unsupported.\n */\n export function validateAction(\n action: DropAction,\n supported: SupportedActions\n ): DropAction {\n return actionTable[action] & supportedTable[supported] ? action : 'none';\n }\n\n /**\n * Create a left mouse event at the given position.\n *\n * @param type - The event type for the mouse event.\n *\n * @param clientX - The client X position.\n *\n * @param clientY - The client Y position.\n *\n * @returns A newly created and initialized mouse event.\n */\n export function createMouseEvent(\n type: string,\n clientX: number,\n clientY: number\n ): MouseEvent {\n let event = document.createEvent('MouseEvent');\n event.initMouseEvent(\n type,\n true,\n true,\n window,\n 0,\n 0,\n 0,\n clientX,\n clientY,\n false,\n false,\n false,\n false,\n 0,\n null\n );\n return event;\n }\n\n /**\n * An object which holds the scroll target data.\n */\n export interface IScrollTarget {\n /**\n * The element to be scrolled.\n */\n element: Element;\n\n /**\n * The scroll edge underneath the mouse.\n */\n edge: 'top' | 'left' | 'right' | 'bottom';\n\n /**\n * The distance from the mouse to the scroll edge.\n */\n distance: number;\n }\n\n /**\n * Find the drag scroll target under the mouse, if any.\n */\n export function findScrollTarget(event: MouseEvent): IScrollTarget | null {\n // Look up the client mouse position.\n let x = event.clientX;\n let y = event.clientY;\n\n // Get the element under the mouse.\n let element: Element | null = document.elementFromPoint(x, y);\n\n // Search for a scrollable target based on the mouse position.\n // The null assert in third clause of for-loop is required due to:\n // https://github.com/Microsoft/TypeScript/issues/14143\n for (; element; element = element!.parentElement) {\n // Ignore elements which are not marked as scrollable.\n let scrollable = element.hasAttribute('data-lm-dragscroll');\n /* */\n scrollable = scrollable || element.hasAttribute('data-p-dragscroll');\n /* */\n if (!scrollable) {\n continue;\n }\n\n // Set up the coordinate offsets for the element.\n let offsetX = 0;\n let offsetY = 0;\n if (element === document.body) {\n offsetX = window.pageXOffset;\n offsetY = window.pageYOffset;\n }\n\n // Get the element bounds in viewport coordinates.\n let r = element.getBoundingClientRect();\n let top = r.top + offsetY;\n let left = r.left + offsetX;\n let right = left + r.width;\n let bottom = top + r.height;\n\n // Skip the element if it's not under the mouse.\n if (x < left || x >= right || y < top || y >= bottom) {\n continue;\n }\n\n // Compute the distance to each edge.\n let dl = x - left + 1;\n let dt = y - top + 1;\n let dr = right - x;\n let db = bottom - y;\n\n // Find the smallest of the edge distances.\n let distance = Math.min(dl, dt, dr, db);\n\n // Skip the element if the mouse is not within a scroll edge.\n if (distance > SCROLL_EDGE_SIZE) {\n continue;\n }\n\n // Set up the edge result variable.\n let edge: 'top' | 'left' | 'right' | 'bottom';\n\n // Find the edge for the computed distance.\n switch (distance) {\n case db:\n edge = 'bottom';\n break;\n case dt:\n edge = 'top';\n break;\n case dr:\n edge = 'right';\n break;\n case dl:\n edge = 'left';\n break;\n default:\n throw 'unreachable';\n }\n\n // Compute how much the element can scroll in width and height.\n let dsw = element.scrollWidth - element.clientWidth;\n let dsh = element.scrollHeight - element.clientHeight;\n\n // Determine if the element should be scrolled for the edge.\n let shouldScroll: boolean;\n switch (edge) {\n case 'top':\n shouldScroll = dsh > 0 && element.scrollTop > 0;\n break;\n case 'left':\n shouldScroll = dsw > 0 && element.scrollLeft > 0;\n break;\n case 'right':\n shouldScroll = dsw > 0 && element.scrollLeft < dsw;\n break;\n case 'bottom':\n shouldScroll = dsh > 0 && element.scrollTop < dsh;\n break;\n default:\n throw 'unreachable';\n }\n\n // Skip the element if it should not be scrolled.\n if (!shouldScroll) {\n continue;\n }\n\n // Return the drag scroll target.\n return { element, edge, distance };\n }\n\n // No drag scroll target was found.\n return null;\n }\n\n /**\n * Dispatch a drag enter event to the indicated element.\n *\n * @param drag - The drag object associated with the action.\n *\n * @param currElem - The currently indicated element, or `null`. This\n * is the \"immediate user selection\" from the whatwg spec.\n *\n * @param currTarget - The current drag target element, or `null`. This\n * is the \"current target element\" from the whatwg spec.\n *\n * @param event - The mouse event related to the action.\n *\n * @returns The element to use as the current drag target. This is the\n * \"current target element\" from the whatwg spec, and may be `null`.\n *\n * #### Notes\n * This largely implements the drag enter portion of the whatwg spec:\n * https://html.spec.whatwg.org/multipage/interaction.html#drag-and-drop-processing-model\n */\n export function dispatchDragEnter(\n drag: Drag,\n currElem: Element | null,\n currTarget: Element | null,\n event: MouseEvent\n ): Element | null {\n // If the current element is null, return null as the new target.\n if (!currElem) {\n return null;\n }\n\n // Dispatch a drag enter event to the current element.\n let dragEvent = createDragEvent('lm-dragenter', drag, event, currTarget);\n let canceled = !currElem.dispatchEvent(dragEvent);\n\n // If the event was canceled, use the current element as the new target.\n if (canceled) {\n return currElem;\n }\n\n /* */\n dragEvent = createDragEvent('p-dragenter', drag, event, currTarget);\n canceled = !currElem.dispatchEvent(dragEvent);\n if (canceled) {\n return currElem;\n }\n /* */\n\n // If the current element is the document body, keep the original target.\n const body =\n drag.document instanceof Document\n ? drag.document.body\n : (drag.document.firstElementChild as HTMLElement);\n\n if (currElem === body) {\n return currTarget;\n }\n\n // Dispatch a drag enter event on the document body.\n dragEvent = createDragEvent('lm-dragenter', drag, event, currTarget);\n body.dispatchEvent(dragEvent);\n\n /* */\n dragEvent = createDragEvent('p-dragenter', drag, event, currTarget);\n body.dispatchEvent(dragEvent);\n /* */\n\n // Ignore the event cancellation, and use the body as the new target.\n return body;\n }\n\n /**\n * Dispatch a drag exit event to the indicated element.\n *\n * @param drag - The drag object associated with the action.\n *\n * @param prevTarget - The previous target element, or `null`. This\n * is the previous \"current target element\" from the whatwg spec.\n *\n * @param currTarget - The current drag target element, or `null`. This\n * is the \"current target element\" from the whatwg spec.\n *\n * @param event - The mouse event related to the action.\n *\n * #### Notes\n * This largely implements the drag exit portion of the whatwg spec:\n * https://html.spec.whatwg.org/multipage/interaction.html#drag-and-drop-processing-model\n */\n export function dispatchDragExit(\n drag: Drag,\n prevTarget: Element | null,\n currTarget: Element | null,\n event: MouseEvent\n ): void {\n // If the previous target is null, do nothing.\n if (!prevTarget) {\n return;\n }\n\n // Dispatch the drag exit event to the previous target.\n let dragEvent = createDragEvent('lm-dragexit', drag, event, currTarget);\n prevTarget.dispatchEvent(dragEvent);\n\n /* */\n dragEvent = createDragEvent('p-dragexit', drag, event, currTarget);\n prevTarget.dispatchEvent(dragEvent);\n /* */\n }\n\n /**\n * Dispatch a drag leave event to the indicated element.\n *\n * @param drag - The drag object associated with the action.\n *\n * @param prevTarget - The previous target element, or `null`. This\n * is the previous \"current target element\" from the whatwg spec.\n *\n * @param currTarget - The current drag target element, or `null`. This\n * is the \"current target element\" from the whatwg spec.\n *\n * @param event - The mouse event related to the action.\n *\n * #### Notes\n * This largely implements the drag leave portion of the whatwg spec:\n * https://html.spec.whatwg.org/multipage/interaction.html#drag-and-drop-processing-model\n */\n export function dispatchDragLeave(\n drag: Drag,\n prevTarget: Element | null,\n currTarget: Element | null,\n event: MouseEvent\n ): void {\n // If the previous target is null, do nothing.\n if (!prevTarget) {\n return;\n }\n\n // Dispatch the drag leave event to the previous target.\n let dragEvent = createDragEvent('lm-dragleave', drag, event, currTarget);\n prevTarget.dispatchEvent(dragEvent);\n\n /* */\n dragEvent = createDragEvent('p-dragleave', drag, event, currTarget);\n prevTarget.dispatchEvent(dragEvent);\n /* */\n }\n\n /**\n * Dispatch a drag over event to the indicated element.\n *\n * @param drag - The drag object associated with the action.\n *\n * @param currTarget - The current drag target element, or `null`. This\n * is the \"current target element\" from the whatwg spec.\n *\n * @param event - The mouse event related to the action.\n *\n * @returns The `DropAction` result of the drag over event.\n *\n * #### Notes\n * This largely implements the drag over portion of the whatwg spec:\n * https://html.spec.whatwg.org/multipage/interaction.html#drag-and-drop-processing-model\n */\n export function dispatchDragOver(\n drag: Drag,\n currTarget: Element | null,\n event: MouseEvent\n ): DropAction {\n // If there is no current target, the drop action is none.\n if (!currTarget) {\n return 'none';\n }\n\n // Dispatch the drag over event to the current target.\n let dragEvent = createDragEvent('lm-dragover', drag, event, null);\n let canceled = !currTarget.dispatchEvent(dragEvent);\n\n // If the event was canceled, return the drop action result.\n if (canceled) {\n return dragEvent.dropAction;\n }\n\n /* */\n dragEvent = createDragEvent('p-dragover', drag, event, null);\n canceled = !currTarget.dispatchEvent(dragEvent);\n if (canceled) {\n return dragEvent.dropAction;\n }\n /* */\n\n // Otherwise, the effective drop action is none.\n return 'none';\n }\n\n /**\n * Dispatch a drop event to the indicated element.\n *\n * @param drag - The drag object associated with the action.\n *\n * @param currTarget - The current drag target element, or `null`. This\n * is the \"current target element\" from the whatwg spec.\n *\n * @param event - The mouse event related to the action.\n *\n * @returns The `DropAction` result of the drop event.\n *\n * #### Notes\n * This largely implements the drag over portion of the whatwg spec:\n * https://html.spec.whatwg.org/multipage/interaction.html#drag-and-drop-processing-model\n */\n export function dispatchDrop(\n drag: Drag,\n currTarget: Element | null,\n event: MouseEvent\n ): DropAction {\n // If there is no current target, the drop action is none.\n if (!currTarget) {\n return 'none';\n }\n\n // Dispatch the drop event to the current target.\n let dragEvent = createDragEvent('lm-drop', drag, event, null);\n let canceled = !currTarget.dispatchEvent(dragEvent);\n\n // If the event was canceled, return the drop action result.\n if (canceled) {\n return dragEvent.dropAction;\n }\n\n /* */\n dragEvent = createDragEvent('p-drop', drag, event, null);\n canceled = !currTarget.dispatchEvent(dragEvent);\n if (canceled) {\n return dragEvent.dropAction;\n }\n /* */\n\n // Otherwise, the effective drop action is none.\n return 'none';\n }\n\n /**\n * A lookup table from drop action to bit value.\n */\n const actionTable: { [key: string]: number } = {\n none: 0x0,\n copy: 0x1,\n link: 0x2,\n move: 0x4\n };\n\n /**\n * A lookup table from supported action to drop action bit mask.\n */\n const supportedTable: { [key: string]: number } = {\n none: actionTable['none'],\n copy: actionTable['copy'],\n link: actionTable['link'],\n move: actionTable['move'],\n 'copy-link': actionTable['copy'] | actionTable['link'],\n 'copy-move': actionTable['copy'] | actionTable['move'],\n 'link-move': actionTable['link'] | actionTable['move'],\n all: actionTable['copy'] | actionTable['link'] | actionTable['move']\n };\n\n /**\n * Create a new initialized `IDragEvent` from the given data.\n *\n * @param type - The event type for the drag event.\n *\n * @param drag - The drag object to use for seeding the drag data.\n *\n * @param event - The mouse event to use for seeding the mouse data.\n *\n * @param related - The related target for the event, or `null`.\n *\n * @returns A new object which implements `IDragEvent`.\n */\n function createDragEvent(\n type: string,\n drag: Drag,\n event: MouseEvent,\n related: Element | null\n ): IDragEvent {\n // Create a new mouse event to use as the drag event. Currently,\n // JS engines do now allow user-defined Event subclasses.\n let dragEvent = document.createEvent('MouseEvent');\n\n // Initialize the mouse event data.\n dragEvent.initMouseEvent(\n type,\n true,\n true,\n window,\n 0,\n event.screenX,\n event.screenY,\n event.clientX,\n event.clientY,\n event.ctrlKey,\n event.altKey,\n event.shiftKey,\n event.metaKey,\n event.button,\n related\n );\n\n // Forcefully add the custom drag event properties.\n (dragEvent as any).dropAction = 'none';\n (dragEvent as any).mimeData = drag.mimeData;\n (dragEvent as any).proposedAction = drag.proposedAction;\n (dragEvent as any).supportedActions = drag.supportedActions;\n (dragEvent as any).source = drag.source;\n\n // Return the fully initialized drag event.\n return dragEvent as IDragEvent;\n }\n}\n"],"names":["Private","options","_onScrollFrame","_scrollTarget","element","edge","distance","d","SCROLL_EDGE_SIZE","f","Math","pow","s","max","round","scrollTop","scrollLeft","requestAnimationFrame","_disposed","_dropAction","_override","_currentTarget","_currentElement","_promise","_resolve","this","document","mimeData","dragImage","proposedAction","supportedActions","source","dispose","createMouseEvent","dispatchDragLeave","_finalize","start","clientX","clientY","Promise","resolve","_addListeners","_attachDragImage","reject","event","dispatchEvent","handleEvent","type","_evtMouseMove","_evtMouseUp","_evtKeyDown","preventDefault","stopPropagation","moveDragImage","style","top","left","_updateCurrentTarget","_updateDragScroll","button","action","dispatchDrop","keyCode","addEventListener","_removeListeners","removeEventListener","target","findScrollTarget","setTimeout","prevTarget","currTarget","prevElem","currElem","elementFromPoint","dispatchDragExit","dispatchDragEnter","dispatchDragOver","_setDropAction","classList","add","pointerEvents","position","Document","body","firstElementChild","appendChild","_detachDragImage","parent","parentNode","removeChild","validateAction","Drag","overrideCursor","clear","cursor","doc","id","overrideCursorID","DisposableDelegate","remove","supported","actionTable","supportedTable","createEvent","initMouseEvent","window","x","y","parentElement","scrollable","hasAttribute","offsetX","offsetY","pageXOffset","pageYOffset","r","getBoundingClientRect","right","width","bottom","height","dl","dt","dr","db","min","dsw","scrollWidth","clientWidth","dsh","scrollHeight","clientHeight","shouldScroll","drag","dragEvent","createDragEvent","canceled","dropAction","none","copy","link","move","all","related","screenX","screenY","ctrlKey","altKey","shiftKey","metaKey"],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/build/1113.23c9417.js b/_static/build/1113.23c9417.js
new file mode 100644
index 0000000..5b0c225
--- /dev/null
+++ b/_static/build/1113.23c9417.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunk_JUPYTERLAB_CORE_OUTPUT=self.webpackChunk_JUPYTERLAB_CORE_OUTPUT||[]).push([[1113],{41113:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{APPLICATION_JAVASCRIPT_MIMETYPE:()=>APPLICATION_JAVASCRIPT_MIMETYPE,ExperimentalRenderedJavascript:()=>ExperimentalRenderedJavascript,TEXT_JAVASCRIPT_MIMETYPE:()=>TEXT_JAVASCRIPT_MIMETYPE,default:()=>__WEBPACK_DEFAULT_EXPORT__,rendererFactory:()=>rendererFactory});var _jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(20040),_jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_0__);const TEXT_JAVASCRIPT_MIMETYPE="text/javascript",APPLICATION_JAVASCRIPT_MIMETYPE="application/javascript";function evalInContext(code,element,document,window){return eval(code)}class ExperimentalRenderedJavascript extends _jupyterlab_rendermime__WEBPACK_IMPORTED_MODULE_0__.RenderedJavaScript{render(e){const _=this.translator.load("jupyterlab"),r=()=>{try{const _=e.data[this.mimeType];return _&&evalInContext(_,this.node,document,window),Promise.resolve()}catch(e){return Promise.reject(e)}};if(!e.trusted){const e=document.createElement("pre");e.textContent=_.__("Are you sure that you want to run arbitrary Javascript within your JupyterLab session?");const t=document.createElement("button");return t.textContent=_.__("Run"),this.node.appendChild(e),this.node.appendChild(t),t.onclick=e=>{this.node.textContent="",r()},Promise.resolve()}return r()}}const rendererFactory={safe:!1,mimeTypes:[TEXT_JAVASCRIPT_MIMETYPE,APPLICATION_JAVASCRIPT_MIMETYPE],createRenderer:e=>new ExperimentalRenderedJavascript(e)},extension={id:"@jupyterlab/javascript-extension:factory",rendererFactory,rank:0,dataType:"string"},__WEBPACK_DEFAULT_EXPORT__=extension}}]);
+//# sourceMappingURL=1113.23c9417.js.map
\ No newline at end of file
diff --git a/_static/build/1113.23c9417.js.map b/_static/build/1113.23c9417.js.map
new file mode 100644
index 0000000..4d73e05
--- /dev/null
+++ b/_static/build/1113.23c9417.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"1113.23c9417.js","mappings":"svBAUO,MAAM,yBAA2B,kBAC3B,gCAAkC,yBAE/C,SAAS,cACP,KACA,QACA,SACA,QAGA,OAAO,KAAK,KACd,CAEM,MAAO,uCAAuC,uEAClD,OAAO,GACL,MAAM,EAAQ,KAAK,WAAW,KAAK,cAC7B,EAAmB,KACvB,IACE,MAAM,EAAO,EAAM,KAAK,KAAK,UAI7B,OAHI,GACF,cAAc,EAAM,KAAK,KAAM,SAAU,QAEpC,QAAQ,S,CACf,MAAO,GACP,OAAO,QAAQ,OAAO,E,GAG1B,IAAK,EAAM,QAAS,CAElB,MAAM,EAAM,SAAS,cAAc,OACnC,EAAI,YAAc,EAAM,GACtB,0FAEF,MAAM,EAAS,SAAS,cAAc,UAUtC,OATA,EAAO,YAAc,EAAM,GAAG,OAE9B,KAAK,KAAK,YAAY,GACtB,KAAK,KAAK,YAAY,GAEtB,EAAO,QAAU,IACf,KAAK,KAAK,YAAc,GACnB,GAAkB,EAElB,QAAQ,S,CAEjB,OAAO,GACT,EAMK,MAAM,gBAAgD,CAC3D,MAAM,EACN,UAAW,CAAC,yBAA0B,iCACtC,eAAgB,GAAW,IAAI,+BAA+B,IAG1D,UAAoC,CACxC,GAAI,2CACJ,gBACA,KAAM,EACN,SAAU,UAGZ,oC","sources":["webpack://_JUPYTERLAB.CORE_OUTPUT/../src/index.ts"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/build/1125.129d070.js b/_static/build/1125.129d070.js
new file mode 100644
index 0000000..76f61e4
--- /dev/null
+++ b/_static/build/1125.129d070.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunk_JUPYTERLAB_CORE_OUTPUT=self.webpackChunk_JUPYTERLAB_CORE_OUTPUT||[]).push([[1125],{51125:(e,t,s)=>{s.r(t),s.d(t,{IDocumentProviderFactory:()=>h,ProviderMock:()=>c,WebSocketProviderWithLocks:()=>B,getAnonymousUserName:()=>o,getRandomColor:()=>a,moonsOfJupyter:()=>n,userColors:()=>i});const n=["Metis","Adrastea","Amalthea","Thebe","Io","Europa","Ganymede","Callisto","Themisto","Leda","Ersa","Pandia","Himalia","Lysithea","Elara","Dia","Carpo","Valetudo","Euporie","Eupheme","Helike","Euanthe","Hermippe","Praxidike","Thyone","Thelxinoe","Ananke","Mneme","Orthosie","Harpalyke","Iocaste","Erinome","Aitne","Herse","Taygete","Eukelade","Carme","Isonoe","Autonoe","Philophrosyne","Cyllene","Pasithee","Pasiphae","Sponde","Eurydome","Kalyke","Hegemone","Kale","Kallichore","Chaldene","Arche","Eirene","Kore","Megaclite","Aoede","Callirrhoe","Sinope"],o=()=>"Anonymous "+n[Math.floor(Math.random()*n.length)],i=["#12A0D3","#17AB30","#CC8500","#A79011","#ee6352","#609DA9","#4BA749","#00A1B3"],a=()=>i[Math.floor(Math.random()*i.length)];class c{requestInitialContent(){return Promise.resolve(!1)}putInitializedState(){}acquireLock(){return Promise.resolve(0)}releaseLock(e){}destroy(){}setPath(e){}}var r=s(26169);const h=new r.Token("@jupyterlab/docprovider:IDocumentProviderFactory");var l=s(27164),d=s(44918),u=s(79915),w=s(31234),_=s(30996),m=s(99622);const f=new Map,y="undefined"==typeof BroadcastChannel?class{constructor(e){this.room=e,this.onmessage=null,m.z((t=>t.key===e&&null!==this.onmessage&&this.onmessage({data:_.Gh(t.newValue||"")})))}postMessage(e){m.X.setItem(this.room,_.s3(_.eh(e)))}}:BroadcastChannel,p=e=>w.Yu(f,e,(()=>{const t=new Set,s=new y(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),g=(e,t,s=null)=>{const n=p(e);n.bc.postMessage(t),n.subs.forEach((e=>e(t,s)))};var v=s(9817);const b=(e,t)=>{d.uE(e,0);const s=u.encodeStateVector(t);d.mP(e,s)},k=(e,t,s)=>{d.uE(e,1),d.mP(e,u.encodeStateAsUpdate(t,s))},C=(e,t,s)=>{try{u.applyUpdate(t,l.HN(e),s)}catch(e){console.error("Caught error while handling a Yjs update",e)}},I=C;var E=s(70528),M=s(32549),L=s(41865),U=s(41042),P=s(18533);const R=[];R[0]=(e,t,s,n,o)=>{d.uE(e,0);const i=((e,t,s,n)=>{const o=l.yg(e);switch(o){case 0:((e,t,s)=>{k(t,s,l.HN(e))})(e,t,s);break;case 1:C(e,s,n);break;case 2:I(e,s,n);break;default:throw new Error("Unknown message type")}return o})(t,e,s.doc,s);n&&1===i&&!s.synced&&(s.synced=!0)},R[3]=(e,t,s,n,o)=>{d.uE(e,1),d.mP(e,E.xq(s.awareness,Array.from(s.awareness.getStates().keys())))},R[1]=(e,t,s,n,o)=>{E.oy(s.awareness,l.HN(t),s)},R[2]=(e,t,s,n,o)=>{((e,t,s)=>{0===l.yg(e)&&s(0,l.kf(e))})(t,s.doc,((e,t)=>q(s,t)))};const q=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),A=(e,t,s)=>{const n=l.l1(t),o=d.Mf(),i=l.yg(n),a=e.messageHandlers[i];return a?a(o,n,e,s,i):console.error("Unable to compute message"),o},S=e=>{if(e.shouldConnect&&null===e.ws){const t=new e._WS(e.url);t.binaryType="arraybuffer",e.ws=t,e.wsconnecting=!0,e.wsconnected=!1,e.synced=!1,t.onmessage=s=>{e.wsLastMessageReceived=v.ZG();const n=A(e,new Uint8Array(s.data),!0);d.kE(n)>1&&t.send(d._f(n))},t.onerror=t=>{e.emit("connection-error",[t,e])},t.onclose=t=>{e.emit("connection-close",[t,e]),e.ws=null,e.wsconnecting=!1,e.wsconnected?(e.wsconnected=!1,e.synced=!1,E.Ag(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(S,L.VV(100*L.sQ(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e)},t.onopen=()=>{e.wsLastMessageReceived=v.ZG(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const s=d.Mf();if(d.uE(s,0),b(s,e.doc),t.send(d._f(s)),null!==e.awareness.getLocalState()){const s=d.Mf();d.uE(s,1),d.mP(s,E.xq(e.awareness,[e.doc.clientID])),t.send(d._f(s))}},e.emit("status",[{status:"connecting"}])}},H=(e,t)=>{e.wsconnected&&e.ws.send(t),e.bcconnected&&g(e.bcChannel,t,e)};class T extends M.y{constructor(e,t,s,{connect:n=!0,awareness:o=new E.GL(s),params:i={},WebSocketPolyfill:a=WebSocket,resyncInterval:c=-1,maxBackoffTime:r=2500,disableBc:h=!1}={}){for(super();"/"===e[e.length-1];)e=e.slice(0,e.length-1);const l=(e=>U.UI(e,((e,t)=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`)).join("&"))(i);this.maxBackoffTime=r,this.bcChannel=e+"/"+t,this.url=e+"/"+t+(0===l.length?"":"?"+l),this.roomname=t,this.doc=s,this._WS=a,this.awareness=o,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=h,this.wsUnsuccessfulReconnects=0,this.messageHandlers=R.slice(),this._synced=!1,this.ws=null,this.wsLastMessageReceived=0,this.shouldConnect=n,this._resyncInterval=0,c>0&&(this._resyncInterval=setInterval((()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=d.Mf();d.uE(e,0),b(e,s),this.ws.send(d._f(e))}}),c)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=A(this,new Uint8Array(e),!1);d.kE(t)>1&&g(this.bcChannel,d._f(t),this)}},this._updateHandler=(e,t)=>{if(t!==this){const t=d.Mf();d.uE(t,0),((e,t)=>{d.uE(e,2),d.mP(e,t)})(t,e),H(this,d._f(t))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:e,updated:t,removed:s},n)=>{const i=e.concat(t).concat(s),a=d.Mf();d.uE(a,1),d.mP(a,E.xq(o,i)),H(this,d._f(a))},this._unloadHandler=()=>{E.Ag(this.awareness,[s.clientID],"window unload")},"undefined"!=typeof window?window.addEventListener("unload",this._unloadHandler):P.on("exit",this._unloadHandler),o.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4{const i=l.Jl(t),a=this._currentLockRequest;this._currentLockRequest=null,a&&a.resolve(i)},this.messageHandlers[125]=(e,t,s,n,o)=>{const i=l.iU(t);i.byteLength>0&&u.applyUpdate(this.doc,i);const a=this._initialContentRequest;this._initialContentRequest=null,a&&a.resolve(i.byteLength>0)},this._isInitialized=!1,this._onConnectionStatus=this._onConnectionStatus.bind(this),this.on("status",this._onConnectionStatus)}setPath(e){if(e!==this._path){this._path=e;const t=d.Mf();d.cW(t,123);const s=unescape(encodeURIComponent(this._contentType+":"+e));for(let e=0;e{var e;return null===(e=this._initialContentRequest)||void 0===e?void 0:e.resolve(!1)}),1e3)),this._initialContentRequest.promise}putInitializedState(){const e=d.Mf();d.uE(e,124),d.HK(e,u.encodeStateAsUpdate(this.doc)),this._sendMessage(d._f(e)),this._isInitialized=!0}acquireLock(){if(this._currentLockRequest)return this._currentLockRequest.promise;let e,t;this._sendMessage(new Uint8Array([127])),this._requestLockInterval&&clearInterval(this._requestLockInterval),this._requestLockInterval=setInterval((()=>{this.wsconnected&&this._sendMessage(new Uint8Array([127]))}),500);const s=new Promise(((s,n)=>{e=s,t=n}));return this._currentLockRequest={promise:s,resolve:e,reject:t},s}releaseLock(e){const t=d.Mf();d.uE(t,126),d.Ep(t,e),this._sendMessage(d._f(t)),this._requestLockInterval&&clearInterval(this._requestLockInterval)}_sendMessage(e){const t=()=>{setTimeout((()=>{this.wsconnected?this.ws.send(e):this.once("status",t)}),0)};t()}async _onConnectionStatus(e){if(this._isInitialized&&"connected"===e.status){const e=await this.acquireLock();await this.requestInitialContent()||this.putInitializedState(),this.releaseLock(e)}}}}}]);
+//# sourceMappingURL=1125.129d070.js.map
\ No newline at end of file
diff --git a/_static/build/1125.129d070.js.map b/_static/build/1125.129d070.js.map
new file mode 100644
index 0000000..5c44452
--- /dev/null
+++ b/_static/build/1125.129d070.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"1125.129d070.js","mappings":"4TACO,MAAM,EAAiB,CAC5B,QACA,WACA,WACA,QACA,KACA,SACA,WACA,WACA,WACA,OACA,OACA,SACA,UACA,WACA,QACA,MACA,QACA,WACA,UACA,UAGA,SAGA,UAEA,WACA,YACA,SACA,YAEA,SACA,QAEA,WACA,YACA,UAIA,UACA,QACA,QACA,UAGA,WACA,QAEA,SAEA,UACA,gBACA,UACA,WAEA,WACA,SAEA,WAEA,SACA,WACA,OACA,aAGA,WACA,QACA,SACA,OAGA,YACA,QAEA,aACA,UAOW,EAAuB,IAClC,aACA,EAAe,KAAK,MAAM,KAAK,SAAW,EAAe,SAE9C,EAAa,CACxB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGW,EAAiB,IAC5B,EAAW,KAAK,MAAM,KAAK,SAAW,EAAW,SCrG7C,MAAO,EACX,wBACE,OAAO,QAAQ,SAAQ,EACzB,CACA,sBAEA,CACA,cACE,OAAO,QAAQ,QAAQ,EACzB,CACA,YAAY,GAEZ,CACA,UAEA,CACA,QAAQ,GAER,E,eCdK,MAAM,EAA2B,IAAI,QAC1C,oD,sECyBF,MAAMA,EAAW,IAAIC,IAwBfC,EAAiC,oBAArBC,iBAtBlB,MAIEC,YAAaC,GACXC,KAAKD,KAAOA,EAIZC,KAAKC,UAAY,KACjBC,EAAA,GAAiBC,GAAKA,EAAEC,MAAQL,GAA2B,OAAnBC,KAAKC,WAAsBD,KAAKC,UAAU,CAAEI,KAAMC,EAAA,GAAkBH,EAAEI,UAAY,OAC5H,CAKAC,YAAaC,GACXP,EAAA,UAA2BF,KAAKD,KAAMO,EAAA,GAAgBA,EAAA,GAAuCG,IAC/F,GAI0EZ,iBAMtEa,EAAaX,GACjBY,EAAA,GAAmBjB,EAAUK,GAAM,KACjC,MAAMa,EAAO,IAAIC,IACXC,EAAK,IAAIlB,EAAGG,GAKlB,OADAe,EAAGb,UAAYE,GAAKS,EAAKG,SAAQC,GAAOA,EAAIb,EAAEE,KAAM,sBAC7C,CACLS,KAAIF,OACN,IA6BSK,EAAU,CAAClB,EAAMM,EAAMa,EAAS,QAC3C,MAAMC,EAAIT,EAAWX,GACrBoB,EAAEL,GAAGN,YAAYH,GACjBc,EAAEP,KAAKG,SAAQC,GAAOA,EAAIX,EAAMa,IAAO,E,cCnElC,MAUME,EAAiB,CAACC,EAASC,KACtC,KAAsBD,EAXW,GAYjC,MAAME,EAAK,oBAAoBD,GAC/B,KAA4BD,EAASE,EAAE,EAQ5BC,EAAiB,CAACH,EAASC,EAAKG,KAC3C,KAAsBJ,EArBW,GAsBjC,KAA4BA,EAAS,sBAAsBC,EAAKG,GAAmB,EAoBxEC,EAAgB,CAACC,EAASL,EAAKM,KAC1C,IACE,cAAcN,EAAKO,EAAA,GAA2BF,GAAUC,EAI1D,CAHE,MAAOE,GAEPC,QAAQD,MAAM,2CAA4CA,EAC5D,GAmBWE,EAAaN,E,2DCvFnB,MASDO,EAAkB,GAExBA,EAX2B,GAWI,CAC7BZ,EACAM,EACAO,EACAC,EACAC,KAEA,KAAsBf,EAlBG,GAmBzB,MAAMgB,ED4EuB,EAACV,EAASN,EAASC,EAAKM,KACrD,MAAMU,EAAcT,EAAA,GAAqBF,GACzC,OAAQW,GACN,KA/E+B,EAiCN,EAACX,EAASN,EAASC,KAC9CE,EAAeH,EAASC,EAAKO,EAAA,GAA2BF,GASnD,EAqCDY,CAAcZ,EAASN,EAASC,GAChC,MACF,KAjF+B,EAkF7BI,EAAcC,EAASL,EAAKM,GAC5B,MACF,KAnF4B,EAoF1BI,EAAWL,EAASL,EAAKM,GACzB,MACF,QACE,MAAM,IAAIY,MAAM,wBAEpB,OAAOF,GC3FiB,CACtBX,EACAN,EACAa,EAASZ,IACTY,GAGAC,GDN+B,ICMjBE,IACbH,EAASO,SAEVP,EAASO,QAAS,EACpB,EAGFR,EAhCqC,GAgCI,CACvCZ,EACAqB,EACAR,EACAS,EACAP,KAEA,KAAsBf,EAtCQ,GAuC9B,KACEA,EACA,KACEa,EAASU,UACTC,MAAMC,KAAKZ,EAASU,UAAUG,YAAYC,SAE9C,EAGFf,EAhDgC,GAgDI,CAClCgB,EACAtB,EACAO,EACAS,EACAP,KAEA,KACEF,EAASU,UACTf,EAAA,GAA2BF,GAC3BO,EACF,EAGFD,EA7D2B,GA6DI,CAC7BgB,EACAtB,EACAO,EACAS,EACAP,KC3D6B,EAACT,EAASuB,EAAGC,KAvBL,IAwB7BtB,EAAA,GAAqBF,IACGwB,EAAwBD,EAAGrB,EAAA,GAAuBF,GAClF,ED0DA,CACEA,EACAO,EAASZ,KACT,CAAC8B,EAAOC,IAAWF,EAAwBjB,EAAUmB,IACvD,EAIF,MAMMF,EAA0B,CAACjB,EAAUmB,IACzCtB,QAAQuB,KAAK,+BAA+BpB,EAASqB,SAASF,KAQ1DG,EAAc,CAACtB,EAAUzB,EAAK0B,KAClC,MAAMR,EAAUE,EAAA,GAAuBpB,GACjCY,EAAU,OACViB,EAAcT,EAAA,GAAqBF,GACnC8B,EAAiBvB,EAASD,gBAAgBK,GAMhD,OALuB,EACrBmB,EAAepC,EAASM,EAASO,EAAUC,EAAYG,GAEvDP,QAAQD,MAAM,6BAETT,GAMHqC,EAAWxB,IACf,GAAIA,EAASyB,eAAiC,OAAhBzB,EAAS0B,GAAa,CAClD,MAAMC,EAAY,IAAI3B,EAAS4B,IAAI5B,EAASqB,KAC5CM,EAAUE,WAAa,cACvB7B,EAAS0B,GAAKC,EACd3B,EAAS8B,cAAe,EACxB9B,EAAS+B,aAAc,EACvB/B,EAASO,QAAS,EAElBoB,EAAU5D,UAAaiE,IACrBhC,EAASiC,sBAAwBC,EAAA,KACjC,MAAM/C,EAAUmC,EAAYtB,EAAU,IAAImC,WAAWH,EAAM7D,OAAO,GAC9D,KAAgBgB,GAAW,GAC7BwC,EAAUS,KAAK,KAAsBjD,GACvC,EAEFwC,EAAUU,QAAWL,IACnBhC,EAASsC,KAAK,mBAAoB,CAACN,EAAOhC,GAAS,EAErD2B,EAAUY,QAAWP,IACnBhC,EAASsC,KAAK,mBAAoB,CAACN,EAAOhC,IAC1CA,EAAS0B,GAAK,KACd1B,EAAS8B,cAAe,EACpB9B,EAAS+B,aACX/B,EAAS+B,aAAc,EACvB/B,EAASO,QAAS,EAElB,KACEP,EAASU,UACTC,MAAMC,KAAKZ,EAASU,UAAUG,YAAYC,QAAQ0B,QAAQC,GACxDA,IAAWzC,EAASZ,IAAIsD,WAE1B1C,GAEFA,EAASsC,KAAK,SAAU,CAAC,CACvBK,OAAQ,mBAGV3C,EAAS4C,2BAIXC,WACErB,EACAsB,EAAA,GACmD,IAAjDA,EAAA,GAAS,EAAG9C,EAAS4C,0BACrB5C,EAAS+C,gBAEX/C,EACF,EAEF2B,EAAUqB,OAAS,KACjBhD,EAASiC,sBAAwBC,EAAA,KACjClC,EAAS8B,cAAe,EACxB9B,EAAS+B,aAAc,EACvB/B,EAAS4C,yBAA2B,EACpC5C,EAASsC,KAAK,SAAU,CAAC,CACvBK,OAAQ,eAGV,MAAMxD,EAAU,OAKhB,GAJA,KAAsBA,EA3KD,GA4KrB,EAA4BA,EAASa,EAASZ,KAC9CuC,EAAUS,KAAK,KAAsBjD,IAEM,OAAvCa,EAASU,UAAUuC,gBAA0B,CAC/C,MAAMC,EAAwB,OAC9B,KAAsBA,EA/KE,GAgLxB,KACEA,EACA,KAAwClD,EAASU,UAAW,CAC1DV,EAASZ,IAAIsD,YAGjBf,EAAUS,KAAK,KAAsBc,GACvC,GAGFlD,EAASsC,KAAK,SAAU,CAAC,CACvBK,OAAQ,eAEZ,GAOIQ,EAAmB,CAACnD,EAAUzB,KAC9ByB,EAAS+B,aACe/B,EAAW,GAAEoC,KAAK7D,GAE1CyB,EAASoD,aACX,EAAWpD,EAASqD,UAAW9E,EAAKyB,EACtC,EAgBK,MAAMsD,UAA0B,IAcrC1F,YAAa2F,EAAWC,EAAUpE,GAAK,QACrCqE,GAAU,EAAI,UACd/C,EAAY,IAAI,KAA4BtB,GAAI,OAChDsE,EAAS,CAAC,EAAC,kBACXC,EAAoBC,UAAS,eAC7BC,GAAiB,EAAE,eACnBd,EAAiB,KAAI,UACrBe,GAAY,GACV,CAAC,GAGH,IAFAC,QAE2C,MAApCR,EAAUA,EAAUS,OAAS,IAClCT,EAAYA,EAAUU,MAAM,EAAGV,EAAUS,OAAS,GAEpD,MAAME,EEvOuBR,IAC/BS,EAAA,GAAWT,GAAQ,CAACU,EAAKlG,IAAQ,GAAGmG,mBAAmBnG,MAAQmG,mBAAmBD,OAAQE,KAAK,KFsOvE,CAAsBZ,GAC5C5F,KAAKiF,eAAiBA,EACtBjF,KAAKuF,UAAYE,EAAY,IAAMC,EACnC1F,KAAKuD,IAAMkC,EAAY,IAAMC,GACD,IAAzBU,EAAcF,OAAe,GAAK,IAAME,GAC3CpG,KAAK0F,SAAWA,EAChB1F,KAAKsB,IAAMA,EACXtB,KAAK8D,IAAM+B,EACX7F,KAAK4C,UAAYA,EACjB5C,KAAKiE,aAAc,EACnBjE,KAAKgE,cAAe,EACpBhE,KAAKsF,aAAc,EACnBtF,KAAKgG,UAAYA,EACjBhG,KAAK8E,yBAA2B,EAChC9E,KAAKiC,gBAAkBA,EAAgBkE,QAIvCnG,KAAKyG,SAAU,EAIfzG,KAAK4D,GAAK,KACV5D,KAAKmE,sBAAwB,EAK7BnE,KAAK2D,cAAgBgC,EAKrB3F,KAAK0G,gBAAkB,EACnBX,EAAiB,IACnB/F,KAAK0G,gBAAsCC,aAAY,KACrD,GAAI3G,KAAK4D,IAAM5D,KAAK4D,GAAGgD,aAAed,UAAUe,KAAM,CAEpD,MAAMxF,EAAU,OAChB,KAAsBA,EA/RL,GAgSjB,EAA4BA,EAASC,GACrCtB,KAAK4D,GAAGU,KAAK,KAAsBjD,GACrC,IACC0E,IAOL/F,KAAK8G,cAAgB,CAACzG,EAAMa,KAC1B,GAAIA,IAAWlB,KAAM,CACnB,MAAMqB,EAAUmC,EAAYxD,KAAM,IAAIqE,WAAWhE,IAAO,GACpD,KAAgBgB,GAAW,GAC7B,EAAWrB,KAAKuF,UAAW,KAAsBlE,GAAUrB,KAE/D,GAOFA,KAAK+G,eAAiB,CAACC,EAAQ9F,KAC7B,GAAIA,IAAWlB,KAAM,CACnB,MAAMqB,EAAU,OAChB,KAAsBA,EA1TH,GD2EA,EAACA,EAAS2F,KACnC,KAAsB3F,EAvDQ,GAwD9B,KAA4BA,EAAS2F,EAAM,EC8OrC,CAAyB3F,EAAS2F,GAClC3B,EAAiBrF,KAAM,KAAsBqB,GAC/C,GAEFrB,KAAKsB,IAAI2F,GAAG,SAAUjH,KAAK+G,gBAK3B/G,KAAKkH,wBAA0B,EAAGC,QAAOC,UAASC,WAAWC,KAC3D,MAAMC,EAAiBJ,EAAMK,OAAOJ,GAASI,OAAOH,GAC9ChG,EAAU,OAChB,KAAsBA,EArUI,GAsU1B,KACEA,EACA,KAAwCuB,EAAW2E,IAErDlC,EAAiBrF,KAAM,KAAsBqB,GAAQ,EAEvDrB,KAAKyH,eAAiB,KACpB,KACEzH,KAAK4C,UACL,CAACtB,EAAIsD,UACL,gBACF,EAEoB,oBAAX8C,OACTA,OAAOC,iBAAiB,SAAU3H,KAAKyH,gBAEvCG,EAAQX,GAAG,OAAQjH,KAAKyH,gBAE1B7E,EAAUqE,GAAG,SAAUjH,KAAKkH,yBAC5BlH,KAAK6H,eAAqClB,aAAY,KAElD3G,KAAKiE,aA9QmB,IAgRtBG,EAAA,KAAqBpE,KAAKmE,uBAIFnE,KAAO,GAAE8H,OACrC,GACCC,KACCpC,GACF3F,KAAK2F,SAET,CAKIlD,aACF,OAAOzC,KAAKyG,OACd,CAEIhE,WAAQuF,GACNhI,KAAKyG,UAAYuB,IACnBhI,KAAKyG,QAAUuB,EACfhI,KAAKwE,KAAK,SAAU,CAACwD,IACrBhI,KAAKwE,KAAK,OAAQ,CAACwD,IAEvB,CAEAC,UAC+B,IAAzBjI,KAAK0G,iBACPwB,cAAclI,KAAK0G,iBAErBwB,cAAclI,KAAK6H,gBACnB7H,KAAKmI,aACiB,oBAAXT,OACTA,OAAOU,oBAAoB,SAAUpI,KAAKyH,gBAE1CG,EAAQS,IAAI,OAAQrI,KAAKyH,gBAE3BzH,KAAK4C,UAAUyF,IAAI,SAAUrI,KAAKkH,yBAClClH,KAAKsB,IAAI+G,IAAI,SAAUrI,KAAK+G,gBAC5Bd,MAAMgC,SACR,CAEAK,YACE,GAAItI,KAAKgG,UACP,OF5UmB,IAACjG,EAAMwI,EE8UvBvI,KAAKsF,cF9UYvF,EE+UPC,KAAKuF,UF/UQgD,EE+UGvI,KAAK8G,cF/UFpG,EAAWX,GAAMa,KAAK4H,IAAID,GEgV1DvI,KAAKsF,aAAc,GAIrB,MAAMmD,EAAc,OACpB,KAAsBA,EArZC,GAsZvB,EAA4BA,EAAazI,KAAKsB,KAC9C,EAAWtB,KAAKuF,UAAW,KAAsBkD,GAAczI,MAE/D,MAAM0I,EAAe,OACrB,KAAsBA,EA1ZC,GA2ZvB,EAA4BA,EAAc1I,KAAKsB,KAC/C,EAAWtB,KAAKuF,UAAW,KAAsBmD,GAAe1I,MAEhE,MAAM2I,EAAwB,OAC9B,KAAsBA,EA9ZW,GA+ZjC,EACE3I,KAAKuF,UACL,KAAsBoD,GACtB3I,MAGF,MAAMoF,EAAwB,OAC9B,KAAsBA,EAraM,GAsa5B,KACEA,EACA,KAAwCpF,KAAK4C,UAAW,CACtD5C,KAAKsB,IAAIsD,YAGb,EACE5E,KAAKuF,UACL,KAAsBH,GACtBpF,KAEJ,CAEA4I,eAEE,MAAMvH,EAAU,OF9WO,IAACtB,EAAMwI,EE+W9B,KAAsBlH,EAtbM,GAub5B,KACEA,EACA,KAAwCrB,KAAK4C,UAAW,CACtD5C,KAAKsB,IAAIsD,UACR,IAAIjF,MAET0F,EAAiBrF,KAAM,KAAsBqB,IACzCrB,KAAKsF,cFvXevF,EEwXPC,KAAKuF,UFxXQgD,EEwXGvI,KAAK8G,cFxXFpG,EAAWX,GAAMa,KAAKiI,OAAON,GEyX/DvI,KAAKsF,aAAc,EAEvB,CAEA6C,aACEnI,KAAK2D,eAAgB,EACrB3D,KAAK4I,eACW,OAAZ5I,KAAK4D,IACP5D,KAAK4D,GAAGkE,OAEZ,CAEAnC,UACE3F,KAAK2D,eAAgB,EAChB3D,KAAKiE,aAA2B,OAAZjE,KAAK4D,KAC5BF,EAAQ1D,MACRA,KAAKsI,YAET,EG/cI,MAAO,UACH,EAOR,YAAY,G,UACV,MACE,EAAQ,IACR,EAAQ,YAAc,IAAM,EAAQ,KACpC,EAAQ,OAAO,KACf,CACE,UAAW,EAAQ,OAAO,YA4MxB,yBAIG,KACH,4BAA0D,KA9MhE,KAAK,MAAQ,EAAQ,KACrB,KAAK,aAAe,EAAQ,YAC5B,KAAK,WAAa,EAAQ,IAC1B,MAAM,EAAe,IAAI,IAAI,EAAQ,KAAK,aACpC,EAC+B,QAD1B,EACT,IAAM,EAAa,IAAI,oBAAY,QAAI,IAAiB,MAAM,GAC1D,EAAmC,QAA/B,EAAG,EAAa,IAAI,mBAAW,QAAI,IAEvC,EADY,EAAQ,OAAO,UACL,gBAExB,GAAqC,OAAV,QAAd,IAAU,YAAI,eAAE,OAC/B,EAAQ,OAAO,UAAU,mBAAmB,OAAQ,CAClD,OACA,UAKJ,KAAK,gBAAgB,KAAO,CAC1B,EACA,EACA,EACA,EACA,KAGA,MAAM,EAAY,KAAoB,GAChC,EAAc,KAAK,oBACzB,KAAK,oBAAsB,KACvB,GACF,EAAY,QAAQ,E,EAIxB,KAAK,gBAAgB,KAAO,CAC1B,EACA,EACA,EACA,EACA,KAGA,MAAM,EAAiB,KAA8B,GAEjD,EAAe,WAAa,GAC9B,cAAc,KAAK,IAAK,GAE1B,MAAM,EAAwB,KAAK,uBACnC,KAAK,uBAAyB,KAC1B,GACF,EAAsB,QAAQ,EAAe,WAAa,E,EAG9D,KAAK,gBAAiB,EACtB,KAAK,oBAAsB,KAAK,oBAAoB,KAAK,MACzD,KAAK,GAAG,SAAU,KAAK,oBACzB,CAEA,QAAQ,GACN,GAAI,IAAY,KAAK,MAAO,CAC1B,KAAK,MAAQ,EACb,MAAM,EAAU,OAChB,KAAe,EAAS,KAExB,MAAM,EAAc,SAClB,mBAAmB,KAAK,aAAe,IAAM,IAE/C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAY,OAAQ,IACtC,KACE,EACsB,EAAY,YAAY,IAGlD,KAAK,aAAa,KAAsB,IAExC,KAAK,eAEL,KAAK,UACH,KAAK,WAAa,IAAM,KAAK,aAAe,IAAM,KAAK,MACzD,KAAK,IAAM,KAAK,UAChB,KAAK,W,CAET,CAKA,wBACE,OAAI,KAAK,yBAIT,KAAK,uBAAyB,IAAI,kBAClC,KAAK,aAAa,IAAI,WAAW,CAAC,OAMlC,YAAW,KAAK,aAA4B,QAA5B,EAAC,KAAK,8BAAsB,eAAE,SAAQ,EAAK,GAAG,MAVrD,KAAK,uBAAuB,OAYvC,CAKA,sBACE,MAAM,EAAU,OAChB,KAAsB,EAAS,KAC/B,KAAyB,EAAS,sBAAsB,KAAK,MAC7D,KAAK,aAAa,KAAsB,IACxC,KAAK,gBAAiB,CACxB,CAMA,cACE,GAAI,KAAK,oBACP,OAAO,KAAK,oBAAoB,QAalC,IAAI,EAAc,EAXlB,KAAK,aAAa,IAAI,WAAW,CAAC,OAE9B,KAAK,sBACP,cAAc,KAAK,sBAErB,KAAK,qBAAuB,aAAY,KAClC,KAAK,aAEP,KAAK,aAAa,IAAI,WAAW,CAAC,M,GAEnC,KAEH,MAAM,EAA2B,IAAI,SAAQ,CAAC,EAAU,KACtD,EAAU,EACV,EAAS,CAAO,IAGlB,OADA,KAAK,oBAAsB,CAAE,UAAS,UAAS,UACxC,CACT,CAOA,YAAY,GACV,MAAM,EAAU,OAEhB,KAAsB,EAAS,KAC/B,KAAqB,EAAS,GAE9B,KAAK,aAAa,KAAsB,IACpC,KAAK,sBACP,cAAc,KAAK,qBAEvB,CAOQ,aAAa,GAEnB,MAAM,EAAO,KACX,YAAW,KACL,KAAK,YACP,KAAK,GAAI,KAAK,GAEd,KAAK,KAAK,SAAU,E,GAErB,EAAE,EAEP,GACF,CAOQ,0BAA0B,GAGhC,GAAI,KAAK,gBAAoC,cAAlB,EAAO,OAAwB,CACxD,MAAM,QAAa,KAAK,oBACW,KAAK,yBAEtC,KAAK,sBAEP,KAAK,YAAY,E,CAErB,E","sources":["webpack://_JUPYTERLAB.CORE_OUTPUT/../src/awareness.ts","webpack://_JUPYTERLAB.CORE_OUTPUT/../src/mock.ts","webpack://_JUPYTERLAB.CORE_OUTPUT/../src/tokens.ts","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/lib0/broadcastchannel.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/y-protocols/sync.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/y-websocket/src/y-websocket.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/y-protocols/auth.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/lib0/url.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../src/yprovider.ts"],"sourcesContent":[null,null,null,"/* eslint-env browser */\n\n/**\n * Helpers for cross-tab communication using broadcastchannel with LocalStorage fallback.\n *\n * ```js\n * // In browser window A:\n * broadcastchannel.subscribe('my events', data => console.log(data))\n * broadcastchannel.publish('my events', 'Hello world!') // => A: 'Hello world!' fires synchronously in same tab\n *\n * // In browser window B:\n * broadcastchannel.publish('my events', 'hello from tab B') // => A: 'hello from tab B'\n * ```\n *\n * @module broadcastchannel\n */\n\n// @todo before next major: use Uint8Array instead as buffer object\n\nimport * as map from './map.js'\nimport * as buffer from './buffer.js'\nimport * as storage from './storage.js'\n\n/**\n * @typedef {Object} Channel\n * @property {Set} Channel.subs\n * @property {any} Channel.bc\n */\n\n/**\n * @type {Map}\n */\nconst channels = new Map()\n\nclass LocalStoragePolyfill {\n /**\n * @param {string} room\n */\n constructor (room) {\n this.room = room\n /**\n * @type {null|function({data:ArrayBuffer}):void}\n */\n this.onmessage = null\n storage.onChange(e => e.key === room && this.onmessage !== null && this.onmessage({ data: buffer.fromBase64(e.newValue || '') }))\n }\n\n /**\n * @param {ArrayBuffer} buf\n */\n postMessage (buf) {\n storage.varStorage.setItem(this.room, buffer.toBase64(buffer.createUint8ArrayFromArrayBuffer(buf)))\n }\n}\n\n// Use BroadcastChannel or Polyfill\nconst BC = typeof BroadcastChannel === 'undefined' ? LocalStoragePolyfill : BroadcastChannel\n\n/**\n * @param {string} room\n * @return {Channel}\n */\nconst getChannel = room =>\n map.setIfUndefined(channels, room, () => {\n const subs = new Set()\n const bc = new BC(room)\n /**\n * @param {{data:ArrayBuffer}} e\n */\n bc.onmessage = e => subs.forEach(sub => sub(e.data, 'broadcastchannel'))\n return {\n bc, subs\n }\n })\n\n/**\n * Subscribe to global `publish` events.\n *\n * @function\n * @param {string} room\n * @param {function(any, any):any} f\n */\nexport const subscribe = (room, f) => getChannel(room).subs.add(f)\n\n/**\n * Unsubscribe from `publish` global events.\n *\n * @function\n * @param {string} room\n * @param {function(any, any):any} f\n */\nexport const unsubscribe = (room, f) => getChannel(room).subs.delete(f)\n\n/**\n * Publish data to all subscribers (including subscribers on this tab)\n *\n * @function\n * @param {string} room\n * @param {any} data\n * @param {any} [origin]\n */\nexport const publish = (room, data, origin = null) => {\n const c = getChannel(room)\n c.bc.postMessage(data)\n c.subs.forEach(sub => sub(data, origin))\n}\n","/**\n * @module sync-protocol\n */\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as Y from 'yjs'\n\n/**\n * @typedef {Map} StateMap\n */\n\n/**\n * Core Yjs defines two message types:\n * • YjsSyncStep1: Includes the State Set of the sending client. When received, the client should reply with YjsSyncStep2.\n * • YjsSyncStep2: Includes all missing structs and the complete delete set. When received, the client is assured that it\n * received all information from the remote client.\n *\n * In a peer-to-peer network, you may want to introduce a SyncDone message type. Both parties should initiate the connection\n * with SyncStep1. When a client received SyncStep2, it should reply with SyncDone. When the local client received both\n * SyncStep2 and SyncDone, it is assured that it is synced to the remote client.\n *\n * In a client-server model, you want to handle this differently: The client should initiate the connection with SyncStep1.\n * When the server receives SyncStep1, it should reply with SyncStep2 immediately followed by SyncStep1. The client replies\n * with SyncStep2 when it receives SyncStep1. Optionally the server may send a SyncDone after it received SyncStep2, so the\n * client knows that the sync is finished. There are two reasons for this more elaborated sync model: 1. This protocol can\n * easily be implemented on top of http and websockets. 2. The server shoul only reply to requests, and not initiate them.\n * Therefore it is necesarry that the client initiates the sync.\n *\n * Construction of a message:\n * [messageType : varUint, message definition..]\n *\n * Note: A message does not include information about the room name. This must to be handled by the upper layer protocol!\n *\n * stringify[messageType] stringifies a message definition (messageType is already read from the bufffer)\n */\n\nexport const messageYjsSyncStep1 = 0\nexport const messageYjsSyncStep2 = 1\nexport const messageYjsUpdate = 2\n\n/**\n * Create a sync step 1 message based on the state of the current shared document.\n *\n * @param {encoding.Encoder} encoder\n * @param {Y.Doc} doc\n */\nexport const writeSyncStep1 = (encoder, doc) => {\n encoding.writeVarUint(encoder, messageYjsSyncStep1)\n const sv = Y.encodeStateVector(doc)\n encoding.writeVarUint8Array(encoder, sv)\n}\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {Y.Doc} doc\n * @param {Uint8Array} [encodedStateVector]\n */\nexport const writeSyncStep2 = (encoder, doc, encodedStateVector) => {\n encoding.writeVarUint(encoder, messageYjsSyncStep2)\n encoding.writeVarUint8Array(encoder, Y.encodeStateAsUpdate(doc, encodedStateVector))\n}\n\n/**\n * Read SyncStep1 message and reply with SyncStep2.\n *\n * @param {decoding.Decoder} decoder The reply to the received message\n * @param {encoding.Encoder} encoder The received message\n * @param {Y.Doc} doc\n */\nexport const readSyncStep1 = (decoder, encoder, doc) =>\n writeSyncStep2(encoder, doc, decoding.readVarUint8Array(decoder))\n\n/**\n * Read and apply Structs and then DeleteStore to a y instance.\n *\n * @param {decoding.Decoder} decoder\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n */\nexport const readSyncStep2 = (decoder, doc, transactionOrigin) => {\n try {\n Y.applyUpdate(doc, decoding.readVarUint8Array(decoder), transactionOrigin)\n } catch (error) {\n // This catches errors that are thrown by event handlers\n console.error('Caught error while handling a Yjs update', error)\n }\n}\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {Uint8Array} update\n */\nexport const writeUpdate = (encoder, update) => {\n encoding.writeVarUint(encoder, messageYjsUpdate)\n encoding.writeVarUint8Array(encoder, update)\n}\n\n/**\n * Read and apply Structs and then DeleteStore to a y instance.\n *\n * @param {decoding.Decoder} decoder\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n */\nexport const readUpdate = readSyncStep2\n\n/**\n * @param {decoding.Decoder} decoder A message received from another client\n * @param {encoding.Encoder} encoder The reply message. Will not be sent if empty.\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n */\nexport const readSyncMessage = (decoder, encoder, doc, transactionOrigin) => {\n const messageType = decoding.readVarUint(decoder)\n switch (messageType) {\n case messageYjsSyncStep1:\n readSyncStep1(decoder, encoder, doc)\n break\n case messageYjsSyncStep2:\n readSyncStep2(decoder, doc, transactionOrigin)\n break\n case messageYjsUpdate:\n readUpdate(decoder, doc, transactionOrigin)\n break\n default:\n throw new Error('Unknown message type')\n }\n return messageType\n}\n","/**\n * @module provider/websocket\n */\n\n/* eslint-env browser */\n\nimport * as Y from 'yjs' // eslint-disable-line\nimport * as bc from 'lib0/broadcastchannel'\nimport * as time from 'lib0/time'\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as syncProtocol from 'y-protocols/sync'\nimport * as authProtocol from 'y-protocols/auth'\nimport * as awarenessProtocol from 'y-protocols/awareness'\nimport { Observable } from 'lib0/observable'\nimport * as math from 'lib0/math'\nimport * as url from 'lib0/url'\n\nexport const messageSync = 0\nexport const messageQueryAwareness = 3\nexport const messageAwareness = 1\nexport const messageAuth = 2\n\n/**\n * encoder, decoder, provider, emitSynced, messageType\n * @type {Array}\n */\nconst messageHandlers = []\n\nmessageHandlers[messageSync] = (\n encoder,\n decoder,\n provider,\n emitSynced,\n _messageType\n) => {\n encoding.writeVarUint(encoder, messageSync)\n const syncMessageType = syncProtocol.readSyncMessage(\n decoder,\n encoder,\n provider.doc,\n provider\n )\n if (\n emitSynced && syncMessageType === syncProtocol.messageYjsSyncStep2 &&\n !provider.synced\n ) {\n provider.synced = true\n }\n}\n\nmessageHandlers[messageQueryAwareness] = (\n encoder,\n _decoder,\n provider,\n _emitSynced,\n _messageType\n) => {\n encoding.writeVarUint(encoder, messageAwareness)\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(\n provider.awareness,\n Array.from(provider.awareness.getStates().keys())\n )\n )\n}\n\nmessageHandlers[messageAwareness] = (\n _encoder,\n decoder,\n provider,\n _emitSynced,\n _messageType\n) => {\n awarenessProtocol.applyAwarenessUpdate(\n provider.awareness,\n decoding.readVarUint8Array(decoder),\n provider\n )\n}\n\nmessageHandlers[messageAuth] = (\n _encoder,\n decoder,\n provider,\n _emitSynced,\n _messageType\n) => {\n authProtocol.readAuthMessage(\n decoder,\n provider.doc,\n (_ydoc, reason) => permissionDeniedHandler(provider, reason)\n )\n}\n\n// @todo - this should depend on awareness.outdatedTime\nconst messageReconnectTimeout = 30000\n\n/**\n * @param {WebsocketProvider} provider\n * @param {string} reason\n */\nconst permissionDeniedHandler = (provider, reason) =>\n console.warn(`Permission denied to access ${provider.url}.\\n${reason}`)\n\n/**\n * @param {WebsocketProvider} provider\n * @param {Uint8Array} buf\n * @param {boolean} emitSynced\n * @return {encoding.Encoder}\n */\nconst readMessage = (provider, buf, emitSynced) => {\n const decoder = decoding.createDecoder(buf)\n const encoder = encoding.createEncoder()\n const messageType = decoding.readVarUint(decoder)\n const messageHandler = provider.messageHandlers[messageType]\n if (/** @type {any} */ (messageHandler)) {\n messageHandler(encoder, decoder, provider, emitSynced, messageType)\n } else {\n console.error('Unable to compute message')\n }\n return encoder\n}\n\n/**\n * @param {WebsocketProvider} provider\n */\nconst setupWS = (provider) => {\n if (provider.shouldConnect && provider.ws === null) {\n const websocket = new provider._WS(provider.url)\n websocket.binaryType = 'arraybuffer'\n provider.ws = websocket\n provider.wsconnecting = true\n provider.wsconnected = false\n provider.synced = false\n\n websocket.onmessage = (event) => {\n provider.wsLastMessageReceived = time.getUnixTime()\n const encoder = readMessage(provider, new Uint8Array(event.data), true)\n if (encoding.length(encoder) > 1) {\n websocket.send(encoding.toUint8Array(encoder))\n }\n }\n websocket.onerror = (event) => {\n provider.emit('connection-error', [event, provider])\n }\n websocket.onclose = (event) => {\n provider.emit('connection-close', [event, provider])\n provider.ws = null\n provider.wsconnecting = false\n if (provider.wsconnected) {\n provider.wsconnected = false\n provider.synced = false\n // update awareness (all users except local left)\n awarenessProtocol.removeAwarenessStates(\n provider.awareness,\n Array.from(provider.awareness.getStates().keys()).filter((client) =>\n client !== provider.doc.clientID\n ),\n provider\n )\n provider.emit('status', [{\n status: 'disconnected'\n }])\n } else {\n provider.wsUnsuccessfulReconnects++\n }\n // Start with no reconnect timeout and increase timeout by\n // using exponential backoff starting with 100ms\n setTimeout(\n setupWS,\n math.min(\n math.pow(2, provider.wsUnsuccessfulReconnects) * 100,\n provider.maxBackoffTime\n ),\n provider\n )\n }\n websocket.onopen = () => {\n provider.wsLastMessageReceived = time.getUnixTime()\n provider.wsconnecting = false\n provider.wsconnected = true\n provider.wsUnsuccessfulReconnects = 0\n provider.emit('status', [{\n status: 'connected'\n }])\n // always send sync step 1 when connected\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageSync)\n syncProtocol.writeSyncStep1(encoder, provider.doc)\n websocket.send(encoding.toUint8Array(encoder))\n // broadcast local awareness state\n if (provider.awareness.getLocalState() !== null) {\n const encoderAwarenessState = encoding.createEncoder()\n encoding.writeVarUint(encoderAwarenessState, messageAwareness)\n encoding.writeVarUint8Array(\n encoderAwarenessState,\n awarenessProtocol.encodeAwarenessUpdate(provider.awareness, [\n provider.doc.clientID\n ])\n )\n websocket.send(encoding.toUint8Array(encoderAwarenessState))\n }\n }\n\n provider.emit('status', [{\n status: 'connecting'\n }])\n }\n}\n\n/**\n * @param {WebsocketProvider} provider\n * @param {ArrayBuffer} buf\n */\nconst broadcastMessage = (provider, buf) => {\n if (provider.wsconnected) {\n /** @type {WebSocket} */ (provider.ws).send(buf)\n }\n if (provider.bcconnected) {\n bc.publish(provider.bcChannel, buf, provider)\n }\n}\n\n/**\n * Websocket Provider for Yjs. Creates a websocket connection to sync the shared document.\n * The document name is attached to the provided url. I.e. the following example\n * creates a websocket connection to http://localhost:1234/my-document-name\n *\n * @example\n * import * as Y from 'yjs'\n * import { WebsocketProvider } from 'y-websocket'\n * const doc = new Y.Doc()\n * const provider = new WebsocketProvider('http://localhost:1234', 'my-document-name', doc)\n *\n * @extends {Observable}\n */\nexport class WebsocketProvider extends Observable {\n /**\n * @param {string} serverUrl\n * @param {string} roomname\n * @param {Y.Doc} doc\n * @param {object} [opts]\n * @param {boolean} [opts.connect]\n * @param {awarenessProtocol.Awareness} [opts.awareness]\n * @param {Object} [opts.params]\n * @param {typeof WebSocket} [opts.WebSocketPolyfill] Optionall provide a WebSocket polyfill\n * @param {number} [opts.resyncInterval] Request server state every `resyncInterval` milliseconds\n * @param {number} [opts.maxBackoffTime] Maximum amount of time to wait before trying to reconnect (we try to reconnect using exponential backoff)\n * @param {boolean} [opts.disableBc] Disable cross-tab BroadcastChannel communication\n */\n constructor (serverUrl, roomname, doc, {\n connect = true,\n awareness = new awarenessProtocol.Awareness(doc),\n params = {},\n WebSocketPolyfill = WebSocket,\n resyncInterval = -1,\n maxBackoffTime = 2500,\n disableBc = false\n } = {}) {\n super()\n // ensure that url is always ends with /\n while (serverUrl[serverUrl.length - 1] === '/') {\n serverUrl = serverUrl.slice(0, serverUrl.length - 1)\n }\n const encodedParams = url.encodeQueryParams(params)\n this.maxBackoffTime = maxBackoffTime\n this.bcChannel = serverUrl + '/' + roomname\n this.url = serverUrl + '/' + roomname +\n (encodedParams.length === 0 ? '' : '?' + encodedParams)\n this.roomname = roomname\n this.doc = doc\n this._WS = WebSocketPolyfill\n this.awareness = awareness\n this.wsconnected = false\n this.wsconnecting = false\n this.bcconnected = false\n this.disableBc = disableBc\n this.wsUnsuccessfulReconnects = 0\n this.messageHandlers = messageHandlers.slice()\n /**\n * @type {boolean}\n */\n this._synced = false\n /**\n * @type {WebSocket?}\n */\n this.ws = null\n this.wsLastMessageReceived = 0\n /**\n * Whether to connect to other peers or not\n * @type {boolean}\n */\n this.shouldConnect = connect\n\n /**\n * @type {number}\n */\n this._resyncInterval = 0\n if (resyncInterval > 0) {\n this._resyncInterval = /** @type {any} */ (setInterval(() => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n // resend sync step 1\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageSync)\n syncProtocol.writeSyncStep1(encoder, doc)\n this.ws.send(encoding.toUint8Array(encoder))\n }\n }, resyncInterval))\n }\n\n /**\n * @param {ArrayBuffer} data\n * @param {any} origin\n */\n this._bcSubscriber = (data, origin) => {\n if (origin !== this) {\n const encoder = readMessage(this, new Uint8Array(data), false)\n if (encoding.length(encoder) > 1) {\n bc.publish(this.bcChannel, encoding.toUint8Array(encoder), this)\n }\n }\n }\n /**\n * Listens to Yjs updates and sends them to remote peers (ws and broadcastchannel)\n * @param {Uint8Array} update\n * @param {any} origin\n */\n this._updateHandler = (update, origin) => {\n if (origin !== this) {\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageSync)\n syncProtocol.writeUpdate(encoder, update)\n broadcastMessage(this, encoding.toUint8Array(encoder))\n }\n }\n this.doc.on('update', this._updateHandler)\n /**\n * @param {any} changed\n * @param {any} _origin\n */\n this._awarenessUpdateHandler = ({ added, updated, removed }, _origin) => {\n const changedClients = added.concat(updated).concat(removed)\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageAwareness)\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(awareness, changedClients)\n )\n broadcastMessage(this, encoding.toUint8Array(encoder))\n }\n this._unloadHandler = () => {\n awarenessProtocol.removeAwarenessStates(\n this.awareness,\n [doc.clientID],\n 'window unload'\n )\n }\n if (typeof window !== 'undefined') {\n window.addEventListener('unload', this._unloadHandler)\n } else if (typeof process !== 'undefined') {\n process.on('exit', this._unloadHandler)\n }\n awareness.on('update', this._awarenessUpdateHandler)\n this._checkInterval = /** @type {any} */ (setInterval(() => {\n if (\n this.wsconnected &&\n messageReconnectTimeout <\n time.getUnixTime() - this.wsLastMessageReceived\n ) {\n // no message received in a long time - not even your own awareness\n // updates (which are updated every 15 seconds)\n /** @type {WebSocket} */ (this.ws).close()\n }\n }, messageReconnectTimeout / 10))\n if (connect) {\n this.connect()\n }\n }\n\n /**\n * @type {boolean}\n */\n get synced () {\n return this._synced\n }\n\n set synced (state) {\n if (this._synced !== state) {\n this._synced = state\n this.emit('synced', [state])\n this.emit('sync', [state])\n }\n }\n\n destroy () {\n if (this._resyncInterval !== 0) {\n clearInterval(this._resyncInterval)\n }\n clearInterval(this._checkInterval)\n this.disconnect()\n if (typeof window !== 'undefined') {\n window.removeEventListener('unload', this._unloadHandler)\n } else if (typeof process !== 'undefined') {\n process.off('exit', this._unloadHandler)\n }\n this.awareness.off('update', this._awarenessUpdateHandler)\n this.doc.off('update', this._updateHandler)\n super.destroy()\n }\n\n connectBc () {\n if (this.disableBc) {\n return\n }\n if (!this.bcconnected) {\n bc.subscribe(this.bcChannel, this._bcSubscriber)\n this.bcconnected = true\n }\n // send sync step1 to bc\n // write sync step 1\n const encoderSync = encoding.createEncoder()\n encoding.writeVarUint(encoderSync, messageSync)\n syncProtocol.writeSyncStep1(encoderSync, this.doc)\n bc.publish(this.bcChannel, encoding.toUint8Array(encoderSync), this)\n // broadcast local state\n const encoderState = encoding.createEncoder()\n encoding.writeVarUint(encoderState, messageSync)\n syncProtocol.writeSyncStep2(encoderState, this.doc)\n bc.publish(this.bcChannel, encoding.toUint8Array(encoderState), this)\n // write queryAwareness\n const encoderAwarenessQuery = encoding.createEncoder()\n encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness)\n bc.publish(\n this.bcChannel,\n encoding.toUint8Array(encoderAwarenessQuery),\n this\n )\n // broadcast local awareness state\n const encoderAwarenessState = encoding.createEncoder()\n encoding.writeVarUint(encoderAwarenessState, messageAwareness)\n encoding.writeVarUint8Array(\n encoderAwarenessState,\n awarenessProtocol.encodeAwarenessUpdate(this.awareness, [\n this.doc.clientID\n ])\n )\n bc.publish(\n this.bcChannel,\n encoding.toUint8Array(encoderAwarenessState),\n this\n )\n }\n\n disconnectBc () {\n // broadcast message with local awareness state set to null (indicating disconnect)\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageAwareness)\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(this.awareness, [\n this.doc.clientID\n ], new Map())\n )\n broadcastMessage(this, encoding.toUint8Array(encoder))\n if (this.bcconnected) {\n bc.unsubscribe(this.bcChannel, this._bcSubscriber)\n this.bcconnected = false\n }\n }\n\n disconnect () {\n this.shouldConnect = false\n this.disconnectBc()\n if (this.ws !== null) {\n this.ws.close()\n }\n }\n\n connect () {\n this.shouldConnect = true\n if (!this.wsconnected && this.ws === null) {\n setupWS(this)\n this.connectBc()\n }\n }\n}\n","\nimport * as Y from 'yjs' // eslint-disable-line\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\n\nexport const messagePermissionDenied = 0\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {string} reason\n */\nexport const writePermissionDenied = (encoder, reason) => {\n encoding.writeVarUint(encoder, messagePermissionDenied)\n encoding.writeVarString(encoder, reason)\n}\n\n/**\n * @callback PermissionDeniedHandler\n * @param {any} y\n * @param {string} reason\n */\n\n/**\n *\n * @param {decoding.Decoder} decoder\n * @param {Y.Doc} y\n * @param {PermissionDeniedHandler} permissionDeniedHandler\n */\nexport const readAuthMessage = (decoder, y, permissionDeniedHandler) => {\n switch (decoding.readVarUint(decoder)) {\n case messagePermissionDenied: permissionDeniedHandler(y, decoding.readVarString(decoder))\n }\n}\n","/**\n * Utility module to work with urls.\n *\n * @module url\n */\n\nimport * as object from './object.js'\n\n/**\n * Parse query parameters from an url.\n *\n * @param {string} url\n * @return {Object}\n */\nexport const decodeQueryParams = url => {\n /**\n * @type {Object}\n */\n const query = {}\n const urlQuerySplit = url.split('?')\n const pairs = urlQuerySplit[urlQuerySplit.length - 1].split('&')\n for (var i = 0; i < pairs.length; i++) {\n const item = pairs[i]\n if (item.length > 0) {\n const pair = item.split('=')\n query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '')\n }\n }\n return query\n}\n\n/**\n * @param {Object} params\n * @return {string}\n */\nexport const encodeQueryParams = params =>\n object.map(params, (val, key) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`).join('&')\n"],"names":["channels","Map","BC","BroadcastChannel","constructor","room","this","onmessage","storage","e","key","data","buffer","newValue","postMessage","buf","getChannel","map","subs","Set","bc","forEach","sub","publish","origin","c","writeSyncStep1","encoder","doc","sv","writeSyncStep2","encodedStateVector","readSyncStep2","decoder","transactionOrigin","decoding","error","console","readUpdate","messageHandlers","provider","emitSynced","_messageType","syncMessageType","messageType","readSyncStep1","Error","synced","_decoder","_emitSynced","awareness","Array","from","getStates","keys","_encoder","y","permissionDeniedHandler","_ydoc","reason","warn","url","readMessage","messageHandler","setupWS","shouldConnect","ws","websocket","_WS","binaryType","wsconnecting","wsconnected","event","wsLastMessageReceived","time","Uint8Array","send","onerror","emit","onclose","filter","client","clientID","status","wsUnsuccessfulReconnects","setTimeout","math","maxBackoffTime","onopen","getLocalState","encoderAwarenessState","broadcastMessage","bcconnected","bcChannel","WebsocketProvider","serverUrl","roomname","connect","params","WebSocketPolyfill","WebSocket","resyncInterval","disableBc","super","length","slice","encodedParams","object","val","encodeURIComponent","join","_synced","_resyncInterval","setInterval","readyState","OPEN","_bcSubscriber","_updateHandler","update","on","_awarenessUpdateHandler","added","updated","removed","_origin","changedClients","concat","_unloadHandler","window","addEventListener","process","_checkInterval","close","messageReconnectTimeout","state","destroy","clearInterval","disconnect","removeEventListener","off","connectBc","f","add","encoderSync","encoderState","encoderAwarenessQuery","disconnectBc","delete"],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/build/1163.ac28297.js b/_static/build/1163.ac28297.js
new file mode 100644
index 0000000..d62dcdf
--- /dev/null
+++ b/_static/build/1163.ac28297.js
@@ -0,0 +1,2 @@
+(self.webpackChunk_JUPYTERLAB_CORE_OUTPUT=self.webpackChunk_JUPYTERLAB_CORE_OUTPUT||[]).push([[1163],{54695:(e,t,n)=>{"use strict";n.r(t),n.d(t,{Cache:()=>g,FreeStyle:()=>v,Rule:()=>m,Selector:()=>y,Style:()=>p,create:()=>S});let s=0;const r=Object.create(null),i=["animation-iteration-count","border-image-outset","border-image-slice","border-image-width","box-flex","box-flex-group","box-ordinal-group","column-count","columns","counter-increment","counter-reset","flex","flex-grow","flex-positive","flex-shrink","flex-negative","flex-order","font-weight","grid-area","grid-column","grid-column-end","grid-column-span","grid-column-start","grid-row","grid-row-end","grid-row-span","grid-row-start","line-clamp","line-height","opacity","order","orphans","tab-size","widows","z-index","zoom","fill-opacity","flood-opacity","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-miterlimit","stroke-opacity","stroke-width"];for(const e of i)for(const t of["-webkit-","-ms-","-moz-","-o-",""])r[t+e]=!0;function o(e,t){return t&&"number"==typeof t&&!r[e]?`${e}:${t}px`:`${e}:${t}`}function a(e){return e.sort(((e,t)=>e[0]>t[0]?1:-1))}function h(e){return e.map((([e,t])=>Array.isArray(t)?t.map((t=>o(e,t))).join(";"):o(e,t))).join(";")}function c(e,t){return-1===e.indexOf("&")?`${t} ${e}`:e.replace(/&/g,t)}function l(e,t,n,s,r){const{style:i,nested:o,isUnique:u}=function(e,t){const n=[],s=[];for(const t of Object.keys(e)){const i=t.trim(),o=e[t];36!==i.charCodeAt(0)&&null!=o&&("object"!=typeof o||Array.isArray(o)?n.push([(r=i,r.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`)).replace(/^ms-/,"-ms-")),o]):s.push([i,o]))}var r;return{style:h(a(n)),nested:t?s:a(s),isUnique:!!e.$unique}}(t,""!==e);let d=i;if(64===e.charCodeAt(0)){const t={selector:e,styles:[],rules:[],style:r?"":i};n.push(t),i&&r&&t.styles.push({selector:r,style:i,isUnique:u});for(const[e,n]of o)d+=e+l(e,n,t.rules,t.styles,r)}else{const t=r?c(e,r):e;i&&s.push({selector:t,style:i,isUnique:u});for(const[e,r]of o)d+=e+l(e,r,n,s,t)}return d}function u(e,t,n,r,i,o){for(const{selector:n,style:a,isUnique:h}of r){const r=o?c(n,i):n,l=h?`u\0${(++s).toString(36)}`:`s\0${t}\0${a}`,u=new p(a,l);u.add(new y(r,`k\0${t}\0${r}`)),e.add(u)}for(const{selector:s,style:r,rules:a,styles:h}of n){const n=new m(s,r,`r\0${t}\0${s}\0${r}`);u(n,t,a,h,i,o),e.add(n)}}function d(e){let t="";for(let n=0;n{},change:()=>{},remove:()=>{}};class g{constructor(e=f){this.changes=e,this.sheet=[],this.changeId=0,this._keys=[],this._children=Object.create(null),this._counters=Object.create(null)}add(e){const t=this._counters[e.id]||0,n=this._children[e.id]||e.clone();if(this._counters[e.id]=t+1,0===t)this._children[n.id]=n,this._keys.push(n.id),this.sheet.push(n.getStyles()),this.changeId++,this.changes.add(n,this._keys.length-1);else if(n instanceof g&&e instanceof g){const t=this._keys.indexOf(e.id),s=n.changeId;n.merge(e),n.changeId!==s&&(this.sheet.splice(t,1,n.getStyles()),this.changeId++,this.changes.change(n,t,t))}}remove(e){const t=this._counters[e.id];if(t){this._counters[e.id]=t-1;const n=this._children[e.id],s=this._keys.indexOf(n.id);if(1===t)delete this._counters[e.id],delete this._children[e.id],this._keys.splice(s,1),this.sheet.splice(s,1),this.changeId++,this.changes.remove(n,s);else if(n instanceof g&&e instanceof g){const t=n.changeId;n.unmerge(e),n.changeId!==t&&(this.sheet.splice(s,1,n.getStyles()),this.changeId++,this.changes.change(n,s,s))}}}values(){return this._keys.map((e=>this._children[e]))}merge(e){for(const t of e.values())this.add(t);return this}unmerge(e){for(const t of e.values())this.remove(t);return this}clone(){return(new g).merge(this)}}class y{constructor(e,t){this.selector=e,this.id=t}getStyles(){return this.selector}clone(){return this}}class p extends g{constructor(e,t){super(),this.style=e,this.id=t}getStyles(){return`${this.sheet.join(",")}{${this.style}}`}clone(){return new p(this.style,this.id).merge(this)}}class m extends g{constructor(e,t,n){super(),this.rule=e,this.style=t,this.id=n}getStyles(){return`${this.rule}{${this.style}${d(this.sheet)}}`}clone(){return new m(this.rule,this.style,this.id).merge(this)}}function _(e,t){return`f${function(e){let t=5381,n=e.length;for(;n--;)t=33*t^e.charCodeAt(n);return(t>>>0).toString(36)}(e)}`}class v extends g{constructor(e,t){super(t),this.id=e}registerStyle(e){const t=[],n=[],s=l("&",e,t,n),r=_(s);return u(this,s,t,n,`.${r}`,!0),r}registerKeyframes(e){return this.registerHashRule("@keyframes",e)}registerHashRule(e,t){const n=[],s=[],r=l("",t,n,s),i=_(r),o=new m(`${e} ${i}`,"",`h\0${r}\0${e}`);return u(o,r,n,s,"",!1),this.add(o),i}registerRule(e,t){const n=[],s=[];u(this,l(e,t,n,s),n,s,"",!1)}registerCss(e){return this.registerRule("",e)}getStyles(){return d(this.sheet)}clone(){return new v(this.id,this.changes).merge(this)}}function S(e){return new v(`f${(++s).toString(36)}`,e)}},91163:(e,t,n)=>{"use strict";n.r(t),n.d(t,{TypeStyle:()=>u,classes:()=>o,createTypeStyle:()=>R,cssRaw:()=>y,cssRule:()=>p,extend:()=>a,fontFace:()=>_,forceRenderStyles:()=>m,getStyles:()=>v,keyframes:()=>S,media:()=>h,reinit:()=>w,setStylesTarget:()=>g,style:()=>$,stylesheet:()=>x,types:()=>d});var s=n(54695);function r(e){var t={};for(var n in e){var s=e[n];if("$nest"===n){var i=s;for(var o in i){var a=i[o];t[o]=r(a)}}else"$debugName"===n?t.$displayName=s:t[n]=s}return t}var i="undefined"==typeof requestAnimationFrame?function(e){return setTimeout(e)}:"undefined"==typeof window?requestAnimationFrame:requestAnimationFrame.bind(window);function o(){for(var e=[],t=0;t{}}]);
+//# sourceMappingURL=1163.ac28297.js.map
\ No newline at end of file
diff --git a/_static/build/1163.ac28297.js.map b/_static/build/1163.ac28297.js.map
new file mode 100644
index 0000000..6f0ec5d
--- /dev/null
+++ b/_static/build/1163.ac28297.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"1163.ac28297.js","mappings":"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","sources":["webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/free-style/src/index.ts","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/typestyle/lib.es2015/internal/formatting.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/typestyle/lib.es2015/internal/utilities.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/typestyle/lib.es2015/internal/typestyle.js","webpack://_JUPYTERLAB.CORE_OUTPUT/../node_modules/typestyle/lib.es2015/index.js"],"sourcesContent":["/**\n * The unique id is used for unique hashes.\n */\nlet uniqueId = 0;\n\n/**\n * Valid CSS property values.\n */\nexport type PropertyValue = number | boolean | string;\n\n/**\n * Input styles object.\n */\nexport interface Styles {\n $unique?: boolean;\n $displayName?: string;\n [selector: string]:\n | null\n | undefined\n | PropertyValue\n | PropertyValue[]\n | Styles;\n}\n\n/**\n * Hash algorithm interface.\n */\nexport type HashFunction = (str: string) => string;\n\n/**\n * Quick dictionary lookup for unit-less numbers.\n */\nconst CSS_NUMBER: Record = Object.create(null);\n\n/**\n * CSS properties that are valid unit-less numbers.\n *\n * Ref: https://github.com/facebook/react/blob/master/packages/react-dom/src/shared/CSSProperty.js\n */\nconst CSS_NUMBER_KEYS = [\n \"animation-iteration-count\",\n \"border-image-outset\",\n \"border-image-slice\",\n \"border-image-width\",\n \"box-flex\",\n \"box-flex-group\",\n \"box-ordinal-group\",\n \"column-count\",\n \"columns\",\n \"counter-increment\",\n \"counter-reset\",\n \"flex\",\n \"flex-grow\",\n \"flex-positive\",\n \"flex-shrink\",\n \"flex-negative\",\n \"flex-order\",\n \"font-weight\",\n \"grid-area\",\n \"grid-column\",\n \"grid-column-end\",\n \"grid-column-span\",\n \"grid-column-start\",\n \"grid-row\",\n \"grid-row-end\",\n \"grid-row-span\",\n \"grid-row-start\",\n \"line-clamp\",\n \"line-height\",\n \"opacity\",\n \"order\",\n \"orphans\",\n \"tab-size\",\n \"widows\",\n \"z-index\",\n \"zoom\",\n // SVG properties.\n \"fill-opacity\",\n \"flood-opacity\",\n \"stop-opacity\",\n \"stroke-dasharray\",\n \"stroke-dashoffset\",\n \"stroke-miterlimit\",\n \"stroke-opacity\",\n \"stroke-width\"\n];\n\n// Add vendor prefixes to all unit-less properties.\nfor (const property of CSS_NUMBER_KEYS) {\n for (const prefix of [\"-webkit-\", \"-ms-\", \"-moz-\", \"-o-\", \"\"]) {\n CSS_NUMBER[prefix + property] = true;\n }\n}\n\n/**\n * Escape a CSS class name.\n */\nfunction escape(str: string) {\n return str.replace(/[ !#$%&()*+,./;<=>?@[\\]^`{|}~\"'\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Transform a JavaScript property into a CSS property.\n */\nfunction hyphenate(propertyName: string): string {\n return propertyName\n .replace(/[A-Z]/g, (m: string) => `-${m.toLowerCase()}`)\n .replace(/^ms-/, \"-ms-\"); // Internet Explorer vendor prefix.\n}\n\n/**\n * Generate a hash value from a string.\n */\nfunction stringHash(str: string): string {\n let value = 5381;\n let len = str.length;\n while (len--) value = (value * 33) ^ str.charCodeAt(len);\n return (value >>> 0).toString(36);\n}\n\n/**\n * Transform a style string to a CSS string.\n */\nfunction styleToString(key: string, value: PropertyValue) {\n if (value && typeof value === \"number\" && !CSS_NUMBER[key]) {\n return `${key}:${value}px`;\n }\n\n return `${key}:${value}`;\n}\n\n/**\n * Sort an array of tuples by first value.\n */\nfunction sortTuples(value: T[]): T[] {\n return value.sort((a, b) => (a[0] > b[0] ? 1 : -1));\n}\n\n/**\n * Categorize user styles.\n */\nfunction parseStyles(styles: Styles, hasNestedStyles: boolean) {\n const properties: Array<[string, PropertyValue | PropertyValue[]]> = [];\n const nestedStyles: Array<[string, Styles]> = [];\n\n // Sort keys before adding to styles.\n for (const key of Object.keys(styles)) {\n const name = key.trim();\n const value = styles[key];\n\n if (name.charCodeAt(0) !== 36 /* $ */ && value != null) {\n if (typeof value === \"object\" && !Array.isArray(value)) {\n nestedStyles.push([name, value]);\n } else {\n properties.push([hyphenate(name), value]);\n }\n }\n }\n\n return {\n style: stringifyProperties(sortTuples(properties)),\n nested: hasNestedStyles ? nestedStyles : sortTuples(nestedStyles),\n isUnique: !!styles.$unique\n };\n}\n\n/**\n * Stringify an array of property tuples.\n */\nfunction stringifyProperties(\n properties: Array<[string, PropertyValue | PropertyValue[]]>\n) {\n return properties\n .map(([name, value]) => {\n if (!Array.isArray(value)) return styleToString(name, value);\n\n return value.map(x => styleToString(name, x)).join(\";\");\n })\n .join(\";\");\n}\n\n/**\n * Interpolate CSS selectors.\n */\nfunction interpolate(selector: string, parent: string) {\n if (selector.indexOf(\"&\") === -1) return `${parent} ${selector}`;\n return selector.replace(/&/g, parent);\n}\n\ntype StylizeStyle = { selector: string; style: string; isUnique: boolean };\n\ntype StylizeRule = {\n selector: string;\n style: string;\n rules: StylizeRule[];\n styles: StylizeStyle[];\n};\n\n/**\n * Recursive loop building styles with deferred selectors.\n */\nfunction stylize(\n selector: string,\n styles: Styles,\n rulesList: StylizeRule[],\n stylesList: StylizeStyle[],\n parent?: string\n) {\n const { style, nested, isUnique } = parseStyles(styles, selector !== \"\");\n let pid = style;\n\n if (selector.charCodeAt(0) === 64 /* @ */) {\n const child: StylizeRule = {\n selector,\n styles: [],\n rules: [],\n style: parent ? \"\" : style\n };\n rulesList.push(child);\n\n // Nested styles support (e.g. `.foo > @media > .bar`).\n if (style && parent) {\n child.styles.push({ selector: parent, style, isUnique });\n }\n\n for (const [name, value] of nested) {\n pid += name + stylize(name, value, child.rules, child.styles, parent);\n }\n } else {\n const key = parent ? interpolate(selector, parent) : selector;\n\n if (style) stylesList.push({ selector: key, style, isUnique });\n\n for (const [name, value] of nested) {\n pid += name + stylize(name, value, rulesList, stylesList, key);\n }\n }\n\n return pid;\n}\n\n/**\n * Transform `stylize` tree into style objects.\n */\nfunction composeStylize(\n cache: Cache,\n pid: string,\n rulesList: StylizeRule[],\n stylesList: StylizeStyle[],\n className: string,\n isStyle: boolean\n) {\n for (const { selector, style, isUnique } of stylesList) {\n const key = isStyle ? interpolate(selector, className) : selector;\n const id = isUnique\n ? `u\\0${(++uniqueId).toString(36)}`\n : `s\\0${pid}\\0${style}`;\n const item = new Style(style, id);\n item.add(new Selector(key, `k\\0${pid}\\0${key}`));\n cache.add(item);\n }\n\n for (const { selector, style, rules, styles } of rulesList) {\n const item = new Rule(selector, style, `r\\0${pid}\\0${selector}\\0${style}`);\n composeStylize(item, pid, rules, styles, className, isStyle);\n cache.add(item);\n }\n}\n\n/**\n * Cache to list to styles.\n */\nfunction join(arr: string[]): string {\n let res = \"\";\n for (let i = 0; i < arr.length; i++) res += arr[i];\n return res;\n}\n\n/**\n * Propagate change events.\n */\nexport interface Changes {\n add(style: Container, index: number): void;\n change(style: Container, oldIndex: number, newIndex: number): void;\n remove(style: Container, index: number): void;\n}\n\n/**\n * Noop changes.\n */\nconst noopChanges: Changes = {\n add: () => undefined,\n change: () => undefined,\n remove: () => undefined\n};\n\n/**\n * Cache-able interface.\n */\nexport interface Container {\n id: string;\n clone(): T;\n getStyles(): string;\n}\n\n/**\n * Implement a cache/event emitter.\n */\nexport class Cache> {\n sheet: string[] = [];\n changeId = 0;\n\n private _keys: string[] = [];\n private _children: Record = Object.create(null);\n private _counters: Record = Object.create(null);\n\n constructor(public changes: Changes = noopChanges) {}\n\n add(style: T): void {\n const count = this._counters[style.id] || 0;\n const item: T = this._children[style.id] || style.clone();\n\n this._counters[style.id] = count + 1;\n\n if (count === 0) {\n this._children[item.id] = item;\n this._keys.push(item.id);\n this.sheet.push(item.getStyles());\n this.changeId++;\n this.changes.add(item, this._keys.length - 1);\n } else if (item instanceof Cache && style instanceof Cache) {\n const curIndex = this._keys.indexOf(style.id);\n const prevItemChangeId = item.changeId;\n\n item.merge(style);\n\n if (item.changeId !== prevItemChangeId) {\n this.sheet.splice(curIndex, 1, item.getStyles());\n this.changeId++;\n this.changes.change(item, curIndex, curIndex);\n }\n }\n }\n\n remove(style: T): void {\n const count = this._counters[style.id];\n\n if (count) {\n this._counters[style.id] = count - 1;\n\n const item = this._children[style.id]!;\n const index = this._keys.indexOf(item.id);\n\n if (count === 1) {\n delete this._counters[style.id];\n delete this._children[style.id];\n\n this._keys.splice(index, 1);\n this.sheet.splice(index, 1);\n this.changeId++;\n this.changes.remove(item, index);\n } else if (item instanceof Cache && style instanceof Cache) {\n const prevChangeId = item.changeId;\n\n item.unmerge(style);\n\n if (item.changeId !== prevChangeId) {\n this.sheet.splice(index, 1, item.getStyles());\n this.changeId++;\n this.changes.change(item, index, index);\n }\n }\n }\n }\n\n values(): T[] {\n return this._keys.map(key => this._children[key]!);\n }\n\n merge(cache: Cache) {\n for (const item of cache.values()) this.add(item);\n return this;\n }\n\n unmerge(cache: Cache) {\n for (const item of cache.values()) this.remove(item);\n return this;\n }\n\n clone(): Cache {\n return new Cache().merge(this);\n }\n}\n\n/**\n * Selector is a dumb class made to represent nested CSS selectors.\n */\nexport class Selector implements Container {\n constructor(public selector: string, public id: string) {}\n\n getStyles() {\n return this.selector;\n }\n\n clone(): Selector {\n return this;\n }\n}\n\n/**\n * The style container registers a style string with selectors.\n */\nexport class Style extends Cache implements Container